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

Artifact 763ca2b39fe551a6dc7d37ba40544311622eee32:


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 39 39 20 32 30 30 37 2f 30 36 2f 32 30 20  .299 2007/06/20 
0220: 31 36 3a 31 33 3a 32 33 20 64 72 68 20 45 78 70  16:13:23 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 53 45 4c 45 43 54 20  ( op==TK_SELECT 
04d0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  ){.    return sq
04e0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
04f0: 79 28 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  y(pExpr->pSelect
0500: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
0510: 45 78 70 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  Expr);.  }.#ifnd
0520: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
0530: 41 53 54 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  AST.  if( op==TK
0540: 5f 43 41 53 54 20 29 7b 0a 20 20 20 20 72 65 74  _CAST ){.    ret
0550: 75 72 6e 20 73 71 6c 69 74 65 33 41 66 66 69 6e  urn sqlite3Affin
0560: 69 74 79 54 79 70 65 28 26 70 45 78 70 72 2d 3e  ityType(&pExpr->
0570: 74 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64  token);.  }.#end
0580: 69 66 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70  if.  return pExp
0590: 72 2d 3e 61 66 66 69 6e 69 74 79 3b 0a 7d 0a 0a  r->affinity;.}..
05a0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f  /*.** Set the co
05b0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
05c0: 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20   for expression 
05d0: 70 45 78 70 72 20 74 6f 20 62 65 20 74 68 65 20  pExpr to be the 
05e0: 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71  collating.** seq
05f0: 75 65 6e 63 65 20 6e 61 6d 65 64 20 62 79 20 70  uence named by p
0600: 54 6f 6b 65 6e 2e 20 20 20 52 65 74 75 72 6e 20  Token.   Return 
0610: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
0620: 20 72 65 76 69 73 65 64 20 65 78 70 72 65 73 73   revised express
0630: 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c  ion..** The coll
0640: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  ating sequence i
0650: 73 20 6d 61 72 6b 65 64 20 61 73 20 22 65 78 70  s marked as "exp
0660: 6c 69 63 69 74 22 20 75 73 69 6e 67 20 74 68 65  licit" using the
0670: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 0a 2a   EP_ExpCollate.*
0680: 2a 20 66 6c 61 67 2e 20 20 41 6e 20 65 78 70 6c  * flag.  An expl
0690: 69 63 69 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73  icit collating s
06a0: 65 71 75 65 6e 63 65 20 77 69 6c 6c 20 6f 76 65  equence will ove
06b0: 72 72 69 64 65 20 69 6d 70 6c 69 63 69 74 0a 2a  rride implicit.*
06c0: 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * collating sequ
06d0: 65 6e 63 65 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a  ences..*/.Expr *
06e0: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 43 6f  sqlite3ExprSetCo
06f0: 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ll(Parse *pParse
0700: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 54  , Expr *pExpr, T
0710: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
0720: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
0730: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
0740: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 43 6f   return 0;.  pCo
0750: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ll = sqlite3Loca
0760: 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
0770: 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e  , (char*)pName->
0780: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  z, pName->n);.  
0790: 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  if( pColl ){.   
07a0: 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20   pExpr->pColl = 
07b0: 70 43 6f 6c 6c 3b 0a 20 20 20 20 70 45 78 70 72  pColl;.    pExpr
07c0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78  ->flags |= EP_Ex
07d0: 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 7d 0a 20 20  pCollate;.  }.  
07e0: 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a  return pExpr;.}.
07f0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0800: 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  e default collat
0810: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ion sequence for
0820: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
0830: 70 45 78 70 72 2e 20 49 66 0a 2a 2a 20 74 68 65  pExpr. If.** the
0840: 72 65 20 69 73 20 6e 6f 20 64 65 66 61 75 6c 74  re is no default
0850: 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 2c   collation type,
0860: 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 43 6f   return 0..*/.Co
0870: 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 45 78  llSeq *sqlite3Ex
0880: 70 72 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20  prCollSeq(Parse 
0890: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
08a0: 45 78 70 72 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  Expr){.  CollSeq
08b0: 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 69   *pColl = 0;.  i
08c0: 66 28 20 70 45 78 70 72 20 29 7b 0a 20 20 20 20  f( pExpr ){.    
08d0: 69 6e 74 20 6f 70 3b 0a 20 20 20 20 70 43 6f 6c  int op;.    pCol
08e0: 6c 20 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c  l = pExpr->pColl
08f0: 3b 0a 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72  ;.    op = pExpr
0900: 2d 3e 6f 70 3b 0a 20 20 20 20 69 66 28 20 28 6f  ->op;.    if( (o
0910: 70 3d 3d 54 4b 5f 43 41 53 54 20 7c 7c 20 6f 70  p==TK_CAST || op
0920: 3d 3d 54 4b 5f 55 50 4c 55 53 29 20 26 26 20 21  ==TK_UPLUS) && !
0930: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72  pColl ){.      r
0940: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
0950: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
0960: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
0970: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
0980: 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c  sqlite3CheckColl
0990: 53 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f 6c  Seq(pParse, pCol
09a0: 6c 29 20 29 7b 20 0a 20 20 20 20 70 43 6f 6c 6c  l) ){ .    pColl
09b0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
09c0: 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a  rn pColl;.}../*.
09d0: 2a 2a 20 70 45 78 70 72 20 69 73 20 61 6e 20 6f  ** pExpr is an o
09e0: 70 65 72 61 6e 64 20 6f 66 20 61 20 63 6f 6d 70  perand of a comp
09f0: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e  arison operator.
0a00: 20 20 61 66 66 32 20 69 73 20 74 68 65 0a 2a 2a    aff2 is the.**
0a10: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 6f   type affinity o
0a20: 66 20 74 68 65 20 6f 74 68 65 72 20 6f 70 65 72  f the other oper
0a30: 61 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  and.  This routi
0a40: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a  ne returns the.*
0a50: 2a 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20  * type affinity 
0a60: 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75  that should be u
0a70: 73 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6d 70  sed for the comp
0a80: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e  arison operator.
0a90: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
0aa0: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
0ab0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61  Expr *pExpr, cha
0ac0: 72 20 61 66 66 32 29 7b 0a 20 20 63 68 61 72 20  r aff2){.  char 
0ad0: 61 66 66 31 20 3d 20 73 71 6c 69 74 65 33 45 78  aff1 = sqlite3Ex
0ae0: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
0af0: 29 3b 0a 20 20 69 66 28 20 61 66 66 31 20 26 26  );.  if( aff1 &&
0b00: 20 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20   aff2 ){.    /* 
0b10: 42 6f 74 68 20 73 69 64 65 73 20 6f 66 20 74 68  Both sides of th
0b20: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65  e comparison are
0b30: 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e 65   columns. If one
0b40: 20 68 61 73 20 6e 75 6d 65 72 69 63 0a 20 20 20   has numeric.   
0b50: 20 2a 2a 20 61 66 66 69 6e 69 74 79 2c 20 75 73   ** affinity, us
0b60: 65 20 74 68 61 74 2e 20 4f 74 68 65 72 77 69 73  e that. Otherwis
0b70: 65 20 75 73 65 20 6e 6f 20 61 66 66 69 6e 69 74  e use no affinit
0b80: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
0b90: 28 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72  ( sqlite3IsNumer
0ba0: 69 63 41 66 66 69 6e 69 74 79 28 61 66 66 31 29  icAffinity(aff1)
0bb0: 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 4e 75 6d   || sqlite3IsNum
0bc0: 65 72 69 63 41 66 66 69 6e 69 74 79 28 61 66 66  ericAffinity(aff
0bd0: 32 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  2) ){.      retu
0be0: 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  rn SQLITE_AFF_NU
0bf0: 4d 45 52 49 43 3b 0a 20 20 20 20 7d 65 6c 73 65  MERIC;.    }else
0c00: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
0c10: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
0c20: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
0c30: 28 20 21 61 66 66 31 20 26 26 20 21 61 66 66 32  ( !aff1 && !aff2
0c40: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 69 74 68   ){.    /* Neith
0c50: 65 72 20 73 69 64 65 20 6f 66 20 74 68 65 20 63  er side of the c
0c60: 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20 63  omparison is a c
0c70: 6f 6c 75 6d 6e 2e 20 20 43 6f 6d 70 61 72 65 20  olumn.  Compare 
0c80: 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c  the.    ** resul
0c90: 74 73 20 64 69 72 65 63 74 6c 79 2e 0a 20 20 20  ts directly..   
0ca0: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
0cb0: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
0cc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
0cd0: 4f 6e 65 20 73 69 64 65 20 69 73 20 61 20 63 6f  One side is a co
0ce0: 6c 75 6d 6e 2c 20 74 68 65 20 6f 74 68 65 72 20  lumn, the other 
0cf0: 69 73 20 6e 6f 74 2e 20 55 73 65 20 74 68 65 20  is not. Use the 
0d00: 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79  columns affinity
0d10: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
0d20: 20 61 66 66 31 3d 3d 30 20 7c 7c 20 61 66 66 32   aff1==0 || aff2
0d30: 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ==0 );.    retur
0d40: 6e 20 28 61 66 66 31 20 2b 20 61 66 66 32 29 3b  n (aff1 + aff2);
0d50: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45  .  }.}../*.** pE
0d60: 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69  xpr is a compari
0d70: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 52  son operator.  R
0d80: 65 74 75 72 6e 20 74 68 65 20 74 79 70 65 20 61  eturn the type a
0d90: 66 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f  ffinity that sho
0da0: 75 6c 64 0a 2a 2a 20 62 65 20 61 70 70 6c 69 65  uld.** be applie
0db0: 64 20 74 6f 20 62 6f 74 68 20 6f 70 65 72 61 6e  d to both operan
0dc0: 64 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e  ds prior to doin
0dd0: 67 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  g the comparison
0de0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
0df0: 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e   comparisonAffin
0e00: 69 74 79 28 45 78 70 72 20 2a 70 45 78 70 72 29  ity(Expr *pExpr)
0e10: 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20  {.  char aff;.  
0e20: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
0e30: 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70  p==TK_EQ || pExp
0e40: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20  r->op==TK_IN || 
0e50: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54  pExpr->op==TK_LT
0e60: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45   ||.          pE
0e70: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 7c  xpr->op==TK_GT |
0e80: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
0e90: 47 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  GE || pExpr->op=
0ea0: 3d 54 4b 5f 4c 45 20 7c 7c 0a 20 20 20 20 20 20  =TK_LE ||.      
0eb0: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54      pExpr->op==T
0ec0: 4b 5f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74  K_NE );.  assert
0ed0: 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29  ( pExpr->pLeft )
0ee0: 3b 0a 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65  ;.  aff = sqlite
0ef0: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45  3ExprAffinity(pE
0f00: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69  xpr->pLeft);.  i
0f10: 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  f( pExpr->pRight
0f20: 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71   ){.    aff = sq
0f30: 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
0f40: 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 52 69 67  nity(pExpr->pRig
0f50: 68 74 2c 20 61 66 66 29 3b 0a 20 20 7d 0a 20 20  ht, aff);.  }.  
0f60: 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
0f70: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 61  pSelect ){.    a
0f80: 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  ff = sqlite3Comp
0f90: 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70  areAffinity(pExp
0fa0: 72 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  r->pSelect->pELi
0fb0: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  st->a[0].pExpr, 
0fc0: 61 66 66 29 3b 0a 20 20 7d 0a 20 20 65 6c 73 65  aff);.  }.  else
0fd0: 20 69 66 28 20 21 61 66 66 20 29 7b 0a 20 20 20   if( !aff ){.   
0fe0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
0ff0: 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 0a 20 20 72 65  F_NONE;.  }.  re
1000: 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a  turn aff;.}../*.
1010: 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63 6f  ** pExpr is a co
1020: 6d 70 61 72 69 73 6f 6e 20 65 78 70 72 65 73 73  mparison express
1030: 69 6f 6e 2c 20 65 67 2e 20 27 3d 27 2c 20 27 3c  ion, eg. '=', '<
1040: 27 2c 20 49 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a  ', IN(...) etc..
1050: 2a 2a 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20  ** idx_affinity 
1060: 69 73 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  is the affinity 
1070: 6f 66 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f  of an indexed co
1080: 6c 75 6d 6e 2e 20 52 65 74 75 72 6e 20 74 72 75  lumn. Return tru
1090: 65 0a 2a 2a 20 69 66 20 74 68 65 20 69 6e 64 65  e.** if the inde
10a0: 78 20 77 69 74 68 20 61 66 66 69 6e 69 74 79 20  x with affinity 
10b0: 69 64 78 5f 61 66 66 69 6e 69 74 79 20 6d 61 79  idx_affinity may
10c0: 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   be used to impl
10d0: 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 63 6f 6d  ement.** the com
10e0: 70 61 72 69 73 6f 6e 20 69 6e 20 70 45 78 70 72  parison in pExpr
10f0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1100: 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28  IndexAffinityOk(
1110: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61  Expr *pExpr, cha
1120: 72 20 69 64 78 5f 61 66 66 69 6e 69 74 79 29 7b  r idx_affinity){
1130: 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f  .  char aff = co
1140: 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79  mparisonAffinity
1150: 28 70 45 78 70 72 29 3b 0a 20 20 73 77 69 74 63  (pExpr);.  switc
1160: 68 28 20 61 66 66 20 29 7b 0a 20 20 20 20 63 61  h( aff ){.    ca
1170: 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  se SQLITE_AFF_NO
1180: 4e 45 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  NE:.      return
1190: 20 31 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   1;.    case SQL
11a0: 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20  ITE_AFF_TEXT:.  
11b0: 20 20 20 20 72 65 74 75 72 6e 20 69 64 78 5f 61      return idx_a
11c0: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
11d0: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 64 65  AFF_TEXT;.    de
11e0: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74  fault:.      ret
11f0: 75 72 6e 20 73 71 6c 69 74 65 33 49 73 4e 75 6d  urn sqlite3IsNum
1200: 65 72 69 63 41 66 66 69 6e 69 74 79 28 69 64 78  ericAffinity(idx
1210: 5f 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 7d 0a  _affinity);.  }.
1220: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1230: 74 68 65 20 50 31 20 76 61 6c 75 65 20 74 68 61  the P1 value tha
1240: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
1250: 20 66 6f 72 20 61 20 62 69 6e 61 72 79 20 63 6f   for a binary co
1260: 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f  mparison.** opco
1270: 64 65 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65  de (OP_Eq, OP_Ge
1280: 20 65 74 63 2e 29 20 75 73 65 64 20 74 6f 20 63   etc.) used to c
1290: 6f 6d 70 61 72 65 20 70 45 78 70 72 31 20 61 6e  ompare pExpr1 an
12a0: 64 20 70 45 78 70 72 32 2e 0a 2a 2a 20 49 66 20  d pExpr2..** If 
12b0: 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 74 72  jumpIfNull is tr
12c0: 75 65 2c 20 74 68 65 6e 20 73 65 74 20 74 68 65  ue, then set the
12d0: 20 6c 6f 77 20 62 79 74 65 20 6f 66 20 74 68 65   low byte of the
12e0: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 50 31 20   returned.** P1 
12f0: 76 61 6c 75 65 20 74 6f 20 74 65 6c 6c 20 74 68  value to tell th
1300: 65 20 6f 70 63 6f 64 65 20 74 6f 20 6a 75 6d 70  e opcode to jump
1310: 20 69 66 20 65 69 74 68 65 72 20 65 78 70 72 65   if either expre
1320: 73 73 69 6f 6e 0a 2a 2a 20 65 76 61 6c 75 61 74  ssion.** evaluat
1330: 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  es to NULL..*/.s
1340: 74 61 74 69 63 20 69 6e 74 20 62 69 6e 61 72 79  tatic int binary
1350: 43 6f 6d 70 61 72 65 50 31 28 45 78 70 72 20 2a  CompareP1(Expr *
1360: 70 45 78 70 72 31 2c 20 45 78 70 72 20 2a 70 45  pExpr1, Expr *pE
1370: 78 70 72 32 2c 20 69 6e 74 20 6a 75 6d 70 49 66  xpr2, int jumpIf
1380: 4e 75 6c 6c 29 7b 0a 20 20 63 68 61 72 20 61 66  Null){.  char af
1390: 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  f = sqlite3ExprA
13a0: 66 66 69 6e 69 74 79 28 70 45 78 70 72 32 29 3b  ffinity(pExpr2);
13b0: 0a 20 20 72 65 74 75 72 6e 20 28 28 69 6e 74 29  .  return ((int)
13c0: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
13d0: 66 69 6e 69 74 79 28 70 45 78 70 72 31 2c 20 61  finity(pExpr1, a
13e0: 66 66 29 29 2b 28 6a 75 6d 70 49 66 4e 75 6c 6c  ff))+(jumpIfNull
13f0: 3f 30 78 31 30 30 3a 30 29 3b 0a 7d 0a 0a 2f 2a  ?0x100:0);.}../*
1400: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
1410: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c  nter to the coll
1420: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74  ation sequence t
1430: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
1440: 65 64 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72  ed by.** a binar
1450: 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  y comparison ope
1460: 72 61 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20  rator comparing 
1470: 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74  pLeft and pRight
1480: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
1490: 65 66 74 20 68 61 6e 64 20 65 78 70 72 65 73 73  eft hand express
14a0: 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74  ion has a collat
14b0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 79 70  ing sequence typ
14c0: 65 2c 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a  e, then it is.**
14d0: 20 75 73 65 64 2e 20 4f 74 68 65 72 77 69 73 65   used. Otherwise
14e0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
14f0: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
1500: 72 69 67 68 74 20 68 61 6e 64 20 65 78 70 72 65  right hand expre
1510: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64  ssion.** is used
1520: 2c 20 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74  , or the default
1530: 20 28 42 49 4e 41 52 59 29 20 69 66 20 6e 65 69   (BINARY) if nei
1540: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ther expression 
1550: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a  has a collating.
1560: 2a 2a 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41  ** type..**.** A
1570: 72 67 75 6d 65 6e 74 20 70 52 69 67 68 74 20 28  rgument pRight (
1580: 62 75 74 20 6e 6f 74 20 70 4c 65 66 74 29 20 6d  but not pLeft) m
1590: 61 79 20 62 65 20 61 20 6e 75 6c 6c 20 70 6f 69  ay be a null poi
15a0: 6e 74 65 72 2e 20 49 6e 20 74 68 69 73 20 63 61  nter. In this ca
15b0: 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74  se,.** it is not
15c0: 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a   considered..*/.
15d0: 43 6f 6c 6c 53 65 71 2a 20 73 71 6c 69 74 65 33  CollSeq* sqlite3
15e0: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
15f0: 6c 53 65 71 28 0a 20 20 50 61 72 73 65 20 2a 70  lSeq(.  Parse *p
1600: 50 61 72 73 65 2c 20 0a 20 20 45 78 70 72 20 2a  Parse, .  Expr *
1610: 70 4c 65 66 74 2c 20 0a 20 20 45 78 70 72 20 2a  pLeft, .  Expr *
1620: 70 52 69 67 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c  pRight.){.  Coll
1630: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73  Seq *pColl;.  as
1640: 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20  sert( pLeft );. 
1650: 20 69 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67   if( pLeft->flag
1660: 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74  s & EP_ExpCollat
1670: 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
1680: 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 20 29 3b   pLeft->pColl );
1690: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 4c 65  .    pColl = pLe
16a0: 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 7d 65 6c  ft->pColl;.  }el
16b0: 73 65 20 69 66 28 20 70 52 69 67 68 74 20 26 26  se if( pRight &&
16c0: 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26   pRight->flags &
16d0: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29   EP_ExpCollate )
16e0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  {.    assert( pR
16f0: 69 67 68 74 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20  ight->pColl );. 
1700: 20 20 20 70 43 6f 6c 6c 20 3d 20 70 52 69 67 68     pColl = pRigh
1710: 74 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 7d 65 6c 73  t->pColl;.  }els
1720: 65 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  e{.    pColl = s
1730: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
1740: 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29  q(pParse, pLeft)
1750: 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c  ;.    if( !pColl
1760: 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20   ){.      pColl 
1770: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
1780: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 52 69  lSeq(pParse, pRi
1790: 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ght);.    }.  }.
17a0: 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a    return pColl;.
17b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
17c0: 65 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d  e code for a com
17d0: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
17e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17f0: 63 6f 64 65 43 6f 6d 70 61 72 65 28 0a 20 20 50  codeCompare(.  P
1800: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1810: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
1820: 28 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61  (and code genera
1830: 74 69 6e 67 29 20 63 6f 6e 74 65 78 74 20 2a 2f  ting) context */
1840: 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20  .  Expr *pLeft, 
1850: 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74       /* The left
1860: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78   operand */.  Ex
1870: 70 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20  pr *pRight,     
1880: 2f 2a 20 54 68 65 20 72 69 67 68 74 20 6f 70 65  /* The right ope
1890: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  rand */.  int op
18a0: 63 6f 64 65 2c 20 20 20 20 20 20 20 2f 2a 20 54  code,       /* T
18b0: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  he comparison op
18c0: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65  code */.  int de
18d0: 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  st,         /* J
18e0: 75 6d 70 20 68 65 72 65 20 69 66 20 74 72 75 65  ump here if true
18f0: 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70  .  */.  int jump
1900: 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66 20  IfNull    /* If 
1910: 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20 65 69  true, jump if ei
1920: 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20  ther operand is 
1930: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  NULL */.){.  int
1940: 20 70 31 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70   p1 = binaryComp
1950: 61 72 65 50 31 28 70 4c 65 66 74 2c 20 70 52 69  areP1(pLeft, pRi
1960: 67 68 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  ght, jumpIfNull)
1970: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 33 20  ;.  CollSeq *p3 
1980: 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
1990: 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
19a0: 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69  arse, pLeft, pRi
19b0: 67 68 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  ght);.  return s
19c0: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 70 50  qlite3VdbeOp3(pP
19d0: 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63  arse->pVdbe, opc
19e0: 6f 64 65 2c 20 70 31 2c 20 64 65 73 74 2c 20 28  ode, p1, dest, (
19f0: 76 6f 69 64 2a 29 70 33 2c 20 50 33 5f 43 4f 4c  void*)p3, P3_COL
1a00: 4c 53 45 51 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  LSEQ);.}../*.** 
1a10: 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20  Construct a new 
1a20: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
1a30: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
1a40: 6e 74 65 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d  nter to it.  Mem
1a50: 6f 72 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20  ory.** for this 
1a60: 6e 6f 64 65 20 69 73 20 6f 62 74 61 69 6e 65 64  node is obtained
1a70: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
1a80: 6f 63 28 29 2e 20 20 54 68 65 20 63 61 6c 6c 69  oc().  The calli
1a90: 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  ng function.** i
1aa0: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
1ab0: 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 74 68  r making sure th
1ac0: 65 20 6e 6f 64 65 20 65 76 65 6e 74 75 61 6c 6c  e node eventuall
1ad0: 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a 2a 2f  y gets freed..*/
1ae0: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
1af0: 70 72 28 69 6e 74 20 6f 70 2c 20 45 78 70 72 20  pr(int op, Expr 
1b00: 2a 70 4c 65 66 74 2c 20 45 78 70 72 20 2a 70 52  *pLeft, Expr *pR
1b10: 69 67 68 74 2c 20 63 6f 6e 73 74 20 54 6f 6b 65  ight, const Toke
1b20: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78  n *pToken){.  Ex
1b30: 70 72 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77  pr *pNew;.  pNew
1b40: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
1b50: 20 73 69 7a 65 6f 66 28 45 78 70 72 29 20 29 3b   sizeof(Expr) );
1b60: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
1b70: 7b 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 6d 61  {.    /* When ma
1b80: 6c 6c 6f 63 20 66 61 69 6c 73 2c 20 64 65 6c 65  lloc fails, dele
1b90: 74 65 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69  te pLeft and pRi
1ba0: 67 68 74 2e 20 45 78 70 72 65 73 73 69 6f 6e 73  ght. Expressions
1bb0: 20 70 61 73 73 65 64 20 74 6f 20 0a 20 20 20 20   passed to .    
1bc0: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
1bd0: 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 20   must always be 
1be0: 61 6c 6c 6f 63 61 74 65 64 20 77 69 74 68 20 73  allocated with s
1bf0: 71 6c 69 74 65 33 45 78 70 72 28 29 20 66 6f 72  qlite3Expr() for
1c00: 20 74 68 69 73 20 0a 20 20 20 20 2a 2a 20 72 65   this .    ** re
1c10: 61 73 6f 6e 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  ason. .    */.  
1c20: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
1c30: 65 74 65 28 70 4c 65 66 74 29 3b 0a 20 20 20 20  ete(pLeft);.    
1c40: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1c50: 65 28 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72  e(pRight);.    r
1c60: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
1c70: 4e 65 77 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20  New->op = op;.  
1c80: 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 4c  pNew->pLeft = pL
1c90: 65 66 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69  eft;.  pNew->pRi
1ca0: 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  ght = pRight;.  
1cb0: 70 4e 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b  pNew->iAgg = -1;
1cc0: 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b  .  if( pToken ){
1cd0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f  .    assert( pTo
1ce0: 6b 65 6e 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20  ken->dyn==0 );. 
1cf0: 20 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20     pNew->span = 
1d00: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70  pNew->token = *p
1d10: 54 6f 6b 65 6e 3b 0a 20 20 7d 65 6c 73 65 20 69  Token;.  }else i
1d20: 66 28 20 70 4c 65 66 74 20 29 7b 0a 20 20 20 20  f( pLeft ){.    
1d30: 69 66 28 20 70 52 69 67 68 74 20 29 7b 0a 20 20  if( pRight ){.  
1d40: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53      sqlite3ExprS
1d50: 70 61 6e 28 70 4e 65 77 2c 20 26 70 4c 65 66 74  pan(pNew, &pLeft
1d60: 2d 3e 73 70 61 6e 2c 20 26 70 52 69 67 68 74 2d  ->span, &pRight-
1d70: 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 69 66  >span);.      if
1d80: 28 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20  ( pRight->flags 
1d90: 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20  & EP_ExpCollate 
1da0: 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
1db0: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78 70  >flags |= EP_Exp
1dc0: 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 20  Collate;.       
1dd0: 20 70 4e 65 77 2d 3e 70 43 6f 6c 6c 20 3d 20 70   pNew->pColl = p
1de0: 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 3b 0a 20 20  Right->pColl;.  
1df0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1e00: 69 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73  if( pLeft->flags
1e10: 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65   & EP_ExpCollate
1e20: 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   ){.      pNew->
1e30: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78 70 43  flags |= EP_ExpC
1e40: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 70 4e  ollate;.      pN
1e50: 65 77 2d 3e 70 43 6f 6c 6c 20 3d 20 70 4c 65 66  ew->pColl = pLef
1e60: 74 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a  t->pColl;.    }.
1e70: 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 45 78    }..  sqlite3Ex
1e80: 70 72 53 65 74 48 65 69 67 68 74 28 70 4e 65 77  prSetHeight(pNew
1e90: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  );.  return pNew
1ea0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 6f 72 6b 73  ;.}../*.** Works
1eb0: 20 6c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70   like sqlite3Exp
1ec0: 72 28 29 20 62 75 74 20 66 72 65 65 73 20 69 74  r() but frees it
1ed0: 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67  s pLeft and pRig
1ee0: 68 74 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2a 20  ht arguments.** 
1ef0: 69 66 20 69 74 20 66 61 69 6c 73 20 64 75 65 20  if it fails due 
1f00: 74 6f 20 61 20 6d 61 6c 6c 6f 63 20 70 72 6f 62  to a malloc prob
1f10: 6c 65 6d 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  lem..*/.Expr *sq
1f20: 6c 69 74 65 33 45 78 70 72 4f 72 46 72 65 65 28  lite3ExprOrFree(
1f30: 69 6e 74 20 6f 70 2c 20 45 78 70 72 20 2a 70 4c  int op, Expr *pL
1f40: 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68  eft, Expr *pRigh
1f50: 74 2c 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a  t, const Token *
1f60: 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20  pToken){.  Expr 
1f70: 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45  *pNew = sqlite3E
1f80: 78 70 72 28 6f 70 2c 20 70 4c 65 66 74 2c 20 70  xpr(op, pLeft, p
1f90: 52 69 67 68 74 2c 20 70 54 6f 6b 65 6e 29 3b 0a  Right, pToken);.
1fa0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
1fb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1fc0: 44 65 6c 65 74 65 28 70 4c 65 66 74 29 3b 0a 20  Delete(pLeft);. 
1fd0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
1fe0: 6c 65 74 65 28 70 52 69 67 68 74 29 3b 0a 20 20  lete(pRight);.  
1ff0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
2000: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64  .}../*.** When d
2010: 6f 69 6e 67 20 61 20 6e 65 73 74 65 64 20 70 61  oing a nested pa
2020: 72 73 65 2c 20 79 6f 75 20 63 61 6e 20 69 6e 63  rse, you can inc
2030: 6c 75 64 65 20 74 65 72 6d 73 20 69 6e 20 61 6e  lude terms in an
2040: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74   expression.** t
2050: 68 61 74 20 6c 6f 6f 6b 20 6c 69 6b 65 20 74 68  hat look like th
2060: 69 73 3a 20 20 20 23 30 20 23 31 20 23 32 20 2e  is:   #0 #1 #2 .
2070: 2e 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73 20  ..  These terms 
2080: 72 65 66 65 72 20 74 6f 20 65 6c 65 6d 65 6e 74  refer to element
2090: 73 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61 63  s.** on the stac
20a0: 6b 2e 20 20 22 23 30 22 20 6d 65 61 6e 73 20 74  k.  "#0" means t
20b0: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
20c0: 61 63 6b 2e 0a 2a 2a 20 22 23 31 22 20 6d 65 61  ack..** "#1" mea
20d0: 6e 73 20 74 68 65 20 6e 65 78 74 20 64 6f 77 6e  ns the next down
20e0: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
20f0: 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a  And so forth..**
2100: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2110: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
2120: 65 20 70 61 72 73 65 72 20 74 6f 20 64 65 61 6c  e parser to deal
2130: 20 77 69 74 68 20 6f 6e 20 6f 66 20 74 68 6f 73   with on of thos
2140: 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 49 74 20 69  e terms..** It i
2150: 6d 6d 65 64 69 61 74 65 6c 79 20 67 65 6e 65 72  mmediately gener
2160: 61 74 65 73 20 63 6f 64 65 20 74 6f 20 73 74 6f  ates code to sto
2170: 72 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  re the value in 
2180: 61 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  a memory locatio
2190: 6e 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  n..** The return
21a0: 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  s an expression 
21b0: 74 68 61 74 20 77 69 6c 6c 20 63 6f 64 65 20 74  that will code t
21c0: 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 76 61  o extract the va
21d0: 6c 75 65 20 66 72 6f 6d 0a 2a 2a 20 74 68 61 74  lue from.** that
21e0: 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
21f0: 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 45   as needed..*/.E
2200: 78 70 72 20 2a 73 71 6c 69 74 65 33 52 65 67 69  xpr *sqlite3Regi
2210: 73 74 65 72 45 78 70 72 28 50 61 72 73 65 20 2a  sterExpr(Parse *
2220: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
2230: 54 6f 6b 65 6e 29 7b 0a 20 20 56 64 62 65 20 2a  Token){.  Vdbe *
2240: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
2250: 65 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20  e;.  Expr *p;.  
2260: 69 6e 74 20 64 65 70 74 68 3b 0a 20 20 69 66 28  int depth;.  if(
2270: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d   pParse->nested=
2280: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
2290: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
22a0: 2c 20 22 6e 65 61 72 20 5c 22 25 54 5c 22 3a 20  , "near \"%T\": 
22b0: 73 79 6e 74 61 78 20 65 72 72 6f 72 22 2c 20 70  syntax error", p
22c0: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 72 65 74 75  Token);.    retu
22d0: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 28 54  rn sqlite3Expr(T
22e0: 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20 30 29  K_NULL, 0, 0, 0)
22f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 76 3d 3d 30  ;.  }.  if( v==0
2300: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
2310: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
2320: 4b 5f 52 45 47 49 53 54 45 52 2c 20 30 2c 20 30  K_REGISTER, 0, 0
2330: 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28  , pToken);.  if(
2340: 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74   p==0 ){.    ret
2350: 75 72 6e 20 30 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  urn 0;  /* Mallo
2360: 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a  c failed */.  }.
2370: 20 20 64 65 70 74 68 20 3d 20 61 74 6f 69 28 28    depth = atoi((
2380: 63 68 61 72 2a 29 26 70 54 6f 6b 65 6e 2d 3e 7a  char*)&pToken->z
2390: 5b 31 5d 29 3b 0a 20 20 70 2d 3e 69 54 61 62 6c  [1]);.  p->iTabl
23a0: 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  e = pParse->nMem
23b0: 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ++;.  sqlite3Vdb
23c0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70  eAddOp(v, OP_Dup
23d0: 2c 20 64 65 70 74 68 2c 20 30 29 3b 0a 20 20 73  , depth, 0);.  s
23e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
23f0: 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
2400: 70 2d 3e 69 54 61 62 6c 65 2c 20 31 29 3b 0a 20  p->iTable, 1);. 
2410: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
2420: 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70  .** Join two exp
2430: 72 65 73 73 69 6f 6e 73 20 75 73 69 6e 67 20 61  ressions using a
2440: 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20  n AND operator. 
2450: 20 49 66 20 65 69 74 68 65 72 20 65 78 70 72 65   If either expre
2460: 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c  ssion is.** NULL
2470: 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75  , then just retu
2480: 72 6e 20 74 68 65 20 6f 74 68 65 72 20 65 78 70  rn the other exp
2490: 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 45 78 70 72  ression..*/.Expr
24a0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64   *sqlite3ExprAnd
24b0: 28 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78  (Expr *pLeft, Ex
24c0: 70 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69  pr *pRight){.  i
24d0: 66 28 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20  f( pLeft==0 ){. 
24e0: 20 20 20 72 65 74 75 72 6e 20 70 52 69 67 68 74     return pRight
24f0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52  ;.  }else if( pR
2500: 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ight==0 ){.    r
2510: 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d  eturn pLeft;.  }
2520: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
2530: 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f   sqlite3Expr(TK_
2540: 41 4e 44 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  AND, pLeft, pRig
2550: 68 74 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ht, 0);.  }.}../
2560: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70  *.** Set the Exp
2570: 72 2e 73 70 61 6e 20 66 69 65 6c 64 20 6f 66 20  r.span field of 
2580: 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
2590: 73 69 6f 6e 20 74 6f 20 73 70 61 6e 20 61 6c 6c  sion to span all
25a0: 0a 2a 2a 20 74 65 78 74 20 62 65 74 77 65 65 6e  .** text between
25b0: 20 74 68 65 20 74 77 6f 20 67 69 76 65 6e 20 74   the two given t
25c0: 6f 6b 65 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  okens..*/.void s
25d0: 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28 45  qlite3ExprSpan(E
25e0: 78 70 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65  xpr *pExpr, Toke
25f0: 6e 20 2a 70 4c 65 66 74 2c 20 54 6f 6b 65 6e 20  n *pLeft, Token 
2600: 2a 70 52 69 67 68 74 29 7b 0a 20 20 61 73 73 65  *pRight){.  asse
2610: 72 74 28 20 70 52 69 67 68 74 21 3d 30 20 29 3b  rt( pRight!=0 );
2620: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74  .  assert( pLeft
2630: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 73 71  !=0 );.  if( !sq
2640: 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65  lite3MallocFaile
2650: 64 28 29 20 26 26 20 70 52 69 67 68 74 2d 3e 7a  d() && pRight->z
2660: 20 26 26 20 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a   && pLeft->z ){.
2670: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66      assert( pLef
2680: 74 2d 3e 64 79 6e 3d 3d 30 20 7c 7c 20 70 4c 65  t->dyn==0 || pLe
2690: 66 74 2d 3e 7a 5b 70 4c 65 66 74 2d 3e 6e 5d 3d  ft->z[pLeft->n]=
26a0: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  =0 );.    if( pL
26b0: 65 66 74 2d 3e 64 79 6e 3d 3d 30 20 26 26 20 70  eft->dyn==0 && p
26c0: 52 69 67 68 74 2d 3e 64 79 6e 3d 3d 30 20 29 7b  Right->dyn==0 ){
26d0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70  .      pExpr->sp
26e0: 61 6e 2e 7a 20 3d 20 70 4c 65 66 74 2d 3e 7a 3b  an.z = pLeft->z;
26f0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70  .      pExpr->sp
2700: 61 6e 2e 6e 20 3d 20 70 52 69 67 68 74 2d 3e 6e  an.n = pRight->n
2710: 20 2b 20 28 70 52 69 67 68 74 2d 3e 7a 20 2d 20   + (pRight->z - 
2720: 70 4c 65 66 74 2d 3e 7a 29 3b 0a 20 20 20 20 7d  pLeft->z);.    }
2730: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 45 78 70  else{.      pExp
2740: 72 2d 3e 73 70 61 6e 2e 7a 20 3d 20 30 3b 0a 20  r->span.z = 0;. 
2750: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
2760: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65  * Construct a ne
2770: 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  w expression nod
2780: 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e  e for a function
2790: 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a   with multiple.*
27a0: 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a  * arguments..*/.
27b0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
27c0: 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 4c 69  rFunction(ExprLi
27d0: 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e  st *pList, Token
27e0: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70   *pToken){.  Exp
27f0: 72 20 2a 70 4e 65 77 3b 0a 20 20 61 73 73 65 72  r *pNew;.  asser
2800: 74 28 20 70 54 6f 6b 65 6e 20 29 3b 0a 20 20 70  t( pToken );.  p
2810: 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  New = sqliteMall
2820: 6f 63 28 20 73 69 7a 65 6f 66 28 45 78 70 72 29  oc( sizeof(Expr)
2830: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
2840: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
2850: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
2860: 4c 69 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20  List); /* Avoid 
2870: 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 77  leaking memory w
2880: 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73  hen malloc fails
2890: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30   */.    return 0
28a0: 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70  ;.  }.  pNew->op
28b0: 20 3d 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3b 0a   = TK_FUNCTION;.
28c0: 20 20 70 4e 65 77 2d 3e 70 4c 69 73 74 20 3d 20    pNew->pList = 
28d0: 70 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74 28  pList;.  assert(
28e0: 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e 3d 3d 30 20   pToken->dyn==0 
28f0: 29 3b 0a 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e  );.  pNew->token
2900: 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 70 4e   = *pToken;.  pN
2910: 65 77 2d 3e 73 70 61 6e 20 3d 20 70 4e 65 77 2d  ew->span = pNew-
2920: 3e 74 6f 6b 65 6e 3b 0a 0a 20 20 73 71 6c 69 74  >token;..  sqlit
2930: 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74 28  e3ExprSetHeight(
2940: 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20  pNew);.  return 
2950: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  pNew;.}../*.** A
2960: 73 73 69 67 6e 20 61 20 76 61 72 69 61 62 6c 65  ssign a variable
2970: 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20 65 78   number to an ex
2980: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 65 6e  pression that en
2990: 63 6f 64 65 73 20 61 20 77 69 6c 64 63 61 72 64  codes a wildcard
29a0: 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69 67 69  .** in the origi
29b0: 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  nal SQL statemen
29c0: 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63  t.  .**.** Wildc
29d0: 61 72 64 73 20 63 6f 6e 73 69 73 74 69 6e 67 20  ards consisting 
29e0: 6f 66 20 61 20 73 69 6e 67 6c 65 20 22 3f 22 20  of a single "?" 
29f0: 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 68 65  are assigned the
2a00: 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69 61 6c   next sequential
2a10: 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  .** variable num
2a20: 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63  ber..**.** Wildc
2a30: 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ards of the form
2a40: 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73 73 69   "?nnn" are assi
2a50: 67 6e 65 64 20 74 68 65 20 6e 75 6d 62 65 72 20  gned the number 
2a60: 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a  "nnn".  We make.
2a70: 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20 69 73  ** sure "nnn" is
2a80: 20 6e 6f 74 20 74 6f 6f 20 62 65 20 74 6f 20 61   not too be to a
2a90: 76 6f 69 64 20 61 20 64 65 6e 69 61 6c 20 6f 66  void a denial of
2aa0: 20 73 65 72 76 69 63 65 20 61 74 74 61 63 6b 20   service attack 
2ab0: 77 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20  when.** the SQL 
2ac0: 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20  statement comes 
2ad0: 66 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c  from an external
2ae0: 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57   source..**.** W
2af0: 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20  ildcards of the 
2b00: 66 6f 72 6d 20 22 3a 61 61 61 22 20 6f 72 20 22  form ":aaa" or "
2b10: 24 61 61 61 22 20 61 72 65 20 61 73 73 69 67 6e  $aaa" are assign
2b20: 65 64 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ed the same numb
2b30: 65 72 0a 2a 2a 20 61 73 20 74 68 65 20 70 72 65  er.** as the pre
2b40: 76 69 6f 75 73 20 69 6e 73 74 61 6e 63 65 20 6f  vious instance o
2b50: 66 20 74 68 65 20 73 61 6d 65 20 77 69 6c 64 63  f the same wildc
2b60: 61 72 64 2e 20 20 4f 72 20 69 66 20 74 68 69 73  ard.  Or if this
2b70: 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   is the first.**
2b80: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
2b90: 20 77 69 6c 64 63 61 72 64 2c 20 74 68 65 20 6e   wildcard, the n
2ba0: 65 78 74 20 73 65 71 75 65 6e 69 61 6c 20 76 61  ext sequenial va
2bb0: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 73  riable number is
2bc0: 0a 2a 2a 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f  .** assigned..*/
2bd0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
2be0: 72 41 73 73 69 67 6e 56 61 72 4e 75 6d 62 65 72  rAssignVarNumber
2bf0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2c00: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
2c10: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 3b 0a 20  Token *pToken;. 
2c20: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
2c30: 72 65 74 75 72 6e 3b 0a 20 20 70 54 6f 6b 65 6e  return;.  pToken
2c40: 20 3d 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e   = &pExpr->token
2c50: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b  ;.  assert( pTok
2c60: 65 6e 2d 3e 6e 3e 3d 31 20 29 3b 0a 20 20 61 73  en->n>=1 );.  as
2c70: 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21  sert( pToken->z!
2c80: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2c90: 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 21 3d 30 20  pToken->z[0]!=0 
2ca0: 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d  );.  if( pToken-
2cb0: 3e 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20  >n==1 ){.    /* 
2cc0: 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20  Wildcard of the 
2cd0: 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73 69 67  form "?".  Assig
2ce0: 6e 20 74 68 65 20 6e 65 78 74 20 76 61 72 69 61  n the next varia
2cf0: 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ble number */.  
2d00: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
2d10: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72  = ++pParse->nVar
2d20: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54  ;.  }else if( pT
2d30: 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 3f 27 20  oken->z[0]=='?' 
2d40: 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61  ){.    /* Wildca
2d50: 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rd of the form "
2d60: 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20  ?nnn".  Convert 
2d70: 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65  "nnn" to an inte
2d80: 67 65 72 20 61 6e 64 0a 20 20 20 20 2a 2a 20 75  ger and.    ** u
2d90: 73 65 20 69 74 20 61 73 20 74 68 65 20 76 61 72  se it as the var
2da0: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  iable number */.
2db0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 70      int i;.    p
2dc0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69  Expr->iTable = i
2dd0: 20 3d 20 61 74 6f 69 28 28 63 68 61 72 2a 29 26   = atoi((char*)&
2de0: 70 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d 29 3b 0a 20  pToken->z[1]);. 
2df0: 20 20 20 69 66 28 20 69 3c 31 20 7c 7c 20 69 3e     if( i<1 || i>
2e00: 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41  SQLITE_MAX_VARIA
2e10: 42 4c 45 5f 4e 55 4d 42 45 52 20 29 7b 0a 20 20  BLE_NUMBER ){.  
2e20: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
2e30: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 61 72  Msg(pParse, "var
2e40: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73  iable number mus
2e50: 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20  t be between ?1 
2e60: 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20  and ?%d",.      
2e70: 20 20 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56      SQLITE_MAX_V
2e80: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 29 3b  ARIABLE_NUMBER);
2e90: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
2ea0: 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b  >pParse->nVar ){
2eb0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
2ec0: 56 61 72 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20  Var = i;.    }. 
2ed0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57   }else{.    /* W
2ee0: 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20  ildcards of the 
2ef0: 66 6f 72 6d 20 22 3a 61 61 61 22 20 6f 72 20 22  form ":aaa" or "
2f00: 24 61 61 61 22 2e 20 20 52 65 75 73 65 20 74 68  $aaa".  Reuse th
2f10: 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 0a  e same variable.
2f20: 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73      ** number as
2f30: 20 74 68 65 20 70 72 69 6f 72 20 61 70 70 65 61   the prior appea
2f40: 72 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d  rance of the sam
2f50: 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68  e name, or if th
2f60: 65 20 6e 61 6d 65 0a 20 20 20 20 2a 2a 20 68 61  e name.    ** ha
2f70: 73 20 6e 65 76 65 72 20 61 70 70 65 61 72 65 64  s never appeared
2f80: 20 62 65 66 6f 72 65 2c 20 72 65 75 73 65 20 74   before, reuse t
2f90: 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65  he same variable
2fa0: 20 6e 75 6d 62 65 72 0a 20 20 20 20 2a 2f 0a 20   number.    */. 
2fb0: 20 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 20     int i, n;.   
2fc0: 20 6e 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 3b 0a   n = pToken->n;.
2fd0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
2fe0: 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 3b  Parse->nVarExpr;
2ff0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
3000: 72 20 2a 70 45 3b 0a 20 20 20 20 20 20 69 66 28  r *pE;.      if(
3010: 20 28 70 45 20 3d 20 70 50 61 72 73 65 2d 3e 61   (pE = pParse->a
3020: 70 56 61 72 45 78 70 72 5b 69 5d 29 21 3d 30 0a  pVarExpr[i])!=0.
3030: 20 20 20 20 20 20 20 20 20 20 26 26 20 70 45 2d            && pE-
3040: 3e 74 6f 6b 65 6e 2e 6e 3d 3d 6e 0a 20 20 20 20  >token.n==n.    
3050: 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28        && memcmp(
3060: 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 54 6f  pE->token.z, pTo
3070: 6b 65 6e 2d 3e 7a 2c 20 6e 29 3d 3d 30 20 29 7b  ken->z, n)==0 ){
3080: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
3090: 69 54 61 62 6c 65 20 3d 20 70 45 2d 3e 69 54 61  iTable = pE->iTa
30a0: 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ble;.        bre
30b0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
30c0: 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 70 50 61  }.    if( i>=pPa
30d0: 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 20 29 7b  rse->nVarExpr ){
30e0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54  .      pExpr->iT
30f0: 61 62 6c 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d  able = ++pParse-
3100: 3e 6e 56 61 72 3b 0a 20 20 20 20 20 20 69 66 28  >nVar;.      if(
3110: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70   pParse->nVarExp
3120: 72 3e 3d 70 50 61 72 73 65 2d 3e 6e 56 61 72 45  r>=pParse->nVarE
3130: 78 70 72 41 6c 6c 6f 63 2d 31 20 29 7b 0a 20 20  xprAlloc-1 ){.  
3140: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56        pParse->nV
3150: 61 72 45 78 70 72 41 6c 6c 6f 63 20 2b 3d 20 70  arExprAlloc += p
3160: 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41  Parse->nVarExprA
3170: 6c 6c 6f 63 20 2b 20 31 30 3b 0a 20 20 20 20 20  lloc + 10;.     
3180: 20 20 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72     pParse->apVar
3190: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 52 65 61  Expr = sqliteRea
31a0: 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50 61 72 73  llocOrFree(pPars
31b0: 65 2d 3e 61 70 56 61 72 45 78 70 72 2c 0a 20 20  e->apVarExpr,.  
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61       pParse->nVa
31e0: 72 45 78 70 72 41 6c 6c 6f 63 2a 73 69 7a 65 6f  rExprAlloc*sizeo
31f0: 66 28 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45  f(pParse->apVarE
3200: 78 70 72 5b 30 5d 29 20 29 3b 0a 20 20 20 20 20  xpr[0]) );.     
3210: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73 71   }.      if( !sq
3220: 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65  lite3MallocFaile
3230: 64 28 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61  d() ){.        a
3240: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 61  ssert( pParse->a
3250: 70 56 61 72 45 78 70 72 21 3d 30 20 29 3b 0a 20  pVarExpr!=0 );. 
3260: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
3270: 70 56 61 72 45 78 70 72 5b 70 50 61 72 73 65 2d  pVarExpr[pParse-
3280: 3e 6e 56 61 72 45 78 70 72 2b 2b 5d 20 3d 20 70  >nVarExpr++] = p
3290: 45 78 70 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Expr;.      }.  
32a0: 20 20 7d 0a 20 20 7d 20 0a 20 20 69 66 28 20 21    }.  } .  if( !
32b0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 26 26 20  pParse->nErr && 
32c0: 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 53 51 4c  pParse->nVar>SQL
32d0: 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45  ITE_MAX_VARIABLE
32e0: 5f 4e 55 4d 42 45 52 20 29 7b 0a 20 20 20 20 73  _NUMBER ){.    s
32f0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
3300: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
3310: 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73 22 29   SQL variables")
3320: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
3330: 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74  ecursively delet
3340: 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
3350: 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tree..*/.void sq
3360: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
3370: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
3380: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
3390: 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 64 79 6e   if( p->span.dyn
33a0: 20 29 20 73 71 6c 69 74 65 46 72 65 65 28 28 63   ) sqliteFree((c
33b0: 68 61 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a 29 3b  har*)p->span.z);
33c0: 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e  .  if( p->token.
33d0: 64 79 6e 20 29 20 73 71 6c 69 74 65 46 72 65 65  dyn ) sqliteFree
33e0: 28 28 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e  ((char*)p->token
33f0: 2e 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  .z);.  sqlite3Ex
3400: 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c 65 66  prDelete(p->pLef
3410: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t);.  sqlite3Exp
3420: 72 44 65 6c 65 74 65 28 70 2d 3e 70 52 69 67 68  rDelete(p->pRigh
3430: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t);.  sqlite3Exp
3440: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70  rListDelete(p->p
3450: 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  List);.  sqlite3
3460: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 2d 3e  SelectDelete(p->
3470: 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69  pSelect);.  sqli
3480: 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a  teFree(p);.}../*
3490: 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e 74 6f 6b  .** The Expr.tok
34a0: 65 6e 20 66 69 65 6c 64 20 6d 69 67 68 74 20 62  en field might b
34b0: 65 20 61 20 73 74 72 69 6e 67 20 6c 69 74 65 72  e a string liter
34c0: 61 6c 20 74 68 61 74 20 69 73 20 71 75 6f 74 65  al that is quote
34d0: 64 2e 0a 2a 2a 20 49 66 20 73 6f 2c 20 72 65 6d  d..** If so, rem
34e0: 6f 76 65 20 74 68 65 20 71 75 6f 74 61 74 69 6f  ove the quotatio
34f0: 6e 20 6d 61 72 6b 73 2e 0a 2a 2f 0a 76 6f 69 64  n marks..*/.void
3500: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 45   sqlite3DequoteE
3510: 78 70 72 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  xpr(Expr *p){.  
3520: 69 66 28 20 45 78 70 72 48 61 73 41 6e 79 50 72  if( ExprHasAnyPr
3530: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 44 65 71  operty(p, EP_Deq
3540: 75 6f 74 65 64 29 20 29 7b 0a 20 20 20 20 72 65  uoted) ){.    re
3550: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 45 78 70 72  turn;.  }.  Expr
3560: 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45  SetProperty(p, E
3570: 50 5f 44 65 71 75 6f 74 65 64 29 3b 0a 20 20 69  P_Dequoted);.  i
3580: 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 3d  f( p->token.dyn=
3590: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
35a0: 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 2d 3e 74  3TokenCopy(&p->t
35b0: 6f 6b 65 6e 2c 20 26 70 2d 3e 74 6f 6b 65 6e 29  oken, &p->token)
35c0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
35d0: 65 71 75 6f 74 65 28 28 63 68 61 72 2a 29 70 2d  equote((char*)p-
35e0: 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 7d 0a 0a 0a 2f  >token.z);.}.../
35f0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
3600: 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74  ng group of rout
3610: 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63  ines make deep c
3620: 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65 73 73  opies of express
3630: 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73  ions,.** express
3640: 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69  ion lists, ID li
3650: 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20  sts, and select 
3660: 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65  statements.  The
3670: 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62   copies can.** b
3680: 65 20 64 65 6c 65 74 65 64 20 28 62 79 20 62 65  e deleted (by be
3690: 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74 68  ing passed to th
36a0: 65 69 72 20 72 65 73 70 65 63 74 69 76 65 20 2e  eir respective .
36b0: 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69  ..Delete() routi
36c0: 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20  nes).** without 
36d0: 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72  effecting the or
36e0: 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54  iginals..**.** T
36f0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
3700: 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72  st, ID, and sour
3710: 63 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20  ce lists return 
3720: 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  by sqlite3ExprLi
3730: 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69  stDup(),.** sqli
3740: 74 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20  te3IdListDup(), 
3750: 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  and sqlite3SrcLi
3760: 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20  stDup() can not 
3770: 62 65 20 66 75 72 74 68 65 72 20 65 78 70 61 6e  be further expan
3780: 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65  ded .** by subse
3790: 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73  quent calls to s
37a0: 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64  qlite*ListAppend
37b0: 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a  () routines..**.
37c0: 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68  ** Any tables th
37d0: 61 74 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d  at the SrcList m
37e0: 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72  ight point to ar
37f0: 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64  e not duplicated
3800: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
3810: 65 33 45 78 70 72 44 75 70 28 45 78 70 72 20 2a  e3ExprDup(Expr *
3820: 70 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  p){.  Expr *pNew
3830: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
3840: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20  eturn 0;.  pNew 
3850: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
3860: 77 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b  w( sizeof(*p) );
3870: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
3880: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d   return 0;.  mem
3890: 63 70 79 28 70 4e 65 77 2c 20 70 2c 20 73 69 7a  cpy(pNew, p, siz
38a0: 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69  eof(*pNew));.  i
38b0: 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 21 3d 30  f( p->token.z!=0
38c0: 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f   ){.    pNew->to
38d0: 6b 65 6e 2e 7a 20 3d 20 28 75 38 2a 29 73 71 6c  ken.z = (u8*)sql
38e0: 69 74 65 53 74 72 4e 44 75 70 28 28 63 68 61 72  iteStrNDup((char
38f0: 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 2d  *)p->token.z, p-
3900: 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 70  >token.n);.    p
3910: 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d  New->token.dyn =
3920: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
3930: 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 74   assert( pNew->t
3940: 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 3b 0a 20 20 7d  oken.z==0 );.  }
3950: 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e 2e 7a 20  .  pNew->span.z 
3960: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65  = 0;.  pNew->pLe
3970: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
3980: 44 75 70 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20  Dup(p->pLeft);. 
3990: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20   pNew->pRight = 
39a0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
39b0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 70 4e 65  ->pRight);.  pNe
39c0: 77 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  w->pList = sqlit
39d0: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 2d  e3ExprListDup(p-
39e0: 3e 70 4c 69 73 74 29 3b 0a 20 20 70 4e 65 77 2d  >pList);.  pNew-
39f0: 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
3a00: 65 33 53 65 6c 65 63 74 44 75 70 28 70 2d 3e 70  e3SelectDup(p->p
3a10: 53 65 6c 65 63 74 29 3b 0a 20 20 72 65 74 75 72  Select);.  retur
3a20: 6e 20 70 4e 65 77 3b 0a 7d 0a 76 6f 69 64 20 73  n pNew;.}.void s
3a30: 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28  qlite3TokenCopy(
3a40: 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 54 6f 6b 65  Token *pTo, Toke
3a50: 6e 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28  n *pFrom){.  if(
3a60: 20 70 54 6f 2d 3e 64 79 6e 20 29 20 73 71 6c 69   pTo->dyn ) sqli
3a70: 74 65 46 72 65 65 28 28 63 68 61 72 2a 29 70 54  teFree((char*)pT
3a80: 6f 2d 3e 7a 29 3b 0a 20 20 69 66 28 20 70 46 72  o->z);.  if( pFr
3a90: 6f 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 70 54 6f  om->z ){.    pTo
3aa0: 2d 3e 6e 20 3d 20 70 46 72 6f 6d 2d 3e 6e 3b 0a  ->n = pFrom->n;.
3ab0: 20 20 20 20 70 54 6f 2d 3e 7a 20 3d 20 28 75 38      pTo->z = (u8
3ac0: 2a 29 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28  *)sqliteStrNDup(
3ad0: 28 63 68 61 72 2a 29 70 46 72 6f 6d 2d 3e 7a 2c  (char*)pFrom->z,
3ae0: 20 70 46 72 6f 6d 2d 3e 6e 29 3b 0a 20 20 20 20   pFrom->n);.    
3af0: 70 54 6f 2d 3e 64 79 6e 20 3d 20 31 3b 0a 20 20  pTo->dyn = 1;.  
3b00: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 6f 2d 3e  }else{.    pTo->
3b10: 7a 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 45 78 70  z = 0;.  }.}.Exp
3b20: 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78  rList *sqlite3Ex
3b30: 70 72 4c 69 73 74 44 75 70 28 45 78 70 72 4c 69  prListDup(ExprLi
3b40: 73 74 20 2a 70 29 7b 0a 20 20 45 78 70 72 4c 69  st *p){.  ExprLi
3b50: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75  st *pNew;.  stru
3b60: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
3b70: 20 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74   *pItem, *pOldIt
3b80: 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  em;.  int i;.  i
3b90: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
3ba0: 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   0;.  pNew = sql
3bb0: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
3bc0: 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
3bd0: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
3be0: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45  rn 0;.  pNew->nE
3bf0: 78 70 72 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c  xpr = pNew->nAll
3c00: 6f 63 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20  oc = p->nExpr;. 
3c10: 20 70 4e 65 77 2d 3e 61 20 3d 20 70 49 74 65 6d   pNew->a = pItem
3c20: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
3c30: 20 70 2d 3e 6e 45 78 70 72 2a 73 69 7a 65 6f 66   p->nExpr*sizeof
3c40: 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69  (p->a[0]) );.  i
3c50: 66 28 20 70 49 74 65 6d 3d 3d 30 20 29 7b 0a 20  f( pItem==0 ){. 
3c60: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4e     sqliteFree(pN
3c70: 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ew);.    return 
3c80: 30 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49 74  0;.  } .  pOldIt
3c90: 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72  em = p->a;.  for
3ca0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72  (i=0; i<p->nExpr
3cb0: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20  ; i++, pItem++, 
3cc0: 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  pOldItem++){.   
3cd0: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 2c   Expr *pNewExpr,
3ce0: 20 2a 70 4f 6c 64 45 78 70 72 3b 0a 20 20 20 20   *pOldExpr;.    
3cf0: 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70  pItem->pExpr = p
3d00: 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65  NewExpr = sqlite
3d10: 33 45 78 70 72 44 75 70 28 70 4f 6c 64 45 78 70  3ExprDup(pOldExp
3d20: 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45  r = pOldItem->pE
3d30: 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  xpr);.    if( pO
3d40: 6c 64 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 21 3d  ldExpr->span.z!=
3d50: 30 20 26 26 20 70 4e 65 77 45 78 70 72 20 29 7b  0 && pNewExpr ){
3d60: 0a 20 20 20 20 20 20 2f 2a 20 41 6c 77 61 79 73  .      /* Always
3d70: 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
3d80: 74 68 65 20 73 70 61 6e 20 66 6f 72 20 74 6f 70  the span for top
3d90: 2d 6c 65 76 65 6c 20 65 78 70 72 65 73 73 69 6f  -level expressio
3da0: 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  ns in the.      
3db0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
3dc0: 73 74 2e 20 20 54 68 65 20 6c 6f 67 69 63 20 69  st.  The logic i
3dd0: 6e 20 53 45 4c 45 43 54 20 70 72 6f 63 65 73 73  n SELECT process
3de0: 69 6e 67 20 74 68 61 74 20 64 65 74 65 72 6d 69  ing that determi
3df0: 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  nes.      ** the
3e00: 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e   names of column
3e10: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
3e20: 73 65 74 20 6e 65 65 64 73 20 74 68 69 73 20 69  set needs this i
3e30: 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
3e40: 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e      sqlite3Token
3e50: 43 6f 70 79 28 26 70 4e 65 77 45 78 70 72 2d 3e  Copy(&pNewExpr->
3e60: 73 70 61 6e 2c 20 26 70 4f 6c 64 45 78 70 72 2d  span, &pOldExpr-
3e70: 3e 73 70 61 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  >span);.    }.  
3e80: 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 45 78    assert( pNewEx
3e90: 70 72 3d 3d 30 20 7c 7c 20 70 4e 65 77 45 78 70  pr==0 || pNewExp
3ea0: 72 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 0a 20 20  r->span.z!=0 .  
3eb0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4f 6c            || pOl
3ec0: 64 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 3d 3d 30  dExpr->span.z==0
3ed0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
3ee0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69  sqlite3MallocFai
3ef0: 6c 65 64 28 29 20 29 3b 0a 20 20 20 20 70 49 74  led() );.    pIt
3f00: 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
3f10: 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49 74 65  teStrDup(pOldIte
3f20: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
3f30: 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20  Item->sortOrder 
3f40: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74  = pOldItem->sort
3f50: 4f 72 64 65 72 3b 0a 20 20 20 20 70 49 74 65 6d  Order;.    pItem
3f60: 2d 3e 69 73 41 67 67 20 3d 20 70 4f 6c 64 49 74  ->isAgg = pOldIt
3f70: 65 6d 2d 3e 69 73 41 67 67 3b 0a 20 20 20 20 70  em->isAgg;.    p
3f80: 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a  Item->done = 0;.
3f90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
3fa0: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63  w;.}../*.** If c
3fb0: 75 72 73 6f 72 73 2c 20 74 72 69 67 67 65 72 73  ursors, triggers
3fc0: 2c 20 76 69 65 77 73 20 61 6e 64 20 73 75 62 71  , views and subq
3fd0: 75 65 72 69 65 73 20 61 72 65 20 61 6c 6c 20 6f  ueries are all o
3fe0: 6d 69 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74  mitted from.** t
3ff0: 68 65 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e  he build, then n
4000: 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
4010: 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20 65  wing routines, e
4020: 78 63 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71  xcept for .** sq
4030: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29  lite3SelectDup()
4040: 2c 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e  , can be called.
4050: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
4060: 70 28 29 20 69 73 20 73 6f 6d 65 74 69 6d 65 73  p() is sometimes
4070: 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20  .** called with 
4080: 61 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e  a NULL argument.
4090: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
40a0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
40b0: 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  W) || !defined(S
40c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
40d0: 45 52 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e  ER) \. || !defin
40e0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
40f0: 55 42 51 55 45 52 59 29 0a 53 72 63 4c 69 73 74  UBQUERY).SrcList
4100: 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74   *sqlite3SrcList
4110: 44 75 70 28 53 72 63 4c 69 73 74 20 2a 70 29 7b  Dup(SrcList *p){
4120: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77  .  SrcList *pNew
4130: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
4140: 20 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 70 3d   nByte;.  if( p=
4150: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
4160: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
4170: 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30  *p) + (p->nSrc>0
4180: 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30   ? sizeof(p->a[0
4190: 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29  ]) * (p->nSrc-1)
41a0: 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20   : 0);.  pNew = 
41b0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
41c0: 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20   nByte );.  if( 
41d0: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
41e0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63   0;.  pNew->nSrc
41f0: 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20   = pNew->nAlloc 
4200: 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72  = p->nSrc;.  for
4210: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b  (i=0; i<p->nSrc;
4220: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
4230: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
4240: 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77  pNewItem = &pNew
4250: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75  ->a[i];.    stru
4260: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
4270: 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e  *pOldItem = &p->
4280: 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20  a[i];.    Table 
4290: 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 49  *pTab;.    pNewI
42a0: 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d  tem->zDatabase =
42b0: 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 70 4f   sqliteStrDup(pO
42c0: 6c 64 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ldItem->zDatabas
42d0: 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  e);.    pNewItem
42e0: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
42f0: 53 74 72 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d  StrDup(pOldItem-
4300: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65  >zName);.    pNe
4310: 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20  wItem->zAlias = 
4320: 73 71 6c 69 74 65 53 74 72 44 75 70 28 70 4f 6c  sqliteStrDup(pOl
4330: 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  dItem->zAlias);.
4340: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6a 6f      pNewItem->jo
4350: 69 6e 74 79 70 65 20 3d 20 70 4f 6c 64 49 74 65  intype = pOldIte
4360: 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20  m->jointype;.   
4370: 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43 75 72 73   pNewItem->iCurs
4380: 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  or = pOldItem->i
4390: 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77  Cursor;.    pNew
43a0: 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65  Item->isPopulate
43b0: 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 73  d = pOldItem->is
43c0: 50 6f 70 75 6c 61 74 65 64 3b 0a 20 20 20 20 70  Populated;.    p
43d0: 54 61 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e  Tab = pNewItem->
43e0: 70 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  pTab = pOldItem-
43f0: 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70  >pTab;.    if( p
4400: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54 61  Tab ){.      pTa
4410: 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d  b->nRef++;.    }
4420: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
4430: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
4440: 53 65 6c 65 63 74 44 75 70 28 70 4f 6c 64 49 74  SelectDup(pOldIt
4450: 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  em->pSelect);.  
4460: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20    pNewItem->pOn 
4470: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
4480: 28 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 29 3b  (pOldItem->pOn);
4490: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
44a0: 55 73 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 49  Using = sqlite3I
44b0: 64 4c 69 73 74 44 75 70 28 70 4f 6c 64 49 74 65  dListDup(pOldIte
44c0: 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20  m->pUsing);.    
44d0: 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65  pNewItem->colUse
44e0: 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f  d = pOldItem->co
44f0: 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74  lUsed;.  }.  ret
4500: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69  urn pNew;.}.IdLi
4510: 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73  st *sqlite3IdLis
4520: 74 44 75 70 28 49 64 4c 69 73 74 20 2a 70 29 7b  tDup(IdList *p){
4530: 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b  .  IdList *pNew;
4540: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
4550: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
4560: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
4570: 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f  MallocRaw( sizeo
4580: 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
4590: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
45a0: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49  rn 0;.  pNew->nI
45b0: 64 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63  d = pNew->nAlloc
45c0: 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65   = p->nId;.  pNe
45d0: 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65 4d 61 6c  w->a = sqliteMal
45e0: 6c 6f 63 52 61 77 28 20 70 2d 3e 6e 49 64 2a 73  locRaw( p->nId*s
45f0: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29  izeof(p->a[0]) )
4600: 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d  ;.  if( pNew->a=
4610: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
4620: 46 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20  Free(pNew);.    
4630: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
4640: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49  for(i=0; i<p->nI
4650: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  d; i++){.    str
4660: 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20  uct IdList_item 
4670: 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65  *pNewItem = &pNe
4680: 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72  w->a[i];.    str
4690: 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20  uct IdList_item 
46a0: 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e  *pOldItem = &p->
46b0: 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74  a[i];.    pNewIt
46c0: 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
46d0: 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49 74 65  teStrDup(pOldIte
46e0: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
46f0: 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70  NewItem->idx = p
4700: 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20  OldItem->idx;.  
4710: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
4720: 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74  .}.Select *sqlit
4730: 65 33 53 65 6c 65 63 74 44 75 70 28 53 65 6c 65  e3SelectDup(Sele
4740: 63 74 20 2a 70 29 7b 0a 20 20 53 65 6c 65 63 74  ct *p){.  Select
4750: 20 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d   *pNew;.  if( p=
4760: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
4770: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61   pNew = sqliteMa
4780: 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28  llocRaw( sizeof(
4790: 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  *p) );.  if( pNe
47a0: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
47b0: 0a 20 20 70 4e 65 77 2d 3e 69 73 44 69 73 74 69  .  pNew->isDisti
47c0: 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69  nct = p->isDisti
47d0: 6e 63 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 45 4c  nct;.  pNew->pEL
47e0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
47f0: 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 45 4c 69  rListDup(p->pELi
4800: 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72  st);.  pNew->pSr
4810: 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
4820: 73 74 44 75 70 28 70 2d 3e 70 53 72 63 29 3b 0a  stDup(p->pSrc);.
4830: 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d    pNew->pWhere =
4840: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
4850: 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 70 4e  p->pWhere);.  pN
4860: 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73  ew->pGroupBy = s
4870: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
4880: 70 28 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a  p(p->pGroupBy);.
4890: 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20    pNew->pHaving 
48a0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
48b0: 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20  (p->pHaving);.  
48c0: 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
48d0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
48e0: 44 75 70 28 70 2d 3e 70 4f 72 64 65 72 42 79 29  Dup(p->pOrderBy)
48f0: 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70  ;.  pNew->op = p
4900: 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 50  ->op;.  pNew->pP
4910: 72 69 6f 72 20 3d 20 73 71 6c 69 74 65 33 53 65  rior = sqlite3Se
4920: 6c 65 63 74 44 75 70 28 70 2d 3e 70 50 72 69 6f  lectDup(p->pPrio
4930: 72 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d  r);.  pNew->pLim
4940: 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  it = sqlite3Expr
4950: 44 75 70 28 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  Dup(p->pLimit);.
4960: 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20    pNew->pOffset 
4970: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
4980: 28 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20  (p->pOffset);.  
4990: 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d  pNew->iLimit = -
49a0: 31 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73  1;.  pNew->iOffs
49b0: 65 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  et = -1;.  pNew-
49c0: 3e 69 73 52 65 73 6f 6c 76 65 64 20 3d 20 70 2d  >isResolved = p-
49d0: 3e 69 73 52 65 73 6f 6c 76 65 64 3b 0a 20 20 70  >isResolved;.  p
49e0: 4e 65 77 2d 3e 69 73 41 67 67 20 3d 20 70 2d 3e  New->isAgg = p->
49f0: 69 73 41 67 67 3b 0a 20 20 70 4e 65 77 2d 3e 75  isAgg;.  pNew->u
4a00: 73 65 73 45 70 68 6d 20 3d 20 30 3b 0a 20 20 70  sesEphm = 0;.  p
4a10: 4e 65 77 2d 3e 64 69 73 61 6c 6c 6f 77 4f 72 64  New->disallowOrd
4a20: 65 72 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65 77  erBy = 0;.  pNew
4a30: 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30  ->pRightmost = 0
4a40: 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70  ;.  pNew->addrOp
4a50: 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a  enEphm[0] = -1;.
4a60: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
4a70: 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[1] = -1;.  
4a80: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
4a90: 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 72 65  hm[2] = -1;.  re
4aa0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c  turn pNew;.}.#el
4ab0: 73 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74  se.Select *sqlit
4ac0: 65 33 53 65 6c 65 63 74 44 75 70 28 53 65 6c 65  e3SelectDup(Sele
4ad0: 63 74 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  ct *p){.  assert
4ae0: 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  ( p==0 );.  retu
4af0: 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 0;.}.#endif..
4b00: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
4b10: 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
4b20: 65 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73  end of an expres
4b30: 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70  sion list.  If p
4b40: 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69  List is.** initi
4b50: 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  ally NULL, then 
4b60: 63 72 65 61 74 65 20 61 20 6e 65 77 20 65 78 70  create a new exp
4b70: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f  ression list..*/
4b80: 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74  .ExprList *sqlit
4b90: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
4ba0: 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74  (ExprList *pList
4bb0: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 54  , Expr *pExpr, T
4bc0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
4bd0: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
4be0: 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
4bf0: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
4c00: 28 45 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20  (ExprList) );.  
4c10: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
4c20: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f  {.      goto no_
4c30: 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  mem;.    }.    a
4c40: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 41  ssert( pList->nA
4c50: 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20  lloc==0 );.  }. 
4c60: 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c   if( pList->nAll
4c70: 6f 63 3c 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72  oc<=pList->nExpr
4c80: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
4c90: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b  xprList_item *a;
4ca0: 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c 69  .    int n = pLi
4cb0: 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 34  st->nAlloc*2 + 4
4cc0: 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65  ;.    a = sqlite
4cd0: 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61  Realloc(pList->a
4ce0: 2c 20 6e 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74  , n*sizeof(pList
4cf0: 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66  ->a[0]));.    if
4d00: 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( a==0 ){.      
4d10: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20  goto no_mem;.   
4d20: 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20   }.    pList->a 
4d30: 3d 20 61 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  = a;.    pList->
4d40: 6e 41 6c 6c 6f 63 20 3d 20 6e 3b 0a 20 20 7d 0a  nAlloc = n;.  }.
4d50: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
4d60: 3e 61 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  >a!=0 );.  if( p
4d70: 45 78 70 72 20 7c 7c 20 70 4e 61 6d 65 20 29 7b  Expr || pName ){
4d80: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
4d90: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
4da0: 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
4db0: 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20  st->nExpr++];.  
4dc0: 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20    memset(pItem, 
4dd0: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d  0, sizeof(*pItem
4de0: 29 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a  ));.    pItem->z
4df0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
4e00: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d  meFromToken(pNam
4e10: 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70  e);.    pItem->p
4e20: 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
4e30: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  }.  return pList
4e40: 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a  ;..no_mem:     .
4e50: 20 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69    /* Avoid leaki
4e60: 6e 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c  ng memory if mal
4e70: 6c 6f 63 20 68 61 73 20 66 61 69 6c 65 64 2e 20  loc has failed. 
4e80: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  */.  sqlite3Expr
4e90: 44 65 6c 65 74 65 28 70 45 78 70 72 29 3b 0a 20  Delete(pExpr);. 
4ea0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
4eb0: 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
4ec0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
4ed0: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
4ee0: 73 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73  ssion list pELis
4ef0: 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20  t contains more 
4f00: 74 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d  than iLimit elem
4f10: 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61  ents,.** leave a
4f20: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
4f30: 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f  in pParse..*/.vo
4f40: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
4f50: 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20  stCheckLength(. 
4f60: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a   Parse *pParse,.
4f70: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
4f80: 73 74 2c 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74  st,.  int iLimit
4f90: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
4fa0: 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69 66 28  zObject.){.  if(
4fb0: 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
4fc0: 74 2d 3e 6e 45 78 70 72 3e 69 4c 69 6d 69 74 20  t->nExpr>iLimit 
4fd0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
4fe0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
4ff0: 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  too many columns
5000: 20 69 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63 74   in %s", zObject
5010: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 23 69 66 20 53  );.  }.}...#if S
5020: 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
5030: 45 50 54 48 3e 30 0a 2f 2a 20 54 68 65 20 66 6f  EPTH>0./* The fo
5040: 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 66 75  llowing three fu
5050: 6e 63 74 69 6f 6e 73 2c 20 68 65 69 67 68 74 4f  nctions, heightO
5060: 66 45 78 70 72 28 29 2c 20 68 65 69 67 68 74 4f  fExpr(), heightO
5070: 66 45 78 70 72 4c 69 73 74 28 29 0a 2a 2a 20 61  fExprList().** a
5080: 6e 64 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63  nd heightOfSelec
5090: 74 28 29 2c 20 61 72 65 20 75 73 65 64 20 74 6f  t(), are used to
50a0: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d   determine the m
50b0: 61 78 69 6d 75 6d 20 68 65 69 67 68 74 0a 2a 2a  aximum height.**
50c0: 20 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73 69   of any expressi
50d0: 6f 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e 63  on tree referenc
50e0: 65 64 20 62 79 20 74 68 65 20 73 74 72 75 63 74  ed by the struct
50f0: 75 72 65 20 70 61 73 73 65 64 20 61 73 20 74 68  ure passed as th
5100: 65 0a 2a 2a 20 66 69 72 73 74 20 61 72 67 75 6d  e.** first argum
5110: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ent..**.** If th
5120: 69 73 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68  is maximum heigh
5130: 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
5140: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  n the current va
5150: 6c 75 65 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74  lue pointed.** t
5160: 6f 20 62 79 20 70 6e 48 65 69 67 68 74 2c 20 74  o by pnHeight, t
5170: 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
5180: 74 65 72 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  ter, then set *p
5190: 6e 48 65 69 67 68 74 20 74 6f 20 74 68 61 74 0a  nHeight to that.
51a0: 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61  ** value..*/.sta
51b0: 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f  tic void heightO
51c0: 66 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69  fExpr(Expr *p, i
51d0: 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20  nt *pnHeight){. 
51e0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66   if( p ){.    if
51f0: 28 20 70 2d 3e 6e 48 65 69 67 68 74 3e 2a 70 6e  ( p->nHeight>*pn
5200: 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  Height ){.      
5210: 2a 70 6e 48 65 69 67 68 74 20 3d 20 70 2d 3e 6e  *pnHeight = p->n
5220: 48 65 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20  Height;.    }.  
5230: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
5240: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
5250: 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e  (ExprList *p, in
5260: 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20  t *pnHeight){.  
5270: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74  if( p ){.    int
5280: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
5290: 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b   i<p->nExpr; i++
52a0: 29 7b 0a 20 20 20 20 20 20 68 65 69 67 68 74 4f  ){.      heightO
52b0: 66 45 78 70 72 28 70 2d 3e 61 5b 69 5d 2e 70 45  fExpr(p->a[i].pE
52c0: 78 70 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  xpr, pnHeight);.
52d0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74      }.  }.}.stat
52e0: 69 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66  ic void heightOf
52f0: 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70  Select(Select *p
5300: 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29  , int *pnHeight)
5310: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
5320: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
5330: 3e 70 57 68 65 72 65 2c 20 70 6e 48 65 69 67 68  >pWhere, pnHeigh
5340: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
5350: 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c  Expr(p->pHaving,
5360: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
5370: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
5380: 70 4c 69 6d 69 74 2c 20 70 6e 48 65 69 67 68 74  pLimit, pnHeight
5390: 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  );.    heightOfE
53a0: 78 70 72 28 70 2d 3e 70 4f 66 66 73 65 74 2c 20  xpr(p->pOffset, 
53b0: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
53c0: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
53d0: 70 2d 3e 70 45 4c 69 73 74 2c 20 70 6e 48 65 69  p->pEList, pnHei
53e0: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
53f0: 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47  OfExprList(p->pG
5400: 72 6f 75 70 42 79 2c 20 70 6e 48 65 69 67 68 74  roupBy, pnHeight
5410: 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  );.    heightOfE
5420: 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65  xprList(p->pOrde
5430: 72 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  rBy, pnHeight);.
5440: 20 20 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65      heightOfSele
5450: 63 74 28 70 2d 3e 70 50 72 69 6f 72 2c 20 70 6e  ct(p->pPrior, pn
5460: 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  Height);.  }.}..
5470: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78  /*.** Set the Ex
5480: 70 72 2e 6e 48 65 69 67 68 74 20 76 61 72 69 61  pr.nHeight varia
5490: 62 6c 65 20 69 6e 20 74 68 65 20 73 74 72 75 63  ble in the struc
54a0: 74 75 72 65 20 70 61 73 73 65 64 20 61 73 20 61  ture passed as a
54b0: 6e 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20  n .** argument. 
54c0: 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69  An expression wi
54d0: 74 68 20 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20  th no children, 
54e0: 45 78 70 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a  Expr.pList or .*
54f0: 2a 20 45 78 70 72 2e 70 53 65 6c 65 63 74 20 6d  * Expr.pSelect m
5500: 65 6d 62 65 72 20 68 61 73 20 61 20 68 65 69 67  ember has a heig
5510: 68 74 20 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68  ht of 1. Any oth
5520: 65 72 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  er expression.**
5530: 20 68 61 73 20 61 20 68 65 69 67 68 74 20 65 71   has a height eq
5540: 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  ual to the maxim
5550: 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79  um height of any
5560: 20 6f 74 68 65 72 20 0a 2a 2a 20 72 65 66 65 72   other .** refer
5570: 65 6e 63 65 64 20 45 78 70 72 20 70 6c 75 73 20  enced Expr plus 
5580: 6f 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  one..*/.void sql
5590: 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68  ite3ExprSetHeigh
55a0: 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e  t(Expr *p){.  in
55b0: 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20  t nHeight = 0;. 
55c0: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
55d0: 3e 70 4c 65 66 74 2c 20 26 6e 48 65 69 67 68 74  >pLeft, &nHeight
55e0: 29 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70  );.  heightOfExp
55f0: 72 28 70 2d 3e 70 52 69 67 68 74 2c 20 26 6e 48  r(p->pRight, &nH
5600: 65 69 67 68 74 29 3b 0a 20 20 68 65 69 67 68 74  eight);.  height
5610: 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4c  OfExprList(p->pL
5620: 69 73 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  ist, &nHeight);.
5630: 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74    heightOfSelect
5640: 28 70 2d 3e 70 53 65 6c 65 63 74 2c 20 26 6e 48  (p->pSelect, &nH
5650: 65 69 67 68 74 29 3b 0a 20 20 70 2d 3e 6e 48 65  eight);.  p->nHe
5660: 69 67 68 74 20 3d 20 6e 48 65 69 67 68 74 20 2b  ight = nHeight +
5670: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   1;.}../*.** Ret
5680: 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  urn the maximum 
5690: 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 65 78  height of any ex
56a0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65  pression tree re
56b0: 66 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74  ferenced.** by t
56c0: 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  he select statem
56d0: 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 61 6e  ent passed as an
56e0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e   argument..*/.in
56f0: 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  t sqlite3SelectE
5700: 78 70 72 48 65 69 67 68 74 28 53 65 6c 65 63 74  xprHeight(Select
5710: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69   *p){.  int nHei
5720: 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68  ght = 0;.  heigh
5730: 74 4f 66 53 65 6c 65 63 74 28 70 2c 20 26 6e 48  tOfSelect(p, &nH
5740: 65 69 67 68 74 29 3b 0a 20 20 72 65 74 75 72 6e  eight);.  return
5750: 20 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65 6e 64   nHeight;.}.#end
5760: 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  if../*.** Delete
5770: 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65   an entire expre
5780: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76  ssion list..*/.v
5790: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
57a0: 69 73 74 44 65 6c 65 74 65 28 45 78 70 72 4c 69  istDelete(ExprLi
57b0: 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
57c0: 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 45 78  t i;.  struct Ex
57d0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
57e0: 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  em;.  if( pList=
57f0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  =0 ) return;.  a
5800: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21  ssert( pList->a!
5810: 3d 30 20 7c 7c 20 28 70 4c 69 73 74 2d 3e 6e 45  =0 || (pList->nE
5820: 78 70 72 3d 3d 30 20 26 26 20 70 4c 69 73 74 2d  xpr==0 && pList-
5830: 3e 6e 41 6c 6c 6f 63 3d 3d 30 29 20 29 3b 0a 20  >nAlloc==0) );. 
5840: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
5850: 6e 45 78 70 72 3c 3d 70 4c 69 73 74 2d 3e 6e 41  nExpr<=pList->nA
5860: 6c 6c 6f 63 20 29 3b 0a 20 20 66 6f 72 28 70 49  lloc );.  for(pI
5870: 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d  tem=pList->a, i=
5880: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
5890: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
58a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
58b0: 72 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70  rDelete(pItem->p
58c0: 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  Expr);.    sqlit
58d0: 65 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a 4e 61  eFree(pItem->zNa
58e0: 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  me);.  }.  sqlit
58f0: 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b  eFree(pList->a);
5900: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c  .  sqliteFree(pL
5910: 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  ist);.}../*.** W
5920: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
5930: 6e 20 74 72 65 65 2e 20 20 43 61 6c 6c 20 78 46  n tree.  Call xF
5940: 75 6e 63 20 66 6f 72 20 65 61 63 68 20 6e 6f 64  unc for each nod
5950: 65 20 76 69 73 69 74 65 64 2e 0a 2a 2a 0a 2a 2a  e visited..**.**
5960: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
5970: 65 20 66 72 6f 6d 20 78 46 75 6e 63 20 64 65 74  e from xFunc det
5980: 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20  ermines whether 
5990: 74 68 65 20 74 72 65 65 20 77 61 6c 6b 20 63 6f  the tree walk co
59a0: 6e 74 69 6e 75 65 73 2e 0a 2a 2a 20 30 20 6d 65  ntinues..** 0 me
59b0: 61 6e 73 20 63 6f 6e 74 69 6e 75 65 20 77 61 6c  ans continue wal
59c0: 6b 69 6e 67 20 74 68 65 20 74 72 65 65 2e 20 20  king the tree.  
59d0: 31 20 6d 65 61 6e 73 20 64 6f 20 6e 6f 74 20 77  1 means do not w
59e0: 61 6c 6b 20 63 68 69 6c 64 72 65 6e 0a 2a 2a 20  alk children.** 
59f0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e  of the current n
5a00: 6f 64 65 20 62 75 74 20 63 6f 6e 74 69 6e 75 65  ode but continue
5a10: 20 77 69 74 68 20 73 69 62 6c 69 6e 67 73 2e 20   with siblings. 
5a20: 20 32 20 6d 65 61 6e 73 20 61 62 61 6e 64 6f 6e   2 means abandon
5a30: 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 77 61 6c  .** the tree wal
5a40: 6b 20 63 6f 6d 70 6c 65 74 65 6c 79 2e 0a 2a 2a  k completely..**
5a50: 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
5a60: 61 6c 75 65 20 66 72 6f 6d 20 74 68 69 73 20 72  alue from this r
5a70: 6f 75 74 69 6e 65 20 69 73 20 31 20 74 6f 20 61  outine is 1 to a
5a80: 62 61 6e 64 6f 6e 20 74 68 65 20 74 72 65 65 20  bandon the tree 
5a90: 77 61 6c 6b 0a 2a 2a 20 61 6e 64 20 30 20 74 6f  walk.** and 0 to
5aa0: 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a   continue..**.**
5ab0: 20 4e 4f 54 49 43 45 3a 20 20 54 68 69 73 20 72   NOTICE:  This r
5ac0: 6f 75 74 69 6e 65 20 64 6f 65 73 20 2a 6e 6f 74  outine does *not
5ad0: 2a 20 64 65 73 63 65 6e 64 20 69 6e 74 6f 20 73  * descend into s
5ae0: 75 62 71 75 65 72 69 65 73 2e 0a 2a 2f 0a 73 74  ubqueries..*/.st
5af0: 61 74 69 63 20 69 6e 74 20 77 61 6c 6b 45 78 70  atic int walkExp
5b00: 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a  rList(ExprList *
5b10: 2c 20 69 6e 74 20 28 2a 29 28 76 6f 69 64 20 2a  , int (*)(void *
5b20: 2c 20 45 78 70 72 2a 29 2c 20 76 6f 69 64 20 2a  , Expr*), void *
5b30: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61  );.static int wa
5b40: 6c 6b 45 78 70 72 54 72 65 65 28 45 78 70 72 20  lkExprTree(Expr 
5b50: 2a 70 45 78 70 72 2c 20 69 6e 74 20 28 2a 78 46  *pExpr, int (*xF
5b60: 75 6e 63 29 28 76 6f 69 64 2a 2c 45 78 70 72 2a  unc)(void*,Expr*
5b70: 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  ), void *pArg){.
5b80: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
5b90: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
5ba0: 6e 20 30 3b 0a 20 20 72 63 20 3d 20 28 2a 78 46  n 0;.  rc = (*xF
5bb0: 75 6e 63 29 28 70 41 72 67 2c 20 70 45 78 70 72  unc)(pArg, pExpr
5bc0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29  );.  if( rc==0 )
5bd0: 7b 0a 20 20 20 20 69 66 28 20 77 61 6c 6b 45 78  {.    if( walkEx
5be0: 70 72 54 72 65 65 28 70 45 78 70 72 2d 3e 70 4c  prTree(pExpr->pL
5bf0: 65 66 74 2c 20 78 46 75 6e 63 2c 20 70 41 72 67  eft, xFunc, pArg
5c00: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
5c10: 20 20 69 66 28 20 77 61 6c 6b 45 78 70 72 54 72    if( walkExprTr
5c20: 65 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  ee(pExpr->pRight
5c30: 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 20 29  , xFunc, pArg) )
5c40: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69   return 1;.    i
5c50: 66 28 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28  f( walkExprList(
5c60: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20 78 46  pExpr->pList, xF
5c70: 75 6e 63 2c 20 70 41 72 67 29 20 29 20 72 65 74  unc, pArg) ) ret
5c80: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
5c90: 75 72 6e 20 72 63 3e 31 3b 0a 7d 0a 0a 2f 2a 0a  urn rc>1;.}../*.
5ca0: 2a 2a 20 43 61 6c 6c 20 77 61 6c 6b 45 78 70 72  ** Call walkExpr
5cb0: 54 72 65 65 28 29 20 66 6f 72 20 65 76 65 72 79  Tree() for every
5cc0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 6c   expression in l
5cd0: 69 73 74 20 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  ist p..*/.static
5ce0: 20 69 6e 74 20 77 61 6c 6b 45 78 70 72 4c 69 73   int walkExprLis
5cf0: 74 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69  t(ExprList *p, i
5d00: 6e 74 20 28 2a 78 46 75 6e 63 29 28 76 6f 69 64  nt (*xFunc)(void
5d10: 20 2a 2c 20 45 78 70 72 2a 29 2c 20 76 6f 69 64   *, Expr*), void
5d20: 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 69   *pArg){.  int i
5d30: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
5d40: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
5d50: 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75  .  if( !p ) retu
5d60: 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 70 2d  rn 0;.  for(i=p-
5d70: 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d  >nExpr, pItem=p-
5d80: 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49  >a; i>0; i--, pI
5d90: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  tem++){.    if( 
5da0: 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70 49 74  walkExprTree(pIt
5db0: 65 6d 2d 3e 70 45 78 70 72 2c 20 78 46 75 6e 63  em->pExpr, xFunc
5dc0: 2c 20 70 41 72 67 29 20 29 20 72 65 74 75 72 6e  , pArg) ) return
5dd0: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
5de0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c   0;.}../*.** Cal
5df0: 6c 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 29  l walkExprTree()
5e00: 20 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65   for every expre
5e10: 73 73 69 6f 6e 20 69 6e 20 53 65 6c 65 63 74 20  ssion in Select 
5e20: 70 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67  p, not including
5e30: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20  .** expressions 
5e40: 74 68 61 74 20 61 72 65 20 70 61 72 74 20 6f 66  that are part of
5e50: 20 73 75 62 2d 73 65 6c 65 63 74 73 20 69 6e 20   sub-selects in 
5e60: 61 6e 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  any FROM clause 
5e70: 6f 72 20 74 68 65 20 4c 49 4d 49 54 0a 2a 2a 20  or the LIMIT.** 
5e80: 6f 72 20 4f 46 46 53 45 54 20 65 78 70 72 65 73  or OFFSET expres
5e90: 73 69 6f 6e 73 2e 2e 0a 2a 2f 0a 73 74 61 74 69  sions...*/.stati
5ea0: 63 20 69 6e 74 20 77 61 6c 6b 53 65 6c 65 63 74  c int walkSelect
5eb0: 45 78 70 72 28 53 65 6c 65 63 74 20 2a 70 2c 20  Expr(Select *p, 
5ec0: 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 76 6f 69  int (*xFunc)(voi
5ed0: 64 20 2a 2c 20 45 78 70 72 2a 29 2c 20 76 6f 69  d *, Expr*), voi
5ee0: 64 20 2a 70 41 72 67 29 7b 0a 20 20 77 61 6c 6b  d *pArg){.  walk
5ef0: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69  ExprList(p->pELi
5f00: 73 74 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29  st, xFunc, pArg)
5f10: 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65  ;.  walkExprTree
5f20: 28 70 2d 3e 70 57 68 65 72 65 2c 20 78 46 75 6e  (p->pWhere, xFun
5f30: 63 2c 20 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b  c, pArg);.  walk
5f40: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f  ExprList(p->pGro
5f50: 75 70 42 79 2c 20 78 46 75 6e 63 2c 20 70 41 72  upBy, xFunc, pAr
5f60: 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72  g);.  walkExprTr
5f70: 65 65 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 78  ee(p->pHaving, x
5f80: 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 77  Func, pArg);.  w
5f90: 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  alkExprList(p->p
5fa0: 4f 72 64 65 72 42 79 2c 20 78 46 75 6e 63 2c 20  OrderBy, xFunc, 
5fb0: 70 41 72 67 29 3b 0a 20 20 69 66 28 20 70 2d 3e  pArg);.  if( p->
5fc0: 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 77 61  pPrior ){.    wa
5fd0: 6c 6b 53 65 6c 65 63 74 45 78 70 72 28 70 2d 3e  lkSelectExpr(p->
5fe0: 70 50 72 69 6f 72 2c 20 78 46 75 6e 63 2c 20 70  pPrior, xFunc, p
5ff0: 41 72 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Arg);.  }.  retu
6000: 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn 0;.}.../*.** 
6010: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
6020: 64 65 73 69 67 6e 65 64 20 61 73 20 61 6e 20 78  designed as an x
6030: 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b 45 78 70  Func for walkExp
6040: 72 54 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 70  rTree()..**.** p
6050: 41 72 67 20 69 73 20 72 65 61 6c 6c 79 20 61 20  Arg is really a 
6060: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  pointer to an in
6070: 74 65 67 65 72 2e 20 20 49 66 20 77 65 20 63 61  teger.  If we ca
6080: 6e 20 74 65 6c 6c 20 62 79 20 6c 6f 6f 6b 69 6e  n tell by lookin
6090: 67 0a 2a 2a 20 61 74 20 70 45 78 70 72 20 74 68  g.** at pExpr th
60a0: 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  at the expressio
60b0: 6e 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  n that contains 
60c0: 70 45 78 70 72 20 69 73 20 6e 6f 74 20 61 20 63  pExpr is not a c
60d0: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 65 78 70 72 65  onstant.** expre
60e0: 73 73 69 6f 6e 2c 20 74 68 65 6e 20 73 65 74 20  ssion, then set 
60f0: 2a 70 41 72 67 20 74 6f 20 30 20 61 6e 64 20 72  *pArg to 0 and r
6100: 65 74 75 72 6e 20 32 20 74 6f 20 61 62 61 6e 64  eturn 2 to aband
6110: 6f 6e 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b  on the tree walk
6120: 2e 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 64 6f  ..** If pExpr do
6130: 65 73 20 64 6f 65 73 20 6e 6f 74 20 64 69 73 71  es does not disq
6140: 75 61 6c 69 66 79 20 74 68 65 20 65 78 70 72 65  ualify the expre
6150: 73 73 69 6f 6e 20 66 72 6f 6d 20 62 65 69 6e 67  ssion from being
6160: 20 61 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74   a constant.** t
6170: 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a  hen do nothing..
6180: 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 77 61 6c 6b  **.** After walk
6190: 69 6e 67 20 74 68 65 20 77 68 6f 6c 65 20 74 72  ing the whole tr
61a0: 65 65 2c 20 69 66 20 6e 6f 20 6e 6f 64 65 73 20  ee, if no nodes 
61b0: 61 72 65 20 66 6f 75 6e 64 20 74 68 61 74 20 64  are found that d
61c0: 69 73 71 75 61 6c 69 66 79 0a 2a 2a 20 74 68 65  isqualify.** the
61d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20 63   expression as c
61e0: 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 77 65  onstant, then we
61f0: 20 61 73 73 75 6d 65 20 74 68 65 20 77 68 6f 6c   assume the whol
6200: 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  e expression.** 
6210: 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 53 65  is constant.  Se
6220: 65 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  e sqlite3ExprIsC
6230: 6f 6e 73 74 61 6e 74 28 29 20 66 6f 72 20 61 64  onstant() for ad
6240: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
6250: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
6260: 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  int exprNodeIsCo
6270: 6e 73 74 61 6e 74 28 76 6f 69 64 20 2a 70 41 72  nstant(void *pAr
6280: 67 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  g, Expr *pExpr){
6290: 0a 20 20 69 6e 74 20 2a 70 4e 20 3d 20 28 69 6e  .  int *pN = (in
62a0: 74 2a 29 70 41 72 67 3b 0a 0a 20 20 2f 2a 20 49  t*)pArg;..  /* I
62b0: 66 20 2a 70 41 72 67 20 69 73 20 33 20 74 68 65  f *pArg is 3 the
62c0: 6e 20 61 6e 79 20 74 65 72 6d 20 6f 66 20 74 68  n any term of th
62d0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
62e0: 74 20 63 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a  t comes from.  *
62f0: 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  * the ON or USIN
6300: 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a  G clauses of a j
6310: 6f 69 6e 20 64 69 73 71 75 61 6c 69 66 69 65 73  oin disqualifies
6320: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
6330: 20 20 2a 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20    ** from being 
6340: 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 6e 73 74  considered const
6350: 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 28 2a  ant. */.  if( (*
6360: 70 4e 29 3d 3d 33 20 26 26 20 45 78 70 72 48 61  pN)==3 && ExprHa
6370: 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78  sAnyProperty(pEx
6380: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
6390: 20 29 7b 0a 20 20 20 20 2a 70 4e 20 3d 20 30 3b   ){.    *pN = 0;
63a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20  .    return 2;. 
63b0: 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45   }..  switch( pE
63c0: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f  xpr->op ){.    /
63d0: 2a 20 43 6f 6e 73 69 64 65 72 20 66 75 6e 63 74  * Consider funct
63e0: 69 6f 6e 73 20 74 6f 20 62 65 20 63 6f 6e 73 74  ions to be const
63f0: 61 6e 74 20 69 66 20 61 6c 6c 20 74 68 65 69 72  ant if all their
6400: 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 63   arguments are c
6410: 6f 6e 73 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61  onstant.    ** a
6420: 6e 64 20 2a 70 41 72 67 3d 3d 32 20 2a 2f 0a 20  nd *pArg==2 */. 
6430: 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
6440: 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 28  ION:.      if( (
6450: 2a 70 4e 29 3d 3d 32 20 29 20 72 65 74 75 72 6e  *pN)==2 ) return
6460: 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c   0;.      /* Fal
6470: 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20  l through */.   
6480: 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20   case TK_ID:.   
6490: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
64a0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f 54  .    case TK_DOT
64b0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  :.    case TK_AG
64c0: 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  G_FUNCTION:.    
64d0: 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
64e0: 4d 4e 3a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  MN:.#ifndef SQLI
64f0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
6500: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
6510: 45 43 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ECT:.    case TK
6520: 5f 45 58 49 53 54 53 3a 0a 23 65 6e 64 69 66 0a  _EXISTS:.#endif.
6530: 20 20 20 20 20 20 2a 70 4e 20 3d 20 30 3b 0a 20        *pN = 0;. 
6540: 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20       return 2;. 
6550: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 0a 20     case TK_IN:. 
6560: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
6570: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
6580: 20 20 20 2a 70 4e 20 3d 20 30 3b 0a 20 20 20 20     *pN = 0;.    
6590: 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20      return 2;.  
65a0: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
65b0: 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
65c0: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
65d0: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
65e0: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
65f0: 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73   1 if the expres
6600: 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
6610: 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20  .** and 0 if it 
6620: 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c  involves variabl
6630: 65 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63  es or function c
6640: 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  alls..**.** For 
6650: 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
6660: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
6670: 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73   double-quoted s
6680: 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22  tring (ex: "abc"
6690: 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72  ).** is consider
66a0: 65 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75  ed a variable bu
66b0: 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65  t a single-quote
66c0: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61  d string (ex: 'a
66d0: 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e  bc') is.** a con
66e0: 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  stant..*/.int sq
66f0: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
6700: 61 6e 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ant(Expr *p){.  
6710: 69 6e 74 20 69 73 43 6f 6e 73 74 20 3d 20 31 3b  int isConst = 1;
6720: 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  .  walkExprTree(
6730: 70 2c 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e  p, exprNodeIsCon
6740: 73 74 61 6e 74 2c 20 26 69 73 43 6f 6e 73 74 29  stant, &isConst)
6750: 3b 0a 20 20 72 65 74 75 72 6e 20 69 73 43 6f 6e  ;.  return isCon
6760: 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c  st;.}../*.** Wal
6770: 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
6780: 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20  tree.  Return 1 
6790: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
67a0: 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  n is constant.**
67b0: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 20 6f 72   that does no or
67c0: 69 67 69 6e 61 74 65 20 66 72 6f 6d 20 74 68 65  iginate from the
67d0: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
67e0: 75 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a  uses of a join..
67f0: 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 69  ** Return 0 if i
6800: 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61  t involves varia
6810: 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e  bles or function
6820: 20 63 61 6c 6c 73 20 6f 72 20 74 65 72 6d 73 20   calls or terms 
6830: 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72  from.** an ON or
6840: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a   USING clause..*
6850: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
6860: 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
6870: 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  in(Expr *p){.  i
6880: 6e 74 20 69 73 43 6f 6e 73 74 20 3d 20 33 3b 0a  nt isConst = 3;.
6890: 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70    walkExprTree(p
68a0: 2c 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73  , exprNodeIsCons
68b0: 74 61 6e 74 2c 20 26 69 73 43 6f 6e 73 74 29 3b  tant, &isConst);
68c0: 0a 20 20 72 65 74 75 72 6e 20 69 73 43 6f 6e 73  .  return isCons
68d0: 74 21 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  t!=0;.}../*.** W
68e0: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
68f0: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
6900: 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  1 if the express
6910: 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
6920: 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e  ** or a function
6930: 20 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e 73 74   call with const
6940: 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20  ant arguments.  
6950: 52 65 74 75 72 6e 20 61 6e 64 20 30 20 69 66 20  Return and 0 if 
6960: 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79  there.** are any
6970: 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a   variables..**.*
6980: 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
6990: 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  es of this funct
69a0: 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75  ion, a double-qu
69b0: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
69c0: 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f   "abc").** is co
69d0: 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61  nsidered a varia
69e0: 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65  ble but a single
69f0: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
6a00: 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a  ex: 'abc') is.**
6a10: 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a   a constant..*/.
6a20: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
6a30: 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74  sConstantOrFunct
6a40: 69 6f 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ion(Expr *p){.  
6a50: 69 6e 74 20 69 73 43 6f 6e 73 74 20 3d 20 32 3b  int isConst = 2;
6a60: 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  .  walkExprTree(
6a70: 70 2c 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e  p, exprNodeIsCon
6a80: 73 74 61 6e 74 2c 20 26 69 73 43 6f 6e 73 74 29  stant, &isConst)
6a90: 3b 0a 20 20 72 65 74 75 72 6e 20 69 73 43 6f 6e  ;.  return isCon
6aa0: 73 74 21 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  st!=0;.}../*.** 
6ab0: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
6ac0: 6e 20 70 20 63 6f 64 65 73 20 61 20 63 6f 6e 73  n p codes a cons
6ad0: 74 61 6e 74 20 69 6e 74 65 67 65 72 20 74 68 61  tant integer tha
6ae0: 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  t is small enoug
6af0: 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61  h.** to fit in a
6b00: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c   32-bit integer,
6b10: 20 72 65 74 75 72 6e 20 31 20 61 6e 64 20 70 75   return 1 and pu
6b20: 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
6b30: 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e  he integer.** in
6b40: 20 2a 70 56 61 6c 75 65 2e 20 20 49 66 20 74 68   *pValue.  If th
6b50: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
6b60: 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6f  not an integer o
6b70: 72 20 69 66 20 69 74 20 69 73 20 74 6f 6f 20 62  r if it is too b
6b80: 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20  ig.** to fit in 
6b90: 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20  a signed 32-bit 
6ba0: 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20  integer, return 
6bb0: 30 20 61 6e 64 20 6c 65 61 76 65 20 2a 70 56 61  0 and leave *pVa
6bc0: 6c 75 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  lue unchanged..*
6bd0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
6be0: 72 49 73 49 6e 74 65 67 65 72 28 45 78 70 72 20  rIsInteger(Expr 
6bf0: 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65 29  *p, int *pValue)
6c00: 7b 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f  {.  switch( p->o
6c10: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
6c20: 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
6c30: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 65 74    if( sqlite3Get
6c40: 49 6e 74 33 32 28 28 63 68 61 72 2a 29 70 2d 3e  Int32((char*)p->
6c50: 74 6f 6b 65 6e 2e 7a 2c 20 70 56 61 6c 75 65 29  token.z, pValue)
6c60: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
6c70: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
6c80: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6c90: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c  .    case TK_UPL
6ca0: 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  US: {.      retu
6cb0: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  rn sqlite3ExprIs
6cc0: 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74  Integer(p->pLeft
6cd0: 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 7d  , pValue);.    }
6ce0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49  .    case TK_UMI
6cf0: 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  NUS: {.      int
6d00: 20 76 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71   v;.      if( sq
6d10: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
6d20: 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29  er(p->pLeft, &v)
6d30: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 56 61   ){.        *pVa
6d40: 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20  lue = -v;.      
6d50: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
6d60: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
6d70: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
6d80: 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  lt: break;.  }. 
6d90: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
6da0: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
6db0: 69 66 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  if the given str
6dc0: 69 6e 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20  ing is a row-id 
6dd0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a  column name..*/.
6de0: 69 6e 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77  int sqlite3IsRow
6df0: 69 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  id(const char *z
6e00: 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
6e10: 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57  StrICmp(z, "_ROW
6e20: 49 44 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72  ID_")==0 ) retur
6e30: 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
6e40: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f  e3StrICmp(z, "RO
6e50: 57 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72  WID")==0 ) retur
6e60: 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
6e70: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49  e3StrICmp(z, "OI
6e80: 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  D")==0 ) return 
6e90: 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  1;.  return 0;.}
6ea0: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
6eb0: 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75  e name of a colu
6ec0: 6d 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58  mn of the form X
6ed0: 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20 6f 72 20 6a  .Y.Z or Y.Z or j
6ee0: 75 73 74 20 5a 2c 20 6c 6f 6f 6b 20 75 70 0a 2a  ust Z, look up.*
6ef0: 2a 20 74 68 61 74 20 6e 61 6d 65 20 69 6e 20 74  * that name in t
6f00: 68 65 20 73 65 74 20 6f 66 20 73 6f 75 72 63 65  he set of source
6f10: 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 4c   tables in pSrcL
6f20: 69 73 74 20 61 6e 64 20 6d 61 6b 65 20 74 68 65  ist and make the
6f30: 20 70 45 78 70 72 20 0a 2a 2a 20 65 78 70 72 65   pExpr .** expre
6f40: 73 73 69 6f 6e 20 6e 6f 64 65 20 72 65 66 65 72  ssion node refer
6f50: 20 62 61 63 6b 20 74 6f 20 74 68 61 74 20 73 6f   back to that so
6f60: 75 72 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68  urce column.  Th
6f70: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e  e following chan
6f80: 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20  ges.** are made 
6f90: 74 6f 20 70 45 78 70 72 3a 0a 2a 2a 0a 2a 2a 20  to pExpr:.**.** 
6fa0: 20 20 20 70 45 78 70 72 2d 3e 69 44 62 20 20 20     pExpr->iDb   
6fb0: 20 20 20 20 20 20 20 20 53 65 74 20 74 68 65 20          Set the 
6fc0: 69 6e 64 65 78 20 69 6e 20 64 62 2d 3e 61 44 62  index in db->aDb
6fd0: 5b 5d 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  [] of the databa
6fe0: 73 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 20 20  se holding.**   
6ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7000: 20 20 20 20 20 20 74 68 65 20 74 61 62 6c 65 2e        the table.
7010: 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 69 54  .**    pExpr->iT
7020: 61 62 6c 65 20 20 20 20 20 20 20 20 53 65 74 20  able        Set 
7030: 74 6f 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  to the cursor nu
7040: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
7050: 6c 65 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 20  le obtained.**  
7060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7070: 20 20 20 20 20 20 20 66 72 6f 6d 20 70 53 72 63         from pSrc
7080: 4c 69 73 74 2e 0a 2a 2a 20 20 20 20 70 45 78 70  List..**    pExp
7090: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 20 20 20 20 20  r->iColumn      
70a0: 20 53 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75   Set to the colu
70b0: 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74 68 69 6e  mn number within
70c0: 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20   the table..**  
70d0: 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20 20 20    pExpr->op     
70e0: 20 20 20 20 20 20 20 53 65 74 20 74 6f 20 54 4b         Set to TK
70f0: 5f 43 4f 4c 55 4d 4e 2e 0a 2a 2a 20 20 20 20 70  _COLUMN..**    p
7100: 45 78 70 72 2d 3e 70 4c 65 66 74 20 20 20 20 20  Expr->pLeft     
7110: 20 20 20 20 41 6e 79 20 65 78 70 72 65 73 73 69      Any expressi
7120: 6f 6e 20 74 68 69 73 20 70 6f 69 6e 74 73 20 74  on this points t
7130: 6f 20 69 73 20 64 65 6c 65 74 65 64 0a 2a 2a 20  o is deleted.** 
7140: 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74     pExpr->pRight
7150: 20 20 20 20 20 20 20 20 41 6e 79 20 65 78 70 72          Any expr
7160: 65 73 73 69 6f 6e 20 74 68 69 73 20 70 6f 69 6e  ession this poin
7170: 74 73 20 74 6f 20 69 73 20 64 65 6c 65 74 65 64  ts to is deleted
7180: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 44 62 54  ..**.** The pDbT
7190: 6f 6b 65 6e 20 69 73 20 74 68 65 20 6e 61 6d 65  oken is the name
71a0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
71b0: 20 28 74 68 65 20 22 58 22 29 2e 20 20 54 68 69   (the "X").  Thi
71c0: 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 0a 2a  s value may be.*
71d0: 2a 20 4e 55 4c 4c 20 6d 65 61 6e 69 6e 67 20 74  * NULL meaning t
71e0: 68 61 74 20 6e 61 6d 65 20 69 73 20 6f 66 20 74  hat name is of t
71f0: 68 65 20 66 6f 72 6d 20 59 2e 5a 20 6f 72 20 5a  he form Y.Z or Z
7200: 2e 20 20 41 6e 79 20 61 76 61 69 6c 61 62 6c 65  .  Any available
7210: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 61 6e   database.** can
7220: 20 62 65 20 75 73 65 64 2e 20 20 54 68 65 20 70   be used.  The p
7230: 54 61 62 6c 65 54 6f 6b 65 6e 20 69 73 20 74 68  TableToken is th
7240: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
7250: 62 6c 65 20 28 74 68 65 20 22 59 22 29 2e 20 20  ble (the "Y").  
7260: 54 68 69 73 0a 2a 2a 20 76 61 6c 75 65 20 63 61  This.** value ca
7270: 6e 20 62 65 20 4e 55 4c 4c 20 69 66 20 70 44 62  n be NULL if pDb
7280: 54 6f 6b 65 6e 20 69 73 20 61 6c 73 6f 20 4e 55  Token is also NU
7290: 4c 4c 2e 20 20 49 66 20 70 54 61 62 6c 65 54 6f  LL.  If pTableTo
72a0: 6b 65 6e 20 69 73 20 4e 55 4c 4c 20 69 74 0a 2a  ken is NULL it.*
72b0: 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  * means that the
72c0: 20 66 6f 72 6d 20 6f 66 20 74 68 65 20 6e 61 6d   form of the nam
72d0: 65 20 69 73 20 5a 20 61 6e 64 20 74 68 61 74 20  e is Z and that 
72e0: 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 61 6e 79  columns from any
72f0: 20 74 61 62 6c 65 0a 2a 2a 20 63 61 6e 20 62 65   table.** can be
7300: 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   used..**.** If 
7310: 74 68 65 20 6e 61 6d 65 20 63 61 6e 6e 6f 74 20  the name cannot 
7320: 62 65 20 72 65 73 6f 6c 76 65 64 20 75 6e 61 6d  be resolved unam
7330: 62 69 67 75 6f 75 73 6c 79 2c 20 6c 65 61 76 65  biguously, leave
7340: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
7350: 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65 20 61  e.** in pParse a
7360: 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  nd return non-ze
7370: 72 6f 2e 20 20 52 65 74 75 72 6e 20 7a 65 72 6f  ro.  Return zero
7380: 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a   on success..*/.
7390: 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 6f 6b 75  static int looku
73a0: 70 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a  pName(.  Parse *
73b0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
73c0: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
73d0: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
73e0: 2a 70 44 62 54 6f 6b 65 6e 2c 20 20 20 20 20 2f  *pDbToken,     /
73f0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
7400: 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e  tabase containin
7410: 67 20 74 61 62 6c 65 2c 20 6f 72 20 4e 55 4c 4c  g table, or NULL
7420: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61   */.  Token *pTa
7430: 62 6c 65 54 6f 6b 65 6e 2c 20 20 2f 2a 20 4e 61  bleToken,  /* Na
7440: 6d 65 20 6f 66 20 74 61 62 6c 65 20 63 6f 6e 74  me of table cont
7450: 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 2c 20 6f  aining column, o
7460: 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65  r NULL */.  Toke
7470: 6e 20 2a 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2c  n *pColumnToken,
7480: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
7490: 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20 20 4e 61 6d  column. */.  Nam
74a0: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20  eContext *pNC,  
74b0: 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 63 6f    /* The name co
74c0: 6e 74 65 78 74 20 75 73 65 64 20 74 6f 20 72 65  ntext used to re
74d0: 73 6f 6c 76 65 20 74 68 65 20 6e 61 6d 65 20 2a  solve the name *
74e0: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20  /.  Expr *pExpr 
74f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65           /* Make
7500: 20 74 68 69 73 20 45 58 50 52 20 6e 6f 64 65 20   this EXPR node 
7510: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 65 6c  point to the sel
7520: 65 63 74 65 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  ected column */.
7530: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 62 20 3d  ){.  char *zDb =
7540: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d   0;       /* Nam
7550: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
7560: 65 2e 20 20 54 68 65 20 22 58 22 20 69 6e 20 58  e.  The "X" in X
7570: 2e 59 2e 5a 20 2a 2f 0a 20 20 63 68 61 72 20 2a  .Y.Z */.  char *
7580: 7a 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 2f  zTab = 0;      /
7590: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
75a0: 62 6c 65 2e 20 20 54 68 65 20 22 59 22 20 69 6e  ble.  The "Y" in
75b0: 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20 2a 2f   X.Y.Z or Y.Z */
75c0: 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20  .  char *zCol = 
75d0: 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  0;      /* Name 
75e0: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 20  of the column.  
75f0: 54 68 65 20 22 5a 22 20 2a 2f 0a 20 20 69 6e 74  The "Z" */.  int
7600: 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
7610: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
7620: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 20  rs */.  int cnt 
7630: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
7640: 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69  Number of matchi
7650: 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ng column names 
7660: 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 54 61 62 20  */.  int cntTab 
7670: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d  = 0;      /* Num
7680: 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20  ber of matching 
7690: 74 61 62 6c 65 20 6e 61 6d 65 73 20 2a 2f 0a 20  table names */. 
76a0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
76b0: 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 54  Parse->db;  /* T
76c0: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
76d0: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
76e0: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 20 20  item *pItem;    
76f0: 20 20 20 2f 2a 20 55 73 65 20 66 6f 72 20 6c 6f     /* Use for lo
7700: 6f 70 69 6e 67 20 6f 76 65 72 20 70 53 72 63 4c  oping over pSrcL
7710: 69 73 74 20 69 74 65 6d 73 20 2a 2f 0a 20 20 73  ist items */.  s
7720: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
7730: 65 6d 20 2a 70 4d 61 74 63 68 20 3d 20 30 3b 20  em *pMatch = 0; 
7740: 20 2f 2a 20 54 68 65 20 6d 61 74 63 68 69 6e 67   /* The matching
7750: 20 70 53 72 63 4c 69 73 74 20 69 74 65 6d 20 2a   pSrcList item *
7760: 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  /.  NameContext 
7770: 2a 70 54 6f 70 4e 43 20 3d 20 70 4e 43 3b 20 20  *pTopNC = pNC;  
7780: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6e        /* First n
7790: 61 6d 65 63 6f 6e 74 65 78 74 20 69 6e 20 74 68  amecontext in th
77a0: 65 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73  e list */..  ass
77b0: 65 72 74 28 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65  ert( pColumnToke
77c0: 6e 20 26 26 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65  n && pColumnToke
77d0: 6e 2d 3e 7a 20 29 3b 20 2f 2a 20 54 68 65 20 5a  n->z ); /* The Z
77e0: 20 69 6e 20 58 2e 59 2e 5a 20 63 61 6e 6e 6f 74   in X.Y.Z cannot
77f0: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 7a 44   be NULL */.  zD
7800: 62 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  b = sqlite3NameF
7810: 72 6f 6d 54 6f 6b 65 6e 28 70 44 62 54 6f 6b 65  romToken(pDbToke
7820: 6e 29 3b 0a 20 20 7a 54 61 62 20 3d 20 73 71 6c  n);.  zTab = sql
7830: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
7840: 6e 28 70 54 61 62 6c 65 54 6f 6b 65 6e 29 3b 0a  n(pTableToken);.
7850: 20 20 7a 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33    zCol = sqlite3
7860: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 43  NameFromToken(pC
7870: 6f 6c 75 6d 6e 54 6f 6b 65 6e 29 3b 0a 20 20 69  olumnToken);.  i
7880: 66 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  f( sqlite3Malloc
7890: 46 61 69 6c 65 64 28 29 20 29 7b 0a 20 20 20 20  Failed() ){.    
78a0: 67 6f 74 6f 20 6c 6f 6f 6b 75 70 6e 61 6d 65 5f  goto lookupname_
78b0: 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 70 45 78 70  end;.  }..  pExp
78c0: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2d 31 3b 0a  r->iTable = -1;.
78d0: 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20    while( pNC && 
78e0: 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78  cnt==0 ){.    Ex
78f0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
7900: 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72      SrcList *pSr
7910: 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72  cList = pNC->pSr
7920: 63 4c 69 73 74 3b 0a 0a 20 20 20 20 69 66 28 20  cList;..    if( 
7930: 70 53 72 63 4c 69 73 74 20 29 7b 0a 20 20 20 20  pSrcList ){.    
7940: 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d    for(i=0, pItem
7950: 3d 70 53 72 63 4c 69 73 74 2d 3e 61 3b 20 69 3c  =pSrcList->a; i<
7960: 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pSrcList->nSrc; 
7970: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
7980: 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54         Table *pT
7990: 61 62 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ab;.        int 
79a0: 69 44 62 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c  iDb;.        Col
79b0: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 0a 20 20  umn *pCol;.  .  
79c0: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 49 74        pTab = pIt
79d0: 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  em->pTab;.      
79e0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d    assert( pTab!=
79f0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 44 62  0 );.        iDb
7a00: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
7a10: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
7a20: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
7a30: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
7a40: 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20  ->nCol>0 );.    
7a50: 20 20 20 20 69 66 28 20 7a 54 61 62 20 29 7b 0a      if( zTab ){.
7a60: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
7a70: 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20  tem->zAlias ){. 
7a80: 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
7a90: 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 49 74 65  *zTabName = pIte
7aa0: 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20  m->zAlias;.     
7ab0: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
7ac0: 65 33 53 74 72 49 43 6d 70 28 7a 54 61 62 4e 61  e3StrICmp(zTabNa
7ad0: 6d 65 2c 20 7a 54 61 62 29 21 3d 30 20 29 20 63  me, zTab)!=0 ) c
7ae0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
7af0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7b00: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62        char *zTab
7b10: 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  Name = pTab->zNa
7b20: 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
7b30: 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20  if( zTabName==0 
7b40: 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  || sqlite3StrICm
7b50: 70 28 7a 54 61 62 4e 61 6d 65 2c 20 7a 54 61 62  p(zTabName, zTab
7b60: 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
7b70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
7b80: 20 7a 44 62 21 3d 30 20 26 26 20 73 71 6c 69 74   zDb!=0 && sqlit
7b90: 65 33 53 74 72 49 43 6d 70 28 64 62 2d 3e 61 44  e3StrICmp(db->aD
7ba0: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 7a 44  b[iDb].zName, zD
7bb0: 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  b)!=0 ){.       
7bc0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
7bd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
7be0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7bf0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
7c00: 20 30 3d 3d 28 63 6e 74 54 61 62 2b 2b 29 20 29   0==(cntTab++) )
7c10: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70  {.          pExp
7c20: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 49 74 65  r->iTable = pIte
7c30: 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
7c40: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 53 63        pExpr->pSc
7c50: 68 65 6d 61 20 3d 20 70 54 61 62 2d 3e 70 53 63  hema = pTab->pSc
7c60: 68 65 6d 61 3b 0a 20 20 20 20 20 20 20 20 20 20  hema;.          
7c70: 70 4d 61 74 63 68 20 3d 20 70 49 74 65 6d 3b 0a  pMatch = pItem;.
7c80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7c90: 20 20 66 6f 72 28 6a 3d 30 2c 20 70 43 6f 6c 3d    for(j=0, pCol=
7ca0: 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54  pTab->aCol; j<pT
7cb0: 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70  ab->nCol; j++, p
7cc0: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
7cd0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
7ce0: 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  ICmp(pCol->zName
7cf0: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20  , zCol)==0 ){.  
7d00: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
7d10: 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 54  char *zColl = pT
7d20: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c  ab->aCol[j].zCol
7d30: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 49  l;.            I
7d40: 64 4c 69 73 74 20 2a 70 55 73 69 6e 67 3b 0a 20  dList *pUsing;. 
7d50: 20 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b             cnt++
7d60: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
7d70: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 49  xpr->iTable = pI
7d80: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
7d90: 20 20 20 20 20 20 20 20 20 20 70 4d 61 74 63 68            pMatch
7da0: 20 3d 20 70 49 74 65 6d 3b 0a 20 20 20 20 20 20   = pItem;.      
7db0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 53 63        pExpr->pSc
7dc0: 68 65 6d 61 20 3d 20 70 54 61 62 2d 3e 70 53 63  hema = pTab->pSc
7dd0: 68 65 6d 61 3b 0a 20 20 20 20 20 20 20 20 20 20  hema;.          
7de0: 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20    /* Substitute 
7df0: 74 68 65 20 72 6f 77 69 64 20 28 63 6f 6c 75 6d  the rowid (colum
7e00: 6e 20 2d 31 29 20 66 6f 72 20 74 68 65 20 49 4e  n -1) for the IN
7e10: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
7e20: 59 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  Y */.           
7e30: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
7e40: 3d 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79  = j==pTab->iPKey
7e50: 20 3f 20 2d 31 20 3a 20 6a 3b 0a 20 20 20 20 20   ? -1 : j;.     
7e60: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66         pExpr->af
7e70: 66 69 6e 69 74 79 20 3d 20 70 54 61 62 2d 3e 61  finity = pTab->a
7e80: 43 6f 6c 5b 6a 5d 2e 61 66 66 69 6e 69 74 79 3b  Col[j].affinity;
7e90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
7ea0: 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26   (pExpr->flags &
7eb0: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3d   EP_ExpCollate)=
7ec0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
7ed0: 20 20 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c      pExpr->pColl
7ee0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
7ef0: 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62  llSeq(db, ENC(db
7f00: 29 2c 20 7a 43 6f 6c 6c 2c 2d 31 2c 20 30 29 3b  ), zColl,-1, 0);
7f10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
7f20: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
7f30: 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 2d  <pSrcList->nSrc-
7f40: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
7f50: 20 20 20 69 66 28 20 70 49 74 65 6d 5b 31 5d 2e     if( pItem[1].
7f60: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41  jointype & JT_NA
7f70: 54 55 52 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  TURAL ){.       
7f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
7f90: 68 69 73 20 6d 61 74 63 68 20 6f 63 63 75 72 72  his match occurr
7fa0: 65 64 20 69 6e 20 74 68 65 20 6c 65 66 74 20 74  ed in the left t
7fb0: 61 62 6c 65 20 6f 66 20 61 20 6e 61 74 75 72 61  able of a natura
7fc0: 6c 20 6a 6f 69 6e 2c 0a 20 20 20 20 20 20 20 20  l join,.        
7fd0: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
7fe0: 73 6b 69 70 20 74 68 65 20 72 69 67 68 74 20 74  skip the right t
7ff0: 61 62 6c 65 20 74 6f 20 61 76 6f 69 64 20 61 20  able to avoid a 
8000: 64 75 70 6c 69 63 61 74 65 20 6d 61 74 63 68 20  duplicate match 
8010: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
8020: 20 20 20 70 49 74 65 6d 2b 2b 3b 0a 20 20 20 20     pItem++;.    
8030: 20 20 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b              i++;
8040: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
8050: 65 6c 73 65 20 69 66 28 20 28 70 55 73 69 6e 67  else if( (pUsing
8060: 20 3d 20 70 49 74 65 6d 5b 31 5d 2e 70 55 73 69   = pItem[1].pUsi
8070: 6e 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ng)!=0 ){.      
8080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
8090: 74 68 69 73 20 6d 61 74 63 68 20 6f 63 63 75 72  this match occur
80a0: 73 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 74 68  s on a column th
80b0: 61 74 20 69 73 20 69 6e 20 74 68 65 20 55 53 49  at is in the USI
80c0: 4e 47 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20  NG clause.      
80d0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20            ** of 
80e0: 61 20 6a 6f 69 6e 2c 20 73 6b 69 70 20 74 68 65  a join, skip the
80f0: 20 73 65 61 72 63 68 20 6f 66 20 74 68 65 20 72   search of the r
8100: 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20 74 68  ight table of th
8110: 65 20 6a 6f 69 6e 0a 20 20 20 20 20 20 20 20 20  e join.         
8120: 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f         ** to avo
8130: 69 64 20 61 20 64 75 70 6c 69 63 61 74 65 20 6d  id a duplicate m
8140: 61 74 63 68 20 74 68 65 72 65 2e 20 2a 2f 0a 20  atch there. */. 
8150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
8160: 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt k;.          
8170: 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
8180: 3c 70 55 73 69 6e 67 2d 3e 6e 49 64 3b 20 6b 2b  <pUsing->nId; k+
8190: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
81a0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
81b0: 33 53 74 72 49 43 6d 70 28 70 55 73 69 6e 67 2d  3StrICmp(pUsing-
81c0: 3e 61 5b 6b 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f  >a[k].zName, zCo
81d0: 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)==0 ){.       
81e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
81f0: 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  em++;.          
8200: 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20            i++;. 
8210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8220: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8230: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
8240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
8250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
8260: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
8270: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
8280: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
8290: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
82a0: 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
82b0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
82c0: 52 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 68  R.    /* If we h
82d0: 61 76 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  ave not already 
82e0: 72 65 73 6f 6c 76 65 64 20 74 68 65 20 6e 61 6d  resolved the nam
82f0: 65 2c 20 74 68 65 6e 20 6d 61 79 62 65 20 0a 20  e, then maybe . 
8300: 20 20 20 2a 2a 20 69 74 20 69 73 20 61 20 6e 65     ** it is a ne
8310: 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 74 72 69  w.* or old.* tri
8320: 67 67 65 72 20 61 72 67 75 6d 65 6e 74 20 72 65  gger argument re
8330: 66 65 72 65 6e 63 65 0a 20 20 20 20 2a 2f 0a 20  ference.    */. 
8340: 20 20 20 69 66 28 20 7a 44 62 3d 3d 30 20 26 26     if( zDb==0 &&
8350: 20 7a 54 61 62 21 3d 30 20 26 26 20 63 6e 74 3d   zTab!=0 && cnt=
8360: 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 74 72  =0 && pParse->tr
8370: 69 67 53 74 61 63 6b 21 3d 30 20 29 7b 0a 20 20  igStack!=0 ){.  
8380: 20 20 20 20 54 72 69 67 67 65 72 53 74 61 63 6b      TriggerStack
8390: 20 2a 70 54 72 69 67 67 65 72 53 74 61 63 6b 20   *pTriggerStack 
83a0: 3d 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74  = pParse->trigSt
83b0: 61 63 6b 3b 0a 20 20 20 20 20 20 54 61 62 6c 65  ack;.      Table
83c0: 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20   *pTab = 0;.    
83d0: 20 20 69 66 28 20 70 54 72 69 67 67 65 72 53 74    if( pTriggerSt
83e0: 61 63 6b 2d 3e 6e 65 77 49 64 78 20 21 3d 20 2d  ack->newIdx != -
83f0: 31 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  1 && sqlite3StrI
8400: 43 6d 70 28 22 6e 65 77 22 2c 20 7a 54 61 62 29  Cmp("new", zTab)
8410: 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 20 20 20   == 0 ){.       
8420: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
8430: 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e   pTriggerStack->
8440: 6e 65 77 49 64 78 3b 0a 20 20 20 20 20 20 20 20  newIdx;.        
8450: 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72  assert( pTrigger
8460: 53 74 61 63 6b 2d 3e 70 54 61 62 20 29 3b 0a 20  Stack->pTab );. 
8470: 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54         pTab = pT
8480: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61  riggerStack->pTa
8490: 62 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  b;.      }else i
84a0: 66 28 20 70 54 72 69 67 67 65 72 53 74 61 63 6b  f( pTriggerStack
84b0: 2d 3e 6f 6c 64 49 64 78 20 21 3d 20 2d 31 20 26  ->oldIdx != -1 &
84c0: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
84d0: 28 22 6f 6c 64 22 2c 20 7a 54 61 62 29 3d 3d 30  ("old", zTab)==0
84e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70   ){.        pExp
84f0: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 54 72 69  r->iTable = pTri
8500: 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 49 64  ggerStack->oldId
8510: 78 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  x;.        asser
8520: 74 28 20 70 54 72 69 67 67 65 72 53 74 61 63 6b  t( pTriggerStack
8530: 2d 3e 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20  ->pTab );.      
8540: 20 20 70 54 61 62 20 3d 20 70 54 72 69 67 67 65    pTab = pTrigge
8550: 72 53 74 61 63 6b 2d 3e 70 54 61 62 3b 0a 20 20  rStack->pTab;.  
8560: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
8570: 20 70 54 61 62 20 29 7b 20 0a 20 20 20 20 20 20   pTab ){ .      
8580: 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20    int iCol;.    
8590: 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c      Column *pCol
85a0: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 3b 0a 0a   = pTab->aCol;..
85b0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
85c0: 53 63 68 65 6d 61 20 3d 20 70 54 61 62 2d 3e 70  Schema = pTab->p
85d0: 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20 20 20  Schema;.        
85e0: 63 6e 74 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  cntTab++;.      
85f0: 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43    for(iCol=0; iC
8600: 6f 6c 20 3c 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b  ol < pTab->nCol;
8610: 20 69 43 6f 6c 2b 2b 2c 20 70 43 6f 6c 2b 2b 29   iCol++, pCol++)
8620: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   {.          if(
8630: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
8640: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  pCol->zName, zCo
8650: 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)==0 ){.       
8660: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
8670: 2a 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61  *zColl = pTab->a
8680: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 43 6f 6c 6c 3b  Col[iCol].zColl;
8690: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6e 74  .            cnt
86a0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
86b0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
86c0: 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b   iCol==pTab->iPK
86d0: 65 79 20 3f 20 2d 31 20 3a 20 69 43 6f 6c 3b 0a  ey ? -1 : iCol;.
86e0: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
86f0: 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 70 54  r->affinity = pT
8700: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 61  ab->aCol[iCol].a
8710: 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20  ffinity;.       
8720: 20 20 20 20 20 69 66 28 20 28 70 45 78 70 72 2d       if( (pExpr-
8730: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
8740: 6f 6c 6c 61 74 65 29 3d 3d 30 20 29 7b 0a 20 20  ollate)==0 ){.  
8750: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
8760: 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  r->pColl = sqlit
8770: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
8780: 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c  , ENC(db), zColl
8790: 2c 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ,-1, 0);.       
87a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
87b0: 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d     pExpr->pTab =
87c0: 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20   pTab;.         
87d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
87e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
87f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
8800: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
8810: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49  (SQLITE_OMIT_TRI
8820: 47 47 45 52 29 20 2a 2f 0a 0a 20 20 20 20 2f 2a  GGER) */..    /*
8830: 0a 20 20 20 20 2a 2a 20 50 65 72 68 61 70 73 20  .    ** Perhaps 
8840: 74 68 65 20 6e 61 6d 65 20 69 73 20 61 20 72 65  the name is a re
8850: 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 52  ference to the R
8860: 4f 57 49 44 0a 20 20 20 20 2a 2f 0a 20 20 20 20  OWID.    */.    
8870: 69 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 63 6e  if( cnt==0 && cn
8880: 74 54 61 62 3d 3d 31 20 26 26 20 73 71 6c 69 74  tTab==1 && sqlit
8890: 65 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c 29 20  e3IsRowid(zCol) 
88a0: 29 7b 0a 20 20 20 20 20 20 63 6e 74 20 3d 20 31  ){.      cnt = 1
88b0: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  ;.      pExpr->i
88c0: 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
88d0: 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69     pExpr->affini
88e0: 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ty = SQLITE_AFF_
88f0: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 7d 0a 0a  INTEGER;.    }..
8900: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66      /*.    ** If
8910: 20 74 68 65 20 69 6e 70 75 74 20 69 73 20 6f 66   the input is of
8920: 20 74 68 65 20 66 6f 72 6d 20 5a 20 28 6e 6f 74   the form Z (not
8930: 20 59 2e 5a 20 6f 72 20 58 2e 59 2e 5a 29 20 74   Y.Z or X.Y.Z) t
8940: 68 65 6e 20 74 68 65 20 6e 61 6d 65 20 5a 0a 20  hen the name Z. 
8950: 20 20 20 2a 2a 20 6d 69 67 68 74 20 72 65 66 65     ** might refe
8960: 72 20 74 6f 20 61 6e 20 72 65 73 75 6c 74 2d 73  r to an result-s
8970: 65 74 20 61 6c 69 61 73 2e 20 20 54 68 69 73 20  et alias.  This 
8980: 68 61 70 70 65 6e 73 2c 20 66 6f 72 20 65 78 61  happens, for exa
8990: 6d 70 6c 65 2c 20 77 68 65 6e 0a 20 20 20 20 2a  mple, when.    *
89a0: 2a 20 77 65 20 61 72 65 20 72 65 73 6f 6c 76 69  * we are resolvi
89b0: 6e 67 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20  ng names in the 
89c0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20  WHERE clause of 
89d0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  the following co
89e0: 6d 6d 61 6e 64 3a 0a 20 20 20 20 2a 2a 0a 20 20  mmand:.    **.  
89f0: 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
8a00: 61 2b 62 20 41 53 20 78 20 46 52 4f 4d 20 74 61  a+b AS x FROM ta
8a10: 62 6c 65 20 57 48 45 52 45 20 78 3c 31 30 3b 0a  ble WHERE x<10;.
8a20: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e      **.    ** In
8a30: 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69 73   cases like this
8a40: 2c 20 72 65 70 6c 61 63 65 20 70 45 78 70 72 20  , replace pExpr 
8a50: 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74  with a copy of t
8a60: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
8a70: 61 74 0a 20 20 20 20 2a 2a 20 66 6f 72 6d 73 20  at.    ** forms 
8a80: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 65  the result set e
8a90: 6e 74 72 79 20 28 22 61 2b 62 22 20 69 6e 20 74  ntry ("a+b" in t
8aa0: 68 65 20 65 78 61 6d 70 6c 65 29 20 61 6e 64 20  he example) and 
8ab0: 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65  return immediate
8ac0: 6c 79 2e 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20  ly..    ** Note 
8ad0: 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73  that the express
8ae0: 69 6f 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ion in the resul
8af0: 74 20 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76  t set should hav
8b00: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20  e already been. 
8b10: 20 20 20 2a 2a 20 72 65 73 6f 6c 76 65 64 20 62     ** resolved b
8b20: 79 20 74 68 65 20 74 69 6d 65 20 74 68 65 20 57  y the time the W
8b30: 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 72  HERE clause is r
8b40: 65 73 6f 6c 76 65 64 2e 0a 20 20 20 20 2a 2f 0a  esolved..    */.
8b50: 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26      if( cnt==0 &
8b60: 26 20 28 70 45 4c 69 73 74 20 3d 20 70 4e 43 2d  & (pEList = pNC-
8b70: 3e 70 45 4c 69 73 74 29 21 3d 30 20 26 26 20 7a  >pEList)!=0 && z
8b80: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
8b90: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 45 4c 69 73  for(j=0; j<pELis
8ba0: 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a  t->nExpr; j++){.
8bb0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41          char *zA
8bc0: 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d  s = pEList->a[j]
8bd0: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
8be0: 69 66 28 20 7a 41 73 21 3d 30 20 26 26 20 73 71  if( zAs!=0 && sq
8bf0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 73  lite3StrICmp(zAs
8c00: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20  , zCol)==0 ){.  
8c10: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 44          Expr *pD
8c20: 75 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  up;.          as
8c30: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65  sert( pExpr->pLe
8c40: 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  ft==0 && pExpr->
8c50: 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
8c60: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
8c70: 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29  Expr->pList==0 )
8c80: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
8c90: 72 74 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  rt( pExpr->pSele
8ca0: 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ct==0 );.       
8cb0: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
8cc0: 33 45 78 70 72 44 75 70 28 70 45 4c 69 73 74 2d  3ExprDup(pEList-
8cd0: 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[j].pExpr);.  
8ce0: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
8cf0: 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78  r->flags & EP_Ex
8d00: 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20  pCollate ){.    
8d10: 20 20 20 20 20 20 20 20 70 44 75 70 2d 3e 70 43          pDup->pC
8d20: 6f 6c 6c 20 3d 20 70 45 78 70 72 2d 3e 70 43 6f  oll = pExpr->pCo
8d30: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll;.            
8d40: 70 44 75 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  pDup->flags |= E
8d50: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20  P_ExpCollate;.  
8d60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8d70: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 73      if( pExpr->s
8d80: 70 61 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74 65  pan.dyn ) sqlite
8d90: 46 72 65 65 28 28 63 68 61 72 2a 29 70 45 78 70  Free((char*)pExp
8da0: 72 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20 20 20  r->span.z);.    
8db0: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
8dc0: 3e 74 6f 6b 65 6e 2e 64 79 6e 20 29 20 73 71 6c  >token.dyn ) sql
8dd0: 69 74 65 46 72 65 65 28 28 63 68 61 72 2a 29 70  iteFree((char*)p
8de0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a  Expr->token.z);.
8df0: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
8e00: 28 70 45 78 70 72 2c 20 70 44 75 70 2c 20 73 69  (pExpr, pDup, si
8e10: 7a 65 6f 66 28 2a 70 45 78 70 72 29 29 3b 0a 20  zeof(*pExpr));. 
8e20: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46           sqliteF
8e30: 72 65 65 28 70 44 75 70 29 3b 0a 20 20 20 20 20  ree(pDup);.     
8e40: 20 20 20 20 20 63 6e 74 20 3d 20 31 3b 0a 20 20       cnt = 1;.  
8e50: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8e60: 7a 54 61 62 3d 3d 30 20 26 26 20 7a 44 62 3d 3d  zTab==0 && zDb==
8e70: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  0 );.          g
8e80: 6f 74 6f 20 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65  oto lookupname_e
8e90: 6e 64 5f 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nd_2;.        }.
8ea0: 20 20 20 20 20 20 7d 20 0a 20 20 20 20 7d 0a 0a        } .    }..
8eb0: 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 74      /* Advance t
8ec0: 6f 20 74 68 65 20 6e 65 78 74 20 6e 61 6d 65 20  o the next name 
8ed0: 63 6f 6e 74 65 78 74 2e 20 20 54 68 65 20 6c 6f  context.  The lo
8ee0: 6f 70 20 77 69 6c 6c 20 65 78 69 74 20 77 68 65  op will exit whe
8ef0: 6e 20 65 69 74 68 65 72 0a 20 20 20 20 2a 2a 20  n either.    ** 
8f00: 77 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 20  we have a match 
8f10: 28 63 6e 74 3e 30 29 20 6f 72 20 77 68 65 6e 20  (cnt>0) or when 
8f20: 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6e 61  we run out of na
8f30: 6d 65 20 63 6f 6e 74 65 78 74 73 2e 0a 20 20 20  me contexts..   
8f40: 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e 74 3d   */.    if( cnt=
8f50: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4e 43 20  =0 ){.      pNC 
8f60: 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pNC->pNext;.  
8f70: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20    }.  }..  /*.  
8f80: 2a 2a 20 49 66 20 58 20 61 6e 64 20 59 20 61 72  ** If X and Y ar
8f90: 65 20 4e 55 4c 4c 20 28 69 6e 20 6f 74 68 65 72  e NULL (in other
8fa0: 20 77 6f 72 64 73 20 69 66 20 6f 6e 6c 79 20 74   words if only t
8fb0: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 5a  he column name Z
8fc0: 20 69 73 0a 20 20 2a 2a 20 73 75 70 70 6c 69 65   is.  ** supplie
8fd0: 64 29 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65  d) and the value
8fe0: 20 6f 66 20 5a 20 69 73 20 65 6e 63 6c 6f 73 65   of Z is enclose
8ff0: 64 20 69 6e 20 64 6f 75 62 6c 65 2d 71 75 6f 74  d in double-quot
9000: 65 73 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 5a 20  es, then.  ** Z 
9010: 69 73 20 61 20 73 74 72 69 6e 67 20 6c 69 74 65  is a string lite
9020: 72 61 6c 20 69 66 20 69 74 20 64 6f 65 73 6e 27  ral if it doesn'
9030: 74 20 6d 61 74 63 68 20 61 6e 79 20 63 6f 6c 75  t match any colu
9040: 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 6e 20 74 68  mn names.  In th
9050: 61 74 0a 20 20 2a 2a 20 63 61 73 65 2c 20 77 65  at.  ** case, we
9060: 20 6e 65 65 64 20 74 6f 20 72 65 74 75 72 6e 20   need to return 
9070: 72 69 67 68 74 20 61 77 61 79 20 61 6e 64 20 6e  right away and n
9080: 6f 74 20 6d 61 6b 65 20 61 6e 79 20 63 68 61 6e  ot make any chan
9090: 67 65 73 20 74 6f 0a 20 20 2a 2a 20 70 45 78 70  ges to.  ** pExp
90a0: 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 65 63  r..  **.  ** Bec
90b0: 61 75 73 65 20 6e 6f 20 72 65 66 65 72 65 6e 63  ause no referenc
90c0: 65 20 77 61 73 20 6d 61 64 65 20 74 6f 20 6f 75  e was made to ou
90d0: 74 65 72 20 63 6f 6e 74 65 78 74 73 2c 20 74 68  ter contexts, th
90e0: 65 20 70 4e 43 2d 3e 6e 52 65 66 0a 20 20 2a 2a  e pNC->nRef.  **
90f0: 20 66 69 65 6c 64 73 20 61 72 65 20 6e 6f 74 20   fields are not 
9100: 63 68 61 6e 67 65 64 20 69 6e 20 61 6e 79 20 63  changed in any c
9110: 6f 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a 20 20 69  ontext..  */.  i
9120: 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 7a 54 61  f( cnt==0 && zTa
9130: 62 3d 3d 30 20 26 26 20 70 43 6f 6c 75 6d 6e 54  b==0 && pColumnT
9140: 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 22 27 20  oken->z[0]=='"' 
9150: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
9160: 65 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 72 65 74  e(zCol);.    ret
9170: 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
9180: 0a 20 20 2a 2a 20 63 6e 74 3d 3d 30 20 6d 65 61  .  ** cnt==0 mea
9190: 6e 73 20 74 68 65 72 65 20 77 61 73 20 6e 6f 74  ns there was not
91a0: 20 6d 61 74 63 68 2e 20 20 63 6e 74 3e 31 20 6d   match.  cnt>1 m
91b0: 65 61 6e 73 20 74 68 65 72 65 20 77 65 72 65 20  eans there were 
91c0: 74 77 6f 20 6f 72 0a 20 20 2a 2a 20 6d 6f 72 65  two or.  ** more
91d0: 20 6d 61 74 63 68 65 73 2e 20 20 45 69 74 68 65   matches.  Eithe
91e0: 72 20 77 61 79 2c 20 77 65 20 68 61 76 65 20 61  r way, we have a
91f0: 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20  n error..  */.  
9200: 69 66 28 20 63 6e 74 21 3d 31 20 29 7b 0a 20 20  if( cnt!=1 ){.  
9210: 20 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20    char *z = 0;. 
9220: 20 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20     char *zErr;. 
9230: 20 20 20 7a 45 72 72 20 3d 20 63 6e 74 3d 3d 30     zErr = cnt==0
9240: 20 3f 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75   ? "no such colu
9250: 6d 6e 3a 20 25 73 22 20 3a 20 22 61 6d 62 69 67  mn: %s" : "ambig
9260: 75 6f 75 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  uous column name
9270: 3a 20 25 73 22 3b 0a 20 20 20 20 69 66 28 20 7a  : %s";.    if( z
9280: 44 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  Db ){.      sqli
9290: 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a 2c  te3SetString(&z,
92a0: 20 7a 44 62 2c 20 22 2e 22 2c 20 7a 54 61 62 2c   zDb, ".", zTab,
92b0: 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20 28 63 68 61   ".", zCol, (cha
92c0: 72 2a 29 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  r*)0);.    }else
92d0: 20 69 66 28 20 7a 54 61 62 20 29 7b 0a 20 20 20   if( zTab ){.   
92e0: 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
92f0: 69 6e 67 28 26 7a 2c 20 7a 54 61 62 2c 20 22 2e  ing(&z, zTab, ".
9300: 22 2c 20 7a 43 6f 6c 2c 20 28 63 68 61 72 2a 29  ", zCol, (char*)
9310: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
9320: 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 53       z = sqliteS
9330: 74 72 44 75 70 28 7a 43 6f 6c 29 3b 0a 20 20 20  trDup(zCol);.   
9340: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72   }.    sqlite3Er
9350: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 7a  rorMsg(pParse, z
9360: 45 72 72 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c  Err, z);.    sql
9370: 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20  iteFree(z);.    
9380: 70 54 6f 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a  pTopNC->nErr++;.
9390: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 63    }..  /* If a c
93a0: 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 20 74 61 62  olumn from a tab
93b0: 6c 65 20 69 6e 20 70 53 72 63 4c 69 73 74 20 69  le in pSrcList i
93c0: 73 20 72 65 66 65 72 65 6e 63 65 64 2c 20 74 68  s referenced, th
93d0: 65 6e 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 74  en record.  ** t
93e0: 68 69 73 20 66 61 63 74 20 69 6e 20 74 68 65 20  his fact in the 
93f0: 70 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 63 6f 6c  pSrcList.a[].col
9400: 55 73 65 64 20 62 69 74 6d 61 73 6b 2e 20 20 43  Used bitmask.  C
9410: 6f 6c 75 6d 6e 20 30 20 63 61 75 73 65 73 0a 20  olumn 0 causes. 
9420: 20 2a 2a 20 62 69 74 20 30 20 74 6f 20 62 65 20   ** bit 0 to be 
9430: 73 65 74 2e 20 20 43 6f 6c 75 6d 6e 20 31 20 73  set.  Column 1 s
9440: 65 74 73 20 62 69 74 20 31 2e 20 20 41 6e 64 20  ets bit 1.  And 
9450: 73 6f 20 66 6f 72 74 68 2e 20 20 49 66 20 74 68  so forth.  If th
9460: 65 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 75  e.  ** column nu
9470: 6d 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20  mber is greater 
9480: 74 68 61 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  than the number 
9490: 6f 66 20 62 69 74 73 20 69 6e 20 74 68 65 20 62  of bits in the b
94a0: 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 74 68 65 6e  itmask.  ** then
94b0: 20 73 65 74 20 74 68 65 20 68 69 67 68 2d 6f 72   set the high-or
94c0: 64 65 72 20 62 69 74 20 6f 66 20 74 68 65 20 62  der bit of the b
94d0: 69 74 6d 61 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69  itmask..  */.  i
94e0: 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
94f0: 6e 3e 3d 30 20 26 26 20 70 4d 61 74 63 68 21 3d  n>=0 && pMatch!=
9500: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  0 ){.    int n =
9510: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
9520: 0a 20 20 20 20 69 66 28 20 6e 3e 3d 73 69 7a 65  .    if( n>=size
9530: 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 20 29 7b  of(Bitmask)*8 ){
9540: 0a 20 20 20 20 20 20 6e 20 3d 20 73 69 7a 65 6f  .      n = sizeo
9550: 66 28 42 69 74 6d 61 73 6b 29 2a 38 2d 31 3b 0a  f(Bitmask)*8-1;.
9560: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
9570: 28 20 70 4d 61 74 63 68 2d 3e 69 43 75 72 73 6f  ( pMatch->iCurso
9580: 72 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  r==pExpr->iTable
9590: 20 29 3b 0a 20 20 20 20 70 4d 61 74 63 68 2d 3e   );.    pMatch->
95a0: 63 6f 6c 55 73 65 64 20 7c 3d 20 28 28 42 69 74  colUsed |= ((Bit
95b0: 6d 61 73 6b 29 31 29 3c 3c 6e 3b 0a 20 20 7d 0a  mask)1)<<n;.  }.
95c0: 0a 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 3a  .lookupname_end:
95d0: 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 61  .  /* Clean up a
95e0: 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20  nd return.  */. 
95f0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 44 62 29   sqliteFree(zDb)
9600: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
9610: 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  Tab);.  sqlite3E
9620: 78 70 72 44 65 6c 65 74 65 28 70 45 78 70 72 2d  xprDelete(pExpr-
9630: 3e 70 4c 65 66 74 29 3b 0a 20 20 70 45 78 70 72  >pLeft);.  pExpr
9640: 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 73  ->pLeft = 0;.  s
9650: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
9660: 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b  (pExpr->pRight);
9670: 0a 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  .  pExpr->pRight
9680: 20 3d 20 30 3b 0a 20 20 70 45 78 70 72 2d 3e 6f   = 0;.  pExpr->o
9690: 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 6c  p = TK_COLUMN;.l
96a0: 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 5f 32 3a  ookupname_end_2:
96b0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 43  .  sqliteFree(zC
96c0: 6f 6c 29 3b 0a 20 20 69 66 28 20 63 6e 74 3d 3d  ol);.  if( cnt==
96d0: 31 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  1 ){.    assert(
96e0: 20 70 4e 43 21 3d 30 20 29 3b 0a 20 20 20 20 73   pNC!=0 );.    s
96f0: 71 6c 69 74 65 33 41 75 74 68 52 65 61 64 28 70  qlite3AuthRead(p
9700: 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 70 4e  Parse, pExpr, pN
9710: 43 2d 3e 70 53 72 63 4c 69 73 74 29 3b 0a 20 20  C->pSrcList);.  
9720: 20 20 69 66 28 20 70 4d 61 74 63 68 20 26 26 20    if( pMatch && 
9730: 21 70 4d 61 74 63 68 2d 3e 70 53 65 6c 65 63 74  !pMatch->pSelect
9740: 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   ){.      pExpr-
9750: 3e 70 54 61 62 20 3d 20 70 4d 61 74 63 68 2d 3e  >pTab = pMatch->
9760: 70 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pTab;.    }.    
9770: 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
9780: 20 6e 52 65 66 20 76 61 6c 75 65 20 6f 6e 20 61   nRef value on a
9790: 6c 6c 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 73  ll name contexts
97a0: 20 66 72 6f 6d 20 54 6f 70 4e 43 20 75 70 20 74   from TopNC up t
97b0: 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 69  o.    ** the poi
97c0: 6e 74 20 77 68 65 72 65 20 74 68 65 20 6e 61 6d  nt where the nam
97d0: 65 20 6d 61 74 63 68 65 64 2e 20 2a 2f 0a 20 20  e matched. */.  
97e0: 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20    for(;;){.     
97f0: 20 61 73 73 65 72 74 28 20 70 54 6f 70 4e 43 21   assert( pTopNC!
9800: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54 6f 70  =0 );.      pTop
9810: 4e 43 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  NC->nRef++;.    
9820: 20 20 69 66 28 20 70 54 6f 70 4e 43 3d 3d 70 4e    if( pTopNC==pN
9830: 43 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  C ) break;.     
9840: 20 70 54 6f 70 4e 43 20 3d 20 70 54 6f 70 4e 43   pTopNC = pTopNC
9850: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
9860: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
9870: 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75   else {.    retu
9880: 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rn 1;.  }.}../*.
9890: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
98a0: 69 73 20 64 65 73 69 67 6e 65 64 20 61 73 20 61  is designed as a
98b0: 6e 20 78 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b  n xFunc for walk
98c0: 45 78 70 72 54 72 65 65 28 29 2e 0a 2a 2a 0a 2a  ExprTree()..**.*
98d0: 2a 20 52 65 73 6f 6c 76 65 20 73 79 6d 62 6f 6c  * Resolve symbol
98e0: 69 63 20 6e 61 6d 65 73 20 69 6e 74 6f 20 54 4b  ic names into TK
98f0: 5f 43 4f 4c 55 4d 4e 20 6f 70 65 72 61 74 6f 72  _COLUMN operator
9900: 73 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  s for the curren
9910: 74 0a 2a 2a 20 6e 6f 64 65 20 69 6e 20 74 68 65  t.** node in the
9920: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
9930: 2e 20 20 52 65 74 75 72 6e 20 30 20 74 6f 20 63  .  Return 0 to c
9940: 6f 6e 74 69 6e 75 65 20 74 68 65 20 73 65 61 72  ontinue the sear
9950: 63 68 20 64 6f 77 6e 0a 2a 2a 20 74 68 65 20 74  ch down.** the t
9960: 72 65 65 20 6f 72 20 32 20 74 6f 20 61 62 6f 72  ree or 2 to abor
9970: 74 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b 2e  t the tree walk.
9980: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
9990: 69 6e 65 20 61 6c 73 6f 20 64 6f 65 73 20 65 72  ine also does er
99a0: 72 6f 72 20 63 68 65 63 6b 69 6e 67 20 61 6e 64  ror checking and
99b0: 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
99c0: 20 66 6f 72 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e   for.** function
99d0: 20 6e 61 6d 65 73 2e 20 20 54 68 65 20 6f 70 65   names.  The ope
99e0: 72 61 74 6f 72 20 66 6f 72 20 61 67 67 72 65 67  rator for aggreg
99f0: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 73  ate functions is
9a00: 20 63 68 61 6e 67 65 64 0a 2a 2a 20 74 6f 20 54   changed.** to T
9a10: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 2e 0a  K_AGG_FUNCTION..
9a20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 61  */.static int na
9a30: 6d 65 52 65 73 6f 6c 76 65 72 53 74 65 70 28 76  meResolverStep(v
9a40: 6f 69 64 20 2a 70 41 72 67 2c 20 45 78 70 72 20  oid *pArg, Expr 
9a50: 2a 70 45 78 70 72 29 7b 0a 20 20 4e 61 6d 65 43  *pExpr){.  NameC
9a60: 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 28 4e  ontext *pNC = (N
9a70: 61 6d 65 43 6f 6e 74 65 78 74 2a 29 70 41 72 67  ameContext*)pArg
9a80: 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  ;.  Parse *pPars
9a90: 65 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d  e;..  if( pExpr=
9aa0: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
9ab0: 20 61 73 73 65 72 74 28 20 70 4e 43 21 3d 30 20   assert( pNC!=0 
9ac0: 29 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 4e  );.  pParse = pN
9ad0: 43 2d 3e 70 50 61 72 73 65 3b 0a 0a 20 20 69 66  C->pParse;..  if
9ae0: 28 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70  ( ExprHasAnyProp
9af0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 52  erty(pExpr, EP_R
9b00: 65 73 6f 6c 76 65 64 29 20 29 20 72 65 74 75 72  esolved) ) retur
9b10: 6e 20 31 3b 0a 20 20 45 78 70 72 53 65 74 50 72  n 1;.  ExprSetPr
9b20: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
9b30: 5f 52 65 73 6f 6c 76 65 64 29 3b 0a 23 69 66 6e  _Resolved);.#ifn
9b40: 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69 66 28  def NDEBUG.  if(
9b50: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 20 26   pNC->pSrcList &
9b60: 26 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 2d  & pNC->pSrcList-
9b70: 3e 6e 41 6c 6c 6f 63 3e 30 20 29 7b 0a 20 20 20  >nAlloc>0 ){.   
9b80: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69   SrcList *pSrcLi
9b90: 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69  st = pNC->pSrcLi
9ba0: 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  st;.    int i;. 
9bb0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e     for(i=0; i<pN
9bc0: 43 2d 3e 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72  C->pSrcList->nSr
9bd0: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  c; i++){.      a
9be0: 73 73 65 72 74 28 20 70 53 72 63 4c 69 73 74 2d  ssert( pSrcList-
9bf0: 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3e 3d 30  >a[i].iCursor>=0
9c00: 20 26 26 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b   && pSrcList->a[
9c10: 69 5d 2e 69 43 75 72 73 6f 72 3c 70 50 61 72 73  i].iCursor<pPars
9c20: 65 2d 3e 6e 54 61 62 29 3b 0a 20 20 20 20 7d 0a  e->nTab);.    }.
9c30: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 77 69    }.#endif.  swi
9c40: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
9c50: 7b 0a 20 20 20 20 2f 2a 20 44 6f 75 62 6c 65 2d  {.    /* Double-
9c60: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 73 20 28  quoted strings (
9c70: 65 78 3a 20 22 61 62 63 22 29 20 61 72 65 20 75  ex: "abc") are u
9c80: 73 65 64 20 61 73 20 69 64 65 6e 74 69 66 69 65  sed as identifie
9c90: 72 73 20 69 66 0a 20 20 20 20 2a 2a 20 70 6f 73  rs if.    ** pos
9ca0: 73 69 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73  sible.  Otherwis
9cb0: 65 20 74 68 65 79 20 72 65 6d 61 69 6e 20 61 73  e they remain as
9cc0: 20 73 74 72 69 6e 67 73 2e 20 20 53 69 6e 67 6c   strings.  Singl
9cd0: 65 2d 71 75 6f 74 65 64 0a 20 20 20 20 2a 2a 20  e-quoted.    ** 
9ce0: 73 74 72 69 6e 67 73 20 28 65 78 3a 20 27 61 62  strings (ex: 'ab
9cf0: 63 27 29 20 61 72 65 20 61 6c 77 61 79 73 20 73  c') are always s
9d00: 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 73 2e 0a  tring literals..
9d10: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
9d20: 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20  TK_STRING: {.   
9d30: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f     if( pExpr->to
9d40: 6b 65 6e 2e 7a 5b 30 5d 3d 3d 27 5c 27 27 20 29  ken.z[0]=='\'' )
9d50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 2f 2a   break;.      /*
9d60: 20 46 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20   Fall thru into 
9d70: 74 68 65 20 54 4b 5f 49 44 20 63 61 73 65 20 69  the TK_ID case i
9d80: 66 20 74 68 69 73 20 69 73 20 61 20 64 6f 75 62  f this is a doub
9d90: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
9da0: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a   */.    }.    /*
9db0: 20 41 20 6c 6f 6e 65 20 69 64 65 6e 74 69 66 69   A lone identifi
9dc0: 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  er is the name o
9dd0: 66 20 61 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20  f a column..    
9de0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  */.    case TK_I
9df0: 44 3a 20 7b 0a 20 20 20 20 20 20 6c 6f 6f 6b 75  D: {.      looku
9e00: 70 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 30 2c  pName(pParse, 0,
9e10: 20 30 2c 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65   0, &pExpr->toke
9e20: 6e 2c 20 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a  n, pNC, pExpr);.
9e30: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
9e40: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
9e50: 41 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  A table name and
9e60: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20 20   column name:   
9e70: 20 20 49 44 2e 49 44 0a 20 20 20 20 2a 2a 20 4f    ID.ID.    ** O
9e80: 72 20 61 20 64 61 74 61 62 61 73 65 2c 20 74 61  r a database, ta
9e90: 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 3a 20  ble and column: 
9ea0: 20 49 44 2e 49 44 2e 49 44 0a 20 20 20 20 2a 2f   ID.ID.ID.    */
9eb0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f 54  .    case TK_DOT
9ec0: 3a 20 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20  : {.      Token 
9ed0: 2a 70 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  *pColumn;.      
9ee0: 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 3b 0a 20  Token *pTable;. 
9ef0: 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 44 62 3b       Token *pDb;
9f00: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69  .      Expr *pRi
9f10: 67 68 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 69  ght;..      /* i
9f20: 66 28 20 70 53 72 63 4c 69 73 74 3d 3d 30 20 29  f( pSrcList==0 )
9f30: 20 62 72 65 61 6b 3b 20 2a 2f 0a 20 20 20 20 20   break; */.     
9f40: 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d   pRight = pExpr-
9f50: 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69  >pRight;.      i
9f60: 66 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  f( pRight->op==T
9f70: 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20  K_ID ){.        
9f80: 70 44 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  pDb = 0;.       
9f90: 20 70 54 61 62 6c 65 20 3d 20 26 70 45 78 70 72   pTable = &pExpr
9fa0: 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a  ->pLeft->token;.
9fb0: 20 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20          pColumn 
9fc0: 3d 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e  = &pRight->token
9fd0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
9fe0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
9ff0: 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  Right->op==TK_DO
a000: 54 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62  T );.        pDb
a010: 20 3d 20 26 70 45 78 70 72 2d 3e 70 4c 65 66 74   = &pExpr->pLeft
a020: 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  ->token;.       
a030: 20 70 54 61 62 6c 65 20 3d 20 26 70 52 69 67 68   pTable = &pRigh
a040: 74 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b  t->pLeft->token;
a050: 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e  .        pColumn
a060: 20 3d 20 26 70 52 69 67 68 74 2d 3e 70 52 69 67   = &pRight->pRig
a070: 68 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20  ht->token;.     
a080: 20 7d 0a 20 20 20 20 20 20 6c 6f 6f 6b 75 70 4e   }.      lookupN
a090: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 44 62 2c  ame(pParse, pDb,
a0a0: 20 70 54 61 62 6c 65 2c 20 70 43 6f 6c 75 6d 6e   pTable, pColumn
a0b0: 2c 20 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20  , pNC, pExpr);. 
a0c0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
a0d0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73     }..    /* Res
a0e0: 6f 6c 76 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61  olve function na
a0f0: 6d 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  mes.    */.    c
a100: 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e  ase TK_CONST_FUN
a110: 43 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  C:.    case TK_F
a120: 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
a130: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
a140: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b   = pExpr->pList;
a150: 20 20 20 20 2f 2a 20 54 68 65 20 61 72 67 75 6d      /* The argum
a160: 65 6e 74 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20  ent list */.    
a170: 20 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 20    int n = pList 
a180: 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  ? pList->nExpr :
a190: 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f   0;  /* Number o
a1a0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
a1b0: 20 20 20 20 20 69 6e 74 20 6e 6f 5f 73 75 63 68       int no_such
a1c0: 5f 66 75 6e 63 20 3d 20 30 3b 20 20 20 20 20 20  _func = 0;      
a1d0: 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f 20 73   /* True if no s
a1e0: 75 63 68 20 66 75 6e 63 74 69 6f 6e 20 65 78 69  uch function exi
a1f0: 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  sts */.      int
a200: 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20   wrong_num_args 
a210: 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65  = 0;     /* True
a220: 20 69 66 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72   if wrong number
a230: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
a240: 0a 20 20 20 20 20 20 69 6e 74 20 69 73 5f 61 67  .      int is_ag
a250: 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
a260: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 73     /* True if is
a270: 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 66 75   an aggregate fu
a280: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  nction */.      
a290: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74  int i;.      int
a2a0: 20 61 75 74 68 3b 20 20 20 20 20 20 20 20 20 20   auth;          
a2b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 75 74 68           /* Auth
a2c0: 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 75 73 65  orization to use
a2d0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   the function */
a2e0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 20  .      int nId; 
a2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a300: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
a310: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 66 75  characters in fu
a320: 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
a330: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
a340: 2a 7a 49 64 3b 20 20 20 20 20 20 20 20 20 20 20  *zId;           
a350: 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e   /* The function
a360: 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20   name. */.      
a370: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20  FuncDef *pDef;  
a380: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
a390: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
a3a0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   the function */
a3b0: 0a 20 20 20 20 20 20 69 6e 74 20 65 6e 63 20 3d  .      int enc =
a3c0: 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29   ENC(pParse->db)
a3d0: 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61  ;  /* The databa
a3e0: 73 65 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 0a  se encoding */..
a3f0: 20 20 20 20 20 20 7a 49 64 20 3d 20 28 63 68 61        zId = (cha
a400: 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  r*)pExpr->token.
a410: 7a 3b 0a 20 20 20 20 20 20 6e 49 64 20 3d 20 70  z;.      nId = p
a420: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20  Expr->token.n;. 
a430: 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69       pDef = sqli
a440: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
a450: 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c  pParse->db, zId,
a460: 20 6e 49 64 2c 20 6e 2c 20 65 6e 63 2c 20 30 29   nId, n, enc, 0)
a470: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  ;.      if( pDef
a480: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
a490: 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Def = sqlite3Fin
a4a0: 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  dFunction(pParse
a4b0: 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20  ->db, zId, nId, 
a4c0: 2d 31 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20  -1, enc, 0);.   
a4d0: 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30       if( pDef==0
a4e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f   ){.          no
a4f0: 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20 31 3b 0a  _such_func = 1;.
a500: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
a510: 20 20 20 20 20 20 20 20 20 77 72 6f 6e 67 5f 6e           wrong_n
a520: 75 6d 5f 61 72 67 73 20 3d 20 31 3b 0a 20 20 20  um_args = 1;.   
a530: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
a540: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 73 5f 61  se{.        is_a
a550: 67 67 20 3d 20 70 44 65 66 2d 3e 78 46 75 6e 63  gg = pDef->xFunc
a560: 3d 3d 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  ==0;.      }.#if
a570: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a580: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
a590: 20 20 20 20 20 69 66 28 20 70 44 65 66 20 29 7b       if( pDef ){
a5a0: 0a 20 20 20 20 20 20 20 20 61 75 74 68 20 3d 20  .        auth = 
a5b0: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
a5c0: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
a5d0: 46 55 4e 43 54 49 4f 4e 2c 20 30 2c 20 70 44 65  FUNCTION, 0, pDe
a5e0: 66 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  f->zName, 0);.  
a5f0: 20 20 20 20 20 20 69 66 28 20 61 75 74 68 21 3d        if( auth!=
a600: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
a610: 20 20 20 20 20 20 20 69 66 28 20 61 75 74 68 3d         if( auth=
a620: 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20 29 7b 0a  =SQLITE_DENY ){.
a630: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
a640: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
a650: 73 65 2c 20 22 6e 6f 74 20 61 75 74 68 6f 72 69  se, "not authori
a660: 7a 65 64 20 74 6f 20 75 73 65 20 66 75 6e 63 74  zed to use funct
a670: 69 6f 6e 3a 20 25 73 22 2c 0a 20 20 20 20 20 20  ion: %s",.      
a680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44                pD
a6a0: 65 66 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ef->zName);.    
a6b0: 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72          pNC->nEr
a6c0: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  r++;.          }
a6d0: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
a6e0: 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a  ->op = TK_NULL;.
a6f0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
a700: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
a710: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
a720: 20 20 20 69 66 28 20 69 73 5f 61 67 67 20 26 26     if( is_agg &&
a730: 20 21 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20   !pNC->allowAgg 
a740: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
a750: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
a760: 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67  e, "misuse of ag
a770: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
a780: 20 25 2e 2a 73 28 29 22 2c 20 6e 49 64 2c 7a 49   %.*s()", nId,zI
a790: 64 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d  d);.        pNC-
a7a0: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20  >nErr++;.       
a7b0: 20 69 73 5f 61 67 67 20 3d 20 30 3b 0a 20 20 20   is_agg = 0;.   
a7c0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 6f 5f     }else if( no_
a7d0: 73 75 63 68 5f 66 75 6e 63 20 29 7b 0a 20 20 20  such_func ){.   
a7e0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
a7f0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
a800: 20 73 75 63 68 20 66 75 6e 63 74 69 6f 6e 3a 20   such function: 
a810: 25 2e 2a 73 22 2c 20 6e 49 64 2c 20 7a 49 64 29  %.*s", nId, zId)
a820: 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e  ;.        pNC->n
a830: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  Err++;.      }el
a840: 73 65 20 69 66 28 20 77 72 6f 6e 67 5f 6e 75 6d  se if( wrong_num
a850: 5f 61 72 67 73 20 29 7b 0a 20 20 20 20 20 20 20  _args ){.       
a860: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
a870: 28 70 50 61 72 73 65 2c 22 77 72 6f 6e 67 20 6e  (pParse,"wrong n
a880: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
a890: 74 73 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 25  ts to function %
a8a0: 2e 2a 73 28 29 22 2c 0a 20 20 20 20 20 20 20 20  .*s()",.        
a8b0: 20 20 20 20 20 6e 49 64 2c 20 7a 49 64 29 3b 0a       nId, zId);.
a8c0: 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72          pNC->nEr
a8d0: 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r++;.      }.   
a8e0: 20 20 20 69 66 28 20 69 73 5f 61 67 67 20 29 7b     if( is_agg ){
a8f0: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
a900: 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 46 55 4e 43  op = TK_AGG_FUNC
a910: 54 49 4f 4e 3b 0a 20 20 20 20 20 20 20 20 70 4e  TION;.        pN
a920: 43 2d 3e 68 61 73 41 67 67 20 3d 20 31 3b 0a 20  C->hasAgg = 1;. 
a930: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
a940: 20 69 73 5f 61 67 67 20 29 20 70 4e 43 2d 3e 61   is_agg ) pNC->a
a950: 6c 6c 6f 77 41 67 67 20 3d 20 30 3b 0a 20 20 20  llowAgg = 0;.   
a960: 20 20 20 66 6f 72 28 69 3d 30 3b 20 70 4e 43 2d     for(i=0; pNC-
a970: 3e 6e 45 72 72 3d 3d 30 20 26 26 20 69 3c 6e 3b  >nErr==0 && i<n;
a980: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 77   i++){.        w
a990: 61 6c 6b 45 78 70 72 54 72 65 65 28 70 4c 69 73  alkExprTree(pLis
a9a0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 6e  t->a[i].pExpr, n
a9b0: 61 6d 65 52 65 73 6f 6c 76 65 72 53 74 65 70 2c  ameResolverStep,
a9c0: 20 70 4e 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20   pNC);.      }. 
a9d0: 20 20 20 20 20 69 66 28 20 69 73 5f 61 67 67 20       if( is_agg 
a9e0: 29 20 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20  ) pNC->allowAgg 
a9f0: 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 46 49  = 1;.      /* FI
aa00: 58 20 4d 45 3a 20 20 43 6f 6d 70 75 74 65 20 70  X ME:  Compute p
aa10: 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 62  Expr->affinity b
aa20: 61 73 65 64 20 6f 6e 20 74 68 65 20 65 78 70 65  ased on the expe
aa30: 63 74 65 64 20 72 65 74 75 72 6e 0a 20 20 20 20  cted return.    
aa40: 20 20 2a 2a 20 74 79 70 65 20 6f 66 20 74 68 65    ** type of the
aa50: 20 66 75 6e 63 74 69 6f 6e 20 0a 20 20 20 20 20   function .     
aa60: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
aa70: 20 69 73 5f 61 67 67 3b 0a 20 20 20 20 7d 0a 23   is_agg;.    }.#
aa80: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
aa90: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
aaa0: 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a  case TK_SELECT:.
aab0: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53      case TK_EXIS
aac0: 54 53 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 63  TS:.#endif.    c
aad0: 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
aae0: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53     if( pExpr->pS
aaf0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
ab00: 20 69 6e 74 20 6e 52 65 66 20 3d 20 70 4e 43 2d   int nRef = pNC-
ab10: 3e 6e 52 65 66 3b 0a 23 69 66 6e 64 65 66 20 53  >nRef;.#ifndef S
ab20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
ab30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 43  .        if( pNC
ab40: 2d 3e 69 73 43 68 65 63 6b 20 29 7b 0a 20 20 20  ->isCheck ){.   
ab50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
ab60: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 73  rorMsg(pParse,"s
ab70: 75 62 71 75 65 72 69 65 73 20 70 72 6f 68 69 62  ubqueries prohib
ab80: 69 74 65 64 20 69 6e 20 43 48 45 43 4b 20 63 6f  ited in CHECK co
ab90: 6e 73 74 72 61 69 6e 74 73 22 29 3b 0a 20 20 20  nstraints");.   
aba0: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
abb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
abc0: 65 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73  ectResolve(pPars
abd0: 65 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63  e, pExpr->pSelec
abe0: 74 2c 20 70 4e 43 29 3b 0a 20 20 20 20 20 20 20  t, pNC);.       
abf0: 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 6e 52   assert( pNC->nR
ac00: 65 66 3e 3d 6e 52 65 66 20 29 3b 0a 20 20 20 20  ef>=nRef );.    
ac10: 20 20 20 20 69 66 28 20 6e 52 65 66 21 3d 70 4e      if( nRef!=pN
ac20: 43 2d 3e 6e 52 65 66 20 29 7b 0a 20 20 20 20 20  C->nRef ){.     
ac30: 20 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70       ExprSetProp
ac40: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56  erty(pExpr, EP_V
ac50: 61 72 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  arSelect);.     
ac60: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
ac70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ac80: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ac90: 4d 49 54 5f 43 48 45 43 4b 0a 20 20 20 20 63 61  MIT_CHECK.    ca
aca0: 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20  se TK_VARIABLE: 
acb0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d  {.      if( pNC-
acc0: 3e 69 73 43 68 65 63 6b 20 29 7b 0a 20 20 20 20  >isCheck ){.    
acd0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
ace0: 4d 73 67 28 70 50 61 72 73 65 2c 22 70 61 72 61  Msg(pParse,"para
acf0: 6d 65 74 65 72 73 20 70 72 6f 68 69 62 69 74 65  meters prohibite
ad00: 64 20 69 6e 20 43 48 45 43 4b 20 63 6f 6e 73 74  d in CHECK const
ad10: 72 61 69 6e 74 73 22 29 3b 0a 20 20 20 20 20 20  raints");.      
ad20: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
ad30: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
ad40: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
ad50: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
ad60: 65 20 77 61 6c 6b 73 20 61 6e 20 65 78 70 72 65  e walks an expre
ad70: 73 73 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 72  ssion tree and r
ad80: 65 73 6f 6c 76 65 73 20 72 65 66 65 72 65 6e 63  esolves referenc
ad90: 65 73 20 74 6f 0a 2a 2a 20 74 61 62 6c 65 20 63  es to.** table c
ada0: 6f 6c 75 6d 6e 73 2e 20 20 4e 6f 64 65 73 20 6f  olumns.  Nodes o
adb0: 66 20 74 68 65 20 66 6f 72 6d 20 49 44 2e 49 44  f the form ID.ID
adc0: 20 6f 72 20 49 44 20 72 65 73 6f 6c 76 65 20 69   or ID resolve i
add0: 6e 74 6f 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 20  nto an.** index 
ade0: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20  to the table in 
adf0: 74 68 65 20 74 61 62 6c 65 20 6c 69 73 74 20 61  the table list a
ae00: 6e 64 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 66 73  nd a column offs
ae10: 65 74 2e 20 20 54 68 65 20 0a 2a 2a 20 45 78 70  et.  The .** Exp
ae20: 72 2e 6f 70 63 6f 64 65 20 66 6f 72 20 73 75 63  r.opcode for suc
ae30: 68 20 6e 6f 64 65 73 20 69 73 20 63 68 61 6e 67  h nodes is chang
ae40: 65 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e  ed to TK_COLUMN.
ae50: 20 20 54 68 65 20 45 78 70 72 2e 69 54 61 62 6c    The Expr.iTabl
ae60: 65 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 63 68  e.** value is ch
ae70: 61 6e 67 65 64 20 74 6f 20 74 68 65 20 69 6e 64  anged to the ind
ae80: 65 78 20 6f 66 20 74 68 65 20 72 65 66 65 72 65  ex of the refere
ae90: 6e 63 65 64 20 74 61 62 6c 65 20 69 6e 20 70 54  nced table in pT
aea0: 61 62 4c 69 73 74 0a 2a 2a 20 70 6c 75 73 20 74  abList.** plus t
aeb0: 68 65 20 22 62 61 73 65 22 20 76 61 6c 75 65 2e  he "base" value.
aec0: 20 20 54 68 65 20 62 61 73 65 20 76 61 6c 75 65    The base value
aed0: 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79   will ultimately
aee0: 20 62 65 63 6f 6d 65 20 74 68 65 0a 2a 2a 20 56   become the.** V
aef0: 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
af00: 72 20 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74  r for a cursor t
af10: 68 61 74 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  hat is pointing 
af20: 69 6e 74 6f 20 74 68 65 20 72 65 66 65 72 65 6e  into the referen
af30: 63 65 64 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 54  ced.** table.  T
af40: 68 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20  he Expr.iColumn 
af50: 76 61 6c 75 65 20 69 73 20 63 68 61 6e 67 65 64  value is changed
af60: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
af70: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20   the column .** 
af80: 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  of the reference
af90: 64 20 74 61 62 6c 65 2e 20 20 54 68 65 20 45 78  d table.  The Ex
afa0: 70 72 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65  pr.iColumn value
afb0: 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 61 6c   for the special
afc0: 0a 2a 2a 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e  .** ROWID column
afd0: 20 69 73 20 2d 31 2e 20 20 41 6e 79 20 49 4e 54   is -1.  Any INT
afe0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
aff0: 20 63 6f 6c 75 6d 6e 20 69 73 20 74 72 69 65 64   column is tried
b000: 20 61 73 20 61 6e 0a 2a 2a 20 61 6c 69 61 73 20   as an.** alias 
b010: 66 6f 72 20 52 4f 57 49 44 2e 0a 2a 2a 0a 2a 2a  for ROWID..**.**
b020: 20 41 6c 73 6f 20 72 65 73 6f 6c 76 65 20 66 75   Also resolve fu
b030: 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 20 61 6e 64  nction names and
b040: 20 63 68 65 63 6b 20 74 68 65 20 66 75 6e 63 74   check the funct
b050: 69 6f 6e 73 20 66 6f 72 20 70 72 6f 70 65 72 0a  ions for proper.
b060: 2a 2a 20 75 73 61 67 65 2e 20 20 4d 61 6b 65 20  ** usage.  Make 
b070: 73 75 72 65 20 61 6c 6c 20 66 75 6e 63 74 69 6f  sure all functio
b080: 6e 20 6e 61 6d 65 73 20 61 72 65 20 72 65 63 6f  n names are reco
b090: 67 6e 69 7a 65 64 20 61 6e 64 20 61 6c 6c 20 66  gnized and all f
b0a0: 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 68 61 76 65  unctions.** have
b0b0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d   the correct num
b0c0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
b0d0: 2e 20 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f  .  Leave an erro
b0e0: 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20  r message.** in 
b0f0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20  pParse->zErrMsg 
b100: 69 66 20 61 6e 79 74 68 69 6e 67 20 69 73 20 61  if anything is a
b110: 6d 69 73 73 2e 20 20 52 65 74 75 72 6e 20 74 68  miss.  Return th
b120: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
b130: 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  rs..**.** If the
b140: 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74   expression cont
b150: 61 69 6e 73 20 61 67 67 72 65 67 61 74 65 20 66  ains aggregate f
b160: 75 6e 63 74 69 6f 6e 73 20 74 68 65 6e 20 73 65  unctions then se
b170: 74 20 74 68 65 20 45 50 5f 41 67 67 0a 2a 2a 20  t the EP_Agg.** 
b180: 70 72 6f 70 65 72 74 79 20 6f 6e 20 74 68 65 20  property on the 
b190: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 69  expression..*/.i
b1a0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 52 65  nt sqlite3ExprRe
b1b0: 73 6f 6c 76 65 4e 61 6d 65 73 28 20 0a 20 20 4e  solveNames( .  N
b1c0: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
b1d0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70         /* Namesp
b1e0: 61 63 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 65  ace to resolve e
b1f0: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 2e 20 2a  xpressions in. *
b200: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20  /.  Expr *pExpr 
b210: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
b220: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  he expression to
b230: 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e 20 2a 2f   be analyzed. */
b240: 0a 29 7b 0a 20 20 69 6e 74 20 73 61 76 65 64 48  .){.  int savedH
b250: 61 73 41 67 67 3b 0a 20 20 69 66 28 20 70 45 78  asAgg;.  if( pEx
b260: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  pr==0 ) return 0
b270: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ;.#if SQLITE_MAX
b280: 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20  _EXPR_DEPTH>0.  
b290: 69 66 28 20 28 70 45 78 70 72 2d 3e 6e 48 65 69  if( (pExpr->nHei
b2a0: 67 68 74 2b 70 4e 43 2d 3e 70 50 61 72 73 65 2d  ght+pNC->pParse-
b2b0: 3e 6e 48 65 69 67 68 74 29 3e 53 51 4c 49 54 45  >nHeight)>SQLITE
b2c0: 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 20  _MAX_EXPR_DEPTH 
b2d0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
b2e0: 72 6f 72 4d 73 67 28 70 4e 43 2d 3e 70 50 61 72  rorMsg(pNC->pPar
b2f0: 73 65 2c 20 0a 20 20 20 20 20 20 20 22 45 78 70  se, .       "Exp
b300: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73 20  ression tree is 
b310: 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78 69 6d  too large (maxim
b320: 75 6d 20 64 65 70 74 68 20 25 64 29 22 2c 0a 20  um depth %d)",. 
b330: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4d 41 58        SQLITE_MAX
b340: 5f 45 58 50 52 5f 44 45 50 54 48 0a 20 20 20 20  _EXPR_DEPTH.    
b350: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
b360: 0a 20 20 7d 0a 20 20 70 4e 43 2d 3e 70 50 61 72  .  }.  pNC->pPar
b370: 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 70  se->nHeight += p
b380: 45 78 70 72 2d 3e 6e 48 65 69 67 68 74 3b 0a 23  Expr->nHeight;.#
b390: 65 6e 64 69 66 0a 20 20 73 61 76 65 64 48 61 73  endif.  savedHas
b3a0: 41 67 67 20 3d 20 70 4e 43 2d 3e 68 61 73 41 67  Agg = pNC->hasAg
b3b0: 67 3b 0a 20 20 70 4e 43 2d 3e 68 61 73 41 67 67  g;.  pNC->hasAgg
b3c0: 20 3d 20 30 3b 0a 20 20 77 61 6c 6b 45 78 70 72   = 0;.  walkExpr
b3d0: 54 72 65 65 28 70 45 78 70 72 2c 20 6e 61 6d 65  Tree(pExpr, name
b3e0: 52 65 73 6f 6c 76 65 72 53 74 65 70 2c 20 70 4e  ResolverStep, pN
b3f0: 43 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  C);.#if SQLITE_M
b400: 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a  AX_EXPR_DEPTH>0.
b410: 20 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 6e    pNC->pParse->n
b420: 48 65 69 67 68 74 20 2d 3d 20 70 45 78 70 72 2d  Height -= pExpr-
b430: 3e 6e 48 65 69 67 68 74 3b 0a 23 65 6e 64 69 66  >nHeight;.#endif
b440: 0a 20 20 69 66 28 20 70 4e 43 2d 3e 6e 45 72 72  .  if( pNC->nErr
b450: 3e 30 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65  >0 ){.    ExprSe
b460: 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  tProperty(pExpr,
b470: 20 45 50 5f 45 72 72 6f 72 29 3b 0a 20 20 7d 0a   EP_Error);.  }.
b480: 20 20 69 66 28 20 70 4e 43 2d 3e 68 61 73 41 67    if( pNC->hasAg
b490: 67 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74  g ){.    ExprSet
b4a0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
b4b0: 45 50 5f 41 67 67 29 3b 0a 20 20 7d 65 6c 73 65  EP_Agg);.  }else
b4c0: 20 69 66 28 20 73 61 76 65 64 48 61 73 41 67 67   if( savedHasAgg
b4d0: 20 29 7b 0a 20 20 20 20 70 4e 43 2d 3e 68 61 73   ){.    pNC->has
b4e0: 41 67 67 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  Agg = 1;.  }.  r
b4f0: 65 74 75 72 6e 20 45 78 70 72 48 61 73 50 72 6f  eturn ExprHasPro
b500: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
b510: 45 72 72 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Error);.}../*.**
b520: 20 41 20 70 6f 69 6e 74 65 72 20 69 6e 73 74 61   A pointer insta
b530: 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75  nce of this stru
b540: 63 74 75 72 65 20 69 73 20 75 73 65 64 20 74 6f  cture is used to
b550: 20 70 61 73 73 20 69 6e 66 6f 72 6d 61 74 69 6f   pass informatio
b560: 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20 77 61 6c  n.** through wal
b570: 6b 45 78 70 72 54 72 65 65 20 69 6e 74 6f 20 63  kExprTree into c
b580: 6f 64 65 53 75 62 71 75 65 72 79 53 74 65 70 28  odeSubqueryStep(
b590: 29 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  )..*/.typedef st
b5a0: 72 75 63 74 20 51 75 65 72 79 43 6f 64 65 72 20  ruct QueryCoder 
b5b0: 51 75 65 72 79 43 6f 64 65 72 3b 0a 73 74 72 75  QueryCoder;.stru
b5c0: 63 74 20 51 75 65 72 79 43 6f 64 65 72 20 7b 0a  ct QueryCoder {.
b5d0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
b5e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
b5f0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
b600: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
b610: 70 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 73  pNC;    /* Names
b620: 70 61 63 65 20 6f 66 20 66 69 72 73 74 20 65 6e  pace of first en
b630: 63 6c 6f 73 69 6e 67 20 71 75 65 72 79 20 2a 2f  closing query */
b640: 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  .};.../*.** Gene
b650: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 73 63  rate code for sc
b660: 61 6c 61 72 20 73 75 62 71 75 65 72 69 65 73 20  alar subqueries 
b670: 75 73 65 64 20 61 73 20 61 6e 20 65 78 70 72 65  used as an expre
b680: 73 73 69 6f 6e 0a 2a 2a 20 61 6e 64 20 49 4e 20  ssion.** and IN 
b690: 6f 70 65 72 61 74 6f 72 73 2e 20 20 45 78 61 6d  operators.  Exam
b6a0: 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ples:.**.**     
b6b0: 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62  (SELECT a FROM b
b6c0: 29 20 20 20 20 20 20 20 20 20 20 2d 2d 20 73 75  )          -- su
b6d0: 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 45 58  bquery.**     EX
b6e0: 49 53 54 53 20 28 53 45 4c 45 43 54 20 61 20 46  ISTS (SELECT a F
b6f0: 52 4f 4d 20 62 29 20 20 20 2d 2d 20 45 58 49 53  ROM b)   -- EXIS
b700: 54 53 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20  TS subquery.**  
b710: 20 20 20 78 20 49 4e 20 28 34 2c 35 2c 31 31 29     x IN (4,5,11)
b720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
b730: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74   IN operator wit
b740: 68 20 6c 69 73 74 20 6f 6e 20 72 69 67 68 74 2d  h list on right-
b750: 68 61 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20 20  hand side.**    
b760: 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 61 20   x IN (SELECT a 
b770: 46 52 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20 49  FROM b)     -- I
b780: 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  N operator with 
b790: 73 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20  subquery on the 
b7a0: 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20  right.**.** The 
b7b0: 70 45 78 70 72 20 70 61 72 61 6d 65 74 65 72 20  pExpr parameter 
b7c0: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 65 78  describes the ex
b7d0: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f  pression that co
b7e0: 6e 74 61 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a  ntains the IN.**
b7f0: 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 75 62   operator or sub
b800: 71 75 65 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65  query..*/.#ifnde
b810: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
b820: 42 51 55 45 52 59 0a 76 6f 69 64 20 73 71 6c 69  BQUERY.void sqli
b830: 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
b840: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
b850: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
b860: 69 6e 74 20 74 65 73 74 41 64 64 72 20 3d 20 30  int testAddr = 0
b870: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b880: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74          /* One-t
b890: 69 6d 65 20 74 65 73 74 20 61 64 64 72 65 73 73  ime test address
b8a0: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
b8b0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
b8c0: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
b8d0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 0a 20  =0 ) return;... 
b8e0: 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 6d 75   /* This code mu
b8f0: 73 74 20 62 65 20 72 75 6e 20 69 6e 20 69 74 73  st be run in its
b900: 20 65 6e 74 69 72 65 74 79 20 65 76 65 72 79 20   entirety every 
b910: 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75  time it is encou
b920: 6e 74 65 72 65 64 0a 20 20 2a 2a 20 69 66 20 61  ntered.  ** if a
b930: 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
b940: 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20 2a  ing is true:.  *
b950: 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65  *.  **    *  The
b960: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
b970: 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64   is a correlated
b980: 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 20   subquery.  **  
b990: 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68    *  The right-h
b9a0: 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20 65  and side is an e
b9b0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63  xpression list c
b9c0: 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61 62  ontaining variab
b9d0: 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57  les.  **    *  W
b9e0: 65 20 61 72 65 20 69 6e 73 69 64 65 20 61 20 74  e are inside a t
b9f0: 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a  rigger.  **.  **
ba00: 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61   If all of the a
ba10: 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c 20  bove are false, 
ba20: 74 68 65 6e 20 77 65 20 63 61 6e 20 72 75 6e 20  then we can run 
ba30: 74 68 69 73 20 63 6f 64 65 20 6a 75 73 74 20 6f  this code just o
ba40: 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65 20 74 68  nce.  ** save th
ba50: 65 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20 72  e results, and r
ba60: 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 65  euse the same re
ba70: 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75 65  sult on subseque
ba80: 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a  nt invocations..
ba90: 20 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70 72    */.  if( !Expr
baa0: 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
bab0: 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65  Expr, EP_VarSele
bac0: 63 74 29 20 26 26 20 21 70 50 61 72 73 65 2d 3e  ct) && !pParse->
bad0: 74 72 69 67 53 74 61 63 6b 20 29 7b 0a 20 20 20  trigStack ){.   
bae0: 20 69 6e 74 20 6d 65 6d 20 3d 20 70 50 61 72 73   int mem = pPars
baf0: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 73  e->nMem++;.    s
bb00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
bb10: 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 6d  v, OP_MemLoad, m
bb20: 65 6d 2c 20 30 29 3b 0a 20 20 20 20 74 65 73 74  em, 0);.    test
bb30: 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
bb40: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66  beAddOp(v, OP_If
bb50: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  , 0, 0);.    ass
bb60: 65 72 74 28 20 74 65 73 74 41 64 64 72 3e 30 20  ert( testAddr>0 
bb70: 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  || sqlite3Malloc
bb80: 46 61 69 6c 65 64 28 29 20 29 3b 0a 20 20 20 20  Failed() );.    
bb90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
bba0: 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 31  (v, OP_MemInt, 1
bbb0: 2c 20 6d 65 6d 29 3b 0a 20 20 7d 0a 0a 20 20 73  , mem);.  }..  s
bbc0: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
bbd0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
bbe0: 49 4e 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72  IN: {.      char
bbf0: 20 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20   affinity;.     
bc00: 20 4b 65 79 49 6e 66 6f 20 6b 65 79 49 6e 66 6f   KeyInfo keyInfo
bc10: 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  ;.      int addr
bc20: 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72  ;        /* Addr
bc30: 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70  ess of OP_OpenEp
bc40: 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74  hemeral instruct
bc50: 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 61 66  ion */..      af
bc60: 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
bc70: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78  ExprAffinity(pEx
bc80: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 0a 20 20 20  pr->pLeft);..   
bc90: 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68     /* Whether th
bca0: 69 73 20 69 73 20 61 6e 20 27 78 20 49 4e 28 53  is is an 'x IN(S
bcb0: 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e  ELECT...)' or an
bcc0: 20 27 78 20 49 4e 28 3c 65 78 70 72 6c 69 73 74   'x IN(<exprlist
bcd0: 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20 65 78 70  >)'.      ** exp
bce0: 72 65 73 73 69 6f 6e 20 69 74 20 69 73 20 68 61  ression it is ha
bcf0: 6e 64 6c 65 64 20 74 68 65 20 73 61 6d 65 20 77  ndled the same w
bd00: 61 79 2e 20 41 20 76 69 72 74 75 61 6c 20 74 61  ay. A virtual ta
bd10: 62 6c 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a  ble is .      **
bd20: 20 66 69 6c 6c 65 64 20 77 69 74 68 20 73 69 6e   filled with sin
bd30: 67 6c 65 2d 66 69 65 6c 64 20 69 6e 64 65 78 20  gle-field index 
bd40: 6b 65 79 73 20 72 65 70 72 65 73 65 6e 74 69 6e  keys representin
bd50: 67 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20  g the results.  
bd60: 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20      ** from the 
bd70: 53 45 4c 45 43 54 20 6f 72 20 74 68 65 20 3c 65  SELECT or the <e
bd80: 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20  xprlist>..      
bd90: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74  **.      ** If t
bda0: 68 65 20 27 78 27 20 65 78 70 72 65 73 73 69 6f  he 'x' expressio
bdb0: 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61  n is a column va
bdc0: 6c 75 65 2c 20 6f 72 20 74 68 65 20 53 45 4c 45  lue, or the SELE
bdd0: 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73  CT....      ** s
bde0: 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73  tatement returns
bdf0: 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c   a column value,
be00: 20 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69   then the affini
be10: 74 79 20 6f 66 20 74 68 61 74 0a 20 20 20 20 20  ty of that.     
be20: 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73   ** column is us
be30: 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68 65 20  ed to build the 
be40: 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 62  index keys. If b
be50: 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68 65 0a  oth 'x' and the.
be60: 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e        ** SELECT.
be70: 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65  .. statement are
be80: 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e   columns, then n
be90: 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 20  umeric affinity 
bea0: 69 73 20 75 73 65 64 0a 20 20 20 20 20 20 2a 2a  is used.      **
beb0: 20 69 66 20 65 69 74 68 65 72 20 63 6f 6c 75 6d   if either colum
bec0: 6e 20 68 61 73 20 4e 55 4d 45 52 49 43 20 6f 72  n has NUMERIC or
bed0: 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e 69 74   INTEGER affinit
bee0: 79 2e 20 49 66 20 6e 65 69 74 68 65 72 0a 20 20  y. If neither.  
bef0: 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74      ** 'x' nor t
bf00: 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61  he SELECT... sta
bf10: 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d  tement are colum
bf20: 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63  ns, then numeric
bf30: 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20 20 20   affinity.      
bf40: 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20  ** is used..    
bf50: 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72    */.      pExpr
bf60: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73  ->iTable = pPars
bf70: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
bf80: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
bf90: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
bfa0: 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 45  penEphemeral, pE
bfb0: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b  xpr->iTable, 0);
bfc0: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6b  .      memset(&k
bfd0: 65 79 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  eyInfo, 0, sizeo
bfe0: 66 28 6b 65 79 49 6e 66 6f 29 29 3b 0a 20 20 20  f(keyInfo));.   
bff0: 20 20 20 6b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c     keyInfo.nFiel
c000: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  d = 1;.      sql
c010: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
c020: 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
c030: 73 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  s, pExpr->iTable
c040: 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  , 1);..      if(
c050: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20   pExpr->pSelect 
c060: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61  ){.        /* Ca
c070: 73 65 20 31 3a 20 20 20 20 20 65 78 70 72 20 49  se 1:     expr I
c080: 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20  N (SELECT ...). 
c090: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
c0a0: 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    ** Generate co
c0b0: 64 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  de to write the 
c0c0: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
c0d0: 65 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74  elect into the t
c0e0: 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20  emporary.       
c0f0: 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61   ** table alloca
c100: 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61  ted and opened a
c110: 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  bove..        */
c120: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 50 61  .        int iPa
c130: 72 6d 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  rm = pExpr->iTab
c140: 6c 65 20 2b 20 20 28 28 28 69 6e 74 29 61 66 66  le +  (((int)aff
c150: 69 6e 69 74 79 29 3c 3c 31 36 29 3b 0a 20 20 20  inity)<<16);.   
c160: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
c170: 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 61  EList;.        a
c180: 73 73 65 72 74 28 20 28 70 45 78 70 72 2d 3e 69  ssert( (pExpr->i
c190: 54 61 62 6c 65 26 30 78 30 30 30 30 46 46 46 46  Table&0x0000FFFF
c1a0: 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  )==pExpr->iTable
c1b0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
c1c0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
c1d0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 53 65  arse, pExpr->pSe
c1e0: 6c 65 63 74 2c 20 53 52 54 5f 53 65 74 2c 20 69  lect, SRT_Set, i
c1f0: 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 30  Parm, 0, 0, 0, 0
c200: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
c210: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d  eturn;.        }
c220: 0a 20 20 20 20 20 20 20 20 70 45 4c 69 73 74 20  .        pEList 
c230: 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  = pExpr->pSelect
c240: 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20  ->pEList;.      
c250: 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20    if( pEList && 
c260: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20  pEList->nExpr>0 
c270: 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 6b 65  ){ .          ke
c280: 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d  yInfo.aColl[0] =
c290: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
c2a0: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
c2b0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
c2c0: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
c2d0: 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
c2e0: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  xpr);.        }.
c2f0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
c300: 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a  pExpr->pList ){.
c310: 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20          /* Case 
c320: 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28  2:     expr IN (
c330: 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20 20 20  exprlist).      
c340: 20 20 2a 2a 0a 09 2a 2a 20 46 6f 72 20 65 61 63    **..** For eac
c350: 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 62 75  h expression, bu
c360: 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b 65 79  ild an index key
c370: 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c 75 61   from the evalua
c380: 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20  tion and.       
c390: 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20   ** store it in 
c3a0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
c3b0: 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69  ble. If <expr> i
c3c0: 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e  s a column, then
c3d0: 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   use.        ** 
c3e0: 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66  that columns aff
c3f0: 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64  inity when build
c400: 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20  ing index keys. 
c410: 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74  If <expr> is not
c420: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f  .        ** a co
c430: 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69  lumn, use numeri
c440: 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20  c affinity..    
c450: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
c460: 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78  nt i;.        Ex
c470: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
c480: 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20  pExpr->pList;.  
c490: 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
c4a0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
c4b0: 6d 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  m;..        if( 
c4c0: 21 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20  !affinity ){.   
c4d0: 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20         affinity 
c4e0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
c4f0: 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
c500: 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f       keyInfo.aCo
c510: 6c 6c 5b 30 5d 20 3d 20 70 45 78 70 72 2d 3e 70  ll[0] = pExpr->p
c520: 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 0a 20 20  Left->pColl;..  
c530: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68        /* Loop th
c540: 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65  rough each expre
c550: 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69  ssion in <exprli
c560: 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  st>. */.        
c570: 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78  for(i=pList->nEx
c580: 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  pr, pItem=pList-
c590: 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49  >a; i>0; i--, pI
c5a0: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
c5b0: 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70 49    Expr *pE2 = pI
c5c0: 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20 20  tem->pExpr;..   
c5d0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
c5e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e   expression is n
c5f0: 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e  ot constant then
c600: 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f   we will need to
c610: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69  .          ** di
c620: 73 61 62 6c 65 20 74 68 65 20 74 65 73 74 20 74  sable the test t
c630: 68 61 74 20 77 61 73 20 67 65 6e 65 72 61 74 65  hat was generate
c640: 64 20 61 62 6f 76 65 20 74 68 61 74 20 6d 61 6b  d above that mak
c650: 65 73 20 73 75 72 65 0a 20 20 20 20 20 20 20 20  es sure.        
c660: 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f    ** this code o
c670: 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63  nly executes onc
c680: 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72 20  e.  Because for 
c690: 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20  a non-constant. 
c6a0: 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72           ** expr
c6b0: 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64 20 74  ession we need t
c6c0: 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63 6f 64  o rerun this cod
c6d0: 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20  e each time..   
c6e0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
c6f0: 20 20 20 20 69 66 28 20 74 65 73 74 41 64 64 72      if( testAddr
c700: 3e 30 20 26 26 20 21 73 71 6c 69 74 65 33 45 78  >0 && !sqlite3Ex
c710: 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32  prIsConstant(pE2
c720: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
c730: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
c740: 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 74 65 73 74  geToNoop(v, test
c750: 41 64 64 72 2d 31 2c 20 33 29 3b 0a 20 20 20 20  Addr-1, 3);.    
c760: 20 20 20 20 20 20 20 20 74 65 73 74 41 64 64 72          testAddr
c770: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
c780: 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  }..          /* 
c790: 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 78 70  Evaluate the exp
c7a0: 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65  ression and inse
c7b0: 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74  rt it into the t
c7c0: 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  emp table */.   
c7d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
c7e0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
c7f0: 45 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  E2);.          s
c800: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
c810: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
c820: 31 2c 20 30 2c 20 26 61 66 66 69 6e 69 74 79 2c  1, 0, &affinity,
c830: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   1);.          s
c840: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c850: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
c860: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
c870: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
c880: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
c890: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
c8a0: 76 2c 20 61 64 64 72 2c 20 28 76 6f 69 64 20 2a  v, addr, (void *
c8b0: 29 26 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45  )&keyInfo, P3_KE
c8c0: 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 62 72  YINFO);.      br
c8d0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
c8e0: 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a  case TK_EXISTS:.
c8f0: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
c900: 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  CT: {.      /* T
c910: 68 69 73 20 68 61 73 20 74 6f 20 62 65 20 61 20  his has to be a 
c920: 73 63 61 6c 61 72 20 53 45 4c 45 43 54 2e 20 20  scalar SELECT.  
c930: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
c940: 20 70 75 74 20 74 68 65 0a 20 20 20 20 20 20 2a   put the.      *
c950: 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  * value of this 
c960: 73 65 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d 6f  select in a memo
c970: 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 63 6f  ry cell and reco
c980: 72 64 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20  rd the number.  
c990: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 65      ** of the me
c9a0: 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f  mory cell in iCo
c9b0: 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lumn..      */. 
c9c0: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
c9d0: 74 20 54 6f 6b 65 6e 20 6f 6e 65 20 3d 20 7b 20  t Token one = { 
c9e0: 28 75 38 2a 29 22 31 22 2c 20 30 2c 20 31 20 7d  (u8*)"1", 0, 1 }
c9f0: 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  ;.      Select *
ca00: 70 53 65 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20  pSel;.      int 
ca10: 69 4d 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20  iMem;.      int 
ca20: 73 6f 70 3b 0a 0a 20 20 20 20 20 20 70 45 78 70  sop;..      pExp
ca30: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 4d 65  r->iColumn = iMe
ca40: 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
ca50: 2b 2b 3b 0a 20 20 20 20 20 20 70 53 65 6c 20 3d  ++;.      pSel =
ca60: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 3b   pExpr->pSelect;
ca70: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
ca80: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
ca90: 29 7b 0a 20 20 20 20 20 20 20 20 73 6f 70 20 3d  ){.        sop =
caa0: 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20   SRT_Mem;.      
cab0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
cac0: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4e 75 6c 6c  Op(v, OP_MemNull
cad0: 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20  , iMem, 0);.    
cae0: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
caf0: 28 76 2c 20 22 23 20 49 6e 69 74 20 73 75 62 71  (v, "# Init subq
cb00: 75 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a  uery result"));.
cb10: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
cb20: 20 20 20 20 20 73 6f 70 20 3d 20 53 52 54 5f 45       sop = SRT_E
cb30: 78 69 73 74 73 3b 0a 20 20 20 20 20 20 20 20 73  xists;.        s
cb40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
cb50: 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 30 2c  v, OP_MemInt, 0,
cb60: 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20   iMem);.        
cb70: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
cb80: 22 23 20 49 6e 69 74 20 45 58 49 53 54 53 20 72  "# Init EXISTS r
cb90: 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20  esult"));.      
cba0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
cbb0: 78 70 72 44 65 6c 65 74 65 28 70 53 65 6c 2d 3e  xprDelete(pSel->
cbc0: 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70  pLimit);.      p
cbd0: 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71  Sel->pLimit = sq
cbe0: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49 4e 54  lite3Expr(TK_INT
cbf0: 45 47 45 52 2c 20 30 2c 20 30 2c 20 26 6f 6e 65  EGER, 0, 0, &one
cc00: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  );.      if( sql
cc10: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
cc20: 65 2c 20 70 53 65 6c 2c 20 73 6f 70 2c 20 69 4d  e, pSel, sop, iM
cc30: 65 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 20  em, 0, 0, 0, 0) 
cc40: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
cc50: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
cc60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
cc70: 7d 0a 0a 20 20 69 66 28 20 74 65 73 74 41 64 64  }..  if( testAdd
cc80: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
cc90: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
cca0: 74 65 73 74 41 64 64 72 29 3b 0a 20 20 7d 0a 0a  testAddr);.  }..
ccb0: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64    return;.}.#end
ccc0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
ccd0: 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f  T_SUBQUERY */../
cce0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e  *.** Generate an
ccf0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61   instruction tha
cd00: 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 69  t will put the i
cd10: 6e 74 65 67 65 72 20 64 65 73 63 72 69 62 65 20  nteger describe 
cd20: 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e  by.** text z[0..
cd30: 6e 2d 31 5d 20 6f 6e 20 74 68 65 20 73 74 61 63  n-1] on the stac
cd40: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  k..*/.static voi
cd50: 64 20 63 6f 64 65 49 6e 74 65 67 65 72 28 56 64  d codeInteger(Vd
cd60: 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61  be *v, const cha
cd70: 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  r *z, int n){.  
cd80: 61 73 73 65 72 74 28 20 7a 20 7c 7c 20 73 71 6c  assert( z || sql
cd90: 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64  ite3MallocFailed
cda0: 28 29 20 29 3b 0a 20 20 69 66 28 20 7a 20 29 7b  () );.  if( z ){
cdb0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
cdc0: 69 66 28 20 73 71 6c 69 74 65 33 47 65 74 49 6e  if( sqlite3GetIn
cdd0: 74 33 32 28 7a 2c 20 26 69 29 20 29 7b 0a 20 20  t32(z, &i) ){.  
cde0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
cdf0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
ce00: 65 72 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 7d  er, i, 0);.    }
ce10: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
ce20: 46 69 74 73 49 6e 36 34 42 69 74 73 28 7a 29 20  FitsIn64Bits(z) 
ce30: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
ce40: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  VdbeOp3(v, OP_In
ce50: 74 36 34 2c 20 30 2c 20 30 2c 20 7a 2c 20 6e 29  t64, 0, 0, z, n)
ce60: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
ce70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
ce80: 33 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c  3(v, OP_Real, 0,
ce90: 20 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 7d   0, z, n);.    }
cea0: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  .  }.}.../*.** G
ceb0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
cec0: 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20 74  t will extract t
ced0: 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f  he iColumn-th co
cee0: 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62  lumn from.** tab
cef0: 6c 65 20 70 54 61 62 20 61 6e 64 20 70 75 73 68  le pTab and push
cf00: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 76 61 6c   that column val
cf10: 75 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  ue on the stack.
cf20: 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e    There.** is an
cf30: 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 6f 20   open cursor to 
cf40: 70 54 61 62 20 69 6e 20 69 54 61 62 6c 65 2e 20  pTab in iTable. 
cf50: 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74 68   If iColumn<0 th
cf60: 65 6e 0a 2a 2a 20 63 6f 64 65 20 69 73 20 67 65  en.** code is ge
cf70: 6e 65 72 61 74 65 64 20 74 68 61 74 20 65 78 74  nerated that ext
cf80: 72 61 63 74 73 20 74 68 65 20 72 6f 77 69 64 2e  racts the rowid.
cf90: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
cfa0: 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
cfb0: 6e 28 56 64 62 65 20 2a 76 2c 20 54 61 62 6c 65  n(Vdbe *v, Table
cfc0: 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c   *pTab, int iCol
cfd0: 75 6d 6e 2c 20 69 6e 74 20 69 54 61 62 6c 65 29  umn, int iTable)
cfe0: 7b 0a 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c  {.  if( iColumn<
cff0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20  0 ){.    int op 
d000: 3d 20 28 70 54 61 62 20 26 26 20 49 73 56 69 72  = (pTab && IsVir
d010: 74 75 61 6c 28 70 54 61 62 29 29 20 3f 20 4f 50  tual(pTab)) ? OP
d020: 5f 56 52 6f 77 69 64 20 3a 20 4f 50 5f 52 6f 77  _VRowid : OP_Row
d030: 69 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  id;.    sqlite3V
d040: 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20  dbeAddOp(v, op, 
d050: 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 7d 65  iTable, 0);.  }e
d060: 6c 73 65 20 69 66 28 20 70 54 61 62 3d 3d 30 20  lse if( pTab==0 
d070: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
d080: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
d090: 6c 75 6d 6e 2c 20 69 54 61 62 6c 65 2c 20 69 43  lumn, iTable, iC
d0a0: 6f 6c 75 6d 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b  olumn);.  }else{
d0b0: 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 49 73  .    int op = Is
d0c0: 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 3f 20  Virtual(pTab) ? 
d0d0: 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f  OP_VColumn : OP_
d0e0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69  Column;.    sqli
d0f0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
d100: 6f 70 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c  op, iTable, iCol
d110: 75 6d 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  umn);.    sqlite
d120: 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76  3ColumnDefault(v
d130: 2c 20 70 54 61 62 2c 20 69 43 6f 6c 75 6d 6e 29  , pTab, iColumn)
d140: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
d150: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
d160: 4f 49 4e 54 0a 20 20 20 20 69 66 28 20 70 54 61  OINT.    if( pTa
d170: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d  b->aCol[iColumn]
d180: 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  .affinity==SQLIT
d190: 45 5f 41 46 46 5f 52 45 41 4c 20 29 7b 0a 20 20  E_AFF_REAL ){.  
d1a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d1b0: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 61 6c 41  ddOp(v, OP_RealA
d1c0: 66 66 69 6e 69 74 79 2c 20 30 2c 20 30 29 3b 0a  ffinity, 0, 0);.
d1d0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
d1e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
d1f0: 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65  te code into the
d200: 20 63 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f   current Vdbe to
d210: 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 67 69   evaluate the gi
d220: 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
d230: 6e 20 61 6e 64 20 6c 65 61 76 65 20 74 68 65 20  n and leave the 
d240: 72 65 73 75 6c 74 20 6f 6e 20 74 68 65 20 74 6f  result on the to
d250: 70 20 6f 66 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a  p of stack..**.*
d260: 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70 65  * This code depe
d270: 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20  nds on the fact 
d280: 74 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b  that certain tok
d290: 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54  en values (ex: T
d2a0: 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65  K_EQ).** are the
d2b0: 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20   same as opcode 
d2c0: 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45  values (ex: OP_E
d2d0: 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  q) that implemen
d2e0: 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  t the correspond
d2f0: 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  ing.** operation
d300: 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65  .  Special comme
d310: 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e  nts in vdbe.c an
d320: 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  d the mkopcodeh.
d330: 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a  awk script in.**
d340: 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73   the make proces
d350: 73 20 63 61 75 73 65 20 74 68 65 73 65 20 76 61  s cause these va
d360: 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20  lues to align.  
d370: 41 73 73 65 72 74 28 29 73 20 69 6e 20 74 68 65  Assert()s in the
d380: 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76   code.** below v
d390: 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e  erify that the n
d3a0: 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e  umbers are align
d3b0: 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f  ed correctly..*/
d3c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
d3d0: 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70 50 61  rCode(Parse *pPa
d3e0: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
d3f0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
d400: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
d410: 69 6e 74 20 6f 70 3b 0a 20 20 69 6e 74 20 73 74  int op;.  int st
d420: 61 63 6b 43 68 6e 67 20 3d 20 31 3b 20 20 20 20  ackChng = 1;    
d430: 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 63 68 61  /* Amount of cha
d440: 6e 67 65 20 74 6f 20 73 74 61 63 6b 20 64 65 70  nge to stack dep
d450: 74 68 20 2a 2f 0a 0a 20 20 69 66 28 20 76 3d 3d  th */..  if( v==
d460: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
d470: 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20  ( pExpr==0 ){.  
d480: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d490: 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  Op(v, OP_Null, 0
d4a0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
d4b0: 3b 0a 20 20 7d 0a 20 20 6f 70 20 3d 20 70 45 78  ;.  }.  op = pEx
d4c0: 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68  pr->op;.  switch
d4d0: 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
d4e0: 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20   TK_AGG_COLUMN: 
d4f0: 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20  {.      AggInfo 
d500: 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 45 78 70  *pAggInfo = pExp
d510: 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20  r->pAggInfo;.   
d520: 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
d530: 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70  o_col *pCol = &p
d540: 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45  AggInfo->aCol[pE
d550: 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20  xpr->iAgg];.    
d560: 20 20 69 66 28 20 21 70 41 67 67 49 6e 66 6f 2d    if( !pAggInfo-
d570: 3e 64 69 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20  >directMode ){. 
d580: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d590: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
d5a0: 6d 4c 6f 61 64 2c 20 70 43 6f 6c 2d 3e 69 4d 65  mLoad, pCol->iMe
d5b0: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62  m, 0);.        b
d5c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
d5d0: 65 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e  e if( pAggInfo->
d5e0: 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 29 7b  useSortingIdx ){
d5f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d600: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
d610: 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f  Column, pAggInfo
d620: 2d 3e 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20  ->sortingIdx,.  
d630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d640: 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
d650: 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 29  ->iSorterColumn)
d660: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
d670: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
d680: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c  * Otherwise, fal
d690: 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20  l thru into the 
d6a0: 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a  TK_COLUMN case *
d6b0: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  /.    }.    case
d6c0: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
d6d0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
d6e0: 54 61 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20 20  Table<0 ){.     
d6f0: 20 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20     /* This only 
d700: 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 64  happens when cod
d710: 69 6e 67 20 63 68 65 63 6b 20 63 6f 6e 73 74 72  ing check constr
d720: 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  aints */.       
d730: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
d740: 3e 63 6b 4f 66 66 73 65 74 3e 30 20 29 3b 0a 20  >ckOffset>0 );. 
d750: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d760: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75  beAddOp(v, OP_Du
d770: 70 2c 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66  p, pParse->ckOff
d780: 73 65 74 2d 70 45 78 70 72 2d 3e 69 43 6f 6c 75  set-pExpr->iColu
d790: 6d 6e 2d 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  mn-1, 1);.      
d7a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
d7b0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
d7c0: 74 43 6f 6c 75 6d 6e 28 76 2c 20 70 45 78 70 72  tColumn(v, pExpr
d7d0: 2d 3e 70 54 61 62 2c 20 70 45 78 70 72 2d 3e 69  ->pTab, pExpr->i
d7e0: 43 6f 6c 75 6d 6e 2c 20 70 45 78 70 72 2d 3e 69  Column, pExpr->i
d7f0: 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Table);.      }.
d800: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d810: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
d820: 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
d830: 63 6f 64 65 49 6e 74 65 67 65 72 28 76 2c 20 28  codeInteger(v, (
d840: 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b  char*)pExpr->tok
d850: 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  en.z, pExpr->tok
d860: 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  en.n);.      bre
d870: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
d880: 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20  se TK_FLOAT:.   
d890: 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
d8a0: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
d8b0: 20 54 4b 5f 46 4c 4f 41 54 3d 3d 4f 50 5f 52 65   TK_FLOAT==OP_Re
d8c0: 61 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  al );.      asse
d8d0: 72 74 28 20 54 4b 5f 53 54 52 49 4e 47 3d 3d 4f  rt( TK_STRING==O
d8e0: 50 5f 53 74 72 69 6e 67 38 20 29 3b 0a 20 20 20  P_String8 );.   
d8f0: 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74     sqlite3Dequot
d900: 65 45 78 70 72 28 70 45 78 70 72 29 3b 0a 20 20  eExpr(pExpr);.  
d910: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
d920: 70 33 28 76 2c 20 6f 70 2c 20 30 2c 20 30 2c 20  p3(v, op, 0, 0, 
d930: 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f  (char*)pExpr->to
d940: 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f  ken.z, pExpr->to
d950: 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 62 72  ken.n);.      br
d960: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
d970: 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20  ase TK_NULL: {. 
d980: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d990: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c  AddOp(v, OP_Null
d9a0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  , 0, 0);.      b
d9b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
d9c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d9d0: 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20  BLOB_LITERAL.   
d9e0: 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b   case TK_BLOB: {
d9f0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  .      int n;.  
da00: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
da10: 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  z;.      assert(
da20: 20 54 4b 5f 42 4c 4f 42 3d 3d 4f 50 5f 48 65 78   TK_BLOB==OP_Hex
da30: 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 6e 20  Blob );.      n 
da40: 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  = pExpr->token.n
da50: 20 2d 20 33 3b 0a 20 20 20 20 20 20 7a 20 3d 20   - 3;.      z = 
da60: 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f  (char*)pExpr->to
da70: 6b 65 6e 2e 7a 20 2b 20 32 3b 0a 20 20 20 20 20  ken.z + 2;.     
da80: 20 61 73 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b   assert( n>=0 );
da90: 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  .      if( n==0 
daa0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 22  ){.        z = "
dab0: 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ";.      }.     
dac0: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
dad0: 76 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 7a 2c 20  v, op, 0, 0, z, 
dae0: 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
daf0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
db00: 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42    case TK_VARIAB
db10: 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  LE: {.      sqli
db20: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
db30: 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78  OP_Variable, pEx
db40: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a  pr->iTable, 0);.
db50: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
db60: 3e 74 6f 6b 65 6e 2e 6e 3e 31 20 29 7b 0a 20 20  >token.n>1 ){.  
db70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
db80: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
db90: 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74   (char*)pExpr->t
dba0: 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74  oken.z, pExpr->t
dbb0: 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d  oken.n);.      }
dbc0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
dbd0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
dbe0: 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20  REGISTER: {.    
dbf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
dc00: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64  Op(v, OP_MemLoad
dc10: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
dc20: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
dc30: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
dc40: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54  SQLITE_OMIT_CAST
dc50: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53  .    case TK_CAS
dc60: 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78  T: {.      /* Ex
dc70: 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  pressions of the
dc80: 20 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c   form:   CAST(pL
dc90: 65 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f  eft AS token) */
dca0: 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66 2c 20  .      int aff, 
dcb0: 74 6f 5f 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c  to_op;.      sql
dcc0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
dcd0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
dce0: 74 29 3b 0a 20 20 20 20 20 20 61 66 66 20 3d 20  t);.      aff = 
dcf0: 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
dd00: 79 70 65 28 26 70 45 78 70 72 2d 3e 74 6f 6b 65  ype(&pExpr->toke
dd10: 6e 29 3b 0a 20 20 20 20 20 20 74 6f 5f 6f 70 20  n);.      to_op 
dd20: 3d 20 61 66 66 20 2d 20 53 51 4c 49 54 45 5f 41  = aff - SQLITE_A
dd30: 46 46 5f 54 45 58 54 20 2b 20 4f 50 5f 54 6f 54  FF_TEXT + OP_ToT
dd40: 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ext;.      asser
dd50: 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 54  t( to_op==OP_ToT
dd60: 65 78 74 20 20 20 20 7c 7c 20 61 66 66 21 3d 53  ext    || aff!=S
dd70: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 20  QLITE_AFF_TEXT  
dd80: 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72    );.      asser
dd90: 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42  t( to_op==OP_ToB
dda0: 6c 6f 62 20 20 20 20 7c 7c 20 61 66 66 21 3d 53  lob    || aff!=S
ddb0: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 20  QLITE_AFF_NONE  
ddc0: 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72    );.      asser
ddd0: 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e  t( to_op==OP_ToN
dde0: 75 6d 65 72 69 63 20 7c 7c 20 61 66 66 21 3d 53  umeric || aff!=S
ddf0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
de00: 43 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  C );.      asser
de10: 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 49  t( to_op==OP_ToI
de20: 6e 74 20 20 20 20 20 7c 7c 20 61 66 66 21 3d 53  nt     || aff!=S
de30: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
de40: 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  R );.      asser
de50: 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 52  t( to_op==OP_ToR
de60: 65 61 6c 20 20 20 20 7c 7c 20 61 66 66 21 3d 53  eal    || aff!=S
de70: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 20  QLITE_AFF_REAL  
de80: 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    );.      sqlit
de90: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 74  e3VdbeAddOp(v, t
dea0: 6f 5f 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  o_op, 0, 0);.   
deb0: 20 20 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 30     stackChng = 0
dec0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
ded0: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
dee0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20  QLITE_OMIT_CAST 
def0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  */.    case TK_L
df00: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
df10: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
df20: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
df30: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
df40: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
df50: 51 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  Q: {.      asser
df60: 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20  t( TK_LT==OP_Lt 
df70: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
df80: 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b   TK_LE==OP_Le );
df90: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
dfa0: 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20  K_GT==OP_Gt );. 
dfb0: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
dfc0: 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20  GE==OP_Ge );.   
dfd0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51     assert( TK_EQ
dfe0: 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20  ==OP_Eq );.     
dff0: 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d   assert( TK_NE==
e000: 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 73  OP_Ne );.      s
e010: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
e020: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
e030: 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
e040: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
e050: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
e060: 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  t);.      codeCo
e070: 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
e080: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
e090: 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 20 30  r->pRight, op, 0
e0a0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 74 61 63  , 0);.      stac
e0b0: 6b 43 68 6e 67 20 3d 20 2d 31 3b 0a 20 20 20 20  kChng = -1;.    
e0c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
e0d0: 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a     case TK_AND:.
e0e0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a      case TK_OR:.
e0f0: 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53      case TK_PLUS
e100: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  :.    case TK_ST
e110: 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AR:.    case TK_
e120: 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20  MINUS:.    case 
e130: 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65  TK_REM:.    case
e140: 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20   TK_BITAND:.    
e150: 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20  case TK_BITOR:. 
e160: 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48     case TK_SLASH
e170: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53  :.    case TK_LS
e180: 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54  HIFT:.    case T
e190: 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63  K_RSHIFT: .    c
e1a0: 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b  ase TK_CONCAT: {
e1b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
e1c0: 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b  K_AND==OP_And );
e1d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
e1e0: 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 0a 20  K_OR==OP_Or );. 
e1f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
e200: 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 0a  PLUS==OP_Add );.
e210: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
e220: 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72  _MINUS==OP_Subtr
e230: 61 63 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  act );.      ass
e240: 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f  ert( TK_REM==OP_
e250: 52 65 6d 61 69 6e 64 65 72 20 29 3b 0a 20 20 20  Remainder );.   
e260: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49     assert( TK_BI
e270: 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20  TAND==OP_BitAnd 
e280: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
e290: 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69   TK_BITOR==OP_Bi
e2a0: 74 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  tOr );.      ass
e2b0: 65 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f  ert( TK_SLASH==O
e2c0: 50 5f 44 69 76 69 64 65 20 29 3b 0a 20 20 20 20  P_Divide );.    
e2d0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48    assert( TK_LSH
e2e0: 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66  IFT==OP_ShiftLef
e2f0: 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
e300: 74 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50  t( TK_RSHIFT==OP
e310: 5f 53 68 69 66 74 52 69 67 68 74 20 29 3b 0a 20  _ShiftRight );. 
e320: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
e330: 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61  CONCAT==OP_Conca
e340: 74 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t );.      sqlit
e350: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
e360: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
e370: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
e380: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
e390: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
e3a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e3b0: 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c  eAddOp(v, op, 0,
e3c0: 20 30 29 3b 0a 20 20 20 20 20 20 73 74 61 63 6b   0);.      stack
e3d0: 43 68 6e 67 20 3d 20 2d 31 3b 0a 20 20 20 20 20  Chng = -1;.     
e3e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
e3f0: 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53    case TK_UMINUS
e400: 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  : {.      Expr *
e410: 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
e420: 4c 65 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Left;.      asse
e430: 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20  rt( pLeft );.   
e440: 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70     if( pLeft->op
e450: 3d 3d 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20 70 4c  ==TK_FLOAT || pL
e460: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45  eft->op==TK_INTE
e470: 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 54  GER ){.        T
e480: 6f 6b 65 6e 20 2a 70 20 3d 20 26 70 4c 65 66 74  oken *p = &pLeft
e490: 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  ->token;.       
e4a0: 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74   char *z = sqlit
e4b0: 65 33 4d 50 72 69 6e 74 66 28 22 2d 25 2e 2a 73  e3MPrintf("-%.*s
e4c0: 22 2c 20 70 2d 3e 6e 2c 20 70 2d 3e 7a 29 3b 0a  ", p->n, p->z);.
e4d0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 66          if( pLef
e4e0: 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20  t->op==TK_FLOAT 
e4f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
e500: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
e510: 50 5f 52 65 61 6c 2c 20 30 2c 20 30 2c 20 7a 2c  P_Real, 0, 0, z,
e520: 20 70 2d 3e 6e 2b 31 29 3b 0a 20 20 20 20 20 20   p->n+1);.      
e530: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e540: 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 76     codeInteger(v
e550: 2c 20 7a 2c 20 70 2d 3e 6e 2b 31 29 3b 0a 20 20  , z, p->n+1);.  
e560: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e570: 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20  sqliteFree(z);. 
e580: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
e590: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46      }.      /* F
e5a0: 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f  all through into
e5b0: 20 54 4b 5f 4e 4f 54 20 2a 2f 0a 20 20 20 20 7d   TK_NOT */.    }
e5c0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
e5d0: 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NOT:.    case TK
e5e0: 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61 73  _NOT: {.      as
e5f0: 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d  sert( TK_BITNOT=
e600: 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 0a 20 20  =OP_BitNot );.  
e610: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
e620: 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 0a 20 20  OT==OP_Not );.  
e630: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
e640: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
e650: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
e660: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e670: 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a  p(v, op, 0, 0);.
e680: 20 20 20 20 20 20 73 74 61 63 6b 43 68 6e 67 20        stackChng 
e690: 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
e6a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
e6b0: 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
e6c0: 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
e6d0: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73   {.      int des
e6e0: 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
e6f0: 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49   TK_ISNULL==OP_I
e700: 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61  sNull );.      a
e710: 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c  ssert( TK_NOTNUL
e720: 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  L==OP_NotNull );
e730: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
e740: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
e750: 74 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a 20 20  teger, 1, 0);.  
e760: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
e770: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
e780: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
e790: 20 64 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56   dest = sqlite3V
e7a0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
e7b0: 29 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 71 6c  ) + 2;.      sql
e7c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
e7d0: 20 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20   op, 1, dest);. 
e7e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e7f0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49  AddOp(v, OP_AddI
e800: 6d 6d 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20  mm, -1, 0);.    
e810: 20 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 30 3b    stackChng = 0;
e820: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
e830: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
e840: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a  AGG_FUNCTION: {.
e850: 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70        AggInfo *p
e860: 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41  Info = pExpr->pA
e870: 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66  ggInfo;.      if
e880: 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20  ( pInfo==0 ){.  
e890: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
e8a0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d  orMsg(pParse, "m
e8b0: 69 73 75 73 65 20 6f 66 20 61 67 67 72 65 67 61  isuse of aggrega
e8c0: 74 65 3a 20 25 54 22 2c 0a 20 20 20 20 20 20 20  te: %T",.       
e8d0: 20 20 20 20 20 26 70 45 78 70 72 2d 3e 73 70 61       &pExpr->spa
e8e0: 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
e8f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e900: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
e910: 4d 65 6d 4c 6f 61 64 2c 20 70 49 6e 66 6f 2d 3e  MemLoad, pInfo->
e920: 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41 67  aFunc[pExpr->iAg
e930: 67 5d 2e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20  g].iMem, 0);.   
e940: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
e950: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
e960: 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a   TK_CONST_FUNC:.
e970: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
e980: 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78  TION: {.      Ex
e990: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
e9a0: 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20  pExpr->pList;.  
e9b0: 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20      int nExpr = 
e9c0: 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e  pList ? pList->n
e9d0: 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20  Expr : 0;.      
e9e0: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a 20  FuncDef *pDef;. 
e9f0: 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 0a 20 20       int nId;.  
ea00: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
ea10: 7a 49 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 63  zId;.      int c
ea20: 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20  onstMask = 0;.  
ea30: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
ea40: 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 70 50   u8 enc = ENC(pP
ea50: 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20  arse->db);.     
ea60: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
ea70: 3d 20 30 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d  = 0;.      zId =
ea80: 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74   (char*)pExpr->t
ea90: 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 6e 49  oken.z;.      nI
eaa0: 64 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  d = pExpr->token
eab0: 2e 6e 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d  .n;.      pDef =
eac0: 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
ead0: 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  tion(pParse->db,
eae0: 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 45 78 70 72   zId, nId, nExpr
eaf0: 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  , enc, 0);.     
eb00: 20 61 73 73 65 72 74 28 20 70 44 65 66 21 3d 30   assert( pDef!=0
eb10: 20 29 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20   );.      nExpr 
eb20: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
eb30: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
eb40: 2c 20 70 4c 69 73 74 29 3b 0a 23 69 66 6e 64 65  , pList);.#ifnde
eb50: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
eb60: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
eb70: 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76 65   /* Possibly ove
eb80: 72 6c 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69  rload the functi
eb90: 6f 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 20  on if the first 
eba0: 61 72 67 75 6d 65 6e 74 20 69 73 0a 20 20 20 20  argument is.    
ebb0: 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 74    ** a virtual t
ebc0: 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20  able column..   
ebd0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46     **.      ** F
ebe0: 6f 72 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f  or infix functio
ebf0: 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20  ns (LIKE, GLOB, 
ec00: 52 45 47 45 58 50 2c 20 61 6e 64 20 4d 41 54 43  REGEXP, and MATC
ec10: 48 29 20 75 73 65 20 74 68 65 0a 20 20 20 20 20  H) use the.     
ec20: 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d   ** second argum
ec30: 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66 69 72  ent, not the fir
ec40: 73 74 2c 20 61 73 20 74 68 65 20 61 72 67 75 6d  st, as the argum
ec50: 65 6e 74 20 74 6f 20 74 65 73 74 20 74 6f 0a 20  ent to test to. 
ec60: 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69       ** see if i
ec70: 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  t is a column in
ec80: 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
ec90: 2e 20 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  .  This is done 
eca0: 62 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a  because.      **
ecb0: 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e   the left operan
ecc0: 64 20 6f 66 20 69 6e 66 69 78 20 66 75 6e 63 74  d of infix funct
ecd0: 69 6f 6e 73 20 28 74 68 65 20 6f 70 65 72 61 6e  ions (the operan
ece0: 64 20 77 65 20 77 61 6e 74 20 74 6f 0a 20 20 20  d we want to.   
ecf0: 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76     ** control ov
ed00: 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73 20  erloading) ends 
ed10: 75 70 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  up as the second
ed20: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
ed30: 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69  .      ** functi
ed40: 6f 6e 2e 20 20 54 68 65 20 65 78 70 72 65 73 73  on.  The express
ed50: 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 69  ion "A glob B" i
ed60: 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
ed70: 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28  .      ** "glob(
ed80: 42 2c 41 29 2e 20 20 57 65 20 77 61 6e 74 20 74  B,A).  We want t
ed90: 6f 20 75 73 65 20 74 68 65 20 41 20 69 6e 20 22  o use the A in "
eda0: 41 20 67 6c 6f 62 20 42 22 20 74 6f 20 74 65 73  A glob B" to tes
edb0: 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 66  t.      ** for f
edc0: 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64  unction overload
edd0: 69 6e 67 2e 20 20 42 75 74 20 77 65 20 75 73 65  ing.  But we use
ede0: 20 74 68 65 20 42 20 74 65 72 6d 20 69 6e 20 22   the B term in "
edf0: 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20 20  glob(B,A)"..    
ee00: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e    */.      if( n
ee10: 45 78 70 72 3e 3d 32 20 26 26 20 28 70 45 78 70  Expr>=2 && (pExp
ee20: 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  r->flags & EP_In
ee30: 66 69 78 46 75 6e 63 29 20 29 7b 0a 20 20 20 20  fixFunc) ){.    
ee40: 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
ee50: 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75  e3VtabOverloadFu
ee60: 6e 63 74 69 6f 6e 28 70 44 65 66 2c 20 6e 45 78  nction(pDef, nEx
ee70: 70 72 2c 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  pr, pList->a[1].
ee80: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65  pExpr);.      }e
ee90: 6c 73 65 20 69 66 28 20 6e 45 78 70 72 3e 30 20  lse if( nExpr>0 
eea0: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20  ){.        pDef 
eeb0: 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65  = sqlite3VtabOve
eec0: 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 70 44  rloadFunction(pD
eed0: 65 66 2c 20 6e 45 78 70 72 2c 20 70 4c 69 73 74  ef, nExpr, pList
eee0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
eef0: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
ef00: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
ef10: 45 78 70 72 20 26 26 20 69 3c 33 32 3b 20 69 2b  Expr && i<32; i+
ef20: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
ef30: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
ef40: 73 74 61 6e 74 28 70 4c 69 73 74 2d 3e 61 5b 69  stant(pList->a[i
ef50: 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
ef60: 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20        constMask 
ef70: 7c 3d 20 28 31 3c 3c 69 29 3b 0a 20 20 20 20 20  |= (1<<i);.     
ef80: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
ef90: 20 70 44 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53   pDef->needCollS
efa0: 65 71 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a  eq && !pColl ){.
efb0: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20            pColl 
efc0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
efd0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 69  lSeq(pParse, pLi
efe0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
eff0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f000: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44 65   }.      if( pDe
f010: 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29  f->needCollSeq )
f020: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  {.        if( !p
f030: 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 70  Coll ) pColl = p
f040: 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
f050: 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73  Coll; .        s
f060: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
f070: 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20   OP_CollSeq, 0, 
f080: 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c  0, (char *)pColl
f090: 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P3_COLLSEQ);. 
f0a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
f0b0: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
f0c0: 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 63 6f 6e 73  P_Function, cons
f0d0: 74 4d 61 73 6b 2c 20 6e 45 78 70 72 2c 20 28 63  tMask, nExpr, (c
f0e0: 68 61 72 2a 29 70 44 65 66 2c 20 50 33 5f 46 55  har*)pDef, P3_FU
f0f0: 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 73 74  NCDEF);.      st
f100: 61 63 6b 43 68 6e 67 20 3d 20 31 2d 6e 45 78 70  ackChng = 1-nExp
f110: 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  r;.      break;.
f120: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
f130: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
f140: 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  RY.    case TK_E
f150: 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20  XISTS:.    case 
f160: 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20  TK_SELECT: {.   
f170: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
f180: 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  olumn==0 ){.    
f190: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53      sqlite3CodeS
f1a0: 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
f1b0: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d   pExpr);.      }
f1c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f1d0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
f1e0: 6d 4c 6f 61 64 2c 20 70 45 78 70 72 2d 3e 69 43  mLoad, pExpr->iC
f1f0: 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20  olumn, 0);.     
f200: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
f210: 20 22 23 20 6c 6f 61 64 20 73 75 62 71 75 65 72   "# load subquer
f220: 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20  y result"));.   
f230: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
f240: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
f250: 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
f260: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 61 66 66  ;.      char aff
f270: 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 69 6e 74  inity;.      int
f280: 20 63 6b 4f 66 66 73 65 74 20 3d 20 70 50 61 72   ckOffset = pPar
f290: 73 65 2d 3e 63 6b 4f 66 66 73 65 74 3b 0a 20 20  se->ckOffset;.  
f2a0: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53      sqlite3CodeS
f2b0: 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
f2c0: 20 70 45 78 70 72 29 3b 0a 0a 20 20 20 20 20 20   pExpr);..      
f2d0: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68  /* Figure out th
f2e0: 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 75 73  e affinity to us
f2f0: 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 6b 65  e to create a ke
f300: 79 20 66 72 6f 6d 20 74 68 65 20 72 65 73 75 6c  y from the resul
f310: 74 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  ts.      ** of t
f320: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 61  he expression. a
f330: 66 66 69 6e 69 74 79 53 74 72 20 73 74 6f 72 65  ffinityStr store
f340: 73 20 61 20 73 74 61 74 69 63 20 73 74 72 69 6e  s a static strin
f350: 67 20 73 75 69 74 61 62 6c 65 20 66 6f 72 0a 20  g suitable for. 
f360: 20 20 20 20 20 2a 2a 20 50 33 20 6f 66 20 4f 50       ** P3 of OP
f370: 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 20 20 20  _MakeRecord..   
f380: 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 69     */.      affi
f390: 6e 69 74 79 20 3d 20 63 6f 6d 70 61 72 69 73 6f  nity = compariso
f3a0: 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29  nAffinity(pExpr)
f3b0: 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
f3c0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
f3d0: 49 6e 74 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a  Integer, 1, 0);.
f3e0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6b        pParse->ck
f3f0: 4f 66 66 73 65 74 20 3d 20 28 63 6b 4f 66 66 73  Offset = (ckOffs
f400: 65 74 20 3f 20 28 63 6b 4f 66 66 73 65 74 2b 31  et ? (ckOffset+1
f410: 29 20 3a 20 30 29 3b 0a 0a 20 20 20 20 20 20 2f  ) : 0);..      /
f420: 2a 20 43 6f 64 65 20 74 68 65 20 3c 65 78 70 72  * Code the <expr
f430: 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49  > from "<expr> I
f440: 4e 20 28 2e 2e 2e 29 22 2e 20 54 68 65 20 74 65  N (...)". The te
f450: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 20 20  mporary table.  
f460: 20 20 20 20 2a 2a 20 70 45 78 70 72 2d 3e 69 54      ** pExpr->iT
f470: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  able contains th
f480: 65 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61  e values that ma
f490: 6b 65 20 75 70 20 74 68 65 20 28 2e 2e 2e 29 20  ke up the (...) 
f4a0: 73 65 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  set..      */.  
f4b0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
f4c0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
f4d0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
f4e0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
f4f0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
f500: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f510: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
f520: 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64 64  NotNull, -1, add
f530: 72 2b 34 29 3b 20 20 20 20 20 20 20 20 20 20 20  r+4);           
f540: 20 2f 2a 20 61 64 64 72 20 2b 20 30 20 2a 2f 0a   /* addr + 0 */.
f550: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f560: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
f570: 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 2, 0);.      s
f580: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
f590: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30  v, OP_Null, 0, 0
f5a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f5b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
f5c0: 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 2b 37 29  Goto, 0, addr+7)
f5d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f5e0: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  dbeOp3(v, OP_Mak
f5f0: 65 52 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20 26  eRecord, 1, 0, &
f600: 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 20 20 20  affinity, 1);   
f610: 2f 2a 20 61 64 64 72 20 2b 20 34 20 2a 2f 0a 20  /* addr + 4 */. 
f620: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f630: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 6f 75 6e  AddOp(v, OP_Foun
f640: 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
f650: 2c 20 61 64 64 72 2b 37 29 3b 0a 20 20 20 20 20  , addr+7);.     
f660: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f670: 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  p(v, OP_AddImm, 
f680: 2d 31 2c 20 30 29 3b 20 20 20 20 20 20 20 20 20  -1, 0);         
f690: 20 20 20 20 20 20 20 20 20 2f 2a 20 61 64 64 72           /* addr
f6a0: 20 2b 20 36 20 2a 2f 0a 0a 20 20 20 20 20 20 62   + 6 */..      b
f6b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
f6c0: 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  if.    case TK_B
f6d0: 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
f6e0: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
f6f0: 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
f700: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
f710: 74 5f 69 74 65 6d 20 2a 70 4c 49 74 65 6d 20 3d  t_item *pLItem =
f720: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
f730: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  ;.      Expr *pR
f740: 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70  ight = pLItem->p
f750: 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
f760: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
f770: 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20  se, pLeft);.    
f780: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f790: 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c  Op(v, OP_Dup, 0,
f7a0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
f7b0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
f7c0: 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  e, pRight);.    
f7d0: 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
f7e0: 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69  arse, pLeft, pRi
f7f0: 67 68 74 2c 20 4f 50 5f 47 65 2c 20 30 2c 20 30  ght, OP_Ge, 0, 0
f800: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f810: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
f820: 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20  Pull, 1, 0);.   
f830: 20 20 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20 20 20     pLItem++;.   
f840: 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c 49 74     pRight = pLIt
f850: 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  em->pExpr;.     
f860: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
f870: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
f880: 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
f890: 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66  are(pParse, pLef
f8a0: 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65  t, pRight, OP_Le
f8b0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
f8c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
f8d0: 76 2c 20 4f 50 5f 41 6e 64 2c 20 30 2c 20 30 29  v, OP_And, 0, 0)
f8e0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
f8f0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
f900: 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20  _UPLUS: {.      
f910: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
f920: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
f930: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 74 61  Left);.      sta
f940: 63 6b 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20  ckChng = 0;.    
f950: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
f960: 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 45 3a     case TK_CASE:
f970: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78 70   {.      int exp
f980: 72 5f 65 6e 64 5f 6c 61 62 65 6c 3b 0a 20 20 20  r_end_label;.   
f990: 20 20 20 69 6e 74 20 6a 75 6d 70 49 6e 73 74 3b     int jumpInst;
f9a0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72  .      int nExpr
f9b0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
f9c0: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
f9d0: 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 74 72  EList;.      str
f9e0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
f9f0: 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 0a 0a 20  m *aListelem;.. 
fa00: 20 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70       assert(pExp
fa10: 72 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  r->pList);.     
fa20: 20 61 73 73 65 72 74 28 28 70 45 78 70 72 2d 3e   assert((pExpr->
fa30: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 25 20 32  pList->nExpr % 2
fa40: 29 20 3d 3d 20 30 29 3b 0a 20 20 20 20 20 20 61  ) == 0);.      a
fa50: 73 73 65 72 74 28 70 45 78 70 72 2d 3e 70 4c 69  ssert(pExpr->pLi
fa60: 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a  st->nExpr > 0);.
fa70: 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70        pEList = p
fa80: 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20  Expr->pList;.   
fa90: 20 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70     aListelem = p
faa0: 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  EList->a;.      
fab0: 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e  nExpr = pEList->
fac0: 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65 78 70  nExpr;.      exp
fad0: 72 5f 65 6e 64 5f 6c 61 62 65 6c 20 3d 20 73 71  r_end_label = sq
fae0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
faf0: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28  el(v);.      if(
fb00: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b   pExpr->pLeft ){
fb10: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
fb20: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
fb30: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
fb40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
fb50: 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20  r(i=0; i<nExpr; 
fb60: 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20 20 20  i=i+2){.        
fb70: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
fb80: 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65  pParse, aListele
fb90: 6d 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  m[i].pExpr);.   
fba0: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
fbb0: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20  pLeft ){.       
fbc0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fbd0: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 31  dOp(v, OP_Dup, 1
fbe0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
fbf0: 6a 75 6d 70 49 6e 73 74 20 3d 20 63 6f 64 65 43  jumpInst = codeC
fc00: 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
fc10: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 61 4c 69  Expr->pLeft, aLi
fc20: 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 2c  stelem[i].pExpr,
fc30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc50: 20 20 4f 50 5f 4e 65 2c 20 30 2c 20 31 29 3b 0a    OP_Ne, 0, 1);.
fc60: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
fc70: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
fc80: 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20  _Pop, 1, 0);.   
fc90: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
fca0: 20 20 20 20 20 20 6a 75 6d 70 49 6e 73 74 20 3d        jumpInst =
fcb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fcc0: 70 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 31  p(v, OP_IfNot, 1
fcd0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
fce0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
fcf0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
fd00: 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70  aListelem[i+1].p
fd10: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73  Expr);.        s
fd20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
fd30: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65  v, OP_Goto, 0, e
fd40: 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 29 3b 0a  xpr_end_label);.
fd50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
fd60: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
fd70: 75 6d 70 49 6e 73 74 29 3b 0a 20 20 20 20 20 20  umpInst);.      
fd80: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  }.      if( pExp
fd90: 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20  r->pLeft ){.    
fda0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fdb0: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
fdc0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  1, 0);.      }. 
fdd0: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
fde0: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  pRight ){.      
fdf0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
fe00: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
fe10: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
fe20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
fe30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
fe40: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30  v, OP_Null, 0, 0
fe50: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
fe60: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
fe70: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 78 70 72  lveLabel(v, expr
fe80: 5f 65 6e 64 5f 6c 61 62 65 6c 29 3b 0a 20 20 20  _end_label);.   
fe90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
fea0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
feb0: 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20  MIT_TRIGGER.    
fec0: 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b  case TK_RAISE: {
fed0: 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 72  .      if( !pPar
fee0: 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 29 7b  se->trigStack ){
fef0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ff00: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
ff10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ff20: 20 20 20 20 20 20 20 20 22 52 41 49 53 45 28 29          "RAISE()
ff30: 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65   may only be use
ff40: 64 20 77 69 74 68 69 6e 20 61 20 74 72 69 67 67  d within a trigg
ff50: 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 09 72  er-program");..r
ff60: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
ff70: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
ff80: 69 43 6f 6c 75 6d 6e 21 3d 4f 45 5f 49 67 6e 6f  iColumn!=OE_Igno
ff90: 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 61  re ){.         a
ffa0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43  ssert( pExpr->iC
ffb0: 6f 6c 75 6d 6e 3d 3d 4f 45 5f 52 6f 6c 6c 62 61  olumn==OE_Rollba
ffc0: 63 6b 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  ck ||.          
ffd0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
ffe0: 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 41 62 6f 72  olumn == OE_Abor
fff0: 74 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  t ||.           
10000 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
10010 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 46 61 69 6c 20  lumn == OE_Fail 
10020 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  );.         sqli
10030 74 65 33 44 65 71 75 6f 74 65 45 78 70 72 28 70  te3DequoteExpr(p
10040 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
10050 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
10060 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54  , OP_Halt, SQLIT
10070 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 70 45  E_CONSTRAINT, pE
10080 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20  xpr->iColumn,.  
10090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100a0 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 45 78        (char*)pEx
100b0 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
100c0 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20  pr->token.n);.  
100d0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
100e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
100f0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20  xpr->iColumn == 
10100 4f 45 5f 49 67 6e 6f 72 65 20 29 3b 0a 20 20 20  OE_Ignore );.   
10110 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10120 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6e  eAddOp(v, OP_Con
10130 74 65 78 74 50 6f 70 2c 20 30 2c 20 30 29 3b 0a  textPop, 0, 0);.
10140 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
10150 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10160 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d  Goto, 0, pParse-
10170 3e 74 72 69 67 53 74 61 63 6b 2d 3e 69 67 6e 6f  >trigStack->igno
10180 72 65 4a 75 6d 70 29 3b 0a 20 20 20 20 20 20 20  reJump);.       
10190 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
101a0 2c 20 22 23 20 72 61 69 73 65 28 49 47 4e 4f 52  , "# raise(IGNOR
101b0 45 29 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  E)"));.      }. 
101c0 20 20 20 20 20 73 74 61 63 6b 43 68 6e 67 20 3d       stackChng =
101d0 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
101e0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
101f0 7d 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  }..  if( pParse-
10200 3e 63 6b 4f 66 66 73 65 74 20 29 7b 0a 20 20 20  >ckOffset ){.   
10210 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65   pParse->ckOffse
10220 74 20 2b 3d 20 73 74 61 63 6b 43 68 6e 67 3b 0a  t += stackChng;.
10230 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
10240 73 65 2d 3e 63 6b 4f 66 66 73 65 74 20 29 3b 0a  se->ckOffset );.
10250 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
10260 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
10270 45 52 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  ER./*.** Generat
10280 65 20 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c  e code that eval
10290 75 74 65 73 20 74 68 65 20 67 69 76 65 6e 20 65  utes the given e
102a0 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 6c 65  xpression and le
102b0 61 76 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a  aves the result.
102c0 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  ** on the stack.
102d0 20 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74    See also sqlit
102e0 65 33 45 78 70 72 43 6f 64 65 28 29 2e 0a 2a 2a  e3ExprCode()..**
102f0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
10300 20 6d 69 67 68 74 20 61 6c 73 6f 20 63 61 63 68   might also cach
10310 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 6e 64  e the result and
10320 20 6d 6f 64 69 66 79 20 74 68 65 20 70 45 78 70   modify the pExp
10330 72 20 74 72 65 65 0a 2a 2a 20 73 6f 20 74 68 61  r tree.** so tha
10340 74 20 69 74 20 77 69 6c 6c 20 6d 61 6b 65 20 75  t it will make u
10350 73 65 20 6f 66 20 74 68 65 20 63 61 63 68 65 64  se of the cached
10360 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65   result on subse
10370 71 75 65 6e 74 20 65 76 61 6c 75 61 74 69 6f 6e  quent evaluation
10380 73 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e  s.** rather than
10390 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 77 68   evaluate the wh
103a0 6f 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  ole expression a
103b0 67 61 69 6e 2e 20 20 54 72 69 76 69 61 6c 20 65  gain.  Trivial e
103c0 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a  xpressions are.*
103d0 2a 20 6e 6f 74 20 63 61 63 68 65 64 2e 20 20 49  * not cached.  I
103e0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
103f0 20 69 73 20 63 61 63 68 65 64 2c 20 69 74 73 20   is cached, its 
10400 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64  result is stored
10410 20 69 6e 20 61 20 0a 2a 2a 20 6d 65 6d 6f 72 79   in a .** memory
10420 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   location..*/.vo
10430 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
10440 64 65 41 6e 64 43 61 63 68 65 28 50 61 72 73 65  deAndCache(Parse
10450 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
10460 70 45 78 70 72 29 7b 0a 20 20 56 64 62 65 20 2a  pExpr){.  Vdbe *
10470 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
10480 65 3b 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 20  e;.  int iMem;. 
10490 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72   int addr1, addr
104a0 32 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  2;.  if( v==0 ) 
104b0 72 65 74 75 72 6e 3b 0a 20 20 61 64 64 72 31 20  return;.  addr1 
104c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
104d0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 73  rentAddr(v);.  s
104e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
104f0 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
10500 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33   addr2 = sqlite3
10510 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
10520 76 29 3b 0a 20 20 69 66 28 20 61 64 64 72 32 3e  v);.  if( addr2>
10530 61 64 64 72 31 2b 31 20 7c 7c 20 73 71 6c 69 74  addr1+1 || sqlit
10540 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 61  e3VdbeGetOp(v, a
10550 64 64 72 31 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ddr1)->opcode==O
10560 50 5f 46 75 6e 63 74 69 6f 6e 20 29 7b 0a 20 20  P_Function ){.  
10570 20 20 69 4d 65 6d 20 3d 20 70 45 78 70 72 2d 3e    iMem = pExpr->
10580 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d  iTable = pParse-
10590 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 73 71 6c  >nMem++;.    sql
105a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
105b0 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d   OP_MemStore, iM
105c0 65 6d 2c 20 30 29 3b 0a 20 20 20 20 70 45 78 70  em, 0);.    pExp
105d0 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53  r->op = TK_REGIS
105e0 54 45 52 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  TER;.  }.}.#endi
105f0 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  f../*.** Generat
10600 65 20 63 6f 64 65 20 74 68 61 74 20 70 75 73 68  e code that push
10610 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  es the value of 
10620 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66  every element of
10630 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78   the given.** ex
10640 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 6f 6e  pression list on
10650 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a  to the stack..**
10660 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
10670 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
10680 73 20 70 75 73 68 65 64 20 6f 6e 74 6f 20 74 68  s pushed onto th
10690 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a 69 6e 74 20  e stack..*/.int 
106a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
106b0 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65  xprList(.  Parse
106c0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
106d0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
106e0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
106f0 70 4c 69 73 74 20 20 20 20 2f 2a 20 54 68 65 20  pList    /* The 
10700 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
10710 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 29  to be coded */.)
10720 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  {.  struct ExprL
10730 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
10740 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69  .  int i, n;.  i
10750 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
10760 74 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 70 4c  turn 0;.  n = pL
10770 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 66 6f  ist->nExpr;.  fo
10780 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  r(pItem=pList->a
10790 2c 20 69 3d 6e 3b 20 69 3e 30 3b 20 69 2d 2d 2c  , i=n; i>0; i--,
107a0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73   pItem++){.    s
107b0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
107c0 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45  Parse, pItem->pE
107d0 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  xpr);.  }.  retu
107e0 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn n;.}../*.** G
107f0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
10800 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65   a boolean expre
10810 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20  ssion such that 
10820 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a  a jump is made.*
10830 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22  * to the label "
10840 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70  dest" if the exp
10850 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20  ression is true 
10860 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a  but execution.**
10870 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69   continues strai
10880 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20  ght thru if the 
10890 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61  expression is fa
108a0 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  lse..**.** If th
108b0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61  e expression eva
108c0 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28  luates to NULL (
108d0 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72  neither true nor
108e0 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a   false), then.**
108f0 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69   take the jump i
10900 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c  f the jumpIfNull
10910 20 66 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a   flag is true..*
10920 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64  *.** This code d
10930 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61  epends on the fa
10940 63 74 20 74 68 61 74 20 63 65 72 74 61 69 6e 20  ct that certain 
10950 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78  token values (ex
10960 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20  : TK_EQ).** are 
10970 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f  the same as opco
10980 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f  de values (ex: O
10990 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65  P_Eq) that imple
109a0 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70  ment the corresp
109b0 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74  onding.** operat
109c0 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f  ion.  Special co
109d0 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63  mments in vdbe.c
109e0 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64   and the mkopcod
109f0 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e  eh.awk script in
10a00 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f  .** the make pro
10a10 63 65 73 73 20 63 61 75 73 65 20 74 68 65 73 65  cess cause these
10a20 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e   values to align
10a30 2e 20 20 41 73 73 65 72 74 28 29 73 20 69 6e 20  .  Assert()s in 
10a40 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f  the code.** belo
10a50 77 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  w verify that th
10a60 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c  e numbers are al
10a70 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e  igned correctly.
10a80 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
10a90 45 78 70 72 49 66 54 72 75 65 28 50 61 72 73 65  ExprIfTrue(Parse
10aa0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
10ab0 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c  pExpr, int dest,
10ac0 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
10ad0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
10ae0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
10af0 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74  nt op = 0;.  int
10b00 20 63 6b 4f 66 66 73 65 74 20 3d 20 70 50 61 72   ckOffset = pPar
10b10 73 65 2d 3e 63 6b 4f 66 66 73 65 74 3b 0a 20 20  se->ckOffset;.  
10b20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70  if( v==0 || pExp
10b30 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
10b40 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
10b50 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
10b60 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
10b70 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32  : {.      int d2
10b80 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
10b90 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
10ba0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
10bb0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
10bc0 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 21  pr->pLeft, d2, !
10bd0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
10be0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
10bf0 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
10c00 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
10c10 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
10c20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10c30 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
10c40 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  d2);.      break
10c50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
10c60 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20   TK_OR: {.      
10c70 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
10c80 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
10c90 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
10ca0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
10cb0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
10cc0 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
10cd0 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
10ce0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
10cf0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
10d00 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
10d10 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
10d20 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
10d30 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
10d40 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
10d50 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
10d60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
10d70 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
10d80 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
10d90 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
10da0 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
10db0 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
10dc0 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
10dd0 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f  assert( TK_LT==O
10de0 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Lt );.      as
10df0 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f  sert( TK_LE==OP_
10e00 4c 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Le );.      asse
10e10 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74  rt( TK_GT==OP_Gt
10e20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
10e30 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29  ( TK_GE==OP_Ge )
10e40 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
10e50 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a  TK_EQ==OP_Eq );.
10e60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
10e70 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20  _NE==OP_Ne );.  
10e80 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
10e90 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
10ea0 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
10eb0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
10ec0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
10ed0 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63  pRight);.      c
10ee0 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
10ef0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
10f00 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
10f10 6f 70 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  op, dest, jumpIf
10f20 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
10f30 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
10f40 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20  se TK_ISNULL:.  
10f50 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
10f60 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  L: {.      asser
10f70 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50  t( TK_ISNULL==OP
10f80 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20  _IsNull );.     
10f90 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e   assert( TK_NOTN
10fa0 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20  ULL==OP_NotNull 
10fb0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10fc0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
10fd0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
10fe0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10ff0 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c  eAddOp(v, op, 1,
11000 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72   dest);.      br
11010 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
11020 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
11030 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65  {.      /* The e
11040 78 70 72 65 73 73 69 6f 6e 20 22 78 20 42 45 54  xpression "x BET
11050 57 45 45 4e 20 79 20 41 4e 44 20 7a 22 20 69 73  WEEN y AND z" is
11060 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 3a   implemented as:
11070 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
11080 2a 2a 20 31 20 49 46 20 28 78 20 3c 20 79 29 20  ** 1 IF (x < y) 
11090 47 4f 54 4f 20 33 0a 20 20 20 20 20 20 2a 2a 20  GOTO 3.      ** 
110a0 32 20 49 46 20 28 78 20 3c 3d 20 7a 29 20 47 4f  2 IF (x <= z) GO
110b0 54 4f 20 3c 64 65 73 74 3e 0a 20 20 20 20 20 20  TO <dest>.      
110c0 2a 2a 20 33 20 2e 2e 2e 0a 20 20 20 20 20 20 2a  ** 3 ....      *
110d0 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
110e0 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  ;.      Expr *pL
110f0 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
11100 66 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  ft;.      Expr *
11110 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
11120 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
11130 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
11140 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
11150 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73   pLeft);.      s
11160 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
11170 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29  v, OP_Dup, 0, 0)
11180 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
11190 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
111a0 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 61  pRight);.      a
111b0 64 64 72 20 3d 20 63 6f 64 65 43 6f 6d 70 61 72  ddr = codeCompar
111c0 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  e(pParse, pLeft,
111d0 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 74 2c 20   pRight, OP_Lt, 
111e0 30 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  0, !jumpIfNull);
111f0 0a 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d  ..      pRight =
11200 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
11210 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [1].pExpr;.     
11220 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
11230 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
11240 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
11250 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66  are(pParse, pLef
11260 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65  t, pRight, OP_Le
11270 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
11280 6c 6c 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  ll);..      sqli
11290 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
112a0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30  OP_Integer, 0, 0
112b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
112c0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
112d0 61 64 64 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  addr);.      sql
112e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
112f0 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a   OP_Pop, 1, 0);.
11300 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11310 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
11320 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
11330 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
11340 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71  pExpr);.      sq
11350 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
11360 2c 20 4f 50 5f 49 66 2c 20 6a 75 6d 70 49 66 4e  , OP_If, jumpIfN
11370 75 6c 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  ull, dest);.    
11380 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
11390 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 63 6b 4f   }.  pParse->ckO
113a0 66 66 73 65 74 20 3d 20 63 6b 4f 66 66 73 65 74  ffset = ckOffset
113b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
113c0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62  ate code for a b
113d0 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f  oolean expressio
113e0 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75  n such that a ju
113f0 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f  mp is made.** to
11400 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74   the label "dest
11410 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  " if the express
11420 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74  ion is false but
11430 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f   execution.** co
11440 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74  ntinues straight
11450 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70   thru if the exp
11460 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e  ression is true.
11470 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
11480 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74  pression evaluat
11490 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74  es to NULL (neit
114a0 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c  her true nor fal
114b0 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70  se) then.** jump
114c0 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69   if jumpIfNull i
114d0 73 20 74 72 75 65 20 6f 72 20 66 61 6c 6c 20 74  s true or fall t
114e0 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66  hrough if jumpIf
114f0 4e 75 6c 6c 20 69 73 20 66 61 6c 73 65 2e 0a 2a  Null is false..*
11500 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
11510 70 72 49 66 46 61 6c 73 65 28 50 61 72 73 65 20  prIfFalse(Parse 
11520 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
11530 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20  Expr, int dest, 
11540 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b  int jumpIfNull){
11550 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
11560 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
11570 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  t op = 0;.  int 
11580 63 6b 4f 66 66 73 65 74 20 3d 20 70 50 61 72 73  ckOffset = pPars
11590 65 2d 3e 63 6b 4f 66 66 73 65 74 3b 0a 20 20 69  e->ckOffset;.  i
115a0 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72  f( v==0 || pExpr
115b0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
115c0 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66   /* The value of
115d0 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f   pExpr->op and o
115e0 70 20 61 72 65 20 72 65 6c 61 74 65 64 20 61 73  p are related as
115f0 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20   follows:.  **. 
11600 20 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d   **       pExpr-
11610 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 6f  >op            o
11620 70 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d  p.  **       ---
11630 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20  ------          
11640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20  ----------.  ** 
11650 20 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20        TK_ISNULL 
11660 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e           OP_NotN
11670 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  ull.  **       T
11680 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20  K_NOTNULL       
11690 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a    OP_IsNull.  **
116a0 20 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20         TK_NE    
116b0 20 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a            OP_Eq.
116c0 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51    **       TK_EQ
116d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
116e0 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Ne.  **       T
116f0 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20 20 20  K_GT            
11700 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20    OP_Le.  **    
11710 20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20     TK_LE        
11720 20 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a        OP_Gt.  **
11730 20 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20         TK_GE    
11740 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a            OP_Lt.
11750 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54    **       TK_LT
11760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
11770 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f  _Ge.  **.  ** Fo
11780 72 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f  r other values o
11790 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20  f pExpr->op, op 
117a0 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64  is undefined and
117b0 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68   unused..  ** Th
117c0 65 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61  e value of TK_ a
117d0 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73  nd OP_ constants
117e0 20 61 72 65 20 61 72 72 61 6e 67 65 64 20 73 75   are arranged su
117f0 63 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20  ch that we.  ** 
11800 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20  can compute the 
11810 6d 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73  mapping above us
11820 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
11830 67 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20  g expression..  
11840 2a 2a 20 41 73 73 65 72 74 28 29 73 20 76 65 72  ** Assert()s ver
11850 69 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d  ify that the com
11860 70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72  putation is corr
11870 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d  ect..  */.  op =
11880 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b   ((pExpr->op+(TK
11890 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28  _ISNULL&1))^1)-(
118a0 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20  TK_ISNULL&1);.. 
118b0 20 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65   /* Verify corre
118c0 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  ct alignment of 
118d0 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73  TK_ and OP_ cons
118e0 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73  tants.  */.  ass
118f0 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
11900 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d  TK_ISNULL || op=
11910 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20  =OP_NotNull );. 
11920 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
11930 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c  op!=TK_NOTNULL |
11940 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  | op==OP_IsNull 
11950 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
11960 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c  pr->op!=TK_NE ||
11970 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20   op==OP_Eq );.  
11980 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
11990 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d  p!=TK_EQ || op==
119a0 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Ne );.  asser
119b0 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
119c0 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65  _LT || op==OP_Ge
119d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
119e0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c  xpr->op!=TK_LE |
119f0 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20  | op==OP_Gt );. 
11a00 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
11a10 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d  op!=TK_GT || op=
11a20 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65  =OP_Le );.  asse
11a30 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
11a40 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c  K_GE || op==OP_L
11a50 74 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  t );..  switch( 
11a60 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
11a70 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a   case TK_AND: {.
11a80 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
11a90 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
11aa0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
11ab0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
11ac0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
11ad0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
11ae0 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
11af0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
11b00 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
11b10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
11b20 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20   TK_OR: {.      
11b30 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
11b40 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
11b50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
11b60 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
11b70 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
11b80 64 32 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29  d2, !jumpIfNull)
11b90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
11ba0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
11bb0 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
11bc0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
11bd0 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
11be0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
11bf0 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20  el(v, d2);.     
11c00 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
11c10 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
11c20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
11c30 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
11c40 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
11c50 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
11c60 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
11c70 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
11c80 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LT:.    case TK
11c90 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LE:.    case TK
11ca0 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GT:.    case TK
11cb0 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GE:.    case TK
11cc0 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _NE:.    case TK
11cd0 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  _EQ: {.      sql
11ce0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
11cf0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
11d00 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
11d10 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
11d20 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
11d30 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
11d40 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
11d50 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
11d60 3e 70 52 69 67 68 74 2c 20 6f 70 2c 20 64 65 73  >pRight, op, des
11d70 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
11d80 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11d90 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
11da0 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
11db0 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
11dc0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
11dd0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
11de0 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
11df0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11e00 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74  p(v, op, 1, dest
11e10 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
11e20 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
11e30 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20  K_BETWEEN: {.   
11e40 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
11e50 73 69 6f 6e 20 69 73 20 22 78 20 42 45 54 57 45  sion is "x BETWE
11e60 45 4e 20 79 20 41 4e 44 20 7a 22 2e 20 49 74 20  EN y AND z". It 
11e70 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
11e80 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s:.      **.    
11e90 20 20 2a 2a 20 31 20 49 46 20 28 78 20 3e 3d 20    ** 1 IF (x >= 
11ea0 79 29 20 47 4f 54 4f 20 33 0a 20 20 20 20 20 20  y) GOTO 3.      
11eb0 2a 2a 20 32 20 47 4f 54 4f 20 3c 64 65 73 74 3e  ** 2 GOTO <dest>
11ec0 0a 20 20 20 20 20 20 2a 2a 20 33 20 49 46 20 28  .      ** 3 IF (
11ed0 78 20 3e 20 7a 29 20 47 4f 54 4f 20 3c 64 65 73  x > z) GOTO <des
11ee0 74 3e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t>.      */.    
11ef0 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
11f00 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
11f10 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
11f20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
11f30 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
11f40 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
11f50 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
11f60 64 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  de(pParse, pLeft
11f70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11f80 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
11f90 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Dup, 0, 0);.    
11fa0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
11fb0 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  e(pParse, pRight
11fc0 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
11fd0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
11fe0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
11ff0 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
12000 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
12010 68 74 2c 20 4f 50 5f 47 65 2c 20 61 64 64 72 2b  ht, OP_Ge, addr+
12020 33 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  3, !jumpIfNull);
12030 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ..      sqlite3V
12040 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
12050 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  op, 1, 0);.     
12060 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12070 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
12080 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 52   dest);.      pR
12090 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  ight = pExpr->pL
120a0 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
120b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
120c0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
120d0 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f  Right);.      co
120e0 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
120f0 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
12100 20 4f 50 5f 47 74 2c 20 64 65 73 74 2c 20 6a 75   OP_Gt, dest, ju
12110 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
12120 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
12130 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
12140 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
12150 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
12160 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12170 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
12180 49 66 4e 6f 74 2c 20 6a 75 6d 70 49 66 4e 75 6c  IfNot, jumpIfNul
12190 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  l, dest);.      
121a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
121b0 0a 20 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66  .  pParse->ckOff
121c0 73 65 74 20 3d 20 63 6b 4f 66 66 73 65 74 3b 0a  set = ckOffset;.
121d0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65  }../*.** Do a de
121e0 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66  ep comparison of
121f0 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20   two expression 
12200 74 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20 54  trees.  Return T
12210 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a  RUE (non-zero).*
12220 2a 20 69 66 20 74 68 65 79 20 61 72 65 20 69 64  * if they are id
12230 65 6e 74 69 63 61 6c 20 61 6e 64 20 72 65 74 75  entical and retu
12240 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65 79  rn FALSE if they
12250 20 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77   differ in any w
12260 61 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  ay..**.** Someti
12270 6d 65 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  mes this routine
12280 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 46 41 4c   will return FAL
12290 53 45 20 65 76 65 6e 20 69 66 20 74 68 65 20 74  SE even if the t
122a0 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  wo expressions.*
122b0 2a 20 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75  * really are equ
122c0 69 76 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20  ivalent.  If we 
122d0 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61  cannot prove tha
122e0 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
122f0 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63  s are.** identic
12300 61 6c 2c 20 77 65 20 72 65 74 75 72 6e 20 46 41  al, we return FA
12310 4c 53 45 20 6a 75 73 74 20 74 6f 20 62 65 20 73  LSE just to be s
12320 61 66 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73  afe.  So if this
12330 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
12340 72 6e 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20  rns false, then 
12350 79 6f 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c  you do not reall
12360 79 20 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74 61  y know for certa
12370 69 6e 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a  in if the two.**
12380 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
12390 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20   the same.  But 
123a0 69 66 20 79 6f 75 20 67 65 74 20 61 20 54 52 55  if you get a TRU
123b0 45 20 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79  E return, then y
123c0 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72  ou.** can be sur
123d0 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
123e0 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20  s are the same. 
123f0 20 49 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77   In the places w
12400 68 65 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  here.** this rou
12410 74 69 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74  tine is used, it
12420 20 64 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74   does not hurt t
12430 6f 20 67 65 74 20 61 6e 20 65 78 74 72 61 20 46  o get an extra F
12440 41 4c 53 45 20 2d 20 74 68 61 74 0a 2a 2a 20 6a  ALSE - that.** j
12450 75 73 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74  ust might result
12460 20 69 6e 20 73 6f 6d 65 20 73 6c 69 67 68 74 6c   in some slightl
12470 79 20 73 6c 6f 77 65 72 20 63 6f 64 65 2e 20 20  y slower code.  
12480 42 75 74 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a  But returning.**
12490 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 54 52   an incorrect TR
124a0 55 45 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f  UE could lead to
124b0 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a   a malfunction..
124c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
124d0 70 72 43 6f 6d 70 61 72 65 28 45 78 70 72 20 2a  prCompare(Expr *
124e0 70 41 2c 20 45 78 70 72 20 2a 70 42 29 7b 0a 20  pA, Expr *pB){. 
124f0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41   int i;.  if( pA
12500 3d 3d 30 7c 7c 70 42 3d 3d 30 20 29 7b 0a 20 20  ==0||pB==0 ){.  
12510 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 70 41 3b    return pB==pA;
12520 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f  .  }.  if( pA->o
12530 70 21 3d 70 42 2d 3e 6f 70 20 29 20 72 65 74 75  p!=pB->op ) retu
12540 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 41 2d  rn 0;.  if( (pA-
12550 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74  >flags & EP_Dist
12560 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67  inct)!=(pB->flag
12570 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29  s & EP_Distinct)
12580 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
12590 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 43  f( !sqlite3ExprC
125a0 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74  ompare(pA->pLeft
125b0 2c 20 70 42 2d 3e 70 4c 65 66 74 29 20 29 20 72  , pB->pLeft) ) r
125c0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21  eturn 0;.  if( !
125d0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
125e0 72 65 28 70 41 2d 3e 70 52 69 67 68 74 2c 20 70  re(pA->pRight, p
125f0 42 2d 3e 70 52 69 67 68 74 29 20 29 20 72 65 74  B->pRight) ) ret
12600 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d  urn 0;.  if( pA-
12610 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 69 66  >pList ){.    if
12620 28 20 70 42 2d 3e 70 4c 69 73 74 3d 3d 30 20 29  ( pB->pList==0 )
12630 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69   return 0;.    i
12640 66 28 20 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45  f( pA->pList->nE
12650 78 70 72 21 3d 70 42 2d 3e 70 4c 69 73 74 2d 3e  xpr!=pB->pList->
12660 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e 20 30  nExpr ) return 0
12670 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
12680 3c 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  <pA->pList->nExp
12690 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  r; i++){.      i
126a0 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 43  f( !sqlite3ExprC
126b0 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 69 73 74  ompare(pA->pList
126c0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 42  ->a[i].pExpr, pB
126d0 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  ->pList->a[i].pE
126e0 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
126f0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
12700 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  }.    }.  }else 
12710 69 66 28 20 70 42 2d 3e 70 4c 69 73 74 20 29 7b  if( pB->pList ){
12720 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
12730 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 70 53 65   }.  if( pA->pSe
12740 6c 65 63 74 20 7c 7c 20 70 42 2d 3e 70 53 65 6c  lect || pB->pSel
12750 65 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ect ) return 0;.
12760 20 20 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65    if( pA->iTable
12770 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20 7c 7c 20  !=pB->iTable || 
12780 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d  pA->iColumn!=pB-
12790 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72  >iColumn ) retur
127a0 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6f  n 0;.  if( pA->o
127b0 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p!=TK_COLUMN && 
127c0 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 7b 0a 20  pA->token.z ){. 
127d0 20 20 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e     if( pB->token
127e0 2e 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  .z==0 ) return 0
127f0 3b 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 74 6f  ;.    if( pB->to
12800 6b 65 6e 2e 6e 21 3d 70 41 2d 3e 74 6f 6b 65 6e  ken.n!=pA->token
12810 2e 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  .n ) return 0;. 
12820 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
12830 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 41  rNICmp((char*)pA
12840 2d 3e 74 6f 6b 65 6e 2e 7a 2c 28 63 68 61 72 2a  ->token.z,(char*
12850 29 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 2c 70 42 2d  )pB->token.z,pB-
12860 3e 74 6f 6b 65 6e 2e 6e 29 21 3d 30 20 29 7b 0a  >token.n)!=0 ){.
12870 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
12880 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
12890 72 6e 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn 1;.}.../*.** 
128a0 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
128b0 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66  t to the pAggInf
128c0 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e  o->aCol[] array.
128d0 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64    Return the ind
128e0 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ex of.** the new
128f0 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72   element.  Retur
12900 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  n a negative num
12910 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61  ber if malloc fa
12920 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
12930 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c  nt addAggInfoCol
12940 75 6d 6e 28 41 67 67 49 6e 66 6f 20 2a 70 49 6e  umn(AggInfo *pIn
12950 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  fo){.  int i;.  
12960 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71  pInfo->aCol = sq
12970 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
12980 74 65 28 0a 20 20 20 20 20 20 20 70 49 6e 66 6f  te(.       pInfo
12990 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73  ->aCol,.       s
129a0 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f  izeof(pInfo->aCo
129b0 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 33 2c  l[0]),.       3,
129c0 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e  .       &pInfo->
129d0 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20  nColumn,.       
129e0 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 41  &pInfo->nColumnA
129f0 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 20 26 69 0a  lloc,.       &i.
12a00 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b    );.  return i;
12a10 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64  .}    ../*.** Ad
12a20 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
12a30 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d  to the pAggInfo-
12a40 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20  >aFunc[] array. 
12a50 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
12a60 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  x of.** the new 
12a70 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  element.  Return
12a80 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62   a negative numb
12a90 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69  er if malloc fai
12aa0 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
12ab0 74 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63  t addAggInfoFunc
12ac0 28 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29  (AggInfo *pInfo)
12ad0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e  {.  int i;.  pIn
12ae0 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69  fo->aFunc = sqli
12af0 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
12b00 28 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  (.       pInfo->
12b10 61 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 73 69  aFunc,.       si
12b20 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e  zeof(pInfo->aFun
12b30 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 33 2c  c[0]),.       3,
12b40 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e  .       &pInfo->
12b50 6e 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 26 70  nFunc,.       &p
12b60 49 6e 66 6f 2d 3e 6e 46 75 6e 63 41 6c 6c 6f 63  Info->nFuncAlloc
12b70 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b  ,.       &i.  );
12b80 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20  .  return i;.}  
12b90 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69    ../*.** This i
12ba0 73 20 61 6e 20 78 46 75 6e 63 20 66 6f 72 20 77  s an xFunc for w
12bb0 61 6c 6b 45 78 70 72 54 72 65 65 28 29 20 75 73  alkExprTree() us
12bc0 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
12bd0 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72 41  .** sqlite3ExprA
12be0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
12bf0 28 29 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  ().  See sqlite3
12c00 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
12c10 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64  gates.** for add
12c20 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
12c30 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ion..**.** This 
12c40 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73  routine analyzes
12c50 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 66   the aggregate f
12c60 75 6e 63 74 69 6f 6e 20 61 74 20 70 45 78 70 72  unction at pExpr
12c70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12c80 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
12c90 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 45 78 70  (void *pArg, Exp
12ca0 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
12cb0 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   i;.  NameContex
12cc0 74 20 2a 70 4e 43 20 3d 20 28 4e 61 6d 65 43 6f  t *pNC = (NameCo
12cd0 6e 74 65 78 74 20 2a 29 70 41 72 67 3b 0a 20 20  ntext *)pArg;.  
12ce0 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
12cf0 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53  pNC->pParse;.  S
12d00 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74  rcList *pSrcList
12d10 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
12d20 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  ;.  AggInfo *pAg
12d30 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41 67  gInfo = pNC->pAg
12d40 67 49 6e 66 6f 3b 0a 20 20 0a 0a 20 20 73 77 69  gInfo;.  ..  swi
12d50 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
12d60 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
12d70 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  G_COLUMN:.    ca
12d80 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
12d90 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
12da0 6f 20 73 65 65 20 69 66 20 74 68 65 20 63 6f 6c  o see if the col
12db0 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66  umn is in one of
12dc0 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74   the tables in t
12dd0 68 65 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a  he FROM.      **
12de0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61   clause of the a
12df0 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a  ggregate query *
12e00 2f 0a 20 20 20 20 20 20 69 66 28 20 70 53 72 63  /.      if( pSrc
12e10 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
12e20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
12e30 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72  tem *pItem = pSr
12e40 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  cList->a;.      
12e50 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72    for(i=0; i<pSr
12e60 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  cList->nSrc; i++
12e70 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
12e80 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
12e90 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a  Info_col *pCol;.
12ea0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
12eb0 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74  xpr->iTable==pIt
12ec0 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20  em->iCursor ){. 
12ed0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
12ee0 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
12ef0 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74  oint, it means t
12f00 68 61 74 20 70 45 78 70 72 20 72 65 66 65 72 73  hat pExpr refers
12f10 20 74 6f 20 61 20 74 61 62 6c 65 0a 20 20 20 20   to a table.    
12f20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
12f30 69 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  is in the FROM c
12f40 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67  lause of the agg
12f50 72 65 67 61 74 65 20 71 75 65 72 79 2e 20 20 0a  regate query.  .
12f60 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20              **. 
12f70 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61             ** Ma
12f80 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  ke an entry for 
12f90 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41  the column in pA
12fa0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69  ggInfo->aCol[] i
12fb0 66 20 74 68 65 72 65 0a 20 20 20 20 20 20 20 20  f there.        
12fc0 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e      ** is not an
12fd0 20 65 6e 74 72 79 20 74 68 65 72 65 20 61 6c 72   entry there alr
12fe0 65 61 64 79 2e 0a 20 20 20 20 20 20 20 20 20 20  eady..          
12ff0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
13000 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20   int k;.        
13010 20 20 20 20 70 43 6f 6c 20 3d 20 70 41 67 67 49      pCol = pAggI
13020 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  nfo->aCol;.     
13030 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20         for(k=0; 
13040 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  k<pAggInfo->nCol
13050 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b  umn; k++, pCol++
13060 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
13070 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c   if( pCol->iTabl
13080 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  e==pExpr->iTable
13090 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
130a0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c        pCol->iCol
130b0 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c  umn==pExpr->iCol
130c0 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
130d0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
130e0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
130f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
13100 20 20 20 20 20 20 20 20 69 66 28 20 6b 3e 3d 70          if( k>=p
13110 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
13120 20 26 26 20 28 6b 20 3d 20 61 64 64 41 67 67 49   && (k = addAggI
13130 6e 66 6f 43 6f 6c 75 6d 6e 28 70 41 67 67 49 6e  nfoColumn(pAggIn
13140 66 6f 29 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  fo))>=0 ){.     
13150 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20           pCol = 
13160 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b  &pAggInfo->aCol[
13170 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k];.            
13180 20 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70    pCol->pTab = p
13190 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Expr->pTab;.    
131a0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
131b0 69 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e  iTable = pExpr->
131c0 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20  iTable;.        
131d0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c        pCol->iCol
131e0 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  umn = pExpr->iCo
131f0 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  lumn;.          
13200 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d      pCol->iMem =
13210 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
13220 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
13230 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
13240 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  mn = -1;.       
13250 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78         pCol->pEx
13260 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  pr = pExpr;.    
13270 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 41            if( pA
13280 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79  ggInfo->pGroupBy
13290 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
132a0 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20      int j, n;.  
132b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
132c0 70 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41  prList *pGB = pA
132d0 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79  ggInfo->pGroupBy
132e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
132f0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
13300 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20  t_item *pTerm = 
13310 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20  pGB->a;.        
13320 20 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d          n = pGB-
13330 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >nExpr;.        
13340 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
13350 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d   j<n; j++, pTerm
13360 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
13370 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20         Expr *pE 
13380 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
13390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133a0 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
133b0 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69  _COLUMN && pE->i
133c0 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54  Table==pExpr->iT
133d0 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20  able &&.        
133e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
133f0 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72  ->iColumn==pExpr
13400 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->iColumn ){.   
13410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13420 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
13430 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20  lumn = j;.      
13440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
13450 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
13460 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13470 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
13480 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
13490 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f           if( pCo
134a0 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
134b0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
134c0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
134d0 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67  terColumn = pAgg
134e0 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f  Info->nSortingCo
134f0 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20  lumn++;.        
13500 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
13510 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
13520 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f    /* There is no
13530 77 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70  w an entry for p
13540 45 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f  Expr in pAggInfo
13550 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72  ->aCol[] (either
13560 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
13570 62 65 63 61 75 73 65 20 69 74 20 77 61 73 20 74  because it was t
13580 68 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62  here before or b
13590 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 20 63  ecause we just c
135a0 72 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20  reated it)..    
135b0 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65          ** Conve
135c0 72 74 20 74 68 65 20 70 45 78 70 72 20 74 6f 20  rt the pExpr to 
135d0 62 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  be a TK_AGG_COLU
135e0 4d 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20  MN referring to 
135f0 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 20  that.           
13600 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   ** pAggInfo->aC
13610 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20  ol[] entry..    
13620 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
13630 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41         pExpr->pA
13640 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66  ggInfo = pAggInf
13650 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  o;.            p
13660 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47  Expr->op = TK_AG
13670 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20  G_COLUMN;.      
13680 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67        pExpr->iAg
13690 67 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20 20  g = k;.         
136a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
136b0 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70      } /* endif p
136c0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49  Expr->iTable==pI
136d0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a  tem->iCursor */.
136e0 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64          } /* end
136f0 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63 4c   loop over pSrcL
13700 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ist */.      }. 
13710 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
13720 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
13730 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  _AGG_FUNCTION: {
13740 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 4e  .      /* The pN
13750 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 74 65 73  C->nDepth==0 tes
13760 74 20 63 61 75 73 65 73 20 61 67 67 72 65 67 61  t causes aggrega
13770 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20  te functions in 
13780 73 75 62 71 75 65 72 69 65 73 0a 20 20 20 20 20  subqueries.     
13790 20 2a 2a 20 74 6f 20 62 65 20 69 67 6e 6f 72 65   ** to be ignore
137a0 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  d */.      if( p
137b0 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 29 7b  NC->nDepth==0 ){
137c0 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
137d0 6b 20 74 6f 20 73 65 65 20 69 66 20 70 45 78 70  k to see if pExp
137e0 72 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65  r is a duplicate
137f0 20 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72   of another aggr
13800 65 67 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a  egate .        *
13810 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  * function that 
13820 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
13830 65 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63  e pAggInfo struc
13840 74 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ture.        */.
13850 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
13860 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74  ggInfo_func *pIt
13870 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61  em = pAggInfo->a
13880 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f  Func;.        fo
13890 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  r(i=0; i<pAggInf
138a0 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
138b0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
138c0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
138d0 70 72 43 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d  prCompare(pItem-
138e0 3e 70 45 78 70 72 2c 20 70 45 78 70 72 29 20 29  >pExpr, pExpr) )
138f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  {.            br
13900 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
13910 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13920 20 20 20 69 66 28 20 69 3e 3d 70 41 67 67 49 6e     if( i>=pAggIn
13930 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20  fo->nFunc ){.   
13940 20 20 20 20 20 20 20 2f 2a 20 70 45 78 70 72 20         /* pExpr 
13950 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61  is original.  Ma
13960 6b 65 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69  ke a new entry i
13970 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  n pAggInfo->aFun
13980 63 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  c[].          */
13990 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65 6e  .          u8 en
139a0 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e  c = ENC(pParse->
139b0 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  db);.          i
139c0 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e   = addAggInfoFun
139d0 63 28 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20  c(pAggInfo);.   
139e0 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 30 20         if( i>=0 
139f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
13a00 49 74 65 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f  Item = &pAggInfo
13a10 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20  ->aFunc[i];.    
13a20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70          pItem->p
13a30 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
13a40 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
13a50 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e  >iMem = pParse->
13a60 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nMem++;.        
13a70 20 20 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63      pItem->pFunc
13a80 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
13a90 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64  nction(pParse->d
13aa0 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
13ab0 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 45 78        (char*)pEx
13ac0 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
13ad0 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 0a 20 20 20  pr->token.n,.   
13ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13af0 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 3f 20 70  pExpr->pList ? p
13b00 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  Expr->pList->nEx
13b10 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b  pr : 0, enc, 0);
13b20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
13b30 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20   pExpr->flags & 
13b40 45 50 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  EP_Distinct ){. 
13b50 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
13b60 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20  em->iDistinct = 
13b70 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
13b80 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
13b90 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
13ba0 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63   pItem->iDistinc
13bb0 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  t = -1;.        
13bc0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
13bd0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
13be0 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70      /* Make pExp
13bf0 72 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 61  r point to the a
13c00 70 70 72 6f 70 72 69 61 74 65 20 70 41 67 67 49  ppropriate pAggI
13c10 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74  nfo->aFunc[] ent
13c20 72 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  ry.        */.  
13c30 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67        pExpr->iAg
13c40 67 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70  g = i;.        p
13c50 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d  Expr->pAggInfo =
13c60 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20   pAggInfo;.     
13c70 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
13c80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
13c90 20 20 2f 2a 20 52 65 63 75 72 73 69 76 65 6c 79    /* Recursively
13ca0 20 77 61 6c 6b 20 73 75 62 71 75 65 72 69 65 73   walk subqueries
13cb0 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 54 4b 5f   looking for TK_
13cc0 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 74 68 61  COLUMN nodes tha
13cd0 74 20 6e 65 65 64 0a 20 20 2a 2a 20 74 6f 20 62  t need.  ** to b
13ce0 65 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f  e changed to TK_
13cf0 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20 42 75 74  AGG_COLUMN.  But
13d00 20 69 6e 63 72 65 6d 65 6e 74 20 6e 44 65 70 74   increment nDept
13d10 68 20 73 6f 20 74 68 61 74 0a 20 20 2a 2a 20 54  h so that.  ** T
13d20 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e  K_AGG_FUNCTION n
13d30 6f 64 65 73 20 69 6e 20 73 75 62 71 75 65 72 69  odes in subqueri
13d40 65 73 20 77 69 6c 6c 20 62 65 20 75 6e 63 68 61  es will be uncha
13d50 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nged..  */.  if(
13d60 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20   pExpr->pSelect 
13d70 29 7b 0a 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70  ){.    pNC->nDep
13d80 74 68 2b 2b 3b 0a 20 20 20 20 77 61 6c 6b 53 65  th++;.    walkSe
13d90 6c 65 63 74 45 78 70 72 28 70 45 78 70 72 2d 3e  lectExpr(pExpr->
13da0 70 53 65 6c 65 63 74 2c 20 61 6e 61 6c 79 7a 65  pSelect, analyze
13db0 41 67 67 72 65 67 61 74 65 2c 20 70 4e 43 29 3b  Aggregate, pNC);
13dc0 0a 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68  .    pNC->nDepth
13dd0 2d 2d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  --;.  }.  return
13de0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61   0;.}../*.** Ana
13df0 6c 79 7a 65 20 74 68 65 20 67 69 76 65 6e 20 65  lyze the given e
13e00 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e  xpression lookin
13e10 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20  g for aggregate 
13e20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a  functions and.**
13e30 20 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74   for variables t
13e40 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61  hat need to be a
13e50 64 64 65 64 20 74 6f 20 74 68 65 20 70 50 61 72  dded to the pPar
13e60 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79  se->aAgg[] array
13e70 2e 0a 2a 2a 20 4d 61 6b 65 20 61 64 64 69 74 69  ..** Make additi
13e80 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20 74 6f 20  onal entries to 
13e90 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67  the pParse->aAgg
13ea0 5b 5d 20 61 72 72 61 79 20 61 73 20 6e 65 63 65  [] array as nece
13eb0 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ssary..**.** Thi
13ec0 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
13ed0 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
13ee0 61 66 74 65 72 20 74 68 65 20 65 78 70 72 65 73  after the expres
13ef0 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a  sion has been.**
13f00 20 61 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c   analyzed by sql
13f10 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e  ite3ExprResolveN
13f20 61 6d 65 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ames()..**.** If
13f30 20 65 72 72 6f 72 73 20 61 72 65 20 73 65 65 6e   errors are seen
13f40 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
13f50 20 6d 65 73 73 61 67 65 20 69 6e 20 7a 45 72 72   message in zErr
13f60 4d 73 67 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  Msg and return.*
13f70 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
13f80 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  errors..*/.int s
13f90 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
13fa0 65 41 67 67 72 65 67 61 74 65 73 28 4e 61 6d 65  eAggregates(Name
13fb0 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78  Context *pNC, Ex
13fc0 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e  pr *pExpr){.  in
13fd0 74 20 6e 45 72 72 20 3d 20 70 4e 43 2d 3e 70 50  t nErr = pNC->pP
13fe0 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 20 20 77 61  arse->nErr;.  wa
13ff0 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78 70 72  lkExprTree(pExpr
14000 2c 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  , analyzeAggrega
14010 74 65 2c 20 70 4e 43 29 3b 0a 20 20 72 65 74 75  te, pNC);.  retu
14020 72 6e 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e  rn pNC->pParse->
14030 6e 45 72 72 20 2d 20 6e 45 72 72 3b 0a 7d 0a 0a  nErr - nErr;.}..
14040 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74  /*.** Call sqlit
14050 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
14060 72 65 67 61 74 65 73 28 29 20 66 6f 72 20 65 76  regates() for ev
14070 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
14080 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69  n an.** expressi
14090 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e  on list.  Return
140a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
140b0 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rrors..**.** If 
140c0 61 6e 20 65 72 72 6f 72 20 69 73 20 66 6f 75 6e  an error is foun
140d0 64 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20  d, the analysis 
140e0 69 73 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f  is cut short..*/
140f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
14100 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e  AnalyzeAggList(N
14110 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
14120 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
14130 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  ){.  struct Expr
14140 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
14150 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
14160 20 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69 66 28   nErr = 0;.  if(
14170 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
14180 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  r(pItem=pList->a
14190 2c 20 69 3d 30 3b 20 6e 45 72 72 3d 3d 30 20 26  , i=0; nErr==0 &
141a0 26 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  & i<pList->nExpr
141b0 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
141c0 0a 20 20 20 20 20 20 6e 45 72 72 20 2b 3d 20 73  .      nErr += s
141d0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
141e0 65 41 67 67 72 65 67 61 74 65 73 28 70 4e 43 2c  eAggregates(pNC,
141f0 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
14200 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
14210 72 6e 20 6e 45 72 72 3b 0a 7d 0a                 rn nErr;.}.