/ Hex Artifact Content
Login

Artifact 20a45339a6ba1e98c07e7f2039e8ffad0290fb77:


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 33 31 33 20 32 30 30 37 2f 30 39 2f 31 38 20  .313 2007/09/18 
0220: 31 35 3a 35 35 3a 30 37 20 64 72 68 20 45 78 70  15:55:07 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 20 2a 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 33 5f 6d 61   from sqlite3_ma
1a80: 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63 61 6c  lloc().  The cal
1a90: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ling function.**
1aa0: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
1ab0: 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20  for making sure 
1ac0: 74 68 65 20 6e 6f 64 65 20 65 76 65 6e 74 75 61  the node eventua
1ad0: 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a  lly gets freed..
1ae0: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
1af0: 45 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20  Expr(.  sqlite3 
1b00: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
1b10: 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 73 71  /* Handle for sq
1b20: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
1b30: 6f 28 29 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c  o() (may be null
1b40: 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  ) */.  int op,  
1b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b60: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63  * Expression opc
1b70: 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ode */.  Expr *p
1b80: 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20  Left,           
1b90: 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e 64   /* Left operand
1ba0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67   */.  Expr *pRig
1bb0: 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ht,           /*
1bc0: 20 52 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a   Right operand *
1bd0: 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20  /.  const Token 
1be0: 2a 70 54 6f 6b 65 6e 20 20 20 20 20 2f 2a 20 41  *pToken     /* A
1bf0: 72 67 75 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f  rgument token */
1c00: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  .){.  Expr *pNew
1c10: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
1c20: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
1c30: 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29  b, sizeof(Expr))
1c40: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
1c50: 29 7b 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 6d  ){.    /* When m
1c60: 61 6c 6c 6f 63 20 66 61 69 6c 73 2c 20 64 65 6c  alloc fails, del
1c70: 65 74 65 20 70 4c 65 66 74 20 61 6e 64 20 70 52  ete pLeft and pR
1c80: 69 67 68 74 2e 20 45 78 70 72 65 73 73 69 6f 6e  ight. Expression
1c90: 73 20 70 61 73 73 65 64 20 74 6f 20 0a 20 20 20  s passed to .   
1ca0: 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f   ** this functio
1cb0: 6e 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65  n must always be
1cc0: 20 61 6c 6c 6f 63 61 74 65 64 20 77 69 74 68 20   allocated with 
1cd0: 73 71 6c 69 74 65 33 45 78 70 72 28 29 20 66 6f  sqlite3Expr() fo
1ce0: 72 20 74 68 69 73 20 0a 20 20 20 20 2a 2a 20 72  r this .    ** r
1cf0: 65 61 73 6f 6e 2e 20 0a 20 20 20 20 2a 2f 0a 20  eason. .    */. 
1d00: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
1d10: 6c 65 74 65 28 70 4c 65 66 74 29 3b 0a 20 20 20  lete(pLeft);.   
1d20: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
1d30: 74 65 28 70 52 69 67 68 74 29 3b 0a 20 20 20 20  te(pRight);.    
1d40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1d50: 70 4e 65 77 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20  pNew->op = op;. 
1d60: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70   pNew->pLeft = p
1d70: 4c 65 66 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 52  Left;.  pNew->pR
1d80: 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20  ight = pRight;. 
1d90: 20 70 4e 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31   pNew->iAgg = -1
1da0: 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29  ;.  if( pToken )
1db0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  {.    assert( pT
1dc0: 6f 6b 65 6e 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a  oken->dyn==0 );.
1dd0: 20 20 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d      pNew->span =
1de0: 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a   pNew->token = *
1df0: 70 54 6f 6b 65 6e 3b 0a 20 20 7d 65 6c 73 65 20  pToken;.  }else 
1e00: 69 66 28 20 70 4c 65 66 74 20 29 7b 0a 20 20 20  if( pLeft ){.   
1e10: 20 69 66 28 20 70 52 69 67 68 74 20 29 7b 0a 20   if( pRight ){. 
1e20: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1e30: 53 70 61 6e 28 70 4e 65 77 2c 20 26 70 4c 65 66  Span(pNew, &pLef
1e40: 74 2d 3e 73 70 61 6e 2c 20 26 70 52 69 67 68 74  t->span, &pRight
1e50: 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 69  ->span);.      i
1e60: 66 28 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73  f( pRight->flags
1e70: 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65   & EP_ExpCollate
1e80: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
1e90: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78  ->flags |= EP_Ex
1ea0: 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20  pCollate;.      
1eb0: 20 20 70 4e 65 77 2d 3e 70 43 6f 6c 6c 20 3d 20    pNew->pColl = 
1ec0: 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 3b 0a 20  pRight->pColl;. 
1ed0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1ee0: 20 69 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67   if( pLeft->flag
1ef0: 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74  s & EP_ExpCollat
1f00: 65 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  e ){.      pNew-
1f10: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78 70  >flags |= EP_Exp
1f20: 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 70  Collate;.      p
1f30: 4e 65 77 2d 3e 70 43 6f 6c 6c 20 3d 20 70 4c 65  New->pColl = pLe
1f40: 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d  ft->pColl;.    }
1f50: 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 45  .  }..  sqlite3E
1f60: 78 70 72 53 65 74 48 65 69 67 68 74 28 70 4e 65  xprSetHeight(pNe
1f70: 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  w);.  return pNe
1f80: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 6f 72 6b  w;.}../*.** Work
1f90: 73 20 6c 69 6b 65 20 73 71 6c 69 74 65 33 45 78  s like sqlite3Ex
1fa0: 70 72 28 29 20 65 78 63 65 70 74 20 74 68 61 74  pr() except that
1fb0: 20 69 74 20 74 61 6b 65 73 20 61 6e 20 65 78 74   it takes an ext
1fc0: 72 61 20 50 61 72 73 65 2a 0a 2a 2a 20 61 72 67  ra Parse*.** arg
1fd0: 75 6d 65 6e 74 20 61 6e 64 20 6e 6f 74 69 66 69  ument and notifi
1fe0: 65 73 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  es the associate
1ff0: 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 6a  d connection obj
2000: 65 63 74 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61  ect if malloc fa
2010: 69 6c 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ils..*/.Expr *sq
2020: 6c 69 74 65 33 50 45 78 70 72 28 0a 20 20 50 61  lite3PExpr(.  Pa
2030: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
2040: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
2050: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
2060: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
2070: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
2080: 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ion opcode */.  
2090: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20  Expr *pLeft,    
20a0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20          /* Left 
20b0: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70  operand */.  Exp
20c0: 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20 20  r *pRight,      
20d0: 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70       /* Right op
20e0: 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  erand */.  const
20f0: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 20   Token *pToken  
2100: 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
2110: 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a 20 20 72 65 74  oken */.){.  ret
2120: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 28  urn sqlite3Expr(
2130: 70 50 61 72 73 65 2d 3e 64 62 2c 20 6f 70 2c 20  pParse->db, op, 
2140: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 70  pLeft, pRight, p
2150: 54 6f 6b 65 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Token);.}../*.**
2160: 20 57 68 65 6e 20 64 6f 69 6e 67 20 61 20 6e 65   When doing a ne
2170: 73 74 65 64 20 70 61 72 73 65 2c 20 79 6f 75 20  sted parse, you 
2180: 63 61 6e 20 69 6e 63 6c 75 64 65 20 74 65 72 6d  can include term
2190: 73 20 69 6e 20 61 6e 20 65 78 70 72 65 73 73 69  s in an expressi
21a0: 6f 6e 0a 2a 2a 20 74 68 61 74 20 6c 6f 6f 6b 20  on.** that look 
21b0: 6c 69 6b 65 20 74 68 69 73 3a 20 20 20 23 30 20  like this:   #0 
21c0: 23 31 20 23 32 20 2e 2e 2e 20 20 54 68 65 73 65  #1 #2 ...  These
21d0: 20 74 65 72 6d 73 20 72 65 66 65 72 20 74 6f 20   terms refer to 
21e0: 65 6c 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 20 74  elements.** on t
21f0: 68 65 20 73 74 61 63 6b 2e 20 20 22 23 30 22 20  he stack.  "#0" 
2200: 6d 65 61 6e 73 20 74 68 65 20 74 6f 70 20 6f 66  means the top of
2210: 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 20 22   the stack..** "
2220: 23 31 22 20 6d 65 61 6e 73 20 74 68 65 20 6e 65  #1" means the ne
2230: 78 74 20 64 6f 77 6e 20 6f 6e 20 74 68 65 20 73  xt down on the s
2240: 74 61 63 6b 2e 20 20 41 6e 64 20 73 6f 20 66 6f  tack.  And so fo
2250: 72 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  rth..**.** This 
2260: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2270: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
2280: 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6f 6e 20  to deal with on 
2290: 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73 2e 0a  of those terms..
22a0: 2a 2a 20 49 74 20 69 6d 6d 65 64 69 61 74 65 6c  ** It immediatel
22b0: 79 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  y generates code
22c0: 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 76 61   to store the va
22d0: 6c 75 65 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20  lue in a memory 
22e0: 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65  location..** The
22f0: 20 72 65 74 75 72 6e 73 20 61 6e 20 65 78 70 72   returns an expr
2300: 65 73 73 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c  ession that will
2310: 20 63 6f 64 65 20 74 6f 20 65 78 74 72 61 63 74   code to extract
2320: 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 0a   the value from.
2330: 2a 2a 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 6c  ** that memory l
2340: 6f 63 61 74 69 6f 6e 20 61 73 20 6e 65 65 64 65  ocation as neede
2350: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
2360: 74 65 33 52 65 67 69 73 74 65 72 45 78 70 72 28  te3RegisterExpr(
2370: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
2380: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
2390: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
23a0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 45 78 70 72  e->pVdbe;.  Expr
23b0: 20 2a 70 3b 0a 20 20 69 6e 74 20 64 65 70 74 68   *p;.  int depth
23c0: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
23d0: 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  nested==0 ){.   
23e0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
23f0: 28 70 50 61 72 73 65 2c 20 22 6e 65 61 72 20 5c  (pParse, "near \
2400: 22 25 54 5c 22 3a 20 73 79 6e 74 61 78 20 65 72  "%T\": syntax er
2410: 72 6f 72 22 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20  ror", pToken);. 
2420: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
2430: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
2440: 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20 30 29  K_NULL, 0, 0, 0)
2450: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 76 3d 3d 30  ;.  }.  if( v==0
2460: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
2470: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
2480: 70 50 61 72 73 65 2c 20 54 4b 5f 52 45 47 49 53  pParse, TK_REGIS
2490: 54 45 52 2c 20 30 2c 20 30 2c 20 70 54 6f 6b 65  TER, 0, 0, pToke
24a0: 6e 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  n);.  if( p==0 )
24b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
24c0: 20 2f 2a 20 4d 61 6c 6c 6f 63 20 66 61 69 6c 65   /* Malloc faile
24d0: 64 20 2a 2f 0a 20 20 7d 0a 20 20 64 65 70 74 68  d */.  }.  depth
24e0: 20 3d 20 61 74 6f 69 28 28 63 68 61 72 2a 29 26   = atoi((char*)&
24f0: 70 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d 29 3b 0a 20  pToken->z[1]);. 
2500: 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61   p->iTable = pPa
2510: 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 73  rse->nMem++;.  s
2520: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
2530: 76 2c 20 4f 50 5f 44 75 70 2c 20 64 65 70 74 68  v, OP_Dup, depth
2540: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
2550: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
2560: 65 6d 53 74 6f 72 65 2c 20 70 2d 3e 69 54 61 62  emStore, p->iTab
2570: 6c 65 2c 20 31 29 3b 0a 20 20 72 65 74 75 72 6e  le, 1);.  return
2580: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69   p;.}../*.** Joi
2590: 6e 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e  n two expression
25a0: 73 20 75 73 69 6e 67 20 61 6e 20 41 4e 44 20 6f  s using an AND o
25b0: 70 65 72 61 74 6f 72 2e 20 20 49 66 20 65 69 74  perator.  If eit
25c0: 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69  her expression i
25d0: 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  s.** NULL, then 
25e0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68 65 20  just return the 
25f0: 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  other expression
2600: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
2610: 65 33 45 78 70 72 41 6e 64 28 73 71 6c 69 74 65  e3ExprAnd(sqlite
2620: 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c 65  3 *db, Expr *pLe
2630: 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74  ft, Expr *pRight
2640: 29 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d 3d  ){.  if( pLeft==
2650: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
2660: 70 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20  pRight;.  }else 
2670: 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29 7b  if( pRight==0 ){
2680: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65 66  .    return pLef
2690: 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
26a0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
26b0: 70 72 28 64 62 2c 20 54 4b 5f 41 4e 44 2c 20 70  pr(db, TK_AND, p
26c0: 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29  Left, pRight, 0)
26d0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
26e0: 65 74 20 74 68 65 20 45 78 70 72 2e 73 70 61 6e  et the Expr.span
26f0: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 67 69   field of the gi
2700: 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74  ven expression t
2710: 6f 20 73 70 61 6e 20 61 6c 6c 0a 2a 2a 20 74 65  o span all.** te
2720: 78 74 20 62 65 74 77 65 65 6e 20 74 68 65 20 74  xt between the t
2730: 77 6f 20 67 69 76 65 6e 20 74 6f 6b 65 6e 73 2e  wo given tokens.
2740: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2750: 45 78 70 72 53 70 61 6e 28 45 78 70 72 20 2a 70  ExprSpan(Expr *p
2760: 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4c 65  Expr, Token *pLe
2770: 66 74 2c 20 54 6f 6b 65 6e 20 2a 70 52 69 67 68  ft, Token *pRigh
2780: 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 52  t){.  assert( pR
2790: 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  ight!=0 );.  ass
27a0: 65 72 74 28 20 70 4c 65 66 74 21 3d 30 20 29 3b  ert( pLeft!=0 );
27b0: 0a 20 20 69 66 28 20 70 45 78 70 72 20 26 26 20  .  if( pExpr && 
27c0: 70 52 69 67 68 74 2d 3e 7a 20 26 26 20 70 4c 65  pRight->z && pLe
27d0: 66 74 2d 3e 7a 20 29 7b 0a 20 20 20 20 61 73 73  ft->z ){.    ass
27e0: 65 72 74 28 20 70 4c 65 66 74 2d 3e 64 79 6e 3d  ert( pLeft->dyn=
27f0: 3d 30 20 7c 7c 20 70 4c 65 66 74 2d 3e 7a 5b 70  =0 || pLeft->z[p
2800: 4c 65 66 74 2d 3e 6e 5d 3d 3d 30 20 29 3b 0a 20  Left->n]==0 );. 
2810: 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 64 79     if( pLeft->dy
2820: 6e 3d 3d 30 20 26 26 20 70 52 69 67 68 74 2d 3e  n==0 && pRight->
2830: 64 79 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dyn==0 ){.      
2840: 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 20 3d 20  pExpr->span.z = 
2850: 70 4c 65 66 74 2d 3e 7a 3b 0a 20 20 20 20 20 20  pLeft->z;.      
2860: 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 20 3d 20  pExpr->span.n = 
2870: 70 52 69 67 68 74 2d 3e 6e 20 2b 20 28 70 52 69  pRight->n + (pRi
2880: 67 68 74 2d 3e 7a 20 2d 20 70 4c 65 66 74 2d 3e  ght->z - pLeft->
2890: 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  z);.    }else{. 
28a0: 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e       pExpr->span
28b0: 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  .z = 0;.    }.  
28c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  }.}../*.** Const
28d0: 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65  ruct a new expre
28e0: 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61  ssion node for a
28f0: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d   function with m
2900: 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d  ultiple.** argum
2910: 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  ents..*/.Expr *s
2920: 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74 69  qlite3ExprFuncti
2930: 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
2940: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
2950: 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
2960: 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b  ){.  Expr *pNew;
2970: 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65  .  assert( pToke
2980: 6e 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n );.  pNew = sq
2990: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
29a0: 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69  o(pParse->db, si
29b0: 7a 65 6f 66 28 45 78 70 72 29 20 29 3b 0a 20 20  zeof(Expr) );.  
29c0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
29d0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
29e0: 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b  stDelete(pList);
29f0: 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e   /* Avoid leakin
2a00: 67 20 6d 65 6d 6f 72 79 20 77 68 65 6e 20 6d 61  g memory when ma
2a10: 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20  lloc fails */.  
2a20: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
2a30: 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f    pNew->op = TK_
2a40: 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 70 4e 65 77  FUNCTION;.  pNew
2a50: 2d 3e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b  ->pList = pList;
2a60: 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65  .  assert( pToke
2a70: 6e 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20 20 70  n->dyn==0 );.  p
2a80: 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54  New->token = *pT
2a90: 6f 6b 65 6e 3b 0a 20 20 70 4e 65 77 2d 3e 73 70  oken;.  pNew->sp
2aa0: 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e  an = pNew->token
2ab0: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  ;..  sqlite3Expr
2ac0: 53 65 74 48 65 69 67 68 74 28 70 4e 65 77 29 3b  SetHeight(pNew);
2ad0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
2ae0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20  }../*.** Assign 
2af0: 61 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  a variable numbe
2b00: 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69  r to an expressi
2b10: 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64 65 73 20  on that encodes 
2b20: 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69 6e  a wildcard.** in
2b30: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51   the original SQ
2b40: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a 2a  L statement.  .*
2b50: 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 63  *.** Wildcards c
2b60: 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73  onsisting of a s
2b70: 69 6e 67 6c 65 20 22 3f 22 20 61 72 65 20 61 73  ingle "?" are as
2b80: 73 69 67 6e 65 64 20 74 68 65 20 6e 65 78 74 20  signed the next 
2b90: 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a 20 76 61  sequential.** va
2ba0: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 2e 0a 2a  riable number..*
2bb0: 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f  *.** Wildcards o
2bc0: 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e  f the form "?nnn
2bd0: 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  " are assigned t
2be0: 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e 6e 22 2e  he number "nnn".
2bf0: 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20 73 75 72    We make.** sur
2c00: 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f 74 20 74  e "nnn" is not t
2c10: 6f 6f 20 62 65 20 74 6f 20 61 76 6f 69 64 20 61  oo be to avoid a
2c20: 20 64 65 6e 69 61 6c 20 6f 66 20 73 65 72 76 69   denial of servi
2c30: 63 65 20 61 74 74 61 63 6b 20 77 68 65 6e 0a 2a  ce attack when.*
2c40: 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  * the SQL statem
2c50: 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20 61  ent comes from a
2c60: 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f 75 72 63  n external sourc
2c70: 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72  e..**.** Wildcar
2c80: 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ds of the form "
2c90: 3a 61 61 61 22 20 6f 72 20 22 24 61 61 61 22 20  :aaa" or "$aaa" 
2ca0: 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 68 65  are assigned the
2cb0: 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20   same number.** 
2cc0: 61 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  as the previous 
2cd0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
2ce0: 73 61 6d 65 20 77 69 6c 64 63 61 72 64 2e 20 20  same wildcard.  
2cf0: 4f 72 20 69 66 20 74 68 69 73 20 69 73 20 74 68  Or if this is th
2d00: 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74 61  e first.** insta
2d10: 6e 63 65 20 6f 66 20 74 68 65 20 77 69 6c 64 63  nce of the wildc
2d20: 61 72 64 2c 20 74 68 65 20 6e 65 78 74 20 73 65  ard, the next se
2d30: 71 75 65 6e 69 61 6c 20 76 61 72 69 61 62 6c 65  quenial variable
2d40: 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73   number is.** as
2d50: 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  signed..*/.void 
2d60: 73 71 6c 69 74 65 33 45 78 70 72 41 73 73 69 67  sqlite3ExprAssig
2d70: 6e 56 61 72 4e 75 6d 62 65 72 28 50 61 72 73 65  nVarNumber(Parse
2d80: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
2d90: 70 45 78 70 72 29 7b 0a 20 20 54 6f 6b 65 6e 20  pExpr){.  Token 
2da0: 2a 70 54 6f 6b 65 6e 3b 0a 20 20 73 71 6c 69 74  *pToken;.  sqlit
2db0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
2dc0: 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 45 78 70  >db;..  if( pExp
2dd0: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
2de0: 20 70 54 6f 6b 65 6e 20 3d 20 26 70 45 78 70 72   pToken = &pExpr
2df0: 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72  ->token;.  asser
2e00: 74 28 20 70 54 6f 6b 65 6e 2d 3e 6e 3e 3d 31 20  t( pToken->n>=1 
2e10: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f  );.  assert( pTo
2e20: 6b 65 6e 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 61  ken->z!=0 );.  a
2e30: 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a  ssert( pToken->z
2e40: 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  [0]!=0 );.  if( 
2e50: 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 31 20 29 7b 0a  pToken->n==1 ){.
2e60: 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20      /* Wildcard 
2e70: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 22 2e  of the form "?".
2e80: 20 20 41 73 73 69 67 6e 20 74 68 65 20 6e 65 78    Assign the nex
2e90: 74 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  t variable numbe
2ea0: 72 20 2a 2f 0a 20 20 20 20 70 45 78 70 72 2d 3e  r */.    pExpr->
2eb0: 69 54 61 62 6c 65 20 3d 20 2b 2b 70 50 61 72 73  iTable = ++pPars
2ec0: 65 2d 3e 6e 56 61 72 3b 0a 20 20 7d 65 6c 73 65  e->nVar;.  }else
2ed0: 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30   if( pToken->z[0
2ee0: 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 2f 2a  ]=='?' ){.    /*
2ef0: 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65   Wildcard of the
2f00: 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43   form "?nnn".  C
2f10: 6f 6e 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20  onvert "nnn" to 
2f20: 61 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 0a 20  an integer and. 
2f30: 20 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20     ** use it as 
2f40: 74 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  the variable num
2f50: 62 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ber */.    int i
2f60: 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61  ;.    pExpr->iTa
2f70: 62 6c 65 20 3d 20 69 20 3d 20 61 74 6f 69 28 28  ble = i = atoi((
2f80: 63 68 61 72 2a 29 26 70 54 6f 6b 65 6e 2d 3e 7a  char*)&pToken->z
2f90: 5b 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 69 3c  [1]);.    if( i<
2fa0: 31 20 7c 7c 20 69 3e 53 51 4c 49 54 45 5f 4d 41  1 || i>SQLITE_MA
2fb0: 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  X_VARIABLE_NUMBE
2fc0: 52 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R ){.      sqlit
2fd0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2fe0: 65 2c 20 22 76 61 72 69 61 62 6c 65 20 6e 75 6d  e, "variable num
2ff0: 62 65 72 20 6d 75 73 74 20 62 65 20 62 65 74 77  ber must be betw
3000: 65 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c  een ?1 and ?%d",
3010: 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
3020: 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e  E_MAX_VARIABLE_N
3030: 55 4d 42 45 52 29 3b 0a 20 20 20 20 7d 0a 20 20  UMBER);.    }.  
3040: 20 20 69 66 28 20 69 3e 70 50 61 72 73 65 2d 3e    if( i>pParse->
3050: 6e 56 61 72 20 29 7b 0a 20 20 20 20 20 20 70 50  nVar ){.      pP
3060: 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 69 3b 0a  arse->nVar = i;.
3070: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
3080: 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 73 20     /* Wildcards 
3090: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61  of the form ":aa
30a0: 61 22 20 6f 72 20 22 24 61 61 61 22 2e 20 20 52  a" or "$aaa".  R
30b0: 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61  euse the same va
30c0: 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 6e 75  riable.    ** nu
30d0: 6d 62 65 72 20 61 73 20 74 68 65 20 70 72 69 6f  mber as the prio
30e0: 72 20 61 70 70 65 61 72 61 6e 63 65 20 6f 66 20  r appearance of 
30f0: 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f  the same name, o
3100: 72 20 69 66 20 74 68 65 20 6e 61 6d 65 0a 20 20  r if the name.  
3110: 20 20 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61    ** has never a
3120: 70 70 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20  ppeared before, 
3130: 72 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 76  reuse the same v
3140: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20  ariable number. 
3150: 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c     */.    int i,
3160: 20 6e 3b 0a 20 20 20 20 6e 20 3d 20 70 54 6f 6b   n;.    n = pTok
3170: 65 6e 2d 3e 6e 3b 0a 20 20 20 20 66 6f 72 28 69  en->n;.    for(i
3180: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56  =0; i<pParse->nV
3190: 61 72 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  arExpr; i++){.  
31a0: 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20      Expr *pE;.  
31b0: 20 20 20 20 69 66 28 20 28 70 45 20 3d 20 70 50      if( (pE = pP
31c0: 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 5b  arse->apVarExpr[
31d0: 69 5d 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  i])!=0.         
31e0: 20 26 26 20 70 45 2d 3e 74 6f 6b 65 6e 2e 6e 3d   && pE->token.n=
31f0: 3d 6e 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  =n.          && 
3200: 6d 65 6d 63 6d 70 28 70 45 2d 3e 74 6f 6b 65 6e  memcmp(pE->token
3210: 2e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 6e  .z, pToken->z, n
3220: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
3230: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
3240: 70 45 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pE->iTable;.    
3250: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
3260: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
3270: 20 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 56 61 72   i>=pParse->nVar
3280: 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70 45  Expr ){.      pE
3290: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2b 2b  xpr->iTable = ++
32a0: 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20  pParse->nVar;.  
32b0: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
32c0: 6e 56 61 72 45 78 70 72 3e 3d 70 50 61 72 73 65  nVarExpr>=pParse
32d0: 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 2d  ->nVarExprAlloc-
32e0: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  1 ){.        pPa
32f0: 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c  rse->nVarExprAll
3300: 6f 63 20 2b 3d 20 70 50 61 72 73 65 2d 3e 6e 56  oc += pParse->nV
3310: 61 72 45 78 70 72 41 6c 6c 6f 63 20 2b 20 31 30  arExprAlloc + 10
3320: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
3330: 2d 3e 61 70 56 61 72 45 78 70 72 20 3d 0a 20 20  ->apVarExpr =.  
3340: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
3350: 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65  3DbReallocOrFree
3360: 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
3370: 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
3380: 20 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45    pParse->apVarE
3390: 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
33a0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45     pParse->nVarE
33b0: 78 70 72 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28  xprAlloc*sizeof(
33c0: 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70  pParse->apVarExp
33d0: 72 5b 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20  r[0]).          
33e0: 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20    );.      }.   
33f0: 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c     if( !db->mall
3400: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
3410: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
3420: 73 65 2d 3e 61 70 56 61 72 45 78 70 72 21 3d 30  se->apVarExpr!=0
3430: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72   );.        pPar
3440: 73 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 70 50  se->apVarExpr[pP
3450: 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 2b 2b  arse->nVarExpr++
3460: 5d 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  ] = pExpr;.     
3470: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 0a 20 20   }.    }.  } .  
3480: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 45 72  if( !pParse->nEr
3490: 72 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 56 61  r && pParse->nVa
34a0: 72 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52  r>SQLITE_MAX_VAR
34b0: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 20 29 7b 0a  IABLE_NUMBER ){.
34c0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
34d0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
34e0: 20 6d 61 6e 79 20 53 51 4c 20 76 61 72 69 61 62   many SQL variab
34f0: 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  les");.  }.}../*
3500: 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20  .** Recursively 
3510: 64 65 6c 65 74 65 20 61 6e 20 65 78 70 72 65 73  delete an expres
3520: 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f  sion tree..*/.vo
3530: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  id sqlite3ExprDe
3540: 6c 65 74 65 28 45 78 70 72 20 2a 70 29 7b 0a 20  lete(Expr *p){. 
3550: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
3560: 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 73 70 61  rn;.  if( p->spa
3570: 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74 65 33 5f  n.dyn ) sqlite3_
3580: 66 72 65 65 28 28 63 68 61 72 2a 29 70 2d 3e 73  free((char*)p->s
3590: 70 61 6e 2e 7a 29 3b 0a 20 20 69 66 28 20 70 2d  pan.z);.  if( p-
35a0: 3e 74 6f 6b 65 6e 2e 64 79 6e 20 29 20 73 71 6c  >token.dyn ) sql
35b0: 69 74 65 33 5f 66 72 65 65 28 28 63 68 61 72 2a  ite3_free((char*
35c0: 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20  )p->token.z);.  
35d0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
35e0: 65 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 73  e(p->pLeft);.  s
35f0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
3600: 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 73  (p->pRight);.  s
3610: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
3620: 6c 65 74 65 28 70 2d 3e 70 4c 69 73 74 29 3b 0a  lete(p->pList);.
3630: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
3640: 65 6c 65 74 65 28 70 2d 3e 70 53 65 6c 65 63 74  elete(p->pSelect
3650: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
3660: 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  e(p);.}../*.** T
3670: 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 20 66 69  he Expr.token fi
3680: 65 6c 64 20 6d 69 67 68 74 20 62 65 20 61 20 73  eld might be a s
3690: 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 20 74 68  tring literal th
36a0: 61 74 20 69 73 20 71 75 6f 74 65 64 2e 0a 2a 2a  at is quoted..**
36b0: 20 49 66 20 73 6f 2c 20 72 65 6d 6f 76 65 20 74   If so, remove t
36c0: 68 65 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72  he quotation mar
36d0: 6b 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ks..*/.void sqli
36e0: 74 65 33 44 65 71 75 6f 74 65 45 78 70 72 28 73  te3DequoteExpr(s
36f0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
3700: 20 2a 70 29 7b 0a 20 20 69 66 28 20 45 78 70 72   *p){.  if( Expr
3710: 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
3720: 2c 20 45 50 5f 44 65 71 75 6f 74 65 64 29 20 29  , EP_Dequoted) )
3730: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
3740: 7d 0a 20 20 45 78 70 72 53 65 74 50 72 6f 70 65  }.  ExprSetPrope
3750: 72 74 79 28 70 2c 20 45 50 5f 44 65 71 75 6f 74  rty(p, EP_Dequot
3760: 65 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f  ed);.  if( p->to
3770: 6b 65 6e 2e 64 79 6e 3d 3d 30 20 29 7b 0a 20 20  ken.dyn==0 ){.  
3780: 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f    sqlite3TokenCo
3790: 70 79 28 64 62 2c 20 26 70 2d 3e 74 6f 6b 65 6e  py(db, &p->token
37a0: 2c 20 26 70 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20  , &p->token);.  
37b0: 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f  }.  sqlite3Dequo
37c0: 74 65 28 28 63 68 61 72 2a 29 70 2d 3e 74 6f 6b  te((char*)p->tok
37d0: 65 6e 2e 7a 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  en.z);.}.../*.**
37e0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
37f0: 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73  roup of routines
3800: 20 6d 61 6b 65 20 64 65 65 70 20 63 6f 70 69 65   make deep copie
3810: 73 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  s of expressions
3820: 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  ,.** expression 
3830: 6c 69 73 74 73 2c 20 49 44 20 6c 69 73 74 73 2c  lists, ID lists,
3840: 20 61 6e 64 20 73 65 6c 65 63 74 20 73 74 61 74   and select stat
3850: 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 63 6f 70  ements.  The cop
3860: 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64 65  ies can.** be de
3870: 6c 65 74 65 64 20 28 62 79 20 62 65 69 6e 67 20  leted (by being 
3880: 70 61 73 73 65 64 20 74 6f 20 74 68 65 69 72 20  passed to their 
3890: 72 65 73 70 65 63 74 69 76 65 20 2e 2e 2e 44 65  respective ...De
38a0: 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65 73 29  lete() routines)
38b0: 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65 66 66 65  .** without effe
38c0: 63 74 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e  cting the origin
38d0: 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65  als..**.** The e
38e0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20  xpression list, 
38f0: 49 44 2c 20 61 6e 64 20 73 6f 75 72 63 65 20 6c  ID, and source l
3900: 69 73 74 73 20 72 65 74 75 72 6e 20 62 79 20 73  ists return by s
3910: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
3920: 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 49  p(),.** sqlite3I
3930: 64 4c 69 73 74 44 75 70 28 29 2c 20 61 6e 64 20  dListDup(), and 
3940: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75  sqlite3SrcListDu
3950: 70 28 29 20 63 61 6e 20 6e 6f 74 20 62 65 20 66  p() can not be f
3960: 75 72 74 68 65 72 20 65 78 70 61 6e 64 65 64 20  urther expanded 
3970: 0a 2a 2a 20 62 79 20 73 75 62 73 65 71 75 65 6e  .** by subsequen
3980: 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  t calls to sqlit
3990: 65 2a 4c 69 73 74 41 70 70 65 6e 64 28 29 20 72  e*ListAppend() r
39a0: 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41  outines..**.** A
39b0: 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74 20 74  ny tables that t
39c0: 68 65 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74  he SrcList might
39d0: 20 70 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e 6f   point to are no
39e0: 74 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2f  t duplicated..*/
39f0: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
3a00: 70 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  prDup(sqlite3 *d
3a10: 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 45  b, Expr *p){.  E
3a20: 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 66 28  xpr *pNew;.  if(
3a30: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
3a40: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
3a50: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
3a60: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a  , sizeof(*p) );.
3a70: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
3a80: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 63  return 0;.  memc
3a90: 70 79 28 70 4e 65 77 2c 20 70 2c 20 73 69 7a 65  py(pNew, p, size
3aa0: 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66  of(*pNew));.  if
3ab0: 28 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 21 3d 30 20  ( p->token.z!=0 
3ac0: 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b  ){.    pNew->tok
3ad0: 65 6e 2e 7a 20 3d 20 28 75 38 2a 29 73 71 6c 69  en.z = (u8*)sqli
3ae0: 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c  te3DbStrNDup(db,
3af0: 20 28 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e   (char*)p->token
3b00: 2e 7a 2c 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b  .z, p->token.n);
3b10: 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e  .    pNew->token
3b20: 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  .dyn = 1;.  }els
3b30: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
3b40: 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20  New->token.z==0 
3b50: 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 73  );.  }.  pNew->s
3b60: 70 61 6e 2e 7a 20 3d 20 30 3b 0a 20 20 70 4e 65  pan.z = 0;.  pNe
3b70: 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  w->pLeft = sqlit
3b80: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
3b90: 3e 70 4c 65 66 74 29 3b 0a 20 20 70 4e 65 77 2d  >pLeft);.  pNew-
3ba0: 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  >pRight = sqlite
3bb0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
3bc0: 70 52 69 67 68 74 29 3b 0a 20 20 70 4e 65 77 2d  pRight);.  pNew-
3bd0: 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  >pList = sqlite3
3be0: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
3bf0: 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 70 4e 65  p->pList);.  pNe
3c00: 77 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  w->pSelect = sql
3c10: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
3c20: 2c 20 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  , p->pSelect);. 
3c30: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
3c40: 76 6f 69 64 20 73 71 6c 69 74 65 33 54 6f 6b 65  void sqlite3Toke
3c50: 6e 43 6f 70 79 28 73 71 6c 69 74 65 33 20 2a 64  nCopy(sqlite3 *d
3c60: 62 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 54  b, Token *pTo, T
3c70: 6f 6b 65 6e 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  oken *pFrom){.  
3c80: 69 66 28 20 70 54 6f 2d 3e 64 79 6e 20 29 20 73  if( pTo->dyn ) s
3c90: 71 6c 69 74 65 33 5f 66 72 65 65 28 28 63 68 61  qlite3_free((cha
3ca0: 72 2a 29 70 54 6f 2d 3e 7a 29 3b 0a 20 20 69 66  r*)pTo->z);.  if
3cb0: 28 20 70 46 72 6f 6d 2d 3e 7a 20 29 7b 0a 20 20  ( pFrom->z ){.  
3cc0: 20 20 70 54 6f 2d 3e 6e 20 3d 20 70 46 72 6f 6d    pTo->n = pFrom
3cd0: 2d 3e 6e 3b 0a 20 20 20 20 70 54 6f 2d 3e 7a 20  ->n;.    pTo->z 
3ce0: 3d 20 28 75 38 2a 29 73 71 6c 69 74 65 33 44 62  = (u8*)sqlite3Db
3cf0: 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61  StrNDup(db, (cha
3d00: 72 2a 29 70 46 72 6f 6d 2d 3e 7a 2c 20 70 46 72  r*)pFrom->z, pFr
3d10: 6f 6d 2d 3e 6e 29 3b 0a 20 20 20 20 70 54 6f 2d  om->n);.    pTo-
3d20: 3e 64 79 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  >dyn = 1;.  }els
3d30: 65 7b 0a 20 20 20 20 70 54 6f 2d 3e 7a 20 3d 20  e{.    pTo->z = 
3d40: 30 3b 0a 20 20 7d 0a 7d 0a 45 78 70 72 4c 69 73  0;.  }.}.ExprLis
3d50: 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t *sqlite3ExprLi
3d60: 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  stDup(sqlite3 *d
3d70: 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 29 7b  b, ExprList *p){
3d80: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65  .  ExprList *pNe
3d90: 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  w;.  struct Expr
3da0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
3db0: 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20 20 69  , *pOldItem;.  i
3dc0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30  nt i;.  if( p==0
3dd0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
3de0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
3df0: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
3e00: 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20  eof(*pNew) );.  
3e10: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
3e20: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
3e30: 69 45 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20  iECursor = 0;.  
3e40: 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20 70 4e  pNew->nExpr = pN
3e50: 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e  ew->nAlloc = p->
3e60: 6e 45 78 70 72 3b 0a 20 20 70 4e 65 77 2d 3e 61  nExpr;.  pNew->a
3e70: 20 3d 20 70 49 74 65 6d 20 3d 20 73 71 6c 69 74   = pItem = sqlit
3e80: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
3e90: 2c 20 20 70 2d 3e 6e 45 78 70 72 2a 73 69 7a 65  ,  p->nExpr*size
3ea0: 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20  of(p->a[0]) );. 
3eb0: 20 69 66 28 20 70 49 74 65 6d 3d 3d 30 20 29 7b   if( pItem==0 ){
3ec0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
3ed0: 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74  e(pNew);.    ret
3ee0: 75 72 6e 20 30 3b 0a 20 20 7d 20 0a 20 20 70 4f  urn 0;.  } .  pO
3ef0: 6c 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20  ldItem = p->a;. 
3f00: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
3f10: 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
3f20: 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b  ++, pOldItem++){
3f30: 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45  .    Expr *pNewE
3f40: 78 70 72 2c 20 2a 70 4f 6c 64 45 78 70 72 3b 0a  xpr, *pOldExpr;.
3f50: 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72      pItem->pExpr
3f60: 20 3d 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71   = pNewExpr = sq
3f70: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
3f80: 20 70 4f 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64   pOldExpr = pOld
3f90: 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
3fa0: 20 20 69 66 28 20 70 4f 6c 64 45 78 70 72 2d 3e    if( pOldExpr->
3fb0: 73 70 61 6e 2e 7a 21 3d 30 20 26 26 20 70 4e 65  span.z!=0 && pNe
3fc0: 77 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 2f  wExpr ){.      /
3fd0: 2a 20 41 6c 77 61 79 73 20 6d 61 6b 65 20 61 20  * Always make a 
3fe0: 63 6f 70 79 20 6f 66 20 74 68 65 20 73 70 61 6e  copy of the span
3ff0: 20 66 6f 72 20 74 6f 70 2d 6c 65 76 65 6c 20 65   for top-level e
4000: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
4010: 65 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65  e.      ** expre
4020: 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 54 68 65  ssion list.  The
4030: 20 6c 6f 67 69 63 20 69 6e 20 53 45 4c 45 43 54   logic in SELECT
4040: 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74   processing that
4050: 20 64 65 74 65 72 6d 69 6e 65 73 0a 20 20 20 20   determines.    
4060: 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65 73 20 6f    ** the names o
4070: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
4080: 20 72 65 73 75 6c 74 20 73 65 74 20 6e 65 65 64   result set need
4090: 73 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  s this informati
40a0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  on */.      sqli
40b0: 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c  te3TokenCopy(db,
40c0: 20 26 70 4e 65 77 45 78 70 72 2d 3e 73 70 61 6e   &pNewExpr->span
40d0: 2c 20 26 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61  , &pOldExpr->spa
40e0: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  n);.    }.    as
40f0: 73 65 72 74 28 20 70 4e 65 77 45 78 70 72 3d 3d  sert( pNewExpr==
4100: 30 20 7c 7c 20 70 4e 65 77 45 78 70 72 2d 3e 73  0 || pNewExpr->s
4110: 70 61 6e 2e 7a 21 3d 30 20 0a 20 20 20 20 20 20  pan.z!=0 .      
4120: 20 20 20 20 20 20 7c 7c 20 70 4f 6c 64 45 78 70        || pOldExp
4130: 72 2d 3e 73 70 61 6e 2e 7a 3d 3d 30 0a 20 20 20  r->span.z==0.   
4140: 20 20 20 20 20 20 20 20 20 7c 7c 20 64 62 2d 3e           || db->
4150: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
4160: 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65      pItem->zName
4170: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
4180: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
4190: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74  >zName);.    pIt
41a0: 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20  em->sortOrder = 
41b0: 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72  pOldItem->sortOr
41c0: 64 65 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  der;.    pItem->
41d0: 69 73 41 67 67 20 3d 20 70 4f 6c 64 49 74 65 6d  isAgg = pOldItem
41e0: 2d 3e 69 73 41 67 67 3b 0a 20 20 20 20 70 49 74  ->isAgg;.    pIt
41f0: 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20  em->done = 0;.  
4200: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
4210: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72  .}../*.** If cur
4220: 73 6f 72 73 2c 20 74 72 69 67 67 65 72 73 2c 20  sors, triggers, 
4230: 76 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65  views and subque
4240: 72 69 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69  ries are all omi
4250: 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  tted from.** the
4260: 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e   build, then non
4270: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
4280: 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20 65 78 63  ng routines, exc
4290: 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69  ept for .** sqli
42a0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 2c 20  te3SelectDup(), 
42b0: 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 73  can be called. s
42c0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
42d0: 29 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a  ) is sometimes.*
42e0: 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 20  * called with a 
42f0: 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  NULL argument..*
4300: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
4310: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
4320: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
4330: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
4340: 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64  ) \. || !defined
4350: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
4360: 51 55 45 52 59 29 0a 53 72 63 4c 69 73 74 20 2a  QUERY).SrcList *
4370: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75  sqlite3SrcListDu
4380: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  p(sqlite3 *db, S
4390: 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20 53 72  rcList *p){.  Sr
43a0: 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69  cList *pNew;.  i
43b0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74  nt i;.  int nByt
43c0: 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  e;.  if( p==0 ) 
43d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74  return 0;.  nByt
43e0: 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b  e = sizeof(*p) +
43f0: 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69   (p->nSrc>0 ? si
4400: 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20  zeof(p->a[0]) * 
4410: 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29  (p->nSrc-1) : 0)
4420: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
4430: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
4440: 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  , nByte );.  if(
4450: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
4460: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72  n 0;.  pNew->nSr
4470: 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63  c = pNew->nAlloc
4480: 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f   = p->nSrc;.  fo
4490: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63  r(i=0; i<p->nSrc
44a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
44b0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
44c0: 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65  *pNewItem = &pNe
44d0: 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72  w->a[i];.    str
44e0: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
44f0: 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d   *pOldItem = &p-
4500: 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65  >a[i];.    Table
4510: 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e 65 77   *pTab;.    pNew
4520: 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20  Item->zDatabase 
4530: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
4540: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
4550: 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
4560: 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  pNewItem->zName 
4570: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
4580: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
4590: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77  zName);.    pNew
45a0: 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73  Item->zAlias = s
45b0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
45c0: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c  b, pOldItem->zAl
45d0: 69 61 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ias);.    pNewIt
45e0: 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 3d 20 70  em->jointype = p
45f0: 4f 6c 64 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  OldItem->jointyp
4600: 65 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  e;.    pNewItem-
4610: 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49  >iCursor = pOldI
4620: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
4630: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 73 50 6f    pNewItem->isPo
4640: 70 75 6c 61 74 65 64 20 3d 20 70 4f 6c 64 49 74  pulated = pOldIt
4650: 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 3b  em->isPopulated;
4660: 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4e 65 77  .    pTab = pNew
4670: 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f 6c  Item->pTab = pOl
4680: 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  dItem->pTab;.   
4690: 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
46a0: 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b     pTab->nRef++;
46b0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49  .    }.    pNewI
46c0: 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73  tem->pSelect = s
46d0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
46e0: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53  db, pOldItem->pS
46f0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 70 4e 65 77  elect);.    pNew
4700: 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69  Item->pOn = sqli
4710: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
4720: 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20  OldItem->pOn);. 
4730: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73     pNewItem->pUs
4740: 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 49 64 4c  ing = sqlite3IdL
4750: 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  istDup(db, pOldI
4760: 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20  tem->pUsing);.  
4770: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55    pNewItem->colU
4780: 73 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  sed = pOldItem->
4790: 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72  colUsed;.  }.  r
47a0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64  eturn pNew;.}.Id
47b0: 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c  List *sqlite3IdL
47c0: 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  istDup(sqlite3 *
47d0: 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 29 7b 0a  db, IdList *p){.
47e0: 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a    IdList *pNew;.
47f0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
4800: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
4810: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
4820: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
4830: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b  sizeof(*pNew) );
4840: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
4850: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
4860: 77 2d 3e 6e 49 64 20 3d 20 70 4e 65 77 2d 3e 6e  w->nId = pNew->n
4870: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 49 64 3b 0a  Alloc = p->nId;.
4880: 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69    pNew->a = sqli
4890: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
48a0: 62 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66  b, p->nId*sizeof
48b0: 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69  (p->a[0]) );.  i
48c0: 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b  f( pNew->a==0 ){
48d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
48e0: 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74  e(pNew);.    ret
48f0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72  urn 0;.  }.  for
4900: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20  (i=0; i<p->nId; 
4910: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
4920: 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e   IdList_item *pN
4930: 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e  ewItem = &pNew->
4940: 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74  a[i];.    struct
4950: 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f   IdList_item *pO
4960: 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69  ldItem = &p->a[i
4970: 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  ];.    pNewItem-
4980: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
4990: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
49a0: 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  dItem->zName);. 
49b0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78     pNewItem->idx
49c0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78   = pOldItem->idx
49d0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
49e0: 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73  New;.}.Select *s
49f0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
4a00: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c  sqlite3 *db, Sel
4a10: 65 63 74 20 2a 70 29 7b 0a 20 20 53 65 6c 65 63  ect *p){.  Selec
4a20: 74 20 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20 70  t *pNew;.  if( p
4a30: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
4a40: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
4a50: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
4a60: 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20  sizeof(*p) );.  
4a70: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
4a80: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
4a90: 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e  isDistinct = p->
4aa0: 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 70 4e  isDistinct;.  pN
4ab0: 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c  ew->pEList = sql
4ac0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
4ad0: 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a  db, p->pEList);.
4ae0: 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73    pNew->pSrc = s
4af0: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70  qlite3SrcListDup
4b00: 28 64 62 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20  (db, p->pSrc);. 
4b10: 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20   pNew->pWhere = 
4b20: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
4b30: 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  b, p->pWhere);. 
4b40: 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20   pNew->pGroupBy 
4b50: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
4b60: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 47 72 6f  tDup(db, p->pGro
4b70: 75 70 42 79 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  upBy);.  pNew->p
4b80: 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  Having = sqlite3
4b90: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
4ba0: 48 61 76 69 6e 67 29 3b 0a 20 20 70 4e 65 77 2d  Having);.  pNew-
4bb0: 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69  >pOrderBy = sqli
4bc0: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
4bd0: 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  b, p->pOrderBy);
4be0: 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d  .  pNew->op = p-
4bf0: 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72  >op;.  pNew->pPr
4c00: 69 6f 72 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ior = sqlite3Sel
4c10: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 50  ectDup(db, p->pP
4c20: 72 69 6f 72 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  rior);.  pNew->p
4c30: 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45  Limit = sqlite3E
4c40: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c  xprDup(db, p->pL
4c50: 69 6d 69 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  imit);.  pNew->p
4c60: 4f 66 66 73 65 74 20 3d 20 73 71 6c 69 74 65 33  Offset = sqlite3
4c70: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
4c80: 4f 66 66 73 65 74 29 3b 0a 20 20 70 4e 65 77 2d  Offset);.  pNew-
4c90: 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20  >iLimit = -1;.  
4ca0: 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20  pNew->iOffset = 
4cb0: 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 52 65  -1;.  pNew->isRe
4cc0: 73 6f 6c 76 65 64 20 3d 20 70 2d 3e 69 73 52 65  solved = p->isRe
4cd0: 73 6f 6c 76 65 64 3b 0a 20 20 70 4e 65 77 2d 3e  solved;.  pNew->
4ce0: 69 73 41 67 67 20 3d 20 70 2d 3e 69 73 41 67 67  isAgg = p->isAgg
4cf0: 3b 0a 20 20 70 4e 65 77 2d 3e 75 73 65 73 45 70  ;.  pNew->usesEp
4d00: 68 6d 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  hm = 0;.  pNew->
4d10: 64 69 73 61 6c 6c 6f 77 4f 72 64 65 72 42 79 20  disallowOrderBy 
4d20: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69  = 0;.  pNew->pRi
4d30: 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 70  ghtmost = 0;.  p
4d40: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  New->addrOpenEph
4d50: 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  m[0] = -1;.  pNe
4d60: 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  w->addrOpenEphm[
4d70: 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  1] = -1;.  pNew-
4d80: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d  >addrOpenEphm[2]
4d90: 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20   = -1;.  return 
4da0: 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65  pNew;.}.#else.Se
4db0: 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c  lect *sqlite3Sel
4dc0: 65 63 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  ectDup(sqlite3 *
4dd0: 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  db, Select *p){.
4de0: 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29    assert( p==0 )
4df0: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
4e00: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41  #endif.../*.** A
4e10: 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
4e20: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61   to the end of a
4e30: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
4e40: 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a  t.  If pList is.
4e50: 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c  ** initially NUL
4e60: 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  L, then create a
4e70: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
4e80: 6c 69 73 74 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73  list..*/.ExprLis
4e90: 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t *sqlite3ExprLi
4ea0: 73 74 41 70 70 65 6e 64 28 0a 20 20 50 61 72 73  stAppend(.  Pars
4eb0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
4ec0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
4ed0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
4ee0: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
4ef0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77      /* List to w
4f00: 68 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20  hich to append. 
4f10: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
4f20: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
4f30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
4f40: 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61  pression to be a
4f50: 70 70 65 6e 64 65 64 20 2a 2f 0a 20 20 54 6f 6b  ppended */.  Tok
4f60: 65 6e 20 2a 70 4e 61 6d 65 20 20 20 20 20 20 20  en *pName       
4f70: 20 20 20 20 20 2f 2a 20 41 53 20 6b 65 79 77 6f       /* AS keywo
4f80: 72 64 20 66 6f 72 20 74 68 65 20 65 78 70 72 65  rd for the expre
4f90: 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 73 71  ssion */.){.  sq
4fa0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
4fb0: 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 4c  se->db;.  if( pL
4fc0: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
4fd0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ist = sqlite3DbM
4fe0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
4ff0: 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20 29  zeof(ExprList) )
5000: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
5010: 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
5020: 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20   no_mem;.    }. 
5030: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
5040: 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20  ->nAlloc==0 );. 
5050: 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e   }.  if( pList->
5060: 6e 41 6c 6c 6f 63 3c 3d 70 4c 69 73 74 2d 3e 6e  nAlloc<=pList->n
5070: 45 78 70 72 20 29 7b 0a 20 20 20 20 73 74 72 75  Expr ){.    stru
5080: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
5090: 20 2a 61 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d   *a;.    int n =
50a0: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32   pList->nAlloc*2
50b0: 20 2b 20 34 3b 0a 20 20 20 20 61 20 3d 20 73 71   + 4;.    a = sq
50c0: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
50d0: 62 2c 20 70 4c 69 73 74 2d 3e 61 2c 20 6e 2a 73  b, pList->a, n*s
50e0: 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
50f0: 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d  ]));.    if( a==
5100: 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
5110: 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20  no_mem;.    }.  
5120: 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a    pList->a = a;.
5130: 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f      pList->nAllo
5140: 63 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  c = n;.  }.  ass
5150: 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30  ert( pList->a!=0
5160: 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20   );.  if( pExpr 
5170: 7c 7c 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20  || pName ){.    
5180: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
5190: 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
51a0: 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
51b0: 45 78 70 72 2b 2b 5d 3b 0a 20 20 20 20 6d 65 6d  Expr++];.    mem
51c0: 73 65 74 28 70 49 74 65 6d 2c 20 30 2c 20 73 69  set(pItem, 0, si
51d0: 7a 65 6f 66 28 2a 70 49 74 65 6d 29 29 3b 0a 20  zeof(*pItem));. 
51e0: 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20     pItem->zName 
51f0: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
5200: 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65  mToken(db, pName
5210: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45  );.    pItem->pE
5220: 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 7d  xpr = pExpr;.  }
5230: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
5240: 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20  ..no_mem:     . 
5250: 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e   /* Avoid leakin
5260: 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c  g memory if mall
5270: 6f 63 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a  oc has failed. *
5280: 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  /.  sqlite3ExprD
5290: 65 6c 65 74 65 28 70 45 78 70 72 29 3b 0a 20 20  elete(pExpr);.  
52a0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
52b0: 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20  elete(pList);.  
52c0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
52d0: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
52e0: 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73 74  sion list pEList
52f0: 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74   contains more t
5300: 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65  han iLimit eleme
5310: 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e  nts,.** leave an
5320: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
5330: 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69  n pParse..*/.voi
5340: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
5350: 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20  tCheckLength(.  
5360: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20  Parse *pParse,. 
5370: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
5380: 74 2c 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 2c  t,.  int iLimit,
5390: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
53a0: 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69 66 28 20  Object.){.  if( 
53b0: 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
53c0: 2d 3e 6e 45 78 70 72 3e 69 4c 69 6d 69 74 20 29  ->nExpr>iLimit )
53d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
53e0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
53f0: 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20  oo many columns 
5400: 69 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29  in %s", zObject)
5410: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 23 69 66 20 64 65  ;.  }.}...#if de
5420: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
5430: 54 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  T) || SQLITE_MAX
5440: 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 2f 2a  _EXPR_DEPTH>0./*
5450: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
5460: 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20  hree functions, 
5470: 68 65 69 67 68 74 4f 66 45 78 70 72 28 29 2c 20  heightOfExpr(), 
5480: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
5490: 28 29 0a 2a 2a 20 61 6e 64 20 68 65 69 67 68 74  ().** and height
54a0: 4f 66 53 65 6c 65 63 74 28 29 2c 20 61 72 65 20  OfSelect(), are 
54b0: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
54c0: 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65  e the maximum he
54d0: 69 67 68 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65  ight.** of any e
54e0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72  xpression tree r
54f0: 65 66 65 72 65 6e 63 65 64 20 62 79 20 74 68 65  eferenced by the
5500: 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65   structure passe
5510: 64 20 61 73 20 74 68 65 0a 2a 2a 20 66 69 72 73  d as the.** firs
5520: 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  t argument..**.*
5530: 2a 20 49 66 20 74 68 69 73 20 6d 61 78 69 6d 75  * If this maximu
5540: 6d 20 68 65 69 67 68 74 20 69 73 20 67 72 65 61  m height is grea
5550: 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ter than the cur
5560: 72 65 6e 74 20 76 61 6c 75 65 20 70 6f 69 6e 74  rent value point
5570: 65 64 0a 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65  ed.** to by pnHe
5580: 69 67 68 74 2c 20 74 68 65 20 73 65 63 6f 6e 64  ight, the second
5590: 20 70 61 72 61 6d 65 74 65 72 2c 20 74 68 65 6e   parameter, then
55a0: 20 73 65 74 20 2a 70 6e 48 65 69 67 68 74 20 74   set *pnHeight t
55b0: 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e  o that.** value.
55c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
55d0: 68 65 69 67 68 74 4f 66 45 78 70 72 28 45 78 70  heightOfExpr(Exp
55e0: 72 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69  r *p, int *pnHei
55f0: 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b  ght){.  if( p ){
5600: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 48 65 69  .    if( p->nHei
5610: 67 68 74 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b  ght>*pnHeight ){
5620: 0a 20 20 20 20 20 20 2a 70 6e 48 65 69 67 68 74  .      *pnHeight
5630: 20 3d 20 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20   = p->nHeight;. 
5640: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69     }.  }.}.stati
5650: 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45  c void heightOfE
5660: 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74  xprList(ExprList
5670: 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67   *p, int *pnHeig
5680: 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  ht){.  if( p ){.
5690: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
56a0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78  or(i=0; i<p->nEx
56b0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
56c0: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
56d0: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65  a[i].pExpr, pnHe
56e0: 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ight);.    }.  }
56f0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68  .}.static void h
5700: 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 53 65  eightOfSelect(Se
5710: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e  lect *p, int *pn
5720: 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70  Height){.  if( p
5730: 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66   ){.    heightOf
5740: 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20  Expr(p->pWhere, 
5750: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
5760: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
5770: 48 61 76 69 6e 67 2c 20 70 6e 48 65 69 67 68 74  Having, pnHeight
5780: 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  );.    heightOfE
5790: 78 70 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 70  xpr(p->pLimit, p
57a0: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
57b0: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4f  ightOfExpr(p->pO
57c0: 66 66 73 65 74 2c 20 70 6e 48 65 69 67 68 74 29  ffset, pnHeight)
57d0: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
57e0: 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74  prList(p->pEList
57f0: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
5800: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
5810: 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70  t(p->pGroupBy, p
5820: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
5830: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70  ightOfExprList(p
5840: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 6e 48 65  ->pOrderBy, pnHe
5850: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
5860: 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e 70 50 72  tOfSelect(p->pPr
5870: 69 6f 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  ior, pnHeight);.
5880: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
5890: 20 74 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68   the Expr.nHeigh
58a0: 74 20 76 61 72 69 61 62 6c 65 20 69 6e 20 74 68  t variable in th
58b0: 65 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73  e structure pass
58c0: 65 64 20 61 73 20 61 6e 20 0a 2a 2a 20 61 72 67  ed as an .** arg
58d0: 75 6d 65 6e 74 2e 20 41 6e 20 65 78 70 72 65 73  ument. An expres
58e0: 73 69 6f 6e 20 77 69 74 68 20 6e 6f 20 63 68 69  sion with no chi
58f0: 6c 64 72 65 6e 2c 20 45 78 70 72 2e 70 4c 69 73  ldren, Expr.pLis
5900: 74 20 6f 72 20 0a 2a 2a 20 45 78 70 72 2e 70 53  t or .** Expr.pS
5910: 65 6c 65 63 74 20 6d 65 6d 62 65 72 20 68 61 73  elect member has
5920: 20 61 20 68 65 69 67 68 74 20 6f 66 20 31 2e 20   a height of 1. 
5930: 41 6e 79 20 6f 74 68 65 72 20 65 78 70 72 65 73  Any other expres
5940: 73 69 6f 6e 0a 2a 2a 20 68 61 73 20 61 20 68 65  sion.** has a he
5950: 69 67 68 74 20 65 71 75 61 6c 20 74 6f 20 74 68  ight equal to th
5960: 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74  e maximum height
5970: 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 0a 2a   of any other .*
5980: 2a 20 72 65 66 65 72 65 6e 63 65 64 20 45 78 70  * referenced Exp
5990: 72 20 70 6c 75 73 20 6f 6e 65 2e 0a 2a 2f 0a 76  r plus one..*/.v
59a0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53  oid sqlite3ExprS
59b0: 65 74 48 65 69 67 68 74 28 45 78 70 72 20 2a 70  etHeight(Expr *p
59c0: 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67 68 74  ){.  int nHeight
59d0: 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74 4f 66   = 0;.  heightOf
59e0: 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26  Expr(p->pLeft, &
59f0: 6e 48 65 69 67 68 74 29 3b 0a 20 20 68 65 69 67  nHeight);.  heig
5a00: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 52 69 67  htOfExpr(p->pRig
5a10: 68 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  ht, &nHeight);. 
5a20: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
5a30: 74 28 70 2d 3e 70 4c 69 73 74 2c 20 26 6e 48 65  t(p->pList, &nHe
5a40: 69 67 68 74 29 3b 0a 20 20 68 65 69 67 68 74 4f  ight);.  heightO
5a50: 66 53 65 6c 65 63 74 28 70 2d 3e 70 53 65 6c 65  fSelect(p->pSele
5a60: 63 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  ct, &nHeight);. 
5a70: 20 70 2d 3e 6e 48 65 69 67 68 74 20 3d 20 6e 48   p->nHeight = nH
5a80: 65 69 67 68 74 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a  eight + 1;.}../*
5a90: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d  .** Return the m
5aa0: 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66  aximum height of
5ab0: 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   any expression 
5ac0: 74 72 65 65 20 72 65 66 65 72 65 6e 63 65 64 0a  tree referenced.
5ad0: 2a 2a 20 62 79 20 74 68 65 20 73 65 6c 65 63 74  ** by the select
5ae0: 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65   statement passe
5af0: 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
5b00: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5b10: 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74  SelectExprHeight
5b20: 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69  (Select *p){.  i
5b30: 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a  nt nHeight = 0;.
5b40: 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74    heightOfSelect
5b50: 28 70 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  (p, &nHeight);. 
5b60: 20 72 65 74 75 72 6e 20 6e 48 65 69 67 68 74 3b   return nHeight;
5b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
5b80: 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
5b90: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
5ba0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
5bb0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
5bc0: 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74  (ExprList *pList
5bd0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
5be0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
5bf0: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28  em *pItem;.  if(
5c00: 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
5c10: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  rn;.  assert( pL
5c20: 69 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 28 70 4c  ist->a!=0 || (pL
5c30: 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 26 26  ist->nExpr==0 &&
5c40: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d   pList->nAlloc==
5c50: 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0) );.  assert( 
5c60: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3c 3d 70 4c  pList->nExpr<=pL
5c70: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 20  ist->nAlloc );. 
5c80: 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
5c90: 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73  ->a, i=0; i<pLis
5ca0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  t->nExpr; i++, p
5cb0: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Item++){.    sql
5cc0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
5cd0: 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
5ce0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
5cf0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
5d00: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
5d10: 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71  (pList->a);.  sq
5d20: 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 69 73 74  lite3_free(pList
5d30: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  );.}../*.** Walk
5d40: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
5d50: 72 65 65 2e 20 20 43 61 6c 6c 20 78 46 75 6e 63  ree.  Call xFunc
5d60: 20 66 6f 72 20 65 61 63 68 20 6e 6f 64 65 20 76   for each node v
5d70: 69 73 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  isited..**.** Th
5d80: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66  e return value f
5d90: 72 6f 6d 20 78 46 75 6e 63 20 64 65 74 65 72 6d  rom xFunc determ
5da0: 69 6e 65 73 20 77 68 65 74 68 65 72 20 74 68 65  ines whether the
5db0: 20 74 72 65 65 20 77 61 6c 6b 20 63 6f 6e 74 69   tree walk conti
5dc0: 6e 75 65 73 2e 0a 2a 2a 20 30 20 6d 65 61 6e 73  nues..** 0 means
5dd0: 20 63 6f 6e 74 69 6e 75 65 20 77 61 6c 6b 69 6e   continue walkin
5de0: 67 20 74 68 65 20 74 72 65 65 2e 20 20 31 20 6d  g the tree.  1 m
5df0: 65 61 6e 73 20 64 6f 20 6e 6f 74 20 77 61 6c 6b  eans do not walk
5e00: 20 63 68 69 6c 64 72 65 6e 0a 2a 2a 20 6f 66 20   children.** of 
5e10: 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64 65  the current node
5e20: 20 62 75 74 20 63 6f 6e 74 69 6e 75 65 20 77 69   but continue wi
5e30: 74 68 20 73 69 62 6c 69 6e 67 73 2e 20 20 32 20  th siblings.  2 
5e40: 6d 65 61 6e 73 20 61 62 61 6e 64 6f 6e 0a 2a 2a  means abandon.**
5e50: 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b 20 63   the tree walk c
5e60: 6f 6d 70 6c 65 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a  ompletely..**.**
5e70: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
5e80: 65 20 66 72 6f 6d 20 74 68 69 73 20 72 6f 75 74  e from this rout
5e90: 69 6e 65 20 69 73 20 31 20 74 6f 20 61 62 61 6e  ine is 1 to aban
5ea0: 64 6f 6e 20 74 68 65 20 74 72 65 65 20 77 61 6c  don the tree wal
5eb0: 6b 0a 2a 2a 20 61 6e 64 20 30 20 74 6f 20 63 6f  k.** and 0 to co
5ec0: 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 4e 4f  ntinue..**.** NO
5ed0: 54 49 43 45 3a 20 20 54 68 69 73 20 72 6f 75 74  TICE:  This rout
5ee0: 69 6e 65 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 64  ine does *not* d
5ef0: 65 73 63 65 6e 64 20 69 6e 74 6f 20 73 75 62 71  escend into subq
5f00: 75 65 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ueries..*/.stati
5f10: 63 20 69 6e 74 20 77 61 6c 6b 45 78 70 72 4c 69  c int walkExprLi
5f20: 73 74 28 45 78 70 72 4c 69 73 74 20 2a 2c 20 69  st(ExprList *, i
5f30: 6e 74 20 28 2a 29 28 76 6f 69 64 20 2a 2c 20 45  nt (*)(void *, E
5f40: 78 70 72 2a 29 2c 20 76 6f 69 64 20 2a 29 3b 0a  xpr*), void *);.
5f50: 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c 6b 45  static int walkE
5f60: 78 70 72 54 72 65 65 28 45 78 70 72 20 2a 70 45  xprTree(Expr *pE
5f70: 78 70 72 2c 20 69 6e 74 20 28 2a 78 46 75 6e 63  xpr, int (*xFunc
5f80: 29 28 76 6f 69 64 2a 2c 45 78 70 72 2a 29 2c 20  )(void*,Expr*), 
5f90: 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 69  void *pArg){.  i
5fa0: 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 45 78  nt rc;.  if( pEx
5fb0: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  pr==0 ) return 0
5fc0: 3b 0a 20 20 72 63 20 3d 20 28 2a 78 46 75 6e 63  ;.  rc = (*xFunc
5fd0: 29 28 70 41 72 67 2c 20 70 45 78 70 72 29 3b 0a  )(pArg, pExpr);.
5fe0: 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20    if( rc==0 ){. 
5ff0: 20 20 20 69 66 28 20 77 61 6c 6b 45 78 70 72 54     if( walkExprT
6000: 72 65 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ree(pExpr->pLeft
6010: 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 20 29  , xFunc, pArg) )
6020: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69   return 1;.    i
6030: 66 28 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  f( walkExprTree(
6040: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 78  pExpr->pRight, x
6050: 46 75 6e 63 2c 20 70 41 72 67 29 20 29 20 72 65  Func, pArg) ) re
6060: 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20  turn 1;.    if( 
6070: 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 45 78  walkExprList(pEx
6080: 70 72 2d 3e 70 4c 69 73 74 2c 20 78 46 75 6e 63  pr->pList, xFunc
6090: 2c 20 70 41 72 67 29 20 29 20 72 65 74 75 72 6e  , pArg) ) return
60a0: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
60b0: 20 72 63 3e 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   rc>1;.}../*.** 
60c0: 43 61 6c 6c 20 77 61 6c 6b 45 78 70 72 54 72 65  Call walkExprTre
60d0: 65 28 29 20 66 6f 72 20 65 76 65 72 79 20 65 78  e() for every ex
60e0: 70 72 65 73 73 69 6f 6e 20 69 6e 20 6c 69 73 74  pression in list
60f0: 20 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   p..*/.static in
6100: 74 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 45  t walkExprList(E
6110: 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20  xprList *p, int 
6120: 28 2a 78 46 75 6e 63 29 28 76 6f 69 64 20 2a 2c  (*xFunc)(void *,
6130: 20 45 78 70 72 2a 29 2c 20 76 6f 69 64 20 2a 70   Expr*), void *p
6140: 41 72 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Arg){.  int i;. 
6150: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
6160: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
6170: 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 20  if( !p ) return 
6180: 30 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 45  0;.  for(i=p->nE
6190: 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e 61 3b  xpr, pItem=p->a;
61a0: 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d   i>0; i--, pItem
61b0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 77 61 6c  ++){.    if( wal
61c0: 6b 45 78 70 72 54 72 65 65 28 70 49 74 65 6d 2d  kExprTree(pItem-
61d0: 3e 70 45 78 70 72 2c 20 78 46 75 6e 63 2c 20 70  >pExpr, xFunc, p
61e0: 41 72 67 29 20 29 20 72 65 74 75 72 6e 20 31 3b  Arg) ) return 1;
61f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
6200: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 77  .}../*.** Call w
6210: 61 6c 6b 45 78 70 72 54 72 65 65 28 29 20 66 6f  alkExprTree() fo
6220: 72 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69  r every expressi
6230: 6f 6e 20 69 6e 20 53 65 6c 65 63 74 20 70 2c 20  on in Select p, 
6240: 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a  not including.**
6250: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
6260: 74 20 61 72 65 20 70 61 72 74 20 6f 66 20 73 75  t are part of su
6270: 62 2d 73 65 6c 65 63 74 73 20 69 6e 20 61 6e 79  b-selects in any
6280: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 72 20   FROM clause or 
6290: 74 68 65 20 4c 49 4d 49 54 0a 2a 2a 20 6f 72 20  the LIMIT.** or 
62a0: 4f 46 46 53 45 54 20 65 78 70 72 65 73 73 69 6f  OFFSET expressio
62b0: 6e 73 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ns...*/.static i
62c0: 6e 74 20 77 61 6c 6b 53 65 6c 65 63 74 45 78 70  nt walkSelectExp
62d0: 72 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  r(Select *p, int
62e0: 20 28 2a 78 46 75 6e 63 29 28 76 6f 69 64 20 2a   (*xFunc)(void *
62f0: 2c 20 45 78 70 72 2a 29 2c 20 76 6f 69 64 20 2a  , Expr*), void *
6300: 70 41 72 67 29 7b 0a 20 20 77 61 6c 6b 45 78 70  pArg){.  walkExp
6310: 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c  rList(p->pEList,
6320: 20 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20   xFunc, pArg);. 
6330: 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70 2d   walkExprTree(p-
6340: 3e 70 57 68 65 72 65 2c 20 78 46 75 6e 63 2c 20  >pWhere, xFunc, 
6350: 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70  pArg);.  walkExp
6360: 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42  rList(p->pGroupB
6370: 79 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 3b  y, xFunc, pArg);
6380: 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  .  walkExprTree(
6390: 70 2d 3e 70 48 61 76 69 6e 67 2c 20 78 46 75 6e  p->pHaving, xFun
63a0: 63 2c 20 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b  c, pArg);.  walk
63b0: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64  ExprList(p->pOrd
63c0: 65 72 42 79 2c 20 78 46 75 6e 63 2c 20 70 41 72  erBy, xFunc, pAr
63d0: 67 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  g);.  if( p->pPr
63e0: 69 6f 72 20 29 7b 0a 20 20 20 20 77 61 6c 6b 53  ior ){.    walkS
63f0: 65 6c 65 63 74 45 78 70 72 28 70 2d 3e 70 50 72  electExpr(p->pPr
6400: 69 6f 72 2c 20 78 46 75 6e 63 2c 20 70 41 72 67  ior, xFunc, pArg
6410: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
6420: 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  0;.}.../*.** Thi
6430: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 64 65 73  s routine is des
6440: 69 67 6e 65 64 20 61 73 20 61 6e 20 78 46 75 6e  igned as an xFun
6450: 63 20 66 6f 72 20 77 61 6c 6b 45 78 70 72 54 72  c for walkExprTr
6460: 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 70 41 72 67  ee()..**.** pArg
6470: 20 69 73 20 72 65 61 6c 6c 79 20 61 20 70 6f 69   is really a poi
6480: 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 74 65 67  nter to an integ
6490: 65 72 2e 20 20 49 66 20 77 65 20 63 61 6e 20 74  er.  If we can t
64a0: 65 6c 6c 20 62 79 20 6c 6f 6f 6b 69 6e 67 0a 2a  ell by looking.*
64b0: 2a 20 61 74 20 70 45 78 70 72 20 74 68 61 74 20  * at pExpr that 
64c0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
64d0: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 70 45 78  hat contains pEx
64e0: 70 72 20 69 73 20 6e 6f 74 20 61 20 63 6f 6e 73  pr is not a cons
64f0: 74 61 6e 74 0a 2a 2a 20 65 78 70 72 65 73 73 69  tant.** expressi
6500: 6f 6e 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 41  on, then set *pA
6510: 72 67 20 74 6f 20 30 20 61 6e 64 20 72 65 74 75  rg to 0 and retu
6520: 72 6e 20 32 20 74 6f 20 61 62 61 6e 64 6f 6e 20  rn 2 to abandon 
6530: 74 68 65 20 74 72 65 65 20 77 61 6c 6b 2e 0a 2a  the tree walk..*
6540: 2a 20 49 66 20 70 45 78 70 72 20 64 6f 65 73 20  * If pExpr does 
6550: 64 6f 65 73 20 6e 6f 74 20 64 69 73 71 75 61 6c  does not disqual
6560: 69 66 79 20 74 68 65 20 65 78 70 72 65 73 73 69  ify the expressi
6570: 6f 6e 20 66 72 6f 6d 20 62 65 69 6e 67 20 61 20  on from being a 
6580: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 65 6e  constant.** then
6590: 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a   do nothing..**.
65a0: 2a 2a 20 41 66 74 65 72 20 77 61 6c 6b 69 6e 67  ** After walking
65b0: 20 74 68 65 20 77 68 6f 6c 65 20 74 72 65 65 2c   the whole tree,
65c0: 20 69 66 20 6e 6f 20 6e 6f 64 65 73 20 61 72 65   if no nodes are
65d0: 20 66 6f 75 6e 64 20 74 68 61 74 20 64 69 73 71   found that disq
65e0: 75 61 6c 69 66 79 0a 2a 2a 20 74 68 65 20 65 78  ualify.** the ex
65f0: 70 72 65 73 73 69 6f 6e 20 61 73 20 63 6f 6e 73  pression as cons
6600: 74 61 6e 74 2c 20 74 68 65 6e 20 77 65 20 61 73  tant, then we as
6610: 73 75 6d 65 20 74 68 65 20 77 68 6f 6c 65 20 65  sume the whole e
6620: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20  xpression.** is 
6630: 63 6f 6e 73 74 61 6e 74 2e 20 20 53 65 65 20 73  constant.  See s
6640: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
6650: 74 61 6e 74 28 29 20 66 6f 72 20 61 64 64 69 74  tant() for addit
6660: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
6670: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
6680: 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74   exprNodeIsConst
6690: 61 6e 74 28 76 6f 69 64 20 2a 70 41 72 67 2c 20  ant(void *pArg, 
66a0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
66b0: 69 6e 74 20 2a 70 4e 20 3d 20 28 69 6e 74 2a 29  int *pN = (int*)
66c0: 70 41 72 67 3b 0a 0a 20 20 2f 2a 20 49 66 20 2a  pArg;..  /* If *
66d0: 70 41 72 67 20 69 73 20 33 20 74 68 65 6e 20 61  pArg is 3 then a
66e0: 6e 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 65  ny term of the e
66f0: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63  xpression that c
6700: 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74  omes from.  ** t
6710: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
6720: 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e  lauses of a join
6730: 20 64 69 73 71 75 61 6c 69 66 69 65 73 20 74 68   disqualifies th
6740: 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a  e expression.  *
6750: 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f 6e  * from being con
6760: 73 69 64 65 72 65 64 20 63 6f 6e 73 74 61 6e 74  sidered constant
6770: 2e 20 2a 2f 0a 20 20 69 66 28 20 28 2a 70 4e 29  . */.  if( (*pN)
6780: 3d 3d 33 20 26 26 20 45 78 70 72 48 61 73 41 6e  ==3 && ExprHasAn
6790: 79 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  yProperty(pExpr,
67a0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b   EP_FromJoin) ){
67b0: 0a 20 20 20 20 2a 70 4e 20 3d 20 30 3b 0a 20 20  .    *pN = 0;.  
67c0: 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a    return 2;.  }.
67d0: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
67e0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43  ->op ){.    /* C
67f0: 6f 6e 73 69 64 65 72 20 66 75 6e 63 74 69 6f 6e  onsider function
6800: 73 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74  s to be constant
6810: 20 69 66 20 61 6c 6c 20 74 68 65 69 72 20 61 72   if all their ar
6820: 67 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e 73  guments are cons
6830: 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20  tant.    ** and 
6840: 2a 70 41 72 67 3d 3d 32 20 2a 2f 0a 20 20 20 20  *pArg==2 */.    
6850: 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  case TK_FUNCTION
6860: 3a 0a 20 20 20 20 20 20 69 66 28 20 28 2a 70 4e  :.      if( (*pN
6870: 29 3d 3d 32 20 29 20 72 65 74 75 72 6e 20 30 3b  )==2 ) return 0;
6880: 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74  .      /* Fall t
6890: 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61  hrough */.    ca
68a0: 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61  se TK_ID:.    ca
68b0: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  se TK_COLUMN:.  
68c0: 20 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a 0a 20    case TK_DOT:. 
68d0: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
68e0: 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73  UNCTION:.    cas
68f0: 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
6900: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
6910: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
6920: 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
6930: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  :.    case TK_EX
6940: 49 53 54 53 3a 0a 23 65 6e 64 69 66 0a 20 20 20  ISTS:.#endif.   
6950: 20 20 20 2a 70 4e 20 3d 20 30 3b 0a 20 20 20 20     *pN = 0;.    
6960: 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20    return 2;.    
6970: 63 61 73 65 20 54 4b 5f 49 4e 3a 0a 20 20 20 20  case TK_IN:.    
6980: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65    if( pExpr->pSe
6990: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
69a0: 2a 70 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  *pN = 0;.       
69b0: 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 20   return 2;.     
69c0: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a   }.    default:.
69d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
69e0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c    }.}../*.** Wal
69f0: 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
6a00: 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20  tree.  Return 1 
6a10: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
6a20: 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  n is constant.**
6a30: 20 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76   and 0 if it inv
6a40: 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20  olves variables 
6a50: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  or function call
6a60: 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  s..**.** For the
6a70: 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
6a80: 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f  s function, a do
6a90: 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  uble-quoted stri
6aa0: 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a  ng (ex: "abc").*
6ab0: 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
6ac0: 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61  a variable but a
6ad0: 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73   single-quoted s
6ae0: 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27  tring (ex: 'abc'
6af0: 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61  ) is.** a consta
6b00: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
6b10: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
6b20: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74  (Expr *p){.  int
6b30: 20 69 73 43 6f 6e 73 74 20 3d 20 31 3b 0a 20 20   isConst = 1;.  
6b40: 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70 2c 20  walkExprTree(p, 
6b50: 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61  exprNodeIsConsta
6b60: 6e 74 2c 20 26 69 73 43 6f 6e 73 74 29 3b 0a 20  nt, &isConst);. 
6b70: 20 72 65 74 75 72 6e 20 69 73 43 6f 6e 73 74 3b   return isConst;
6b80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  .}../*.** Walk a
6b90: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
6ba0: 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  e.  Return 1 if 
6bb0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
6bc0: 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68  s constant.** th
6bd0: 61 74 20 64 6f 65 73 20 6e 6f 20 6f 72 69 67 69  at does no origi
6be0: 6e 61 74 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e  nate from the ON
6bf0: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
6c00: 73 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20  s of a join..** 
6c10: 52 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69  Return 0 if it i
6c20: 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65  nvolves variable
6c30: 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61  s or function ca
6c40: 6c 6c 73 20 6f 72 20 74 65 72 6d 73 20 66 72 6f  lls or terms fro
6c50: 6d 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72 20 55 53  m.** an ON or US
6c60: 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69  ING clause..*/.i
6c70: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
6c80: 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
6c90: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Expr *p){.  int 
6ca0: 69 73 43 6f 6e 73 74 20 3d 20 33 3b 0a 20 20 77  isConst = 3;.  w
6cb0: 61 6c 6b 45 78 70 72 54 72 65 65 28 70 2c 20 65  alkExprTree(p, e
6cc0: 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  xprNodeIsConstan
6cd0: 74 2c 20 26 69 73 43 6f 6e 73 74 29 3b 0a 20 20  t, &isConst);.  
6ce0: 72 65 74 75 72 6e 20 69 73 43 6f 6e 73 74 21 3d  return isConst!=
6cf0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  0;.}../*.** Walk
6d00: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
6d10: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69  ree.  Return 1 i
6d20: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
6d30: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
6d40: 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61  or a function ca
6d50: 6c 6c 20 77 69 74 68 20 63 6f 6e 73 74 61 6e 74  ll with constant
6d60: 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74   arguments.  Ret
6d70: 75 72 6e 20 61 6e 64 20 30 20 69 66 20 74 68 65  urn and 0 if the
6d80: 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79 20 76 61  re.** are any va
6d90: 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46  riables..**.** F
6da0: 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
6db0: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
6dc0: 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65  , a double-quote
6dd0: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61  d string (ex: "a
6de0: 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  bc").** is consi
6df0: 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65  dered a variable
6e00: 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75   but a single-qu
6e10: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
6e20: 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20   'abc') is.** a 
6e30: 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74  constant..*/.int
6e40: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
6e50: 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e  nstantOrFunction
6e60: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74  (Expr *p){.  int
6e70: 20 69 73 43 6f 6e 73 74 20 3d 20 32 3b 0a 20 20   isConst = 2;.  
6e80: 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70 2c 20  walkExprTree(p, 
6e90: 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61  exprNodeIsConsta
6ea0: 6e 74 2c 20 26 69 73 43 6f 6e 73 74 29 3b 0a 20  nt, &isConst);. 
6eb0: 20 72 65 74 75 72 6e 20 69 73 43 6f 6e 73 74 21   return isConst!
6ec0: 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  =0;.}../*.** If 
6ed0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
6ee0: 20 63 6f 64 65 73 20 61 20 63 6f 6e 73 74 61 6e   codes a constan
6ef0: 74 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 69  t integer that i
6f00: 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a  s small enough.*
6f10: 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 33 32  * to fit in a 32
6f20: 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65  -bit integer, re
6f30: 74 75 72 6e 20 31 20 61 6e 64 20 70 75 74 20 74  turn 1 and put t
6f40: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
6f50: 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70  integer.** in *p
6f60: 56 61 6c 75 65 2e 20 20 49 66 20 74 68 65 20 65  Value.  If the e
6f70: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74  xpression is not
6f80: 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 69   an integer or i
6f90: 66 20 69 74 20 69 73 20 74 6f 6f 20 62 69 67 0a  f it is too big.
6fa0: 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 73  ** to fit in a s
6fb0: 69 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74  igned 32-bit int
6fc0: 65 67 65 72 2c 20 72 65 74 75 72 6e 20 30 20 61  eger, return 0 a
6fd0: 6e 64 20 6c 65 61 76 65 20 2a 70 56 61 6c 75 65  nd leave *pValue
6fe0: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69   unchanged..*/.i
6ff0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
7000: 49 6e 74 65 67 65 72 28 45 78 70 72 20 2a 70 2c  Integer(Expr *p,
7010: 20 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20   int *pValue){. 
7020: 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29   switch( p->op )
7030: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  {.    case TK_IN
7040: 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 69  TEGER: {.      i
7050: 66 28 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74  f( sqlite3GetInt
7060: 33 32 28 28 63 68 61 72 2a 29 70 2d 3e 74 6f 6b  32((char*)p->tok
7070: 65 6e 2e 7a 2c 20 70 56 61 6c 75 65 29 20 29 7b  en.z, pValue) ){
7080: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
7090: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
70a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
70b0: 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a    case TK_UPLUS:
70c0: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
70d0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
70e0: 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70  eger(p->pLeft, p
70f0: 56 61 6c 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Value);.    }.  
7100: 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53    case TK_UMINUS
7110: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b  : {.      int v;
7120: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
7130: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
7140: 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b  p->pLeft, &v) ){
7150: 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65  .        *pValue
7160: 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72   = -v;.        r
7170: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
7180: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7190: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
71a0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
71b0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
71c0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
71d0: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
71e0: 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c   is a row-id col
71f0: 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74  umn name..*/.int
7200: 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28   sqlite3IsRowid(
7210: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
7220: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
7230: 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f  ICmp(z, "_ROWID_
7240: 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ")==0 ) return 1
7250: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
7260: 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44  trICmp(z, "ROWID
7270: 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ")==0 ) return 1
7280: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
7290: 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29  trICmp(z, "OID")
72a0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
72b0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
72c0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e  *.** Given the n
72d0: 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  ame of a column 
72e0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 2e 59 2e  of the form X.Y.
72f0: 5a 20 6f 72 20 59 2e 5a 20 6f 72 20 6a 75 73 74  Z or Y.Z or just
7300: 20 5a 2c 20 6c 6f 6f 6b 20 75 70 0a 2a 2a 20 74   Z, look up.** t
7310: 68 61 74 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  hat name in the 
7320: 73 65 74 20 6f 66 20 73 6f 75 72 63 65 20 74 61  set of source ta
7330: 62 6c 65 73 20 69 6e 20 70 53 72 63 4c 69 73 74  bles in pSrcList
7340: 20 61 6e 64 20 6d 61 6b 65 20 74 68 65 20 70 45   and make the pE
7350: 78 70 72 20 0a 2a 2a 20 65 78 70 72 65 73 73 69  xpr .** expressi
7360: 6f 6e 20 6e 6f 64 65 20 72 65 66 65 72 20 62 61  on node refer ba
7370: 63 6b 20 74 6f 20 74 68 61 74 20 73 6f 75 72 63  ck to that sourc
7380: 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 66  e column.  The f
7390: 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73  ollowing changes
73a0: 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20 74 6f 20  .** are made to 
73b0: 70 45 78 70 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  pExpr:.**.**    
73c0: 70 45 78 70 72 2d 3e 69 44 62 20 20 20 20 20 20  pExpr->iDb      
73d0: 20 20 20 20 20 53 65 74 20 74 68 65 20 69 6e 64       Set the ind
73e0: 65 78 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20  ex in db->aDb[] 
73f0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
7400: 68 6f 6c 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20  holding.**      
7410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7420: 20 20 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a     the table..**
7430: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
7440: 65 20 20 20 20 20 20 20 20 53 65 74 20 74 6f 20  e        Set to 
7450: 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
7460: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
7470: 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 20 20 20 20  obtained.**     
7480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7490: 20 20 20 20 66 72 6f 6d 20 70 53 72 63 4c 69 73      from pSrcLis
74a0: 74 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e  t..**    pExpr->
74b0: 69 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 53 65  iColumn       Se
74c0: 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t to the column 
74d0: 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74 68  number within th
74e0: 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 70  e table..**    p
74f0: 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20  Expr->op        
7500: 20 20 20 20 53 65 74 20 74 6f 20 54 4b 5f 43 4f      Set to TK_CO
7510: 4c 55 4d 4e 2e 0a 2a 2a 20 20 20 20 70 45 78 70  LUMN..**    pExp
7520: 72 2d 3e 70 4c 65 66 74 20 20 20 20 20 20 20 20  r->pLeft        
7530: 20 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   Any expression 
7540: 74 68 69 73 20 70 6f 69 6e 74 73 20 74 6f 20 69  this points to i
7550: 73 20 64 65 6c 65 74 65 64 0a 2a 2a 20 20 20 20  s deleted.**    
7560: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 20 20  pExpr->pRight   
7570: 20 20 20 20 20 41 6e 79 20 65 78 70 72 65 73 73       Any express
7580: 69 6f 6e 20 74 68 69 73 20 70 6f 69 6e 74 73 20  ion this points 
7590: 74 6f 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a  to is deleted..*
75a0: 2a 0a 2a 2a 20 54 68 65 20 70 44 62 54 6f 6b 65  *.** The pDbToke
75b0: 6e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  n is the name of
75c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 74   the database (t
75d0: 68 65 20 22 58 22 29 2e 20 20 54 68 69 73 20 76  he "X").  This v
75e0: 61 6c 75 65 20 6d 61 79 20 62 65 0a 2a 2a 20 4e  alue may be.** N
75f0: 55 4c 4c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ULL meaning that
7600: 20 6e 61 6d 65 20 69 73 20 6f 66 20 74 68 65 20   name is of the 
7610: 66 6f 72 6d 20 59 2e 5a 20 6f 72 20 5a 2e 20 20  form Y.Z or Z.  
7620: 41 6e 79 20 61 76 61 69 6c 61 62 6c 65 20 64 61  Any available da
7630: 74 61 62 61 73 65 0a 2a 2a 20 63 61 6e 20 62 65  tabase.** can be
7640: 20 75 73 65 64 2e 20 20 54 68 65 20 70 54 61 62   used.  The pTab
7650: 6c 65 54 6f 6b 65 6e 20 69 73 20 74 68 65 20 6e  leToken is the n
7660: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
7670: 20 28 74 68 65 20 22 59 22 29 2e 20 20 54 68 69   (the "Y").  Thi
7680: 73 0a 2a 2a 20 76 61 6c 75 65 20 63 61 6e 20 62  s.** value can b
7690: 65 20 4e 55 4c 4c 20 69 66 20 70 44 62 54 6f 6b  e NULL if pDbTok
76a0: 65 6e 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e  en is also NULL.
76b0: 20 20 49 66 20 70 54 61 62 6c 65 54 6f 6b 65 6e    If pTableToken
76c0: 20 69 73 20 4e 55 4c 4c 20 69 74 0a 2a 2a 20 6d   is NULL it.** m
76d0: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 66 6f  eans that the fo
76e0: 72 6d 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69  rm of the name i
76f0: 73 20 5a 20 61 6e 64 20 74 68 61 74 20 63 6f 6c  s Z and that col
7700: 75 6d 6e 73 20 66 72 6f 6d 20 61 6e 79 20 74 61  umns from any ta
7710: 62 6c 65 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73  ble.** can be us
7720: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
7730: 20 6e 61 6d 65 20 63 61 6e 6e 6f 74 20 62 65 20   name cannot be 
7740: 72 65 73 6f 6c 76 65 64 20 75 6e 61 6d 62 69 67  resolved unambig
7750: 75 6f 75 73 6c 79 2c 20 6c 65 61 76 65 20 61 6e  uously, leave an
7760: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a   error message.*
7770: 2a 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  * in pParse and 
7780: 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e  return non-zero.
7790: 20 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 6f 6e    Return zero on
77a0: 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61   success..*/.sta
77b0: 74 69 63 20 69 6e 74 20 6c 6f 6f 6b 75 70 4e 61  tic int lookupNa
77c0: 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  me(.  Parse *pPa
77d0: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  rse,       /* Th
77e0: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
77f0: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44  t */.  Token *pD
7800: 62 54 6f 6b 65 6e 2c 20 20 20 20 20 2f 2a 20 4e  bToken,     /* N
7810: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
7820: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
7830: 61 62 6c 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  able, or NULL */
7840: 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65  .  Token *pTable
7850: 54 6f 6b 65 6e 2c 20 20 2f 2a 20 4e 61 6d 65 20  Token,  /* Name 
7860: 6f 66 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  of table contain
7870: 69 6e 67 20 63 6f 6c 75 6d 6e 2c 20 6f 72 20 4e  ing column, or N
7880: 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ULL */.  Token *
7890: 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2c 20 2f 2a  pColumnToken, /*
78a0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   Name of the col
78b0: 75 6d 6e 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f  umn. */.  NameCo
78c0: 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 2f  ntext *pNC,    /
78d0: 2a 20 54 68 65 20 6e 61 6d 65 20 63 6f 6e 74 65  * The name conte
78e0: 78 74 20 75 73 65 64 20 74 6f 20 72 65 73 6f 6c  xt used to resol
78f0: 76 65 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20  ve the name */. 
7900: 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20   Expr *pExpr    
7910: 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 74 68        /* Make th
7920: 69 73 20 45 58 50 52 20 6e 6f 64 65 20 70 6f 69  is EXPR node poi
7930: 6e 74 20 74 6f 20 74 68 65 20 73 65 6c 65 63 74  nt to the select
7940: 65 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a  ed column */.){.
7950: 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b    char *zDb = 0;
7960: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
7970: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
7980: 20 54 68 65 20 22 58 22 20 69 6e 20 58 2e 59 2e   The "X" in X.Y.
7990: 5a 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 61  Z */.  char *zTa
79a0: 62 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e  b = 0;      /* N
79b0: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
79c0: 2e 20 20 54 68 65 20 22 59 22 20 69 6e 20 58 2e  .  The "Y" in X.
79d0: 59 2e 5a 20 6f 72 20 59 2e 5a 20 2a 2f 0a 20 20  Y.Z or Y.Z */.  
79e0: 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 30 3b 20  char *zCol = 0; 
79f0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
7a00: 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65  the column.  The
7a10: 20 22 5a 22 20 2a 2f 0a 20 20 69 6e 74 20 69 2c   "Z" */.  int i,
7a20: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   j;            /
7a30: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
7a40: 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  */.  int cnt = 0
7a50: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
7a60: 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20  ber of matching 
7a70: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
7a80: 20 20 69 6e 74 20 63 6e 74 54 61 62 20 3d 20 30    int cntTab = 0
7a90: 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ;      /* Number
7aa0: 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 74 61 62   of matching tab
7ab0: 6c 65 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 73 71  le names */.  sq
7ac0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
7ad0: 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20  se->db;  /* The 
7ae0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 74  database */.  st
7af0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
7b00: 6d 20 2a 70 49 74 65 6d 3b 20 20 20 20 20 20 20  m *pItem;       
7b10: 2f 2a 20 55 73 65 20 66 6f 72 20 6c 6f 6f 70 69  /* Use for loopi
7b20: 6e 67 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74  ng over pSrcList
7b30: 20 69 74 65 6d 73 20 2a 2f 0a 20 20 73 74 72 75   items */.  stru
7b40: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
7b50: 2a 70 4d 61 74 63 68 20 3d 20 30 3b 20 20 2f 2a  *pMatch = 0;  /*
7b60: 20 54 68 65 20 6d 61 74 63 68 69 6e 67 20 70 53   The matching pS
7b70: 72 63 4c 69 73 74 20 69 74 65 6d 20 2a 2f 0a 20  rcList item */. 
7b80: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 54   NameContext *pT
7b90: 6f 70 4e 43 20 3d 20 70 4e 43 3b 20 20 20 20 20  opNC = pNC;     
7ba0: 20 20 20 2f 2a 20 46 69 72 73 74 20 6e 61 6d 65     /* First name
7bb0: 63 6f 6e 74 65 78 74 20 69 6e 20 74 68 65 20 6c  context in the l
7bc0: 69 73 74 20 2a 2f 0a 20 20 53 63 68 65 6d 61 20  ist */.  Schema 
7bd0: 2a 70 53 63 68 65 6d 61 20 3d 20 30 3b 20 20 20  *pSchema = 0;   
7be0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63             /* Sc
7bf0: 68 65 6d 61 20 6f 66 20 74 68 65 20 65 78 70 72  hema of the expr
7c00: 65 73 73 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73  ession */..  ass
7c10: 65 72 74 28 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65  ert( pColumnToke
7c20: 6e 20 26 26 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65  n && pColumnToke
7c30: 6e 2d 3e 7a 20 29 3b 20 2f 2a 20 54 68 65 20 5a  n->z ); /* The Z
7c40: 20 69 6e 20 58 2e 59 2e 5a 20 63 61 6e 6e 6f 74   in X.Y.Z cannot
7c50: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 7a 44   be NULL */.  zD
7c60: 62 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  b = sqlite3NameF
7c70: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 44 62  romToken(db, pDb
7c80: 54 6f 6b 65 6e 29 3b 0a 20 20 7a 54 61 62 20 3d  Token);.  zTab =
7c90: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
7ca0: 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65  Token(db, pTable
7cb0: 54 6f 6b 65 6e 29 3b 0a 20 20 7a 43 6f 6c 20 3d  Token);.  zCol =
7cc0: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
7cd0: 54 6f 6b 65 6e 28 64 62 2c 20 70 43 6f 6c 75 6d  Token(db, pColum
7ce0: 6e 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 64  nToken);.  if( d
7cf0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7d00: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6c 6f 6f 6b  ){.    goto look
7d10: 75 70 6e 61 6d 65 5f 65 6e 64 3b 0a 20 20 7d 0a  upname_end;.  }.
7d20: 0a 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  .  pExpr->iTable
7d30: 20 3d 20 2d 31 3b 0a 20 20 77 68 69 6c 65 28 20   = -1;.  while( 
7d40: 70 4e 43 20 26 26 20 63 6e 74 3d 3d 30 20 29 7b  pNC && cnt==0 ){
7d50: 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
7d60: 45 4c 69 73 74 3b 0a 20 20 20 20 53 72 63 4c 69  EList;.    SrcLi
7d70: 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70  st *pSrcList = p
7d80: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 0a 20  NC->pSrcList;.. 
7d90: 20 20 20 69 66 28 20 70 53 72 63 4c 69 73 74 20     if( pSrcList 
7da0: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
7db0: 2c 20 70 49 74 65 6d 3d 70 53 72 63 4c 69 73 74  , pItem=pSrcList
7dc0: 2d 3e 61 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d  ->a; i<pSrcList-
7dd0: 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
7de0: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 54 61  m++){.        Ta
7df0: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20  ble *pTab;.     
7e00: 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
7e10: 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c      Column *pCol
7e20: 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 70 54 61  ;.  .        pTa
7e30: 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b  b = pItem->pTab;
7e40: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7e50: 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20   pTab!=0 );.    
7e60: 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
7e70: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
7e80: 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
7e90: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
7ea0: 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20  t( pTab->nCol>0 
7eb0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  );.        if( z
7ec0: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Tab ){.         
7ed0: 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69   if( pItem->zAli
7ee0: 61 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  as ){.          
7ef0: 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65    char *zTabName
7f00: 20 3d 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73   = pItem->zAlias
7f10: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
7f20: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
7f30: 28 7a 54 61 62 4e 61 6d 65 2c 20 7a 54 61 62 29  (zTabName, zTab)
7f40: 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
7f50: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
7f60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
7f70: 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54  r *zTabName = pT
7f80: 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
7f90: 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e         if( zTabN
7fa0: 61 6d 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ame==0 || sqlite
7fb0: 33 53 74 72 49 43 6d 70 28 7a 54 61 62 4e 61 6d  3StrICmp(zTabNam
7fc0: 65 2c 20 7a 54 61 62 29 21 3d 30 20 29 20 63 6f  e, zTab)!=0 ) co
7fd0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
7fe0: 20 20 20 20 69 66 28 20 7a 44 62 21 3d 30 20 26      if( zDb!=0 &
7ff0: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
8000: 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e  (db->aDb[iDb].zN
8010: 61 6d 65 2c 20 7a 44 62 29 21 3d 30 20 29 7b 0a  ame, zDb)!=0 ){.
8020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
8030: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
8040: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
8050: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
8060: 20 20 20 20 69 66 28 20 30 3d 3d 28 63 6e 74 54      if( 0==(cntT
8070: 61 62 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 20  ab++) ){.       
8080: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
8090: 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f   = pItem->iCurso
80a0: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 63  r;.          pSc
80b0: 68 65 6d 61 20 3d 20 70 54 61 62 2d 3e 70 53 63  hema = pTab->pSc
80c0: 68 65 6d 61 3b 0a 20 20 20 20 20 20 20 20 20 20  hema;.          
80d0: 70 4d 61 74 63 68 20 3d 20 70 49 74 65 6d 3b 0a  pMatch = pItem;.
80e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
80f0: 20 20 66 6f 72 28 6a 3d 30 2c 20 70 43 6f 6c 3d    for(j=0, pCol=
8100: 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54  pTab->aCol; j<pT
8110: 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70  ab->nCol; j++, p
8120: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
8130: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
8140: 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  ICmp(pCol->zName
8150: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20  , zCol)==0 ){.  
8160: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
8170: 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 54  char *zColl = pT
8180: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c  ab->aCol[j].zCol
8190: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 49  l;.            I
81a0: 64 4c 69 73 74 20 2a 70 55 73 69 6e 67 3b 0a 20  dList *pUsing;. 
81b0: 20 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b             cnt++
81c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
81d0: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 49  xpr->iTable = pI
81e0: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
81f0: 20 20 20 20 20 20 20 20 20 20 70 4d 61 74 63 68            pMatch
8200: 20 3d 20 70 49 74 65 6d 3b 0a 20 20 20 20 20 20   = pItem;.      
8210: 20 20 20 20 20 20 70 53 63 68 65 6d 61 20 3d 20        pSchema = 
8220: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3b 0a 20  pTab->pSchema;. 
8230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75             /* Su
8240: 62 73 74 69 74 75 74 65 20 74 68 65 20 72 6f 77  bstitute the row
8250: 69 64 20 28 63 6f 6c 75 6d 6e 20 2d 31 29 20 66  id (column -1) f
8260: 6f 72 20 74 68 65 20 49 4e 54 45 47 45 52 20 50  or the INTEGER P
8270: 52 49 4d 41 52 59 20 4b 45 59 20 2a 2f 0a 20 20  RIMARY KEY */.  
8280: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
8290: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3d 3d 70 54  >iColumn = j==pT
82a0: 61 62 2d 3e 69 50 4b 65 79 20 3f 20 2d 31 20 3a  ab->iPKey ? -1 :
82b0: 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   j;.            
82c0: 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20  pExpr->affinity 
82d0: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  = pTab->aCol[j].
82e0: 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20  affinity;.      
82f0: 20 20 20 20 20 20 69 66 28 20 28 70 45 78 70 72        if( (pExpr
8300: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70  ->flags & EP_Exp
8310: 43 6f 6c 6c 61 74 65 29 3d 3d 30 20 29 7b 0a 20  Collate)==0 ){. 
8320: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
8330: 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  pr->pColl = sqli
8340: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
8350: 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c  b, ENC(db), zCol
8360: 6c 2c 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  l,-1, 0);.      
8370: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8380: 20 20 20 20 69 66 28 20 69 3c 70 53 72 63 4c 69      if( i<pSrcLi
8390: 73 74 2d 3e 6e 53 72 63 2d 31 20 29 7b 0a 20 20  st->nSrc-1 ){.  
83a0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
83b0: 70 49 74 65 6d 5b 31 5d 2e 6a 6f 69 6e 74 79 70  pItem[1].jointyp
83c0: 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29  e & JT_NATURAL )
83d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
83e0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6d 61 74    /* If this mat
83f0: 63 68 20 6f 63 63 75 72 72 65 64 20 69 6e 20 74  ch occurred in t
8400: 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66  he left table of
8410: 20 61 20 6e 61 74 75 72 61 6c 20 6a 6f 69 6e 2c   a natural join,
8420: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8430: 20 2a 2a 20 74 68 65 6e 20 73 6b 69 70 20 74 68   ** then skip th
8440: 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 74 6f  e right table to
8450: 20 61 76 6f 69 64 20 61 20 64 75 70 6c 69 63 61   avoid a duplica
8460: 74 65 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20  te match */.    
8470: 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
8480: 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  m++;.           
8490: 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
84a0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
84b0: 28 20 28 70 55 73 69 6e 67 20 3d 20 70 49 74 65  ( (pUsing = pIte
84c0: 6d 5b 31 5d 2e 70 55 73 69 6e 67 29 21 3d 30 20  m[1].pUsing)!=0 
84d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
84e0: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6d 61     /* If this ma
84f0: 74 63 68 20 6f 63 63 75 72 73 20 6f 6e 20 61 20  tch occurs on a 
8500: 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69 73 20 69  column that is i
8510: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
8520: 73 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  se.             
8530: 20 20 20 2a 2a 20 6f 66 20 61 20 6a 6f 69 6e 2c     ** of a join,
8540: 20 73 6b 69 70 20 74 68 65 20 73 65 61 72 63 68   skip the search
8550: 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61   of the right ta
8560: 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 0a  ble of the join.
8570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8580: 2a 2a 20 74 6f 20 61 76 6f 69 64 20 61 20 64 75  ** to avoid a du
8590: 70 6c 69 63 61 74 65 20 6d 61 74 63 68 20 74 68  plicate match th
85a0: 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ere. */.        
85b0: 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20          int k;. 
85c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
85d0: 6f 72 28 6b 3d 30 3b 20 6b 3c 70 55 73 69 6e 67  or(k=0; k<pUsing
85e0: 2d 3e 6e 49 64 3b 20 6b 2b 2b 29 7b 0a 20 20 20  ->nId; k++){.   
85f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
8600: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
8610: 70 28 70 55 73 69 6e 67 2d 3e 61 5b 6b 5d 2e 7a  p(pUsing->a[k].z
8620: 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29  Name, zCol)==0 )
8630: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
8640: 20 20 20 20 20 20 70 49 74 65 6d 2b 2b 3b 0a 20        pItem++;. 
8650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8660: 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20     i++;.        
8670: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
8680: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
8690: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
86a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
86b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
86c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
86d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
86e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
86f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23        }.    }..#
8700: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
8710: 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 2f  IT_TRIGGER.    /
8720: 2a 20 49 66 20 77 65 20 68 61 76 65 20 6e 6f 74  * If we have not
8730: 20 61 6c 72 65 61 64 79 20 72 65 73 6f 6c 76 65   already resolve
8740: 64 20 74 68 65 20 6e 61 6d 65 2c 20 74 68 65 6e  d the name, then
8750: 20 6d 61 79 62 65 20 0a 20 20 20 20 2a 2a 20 69   maybe .    ** i
8760: 74 20 69 73 20 61 20 6e 65 77 2e 2a 20 6f 72 20  t is a new.* or 
8770: 6f 6c 64 2e 2a 20 74 72 69 67 67 65 72 20 61 72  old.* trigger ar
8780: 67 75 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65  gument reference
8790: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
87a0: 7a 44 62 3d 3d 30 20 26 26 20 7a 54 61 62 21 3d  zDb==0 && zTab!=
87b0: 30 20 26 26 20 63 6e 74 3d 3d 30 20 26 26 20 70  0 && cnt==0 && p
87c0: 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b  Parse->trigStack
87d0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 72 69  !=0 ){.      Tri
87e0: 67 67 65 72 53 74 61 63 6b 20 2a 70 54 72 69 67  ggerStack *pTrig
87f0: 67 65 72 53 74 61 63 6b 20 3d 20 70 50 61 72 73  gerStack = pPars
8800: 65 2d 3e 74 72 69 67 53 74 61 63 6b 3b 0a 20 20  e->trigStack;.  
8810: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
8820: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 0;.      if( p
8830: 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6e 65  TriggerStack->ne
8840: 77 49 64 78 20 21 3d 20 2d 31 20 26 26 20 73 71  wIdx != -1 && sq
8850: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 22 6e 65  lite3StrICmp("ne
8860: 77 22 2c 20 7a 54 61 62 29 20 3d 3d 20 30 20 29  w", zTab) == 0 )
8870: 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  {.        pExpr-
8880: 3e 69 54 61 62 6c 65 20 3d 20 70 54 72 69 67 67  >iTable = pTrigg
8890: 65 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64 78 3b  erStack->newIdx;
88a0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
88b0: 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e   pTriggerStack->
88c0: 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 20 20  pTab );.        
88d0: 70 54 61 62 20 3d 20 70 54 72 69 67 67 65 72 53  pTab = pTriggerS
88e0: 74 61 63 6b 2d 3e 70 54 61 62 3b 0a 20 20 20 20  tack->pTab;.    
88f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 72 69    }else if( pTri
8900: 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 49 64  ggerStack->oldId
8910: 78 20 21 3d 20 2d 31 20 26 26 20 73 71 6c 69 74  x != -1 && sqlit
8920: 65 33 53 74 72 49 43 6d 70 28 22 6f 6c 64 22 2c  e3StrICmp("old",
8930: 20 7a 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20   zTab)==0 ){.   
8940: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
8950: 6c 65 20 3d 20 70 54 72 69 67 67 65 72 53 74 61  le = pTriggerSta
8960: 63 6b 2d 3e 6f 6c 64 49 64 78 3b 0a 20 20 20 20  ck->oldIdx;.    
8970: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69      assert( pTri
8980: 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 20  ggerStack->pTab 
8990: 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20  );.        pTab 
89a0: 3d 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d  = pTriggerStack-
89b0: 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 7d 0a 0a  >pTab;.      }..
89c0: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 20 29        if( pTab )
89d0: 7b 20 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  { .        int i
89e0: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c  Col;.        Col
89f0: 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 70 54 61 62  umn *pCol = pTab
8a00: 2d 3e 61 43 6f 6c 3b 0a 0a 20 20 20 20 20 20 20  ->aCol;..       
8a10: 20 70 53 63 68 65 6d 61 20 3d 20 70 54 61 62 2d   pSchema = pTab-
8a20: 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20  >pSchema;.      
8a30: 20 20 63 6e 74 54 61 62 2b 2b 3b 0a 20 20 20 20    cntTab++;.    
8a40: 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
8a50: 69 43 6f 6c 20 3c 20 70 54 61 62 2d 3e 6e 43 6f  iCol < pTab->nCo
8a60: 6c 3b 20 69 43 6f 6c 2b 2b 2c 20 70 43 6f 6c 2b  l; iCol++, pCol+
8a70: 2b 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69  +) {.          i
8a80: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
8a90: 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a  p(pCol->zName, z
8aa0: 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Col)==0 ){.     
8ab0: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
8ac0: 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d  r *zColl = pTab-
8ad0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 43 6f 6c  >aCol[iCol].zCol
8ae0: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  l;.            c
8af0: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt++;.          
8b00: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
8b10: 20 3d 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69   = iCol==pTab->i
8b20: 50 4b 65 79 20 3f 20 2d 31 20 3a 20 69 43 6f 6c  PKey ? -1 : iCol
8b30: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
8b40: 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  xpr->affinity = 
8b50: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
8b60: 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20  .affinity;.     
8b70: 20 20 20 20 20 20 20 69 66 28 20 28 70 45 78 70         if( (pExp
8b80: 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78  r->flags & EP_Ex
8b90: 70 43 6f 6c 6c 61 74 65 29 3d 3d 30 20 29 7b 0a  pCollate)==0 ){.
8ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
8bb0: 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c  xpr->pColl = sql
8bc0: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
8bd0: 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f  db, ENC(db), zCo
8be0: 6c 6c 2c 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20  ll,-1, 0);.     
8bf0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8c00: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62       pExpr->pTab
8c10: 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20   = pTab;.       
8c20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8c30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8c40: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
8c50: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
8c60: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
8c70: 52 49 47 47 45 52 29 20 2a 2f 0a 0a 20 20 20 20  RIGGER) */..    
8c80: 2f 2a 0a 20 20 20 20 2a 2a 20 50 65 72 68 61 70  /*.    ** Perhap
8c90: 73 20 74 68 65 20 6e 61 6d 65 20 69 73 20 61 20  s the name is a 
8ca0: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
8cb0: 20 52 4f 57 49 44 0a 20 20 20 20 2a 2f 0a 20 20   ROWID.    */.  
8cc0: 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26 26 20    if( cnt==0 && 
8cd0: 63 6e 74 54 61 62 3d 3d 31 20 26 26 20 73 71 6c  cntTab==1 && sql
8ce0: 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c  ite3IsRowid(zCol
8cf0: 29 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 20 3d  ) ){.      cnt =
8d00: 20 31 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   1;.      pExpr-
8d10: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20  >iColumn = -1;. 
8d20: 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69       pExpr->affi
8d30: 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46  nity = SQLITE_AF
8d40: 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 7d  F_INTEGER;.    }
8d50: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
8d60: 49 66 20 74 68 65 20 69 6e 70 75 74 20 69 73 20  If the input is 
8d70: 6f 66 20 74 68 65 20 66 6f 72 6d 20 5a 20 28 6e  of the form Z (n
8d80: 6f 74 20 59 2e 5a 20 6f 72 20 58 2e 59 2e 5a 29  ot Y.Z or X.Y.Z)
8d90: 20 74 68 65 6e 20 74 68 65 20 6e 61 6d 65 20 5a   then the name Z
8da0: 0a 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 72 65  .    ** might re
8db0: 66 65 72 20 74 6f 20 61 6e 20 72 65 73 75 6c 74  fer to an result
8dc0: 2d 73 65 74 20 61 6c 69 61 73 2e 20 20 54 68 69  -set alias.  Thi
8dd0: 73 20 68 61 70 70 65 6e 73 2c 20 66 6f 72 20 65  s happens, for e
8de0: 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a 20 20 20  xample, when.   
8df0: 20 2a 2a 20 77 65 20 61 72 65 20 72 65 73 6f 6c   ** we are resol
8e00: 76 69 6e 67 20 6e 61 6d 65 73 20 69 6e 20 74 68  ving names in th
8e10: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
8e20: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
8e30: 63 6f 6d 6d 61 6e 64 3a 0a 20 20 20 20 2a 2a 0a  command:.    **.
8e40: 20 20 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43      **     SELEC
8e50: 54 20 61 2b 62 20 41 53 20 78 20 46 52 4f 4d 20  T a+b AS x FROM 
8e60: 74 61 62 6c 65 20 57 48 45 52 45 20 78 3c 31 30  table WHERE x<10
8e70: 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
8e80: 49 6e 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68  In cases like th
8e90: 69 73 2c 20 72 65 70 6c 61 63 65 20 70 45 78 70  is, replace pExp
8ea0: 72 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66  r with a copy of
8eb0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
8ec0: 74 68 61 74 0a 20 20 20 20 2a 2a 20 66 6f 72 6d  that.    ** form
8ed0: 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
8ee0: 20 65 6e 74 72 79 20 28 22 61 2b 62 22 20 69 6e   entry ("a+b" in
8ef0: 20 74 68 65 20 65 78 61 6d 70 6c 65 29 20 61 6e   the example) an
8f00: 64 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61  d return immedia
8f10: 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 4e 6f 74  tely..    ** Not
8f20: 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65  e that the expre
8f30: 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 72 65 73  ssion in the res
8f40: 75 6c 74 20 73 65 74 20 73 68 6f 75 6c 64 20 68  ult set should h
8f50: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
8f60: 0a 20 20 20 20 2a 2a 20 72 65 73 6f 6c 76 65 64  .    ** resolved
8f70: 20 62 79 20 74 68 65 20 74 69 6d 65 20 74 68 65   by the time the
8f80: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
8f90: 20 72 65 73 6f 6c 76 65 64 2e 0a 20 20 20 20 2a   resolved..    *
8fa0: 2f 0a 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30  /.    if( cnt==0
8fb0: 20 26 26 20 28 70 45 4c 69 73 74 20 3d 20 70 4e   && (pEList = pN
8fc0: 43 2d 3e 70 45 4c 69 73 74 29 21 3d 30 20 26 26  C->pEList)!=0 &&
8fd0: 20 7a 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   zTab==0 ){.    
8fe0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 45 4c    for(j=0; j<pEL
8ff0: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29  ist->nExpr; j++)
9000: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
9010: 7a 41 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  zAs = pEList->a[
9020: 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
9030: 20 20 69 66 28 20 7a 41 73 21 3d 30 20 26 26 20    if( zAs!=0 && 
9040: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
9050: 41 73 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a  As, zCol)==0 ){.
9060: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
9070: 70 44 75 70 2c 20 2a 70 4f 72 69 67 3b 0a 20 20  pDup, *pOrig;.  
9080: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9090: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20  pExpr->pLeft==0 
90a0: 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  && pExpr->pRight
90b0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
90c0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
90d0: 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pList==0 );.    
90e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
90f0: 78 70 72 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  xpr->pSelect==0 
9100: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72  );.          pOr
9110: 69 67 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a  ig = pEList->a[j
9120: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
9130: 20 20 20 69 66 28 20 21 70 4e 43 2d 3e 61 6c 6c     if( !pNC->all
9140: 6f 77 41 67 67 20 26 26 20 45 78 70 72 48 61 73  owAgg && ExprHas
9150: 50 72 6f 70 65 72 74 79 28 70 4f 72 69 67 2c 20  Property(pOrig, 
9160: 45 50 5f 41 67 67 29 20 29 7b 0a 20 20 20 20 20  EP_Agg) ){.     
9170: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
9180: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
9190: 6d 69 73 75 73 65 20 6f 66 20 61 6c 69 61 73 65  misuse of aliase
91a0: 64 20 61 67 67 72 65 67 61 74 65 20 25 73 22 2c  d aggregate %s",
91b0: 20 7a 41 73 29 3b 0a 20 20 20 20 20 20 20 20 20   zAs);.         
91c0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
91d0: 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  zCol);.         
91e0: 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20     return 2;.   
91f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9200: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
9210: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 72  3ExprDup(db, pOr
9220: 69 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ig);.          i
9230: 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  f( pExpr->flags 
9240: 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20  & EP_ExpCollate 
9250: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
9260: 44 75 70 2d 3e 70 43 6f 6c 6c 20 3d 20 70 45 78  Dup->pColl = pEx
9270: 70 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  pr->pColl;.     
9280: 20 20 20 20 20 20 20 70 44 75 70 2d 3e 66 6c 61         pDup->fla
9290: 67 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c  gs |= EP_ExpColl
92a0: 61 74 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ate;.          }
92b0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
92c0: 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 29  Expr->span.dyn )
92d0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 28 63   sqlite3_free((c
92e0: 68 61 72 2a 29 70 45 78 70 72 2d 3e 73 70 61 6e  har*)pExpr->span
92f0: 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  .z);.          i
9300: 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  f( pExpr->token.
9310: 64 79 6e 20 29 20 73 71 6c 69 74 65 33 5f 66 72  dyn ) sqlite3_fr
9320: 65 65 28 28 63 68 61 72 2a 29 70 45 78 70 72 2d  ee((char*)pExpr-
9330: 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 20  >token.z);.     
9340: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 45 78 70       memcpy(pExp
9350: 72 2c 20 70 44 75 70 2c 20 73 69 7a 65 6f 66 28  r, pDup, sizeof(
9360: 2a 70 45 78 70 72 29 29 3b 0a 20 20 20 20 20 20  *pExpr));.      
9370: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
9380: 28 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20  (pDup);.        
9390: 20 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20    cnt = 1;.     
93a0: 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20 30 3b       pMatch = 0;
93b0: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
93c0: 74 28 20 7a 54 61 62 3d 3d 30 20 26 26 20 7a 44  t( zTab==0 && zD
93d0: 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  b==0 );.        
93e0: 20 20 67 6f 74 6f 20 6c 6f 6f 6b 75 70 6e 61 6d    goto lookupnam
93f0: 65 5f 65 6e 64 5f 32 3b 0a 20 20 20 20 20 20 20  e_end_2;.       
9400: 20 7d 0a 20 20 20 20 20 20 7d 20 0a 20 20 20 20   }.      } .    
9410: 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 76 61 6e 63  }..    /* Advanc
9420: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6e 61  e to the next na
9430: 6d 65 20 63 6f 6e 74 65 78 74 2e 20 20 54 68 65  me context.  The
9440: 20 6c 6f 6f 70 20 77 69 6c 6c 20 65 78 69 74 20   loop will exit 
9450: 77 68 65 6e 20 65 69 74 68 65 72 0a 20 20 20 20  when either.    
9460: 2a 2a 20 77 65 20 68 61 76 65 20 61 20 6d 61 74  ** we have a mat
9470: 63 68 20 28 63 6e 74 3e 30 29 20 6f 72 20 77 68  ch (cnt>0) or wh
9480: 65 6e 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66  en we run out of
9490: 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 73 2e 0a   name contexts..
94a0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63      */.    if( c
94b0: 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  nt==0 ){.      p
94c0: 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b  NC = pNC->pNext;
94d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
94e0: 0a 20 20 2a 2a 20 49 66 20 58 20 61 6e 64 20 59  .  ** If X and Y
94f0: 20 61 72 65 20 4e 55 4c 4c 20 28 69 6e 20 6f 74   are NULL (in ot
9500: 68 65 72 20 77 6f 72 64 73 20 69 66 20 6f 6e 6c  her words if onl
9510: 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  y the column nam
9520: 65 20 5a 20 69 73 0a 20 20 2a 2a 20 73 75 70 70  e Z is.  ** supp
9530: 6c 69 65 64 29 20 61 6e 64 20 74 68 65 20 76 61  lied) and the va
9540: 6c 75 65 20 6f 66 20 5a 20 69 73 20 65 6e 63 6c  lue of Z is encl
9550: 6f 73 65 64 20 69 6e 20 64 6f 75 62 6c 65 2d 71  osed in double-q
9560: 75 6f 74 65 73 2c 20 74 68 65 6e 0a 20 20 2a 2a  uotes, then.  **
9570: 20 5a 20 69 73 20 61 20 73 74 72 69 6e 67 20 6c   Z is a string l
9580: 69 74 65 72 61 6c 20 69 66 20 69 74 20 64 6f 65  iteral if it doe
9590: 73 6e 27 74 20 6d 61 74 63 68 20 61 6e 79 20 63  sn't match any c
95a0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 6e  olumn names.  In
95b0: 20 74 68 61 74 0a 20 20 2a 2a 20 63 61 73 65 2c   that.  ** case,
95c0: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 74 75   we need to retu
95d0: 72 6e 20 72 69 67 68 74 20 61 77 61 79 20 61 6e  rn right away an
95e0: 64 20 6e 6f 74 20 6d 61 6b 65 20 61 6e 79 20 63  d not make any c
95f0: 68 61 6e 67 65 73 20 74 6f 0a 20 20 2a 2a 20 70  hanges to.  ** p
9600: 45 78 70 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Expr..  **.  ** 
9610: 42 65 63 61 75 73 65 20 6e 6f 20 72 65 66 65 72  Because no refer
9620: 65 6e 63 65 20 77 61 73 20 6d 61 64 65 20 74 6f  ence was made to
9630: 20 6f 75 74 65 72 20 63 6f 6e 74 65 78 74 73 2c   outer contexts,
9640: 20 74 68 65 20 70 4e 43 2d 3e 6e 52 65 66 0a 20   the pNC->nRef. 
9650: 20 2a 2a 20 66 69 65 6c 64 73 20 61 72 65 20 6e   ** fields are n
9660: 6f 74 20 63 68 61 6e 67 65 64 20 69 6e 20 61 6e  ot changed in an
9670: 79 20 63 6f 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a  y context..  */.
9680: 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26 26 20    if( cnt==0 && 
9690: 7a 54 61 62 3d 3d 30 20 26 26 20 70 43 6f 6c 75  zTab==0 && pColu
96a0: 6d 6e 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27  mnToken->z[0]=='
96b0: 22 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  "' ){.    sqlite
96c0: 33 5f 66 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20  3_free(zCol);.  
96d0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
96e0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63 6e 74 3d 3d  .  /*.  ** cnt==
96f0: 30 20 6d 65 61 6e 73 20 74 68 65 72 65 20 77 61  0 means there wa
9700: 73 20 6e 6f 74 20 6d 61 74 63 68 2e 20 20 63 6e  s not match.  cn
9710: 74 3e 31 20 6d 65 61 6e 73 20 74 68 65 72 65 20  t>1 means there 
9720: 77 65 72 65 20 74 77 6f 20 6f 72 0a 20 20 2a 2a  were two or.  **
9730: 20 6d 6f 72 65 20 6d 61 74 63 68 65 73 2e 20 20   more matches.  
9740: 45 69 74 68 65 72 20 77 61 79 2c 20 77 65 20 68  Either way, we h
9750: 61 76 65 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20  ave an error..  
9760: 2a 2f 0a 20 20 69 66 28 20 63 6e 74 21 3d 31 20  */.  if( cnt!=1 
9770: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  ){.    char *z =
9780: 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45   0;.    char *zE
9790: 72 72 3b 0a 20 20 20 20 7a 45 72 72 20 3d 20 63  rr;.    zErr = c
97a0: 6e 74 3d 3d 30 20 3f 20 22 6e 6f 20 73 75 63 68  nt==0 ? "no such
97b0: 20 63 6f 6c 75 6d 6e 3a 20 25 73 22 20 3a 20 22   column: %s" : "
97c0: 61 6d 62 69 67 75 6f 75 73 20 63 6f 6c 75 6d 6e  ambiguous column
97d0: 20 6e 61 6d 65 3a 20 25 73 22 3b 0a 20 20 20 20   name: %s";.    
97e0: 69 66 28 20 7a 44 62 20 29 7b 0a 20 20 20 20 20  if( zDb ){.     
97f0: 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
9800: 67 28 26 7a 2c 20 7a 44 62 2c 20 22 2e 22 2c 20  g(&z, zDb, ".", 
9810: 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c  zTab, ".", zCol,
9820: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
9830: 7d 65 6c 73 65 20 69 66 28 20 7a 54 61 62 20 29  }else if( zTab )
9840: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
9850: 65 74 53 74 72 69 6e 67 28 26 7a 2c 20 7a 54 61  etString(&z, zTa
9860: 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20 28 63  b, ".", zCol, (c
9870: 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 7d 65 6c  har*)0);.    }el
9880: 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71  se{.      z = sq
9890: 6c 69 74 65 33 53 74 72 44 75 70 28 7a 43 6f 6c  lite3StrDup(zCol
98a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
98b0: 20 7a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69   z ){.      sqli
98c0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
98d0: 73 65 2c 20 7a 45 72 72 2c 20 7a 29 3b 0a 20 20  se, zErr, z);.  
98e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
98f0: 28 7a 29 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e  (z);.      pTopN
9900: 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d  C->nErr++;.    }
9910: 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62 2d 3e  else{.      db->
9920: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
9930: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
9940: 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 66 72  * If a column fr
9950: 6f 6d 20 61 20 74 61 62 6c 65 20 69 6e 20 70 53  om a table in pS
9960: 72 63 4c 69 73 74 20 69 73 20 72 65 66 65 72 65  rcList is refere
9970: 6e 63 65 64 2c 20 74 68 65 6e 20 72 65 63 6f 72  nced, then recor
9980: 64 0a 20 20 2a 2a 20 74 68 69 73 20 66 61 63 74  d.  ** this fact
9990: 20 69 6e 20 74 68 65 20 70 53 72 63 4c 69 73 74   in the pSrcList
99a0: 2e 61 5b 5d 2e 63 6f 6c 55 73 65 64 20 62 69 74  .a[].colUsed bit
99b0: 6d 61 73 6b 2e 20 20 43 6f 6c 75 6d 6e 20 30 20  mask.  Column 0 
99c0: 63 61 75 73 65 73 0a 20 20 2a 2a 20 62 69 74 20  causes.  ** bit 
99d0: 30 20 74 6f 20 62 65 20 73 65 74 2e 20 20 43 6f  0 to be set.  Co
99e0: 6c 75 6d 6e 20 31 20 73 65 74 73 20 62 69 74 20  lumn 1 sets bit 
99f0: 31 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68  1.  And so forth
9a00: 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 63  .  If the.  ** c
9a10: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69 73 20  olumn number is 
9a20: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
9a30: 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73 20   number of bits 
9a40: 69 6e 20 74 68 65 20 62 69 74 6d 61 73 6b 0a 20  in the bitmask. 
9a50: 20 2a 2a 20 74 68 65 6e 20 73 65 74 20 74 68 65   ** then set the
9a60: 20 68 69 67 68 2d 6f 72 64 65 72 20 62 69 74 20   high-order bit 
9a70: 6f 66 20 74 68 65 20 62 69 74 6d 61 73 6b 2e 0a  of the bitmask..
9a80: 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72    */.  if( pExpr
9a90: 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20  ->iColumn>=0 && 
9aa0: 70 4d 61 74 63 68 21 3d 30 20 29 7b 0a 20 20 20  pMatch!=0 ){.   
9ab0: 20 69 6e 74 20 6e 20 3d 20 70 45 78 70 72 2d 3e   int n = pExpr->
9ac0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 66 28  iColumn;.    if(
9ad0: 20 6e 3e 3d 73 69 7a 65 6f 66 28 42 69 74 6d 61   n>=sizeof(Bitma
9ae0: 73 6b 29 2a 38 20 29 7b 0a 20 20 20 20 20 20 6e  sk)*8 ){.      n
9af0: 20 3d 20 73 69 7a 65 6f 66 28 42 69 74 6d 61 73   = sizeof(Bitmas
9b00: 6b 29 2a 38 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  k)*8-1;.    }.  
9b10: 20 20 61 73 73 65 72 74 28 20 70 4d 61 74 63 68    assert( pMatch
9b20: 2d 3e 69 43 75 72 73 6f 72 3d 3d 70 45 78 70 72  ->iCursor==pExpr
9b30: 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20 20 20  ->iTable );.    
9b40: 70 4d 61 74 63 68 2d 3e 63 6f 6c 55 73 65 64 20  pMatch->colUsed 
9b50: 7c 3d 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c  |= ((Bitmask)1)<
9b60: 3c 6e 3b 0a 20 20 7d 0a 0a 6c 6f 6f 6b 75 70 6e  <n;.  }..lookupn
9b70: 61 6d 65 5f 65 6e 64 3a 0a 20 20 2f 2a 20 43 6c  ame_end:.  /* Cl
9b80: 65 61 6e 20 75 70 20 61 6e 64 20 72 65 74 75 72  ean up and retur
9b90: 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  n.  */.  sqlite3
9ba0: 5f 66 72 65 65 28 7a 44 62 29 3b 0a 20 20 73 71  _free(zDb);.  sq
9bb0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 61 62 29  lite3_free(zTab)
9bc0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
9bd0: 65 6c 65 74 65 28 70 45 78 70 72 2d 3e 70 4c 65  elete(pExpr->pLe
9be0: 66 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 4c  ft);.  pExpr->pL
9bf0: 65 66 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  eft = 0;.  sqlit
9c00: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 78  e3ExprDelete(pEx
9c10: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 70  pr->pRight);.  p
9c20: 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 30  Expr->pRight = 0
9c30: 3b 0a 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20  ;.  pExpr->op = 
9c40: 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 6c 6f 6f 6b 75  TK_COLUMN;.looku
9c50: 70 6e 61 6d 65 5f 65 6e 64 5f 32 3a 0a 20 20 73  pname_end_2:.  s
9c60: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c  qlite3_free(zCol
9c70: 29 3b 0a 20 20 69 66 28 20 63 6e 74 3d 3d 31 20  );.  if( cnt==1 
9c80: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
9c90: 4e 43 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  NC!=0 );.    sql
9ca0: 69 74 65 33 41 75 74 68 52 65 61 64 28 70 50 61  ite3AuthRead(pPa
9cb0: 72 73 65 2c 20 70 45 78 70 72 2c 20 70 53 63 68  rse, pExpr, pSch
9cc0: 65 6d 61 2c 20 70 4e 43 2d 3e 70 53 72 63 4c 69  ema, pNC->pSrcLi
9cd0: 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 61  st);.    if( pMa
9ce0: 74 63 68 20 26 26 20 21 70 4d 61 74 63 68 2d 3e  tch && !pMatch->
9cf0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
9d00: 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d 20 70   pExpr->pTab = p
9d10: 4d 61 74 63 68 2d 3e 70 54 61 62 3b 0a 20 20 20  Match->pTab;.   
9d20: 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d   }.    /* Increm
9d30: 65 6e 74 20 74 68 65 20 6e 52 65 66 20 76 61 6c  ent the nRef val
9d40: 75 65 20 6f 6e 20 61 6c 6c 20 6e 61 6d 65 20 63  ue on all name c
9d50: 6f 6e 74 65 78 74 73 20 66 72 6f 6d 20 54 6f 70  ontexts from Top
9d60: 4e 43 20 75 70 20 74 6f 0a 20 20 20 20 2a 2a 20  NC up to.    ** 
9d70: 74 68 65 20 70 6f 69 6e 74 20 77 68 65 72 65 20  the point where 
9d80: 74 68 65 20 6e 61 6d 65 20 6d 61 74 63 68 65 64  the name matched
9d90: 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 3b 3b 29  . */.    for(;;)
9da0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
9db0: 70 54 6f 70 4e 43 21 3d 30 20 29 3b 0a 20 20 20  pTopNC!=0 );.   
9dc0: 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 52 65 66 2b     pTopNC->nRef+
9dd0: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 6f  +;.      if( pTo
9de0: 70 4e 43 3d 3d 70 4e 43 20 29 20 62 72 65 61 6b  pNC==pNC ) break
9df0: 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e 43 20 3d  ;.      pTopNC =
9e00: 20 70 54 6f 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a   pTopNC->pNext;.
9e10: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
9e20: 20 30 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20   0;.  } else {. 
9e30: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
9e40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
9e50: 6f 75 74 69 6e 65 20 69 73 20 64 65 73 69 67 6e  outine is design
9e60: 65 64 20 61 73 20 61 6e 20 78 46 75 6e 63 20 66  ed as an xFunc f
9e70: 6f 72 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  or walkExprTree(
9e80: 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65  )..**.** Resolve
9e90: 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 73 20   symbolic names 
9ea0: 69 6e 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6f  into TK_COLUMN o
9eb0: 70 65 72 61 74 6f 72 73 20 66 6f 72 20 74 68 65  perators for the
9ec0: 20 63 75 72 72 65 6e 74 0a 2a 2a 20 6e 6f 64 65   current.** node
9ed0: 20 69 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   in the expressi
9ee0: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
9ef0: 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 74   0 to continue t
9f00: 68 65 20 73 65 61 72 63 68 20 64 6f 77 6e 0a 2a  he search down.*
9f10: 2a 20 74 68 65 20 74 72 65 65 20 6f 72 20 32 20  * the tree or 2 
9f20: 74 6f 20 61 62 6f 72 74 20 74 68 65 20 74 72 65  to abort the tre
9f30: 65 20 77 61 6c 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  e walk..**.** Th
9f40: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20  is routine also 
9f50: 64 6f 65 73 20 65 72 72 6f 72 20 63 68 65 63 6b  does error check
9f60: 69 6e 67 20 61 6e 64 20 6e 61 6d 65 20 72 65 73  ing and name res
9f70: 6f 6c 75 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 66  olution for.** f
9f80: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 2e 20 20  unction names.  
9f90: 54 68 65 20 6f 70 65 72 61 74 6f 72 20 66 6f 72  The operator for
9fa0: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
9fb0: 69 6f 6e 73 20 69 73 20 63 68 61 6e 67 65 64 0a  ions is changed.
9fc0: 2a 2a 20 74 6f 20 54 4b 5f 41 47 47 5f 46 55 4e  ** to TK_AGG_FUN
9fd0: 43 54 49 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63  CTION..*/.static
9fe0: 20 69 6e 74 20 6e 61 6d 65 52 65 73 6f 6c 76 65   int nameResolve
9ff0: 72 53 74 65 70 28 76 6f 69 64 20 2a 70 41 72 67  rStep(void *pArg
a000: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
a010: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
a020: 4e 43 20 3d 20 28 4e 61 6d 65 43 6f 6e 74 65 78  NC = (NameContex
a030: 74 2a 29 70 41 72 67 3b 0a 20 20 50 61 72 73 65  t*)pArg;.  Parse
a040: 20 2a 70 50 61 72 73 65 3b 0a 0a 20 20 69 66 28   *pParse;..  if(
a050: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
a060: 72 6e 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 1;.  assert( 
a070: 70 4e 43 21 3d 30 20 29 3b 0a 20 20 70 50 61 72  pNC!=0 );.  pPar
a080: 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
a090: 3b 0a 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  ;..  if( ExprHas
a0a0: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70  AnyProperty(pExp
a0b0: 72 2c 20 45 50 5f 52 65 73 6f 6c 76 65 64 29 20  r, EP_Resolved) 
a0c0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 45 78  ) return 1;.  Ex
a0d0: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
a0e0: 78 70 72 2c 20 45 50 5f 52 65 73 6f 6c 76 65 64  xpr, EP_Resolved
a0f0: 29 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  );.#ifndef NDEBU
a100: 47 0a 20 20 69 66 28 20 70 4e 43 2d 3e 70 53 72  G.  if( pNC->pSr
a110: 63 4c 69 73 74 20 26 26 20 70 4e 43 2d 3e 70 53  cList && pNC->pS
a120: 72 63 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3e 30  rcList->nAlloc>0
a130: 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20   ){.    SrcList 
a140: 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d  *pSrcList = pNC-
a150: 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 69  >pSrcList;.    i
a160: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
a170: 30 3b 20 69 3c 70 4e 43 2d 3e 70 53 72 63 4c 69  0; i<pNC->pSrcLi
a180: 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
a190: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
a1a0: 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75  rcList->a[i].iCu
a1b0: 72 73 6f 72 3e 3d 30 20 26 26 20 70 53 72 63 4c  rsor>=0 && pSrcL
a1c0: 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  ist->a[i].iCurso
a1d0: 72 3c 70 50 61 72 73 65 2d 3e 6e 54 61 62 29 3b  r<pParse->nTab);
a1e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
a1f0: 66 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  f.  switch( pExp
a200: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20  r->op ){.    /* 
a210: 44 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74  Double-quoted st
a220: 72 69 6e 67 73 20 28 65 78 3a 20 22 61 62 63 22  rings (ex: "abc"
a230: 29 20 61 72 65 20 75 73 65 64 20 61 73 20 69 64  ) are used as id
a240: 65 6e 74 69 66 69 65 72 73 20 69 66 0a 20 20 20  entifiers if.   
a250: 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 20 4f   ** possible.  O
a260: 74 68 65 72 77 69 73 65 20 74 68 65 79 20 72 65  therwise they re
a270: 6d 61 69 6e 20 61 73 20 73 74 72 69 6e 67 73 2e  main as strings.
a280: 20 20 53 69 6e 67 6c 65 2d 71 75 6f 74 65 64 0a    Single-quoted.
a290: 20 20 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 28      ** strings (
a2a0: 65 78 3a 20 27 61 62 63 27 29 20 61 72 65 20 61  ex: 'abc') are a
a2b0: 6c 77 61 79 73 20 73 74 72 69 6e 67 20 6c 69 74  lways string lit
a2c0: 65 72 61 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  erals..    */.  
a2d0: 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
a2e0: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  : {.      if( pE
a2f0: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d  xpr->token.z[0]=
a300: 3d 27 5c 27 27 20 29 20 62 72 65 61 6b 3b 0a 20  ='\'' ) break;. 
a310: 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
a320: 75 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 49 44  u into the TK_ID
a330: 20 63 61 73 65 20 69 66 20 74 68 69 73 20 69 73   case if this is
a340: 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64   a double-quoted
a350: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 7d   string */.    }
a360: 0a 20 20 20 20 2f 2a 20 41 20 6c 6f 6e 65 20 69  .    /* A lone i
a370: 64 65 6e 74 69 66 69 65 72 20 69 73 20 74 68 65  dentifier is the
a380: 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d   name of a colum
a390: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  n..    */.    ca
a3a0: 73 65 20 54 4b 5f 49 44 3a 20 7b 0a 20 20 20 20  se TK_ID: {.    
a3b0: 20 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70 50 61    lookupName(pPa
a3c0: 72 73 65 2c 20 30 2c 20 30 2c 20 26 70 45 78 70  rse, 0, 0, &pExp
a3d0: 72 2d 3e 74 6f 6b 65 6e 2c 20 70 4e 43 2c 20 70  r->token, pNC, p
a3e0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 72 65 74  Expr);.      ret
a3f0: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 0a  urn 1;.    }.  .
a400: 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 6e      /* A table n
a410: 61 6d 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e  ame and column n
a420: 61 6d 65 3a 20 20 20 20 20 49 44 2e 49 44 0a 20  ame:     ID.ID. 
a430: 20 20 20 2a 2a 20 4f 72 20 61 20 64 61 74 61 62     ** Or a datab
a440: 61 73 65 2c 20 74 61 62 6c 65 20 61 6e 64 20 63  ase, table and c
a450: 6f 6c 75 6d 6e 3a 20 20 49 44 2e 49 44 2e 49 44  olumn:  ID.ID.ID
a460: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
a470: 20 54 4b 5f 44 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_DOT: {.     
a480: 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e 3b   Token *pColumn;
a490: 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54  .      Token *pT
a4a0: 61 62 6c 65 3b 0a 20 20 20 20 20 20 54 6f 6b 65  able;.      Toke
a4b0: 6e 20 2a 70 44 62 3b 0a 20 20 20 20 20 20 45 78  n *pDb;.      Ex
a4c0: 70 72 20 2a 70 52 69 67 68 74 3b 0a 0a 20 20 20  pr *pRight;..   
a4d0: 20 20 20 2f 2a 20 69 66 28 20 70 53 72 63 4c 69     /* if( pSrcLi
a4e0: 73 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 20 2a  st==0 ) break; *
a4f0: 2f 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d  /.      pRight =
a500: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a   pExpr->pRight;.
a510: 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74        if( pRight
a520: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20  ->op==TK_ID ){. 
a530: 20 20 20 20 20 20 20 70 44 62 20 3d 20 30 3b 0a         pDb = 0;.
a540: 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 20 3d          pTable =
a550: 20 26 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e   &pExpr->pLeft->
a560: 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 70  token;.        p
a570: 43 6f 6c 75 6d 6e 20 3d 20 26 70 52 69 67 68 74  Column = &pRight
a580: 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d  ->token;.      }
a590: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
a5a0: 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e 6f 70  sert( pRight->op
a5b0: 3d 3d 54 4b 5f 44 4f 54 20 29 3b 0a 20 20 20 20  ==TK_DOT );.    
a5c0: 20 20 20 20 70 44 62 20 3d 20 26 70 45 78 70 72      pDb = &pExpr
a5d0: 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a  ->pLeft->token;.
a5e0: 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 20 3d          pTable =
a5f0: 20 26 70 52 69 67 68 74 2d 3e 70 4c 65 66 74 2d   &pRight->pLeft-
a600: 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  >token;.        
a610: 70 43 6f 6c 75 6d 6e 20 3d 20 26 70 52 69 67 68  pColumn = &pRigh
a620: 74 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e  t->pRight->token
a630: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a640: 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70 50 61 72 73  lookupName(pPars
a650: 65 2c 20 70 44 62 2c 20 70 54 61 62 6c 65 2c 20  e, pDb, pTable, 
a660: 70 43 6f 6c 75 6d 6e 2c 20 70 4e 43 2c 20 70 45  pColumn, pNC, pE
a670: 78 70 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  xpr);.      retu
a680: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 1;.    }..   
a690: 20 2f 2a 20 52 65 73 6f 6c 76 65 20 66 75 6e 63   /* Resolve func
a6a0: 74 69 6f 6e 20 6e 61 6d 65 73 0a 20 20 20 20 2a  tion names.    *
a6b0: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  /.    case TK_CO
a6c0: 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20 20 63 61  NST_FUNC:.    ca
a6d0: 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20  se TK_FUNCTION: 
a6e0: 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  {.      ExprList
a6f0: 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
a700: 3e 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68  >pList;    /* Th
a710: 65 20 61 72 67 75 6d 65 6e 74 20 6c 69 73 74 20  e argument list 
a720: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  */.      int n =
a730: 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e   pList ? pList->
a740: 6e 45 78 70 72 20 3a 20 30 3b 20 20 2f 2a 20 4e  nExpr : 0;  /* N
a750: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
a760: 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
a770: 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20 30  no_such_func = 0
a780: 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ;       /* True 
a790: 69 66 20 6e 6f 20 73 75 63 68 20 66 75 6e 63 74  if no such funct
a7a0: 69 6f 6e 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ion exists */.  
a7b0: 20 20 20 20 69 6e 74 20 77 72 6f 6e 67 5f 6e 75      int wrong_nu
a7c0: 6d 5f 61 72 67 73 20 3d 20 30 3b 20 20 20 20 20  m_args = 0;     
a7d0: 2f 2a 20 54 72 75 65 20 69 66 20 77 72 6f 6e 67  /* True if wrong
a7e0: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
a7f0: 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ents */.      in
a800: 74 20 69 73 5f 61 67 67 20 3d 20 30 3b 20 20 20  t is_agg = 0;   
a810: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
a820: 65 20 69 66 20 69 73 20 61 6e 20 61 67 67 72 65  e if is an aggre
a830: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  gate function */
a840: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
a850: 20 20 20 20 69 6e 74 20 61 75 74 68 3b 20 20 20      int auth;   
a860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a870: 2f 2a 20 41 75 74 68 6f 72 69 7a 61 74 69 6f 6e  /* Authorization
a880: 20 74 6f 20 75 73 65 20 74 68 65 20 66 75 6e 63   to use the func
a890: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tion */.      in
a8a0: 74 20 6e 49 64 3b 20 20 20 20 20 20 20 20 20 20  t nId;          
a8b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
a8c0: 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
a8d0: 73 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 6e 61  s in function na
a8e0: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73  me */.      cons
a8f0: 74 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20  t char *zId;    
a900: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
a910: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 2e 20 2a 2f  unction name. */
a920: 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
a930: 70 44 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  pDef;           
a940: 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
a950: 6e 20 61 62 6f 75 74 20 74 68 65 20 66 75 6e 63  n about the func
a960: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tion */.      in
a970: 74 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72  t enc = ENC(pPar
a980: 73 65 2d 3e 64 62 29 3b 20 20 2f 2a 20 54 68 65  se->db);  /* The
a990: 20 64 61 74 61 62 61 73 65 20 65 6e 63 6f 64 69   database encodi
a9a0: 6e 67 20 2a 2f 0a 0a 20 20 20 20 20 20 7a 49 64  ng */..      zId
a9b0: 20 3d 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d   = (char*)pExpr-
a9c0: 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20  >token.z;.      
a9d0: 6e 49 64 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b  nId = pExpr->tok
a9e0: 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 70 44 65 66  en.n;.      pDef
a9f0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
aa00: 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64  nction(pParse->d
aa10: 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 2c 20  b, zId, nId, n, 
aa20: 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  enc, 0);.      i
aa30: 66 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20  f( pDef==0 ){.  
aa40: 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c        pDef = sql
aa50: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
aa60: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64  (pParse->db, zId
aa70: 2c 20 6e 49 64 2c 20 2d 31 2c 20 65 6e 63 2c 20  , nId, -1, enc, 
aa80: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
aa90: 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pDef==0 ){.     
aaa0: 20 20 20 20 20 6e 6f 5f 73 75 63 68 5f 66 75 6e       no_such_fun
aab0: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
aac0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
aad0: 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d  wrong_num_args =
aae0: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
aaf0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ab00: 20 20 20 69 73 5f 61 67 67 20 3d 20 70 44 65 66     is_agg = pDef
ab10: 2d 3e 78 46 75 6e 63 3d 3d 30 3b 0a 20 20 20 20  ->xFunc==0;.    
ab20: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
ab30: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
ab40: 41 54 49 4f 4e 0a 20 20 20 20 20 20 69 66 28 20  ATION.      if( 
ab50: 70 44 65 66 20 29 7b 0a 20 20 20 20 20 20 20 20  pDef ){.        
ab60: 61 75 74 68 20 3d 20 73 71 6c 69 74 65 33 41 75  auth = sqlite3Au
ab70: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
ab80: 53 51 4c 49 54 45 5f 46 55 4e 43 54 49 4f 4e 2c  SQLITE_FUNCTION,
ab90: 20 30 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c   0, pDef->zName,
aba0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
abb0: 20 61 75 74 68 21 3d 53 51 4c 49 54 45 5f 4f 4b   auth!=SQLITE_OK
abc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
abd0: 28 20 61 75 74 68 3d 3d 53 51 4c 49 54 45 5f 44  ( auth==SQLITE_D
abe0: 45 4e 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ENY ){.         
abf0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
ac00: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 74 20  sg(pParse, "not 
ac10: 61 75 74 68 6f 72 69 7a 65 64 20 74 6f 20 75 73  authorized to us
ac20: 65 20 66 75 6e 63 74 69 6f 6e 3a 20 25 73 22 2c  e function: %s",
ac30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ac40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac50: 20 20 20 20 20 70 44 65 66 2d 3e 7a 4e 61 6d 65       pDef->zName
ac60: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
ac70: 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  NC->nErr++;.    
ac80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ac90: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
aca0: 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20  _NULL;.         
acb0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
acc0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e     }.      }.#en
acd0: 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 69 73  dif.      if( is
ace0: 5f 61 67 67 20 26 26 20 21 70 4e 43 2d 3e 61 6c  _agg && !pNC->al
acf0: 6c 6f 77 41 67 67 20 29 7b 0a 20 20 20 20 20 20  lowAgg ){.      
ad00: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
ad10: 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73  g(pParse, "misus
ad20: 65 20 6f 66 20 61 67 67 72 65 67 61 74 65 20 66  e of aggregate f
ad30: 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c  unction %.*s()",
ad40: 20 6e 49 64 2c 7a 49 64 29 3b 0a 20 20 20 20 20   nId,zId);.     
ad50: 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a     pNC->nErr++;.
ad60: 20 20 20 20 20 20 20 20 69 73 5f 61 67 67 20 3d          is_agg =
ad70: 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   0;.      }else 
ad80: 69 66 28 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63  if( no_such_func
ad90: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
ada0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
adb0: 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 66 75 6e  se, "no such fun
adc0: 63 74 69 6f 6e 3a 20 25 2e 2a 73 22 2c 20 6e 49  ction: %.*s", nI
add0: 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20  d, zId);.       
ade0: 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20   pNC->nErr++;.  
adf0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72      }else if( wr
ae00: 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 29 7b 0a  ong_num_args ){.
ae10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
ae20: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22  rrorMsg(pParse,"
ae30: 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20  wrong number of 
ae40: 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e  arguments to fun
ae50: 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 0a 20  ction %.*s()",. 
ae60: 20 20 20 20 20 20 20 20 20 20 20 20 6e 49 64 2c              nId,
ae70: 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20 70   zId);.        p
ae80: 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  NC->nErr++;.    
ae90: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73    }.      if( is
aea0: 5f 61 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20  _agg ){.        
aeb0: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41  pExpr->op = TK_A
aec0: 47 47 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 20  GG_FUNCTION;.   
aed0: 20 20 20 20 20 70 4e 43 2d 3e 68 61 73 41 67 67       pNC->hasAgg
aee0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
aef0: 20 20 20 20 69 66 28 20 69 73 5f 61 67 67 20 29      if( is_agg )
af00: 20 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 3d   pNC->allowAgg =
af10: 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   0;.      for(i=
af20: 30 3b 20 70 4e 43 2d 3e 6e 45 72 72 3d 3d 30 20  0; pNC->nErr==0 
af30: 26 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  && i<n; i++){.  
af40: 20 20 20 20 20 20 77 61 6c 6b 45 78 70 72 54 72        walkExprTr
af50: 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  ee(pList->a[i].p
af60: 45 78 70 72 2c 20 6e 61 6d 65 52 65 73 6f 6c 76  Expr, nameResolv
af70: 65 72 53 74 65 70 2c 20 70 4e 43 29 3b 0a 20 20  erStep, pNC);.  
af80: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
af90: 69 73 5f 61 67 67 20 29 20 70 4e 43 2d 3e 61 6c  is_agg ) pNC->al
afa0: 6c 6f 77 41 67 67 20 3d 20 31 3b 0a 20 20 20 20  lowAgg = 1;.    
afb0: 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f    /* FIX ME:  Co
afc0: 6d 70 75 74 65 20 70 45 78 70 72 2d 3e 61 66 66  mpute pExpr->aff
afd0: 69 6e 69 74 79 20 62 61 73 65 64 20 6f 6e 20 74  inity based on t
afe0: 68 65 20 65 78 70 65 63 74 65 64 20 72 65 74 75  he expected retu
aff0: 72 6e 0a 20 20 20 20 20 20 2a 2a 20 74 79 70 65  rn.      ** type
b000: 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
b010: 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
b020: 20 72 65 74 75 72 6e 20 69 73 5f 61 67 67 3b 0a   return is_agg;.
b030: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
b040: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
b050: 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  RY.    case TK_S
b060: 45 4c 45 43 54 3a 0a 20 20 20 20 63 61 73 65 20  ELECT:.    case 
b070: 54 4b 5f 45 58 49 53 54 53 3a 0a 23 65 6e 64 69  TK_EXISTS:.#endi
b080: 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  f.    case TK_IN
b090: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  : {.      if( pE
b0a0: 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  xpr->pSelect ){.
b0b0: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 52 65 66          int nRef
b0c0: 20 3d 20 70 4e 43 2d 3e 6e 52 65 66 3b 0a 23 69   = pNC->nRef;.#i
b0d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b0e0: 54 5f 43 48 45 43 4b 0a 20 20 20 20 20 20 20 20  T_CHECK.        
b0f0: 69 66 28 20 70 4e 43 2d 3e 69 73 43 68 65 63 6b  if( pNC->isCheck
b100: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
b110: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
b120: 61 72 73 65 2c 22 73 75 62 71 75 65 72 69 65 73  arse,"subqueries
b130: 20 70 72 6f 68 69 62 69 74 65 64 20 69 6e 20 43   prohibited in C
b140: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73  HECK constraints
b150: 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  ");.        }.#e
b160: 6e 64 69 66 0a 20 20 20 20 20 20 20 20 73 71 6c  ndif.        sql
b170: 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76  ite3SelectResolv
b180: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
b190: 3e 70 53 65 6c 65 63 74 2c 20 70 4e 43 29 3b 0a  >pSelect, pNC);.
b1a0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
b1b0: 70 4e 43 2d 3e 6e 52 65 66 3e 3d 6e 52 65 66 20  pNC->nRef>=nRef 
b1c0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
b1d0: 52 65 66 21 3d 70 4e 43 2d 3e 6e 52 65 66 20 29  Ref!=pNC->nRef )
b1e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
b1f0: 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70  SetProperty(pExp
b200: 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29  r, EP_VarSelect)
b210: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
b220: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
b230: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
b240: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
b250: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52  .    case TK_VAR
b260: 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 69  IABLE: {.      i
b270: 66 28 20 70 4e 43 2d 3e 69 73 43 68 65 63 6b 20  f( pNC->isCheck 
b280: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
b290: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
b2a0: 65 2c 22 70 61 72 61 6d 65 74 65 72 73 20 70 72  e,"parameters pr
b2b0: 6f 68 69 62 69 74 65 64 20 69 6e 20 43 48 45 43  ohibited in CHEC
b2c0: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 22 29 3b  K constraints");
b2d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
b2e0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
b2f0: 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  if.  }.  return 
b300: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
b310: 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 61   routine walks a
b320: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
b330: 65 20 61 6e 64 20 72 65 73 6f 6c 76 65 73 20 72  e and resolves r
b340: 65 66 65 72 65 6e 63 65 73 20 74 6f 0a 2a 2a 20  eferences to.** 
b350: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 2e 20 20  table columns.  
b360: 4e 6f 64 65 73 20 6f 66 20 74 68 65 20 66 6f 72  Nodes of the for
b370: 6d 20 49 44 2e 49 44 20 6f 72 20 49 44 20 72 65  m ID.ID or ID re
b380: 73 6f 6c 76 65 20 69 6e 74 6f 20 61 6e 0a 2a 2a  solve into an.**
b390: 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 74 61   index to the ta
b3a0: 62 6c 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ble in the table
b3b0: 20 6c 69 73 74 20 61 6e 64 20 61 20 63 6f 6c 75   list and a colu
b3c0: 6d 6e 20 6f 66 66 73 65 74 2e 20 20 54 68 65 20  mn offset.  The 
b3d0: 0a 2a 2a 20 45 78 70 72 2e 6f 70 63 6f 64 65 20  .** Expr.opcode 
b3e0: 66 6f 72 20 73 75 63 68 20 6e 6f 64 65 73 20 69  for such nodes i
b3f0: 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f  s changed to TK_
b400: 43 4f 4c 55 4d 4e 2e 20 20 54 68 65 20 45 78 70  COLUMN.  The Exp
b410: 72 2e 69 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75  r.iTable.** valu
b420: 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20  e is changed to 
b430: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
b440: 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c   referenced tabl
b450: 65 20 69 6e 20 70 54 61 62 4c 69 73 74 0a 2a 2a  e in pTabList.**
b460: 20 70 6c 75 73 20 74 68 65 20 22 62 61 73 65 22   plus the "base"
b470: 20 76 61 6c 75 65 2e 20 20 54 68 65 20 62 61 73   value.  The bas
b480: 65 20 76 61 6c 75 65 20 77 69 6c 6c 20 75 6c 74  e value will ult
b490: 69 6d 61 74 65 6c 79 20 62 65 63 6f 6d 65 20 74  imately become t
b4a0: 68 65 0a 2a 2a 20 56 44 42 45 20 63 75 72 73 6f  he.** VDBE curso
b4b0: 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 61 20 63  r number for a c
b4c0: 75 72 73 6f 72 20 74 68 61 74 20 69 73 20 70 6f  ursor that is po
b4d0: 69 6e 74 69 6e 67 20 69 6e 74 6f 20 74 68 65 20  inting into the 
b4e0: 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20 74 61  referenced.** ta
b4f0: 62 6c 65 2e 20 20 54 68 65 20 45 78 70 72 2e 69  ble.  The Expr.i
b500: 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73 20  Column value is 
b510: 63 68 61 6e 67 65 64 20 74 6f 20 74 68 65 20 69  changed to the i
b520: 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75  ndex of the colu
b530: 6d 6e 20 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65  mn .** of the re
b540: 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 2e 20  ferenced table. 
b550: 20 54 68 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d   The Expr.iColum
b560: 6e 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  n value for the 
b570: 73 70 65 63 69 61 6c 0a 2a 2a 20 52 4f 57 49 44  special.** ROWID
b580: 20 63 6f 6c 75 6d 6e 20 69 73 20 2d 31 2e 20 20   column is -1.  
b590: 41 6e 79 20 49 4e 54 45 47 45 52 20 50 52 49 4d  Any INTEGER PRIM
b5a0: 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 69  ARY KEY column i
b5b0: 73 20 74 72 69 65 64 20 61 73 20 61 6e 0a 2a 2a  s tried as an.**
b5c0: 20 61 6c 69 61 73 20 66 6f 72 20 52 4f 57 49 44   alias for ROWID
b5d0: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 73  ..**.** Also res
b5e0: 6f 6c 76 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61  olve function na
b5f0: 6d 65 73 20 61 6e 64 20 63 68 65 63 6b 20 74 68  mes and check th
b600: 65 20 66 75 6e 63 74 69 6f 6e 73 20 66 6f 72 20  e functions for 
b610: 70 72 6f 70 65 72 0a 2a 2a 20 75 73 61 67 65 2e  proper.** usage.
b620: 20 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20    Make sure all 
b630: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 20 61  function names a
b640: 72 65 20 72 65 63 6f 67 6e 69 7a 65 64 20 61 6e  re recognized an
b650: 64 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 73 0a  d all functions.
b660: 2a 2a 20 68 61 76 65 20 74 68 65 20 63 6f 72 72  ** have the corr
b670: 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  ect number of ar
b680: 67 75 6d 65 6e 74 73 2e 20 20 4c 65 61 76 65 20  guments.  Leave 
b690: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
b6a0: 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a  .** in pParse->z
b6b0: 45 72 72 4d 73 67 20 69 66 20 61 6e 79 74 68 69  ErrMsg if anythi
b6c0: 6e 67 20 69 73 20 61 6d 69 73 73 2e 20 20 52 65  ng is amiss.  Re
b6d0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
b6e0: 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a  of errors..**.**
b6f0: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
b700: 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61 67 67 72  on contains aggr
b710: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
b720: 74 68 65 6e 20 73 65 74 20 74 68 65 20 45 50 5f  then set the EP_
b730: 41 67 67 0a 2a 2a 20 70 72 6f 70 65 72 74 79 20  Agg.** property 
b740: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
b750: 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
b760: 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
b770: 73 28 20 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  s( .  NameContex
b780: 74 20 2a 70 4e 43 2c 20 20 20 20 20 20 20 2f 2a  t *pNC,       /*
b790: 20 4e 61 6d 65 73 70 61 63 65 20 74 6f 20 72 65   Namespace to re
b7a0: 73 6f 6c 76 65 20 65 78 70 72 65 73 73 69 6f 6e  solve expression
b7b0: 73 20 69 6e 2e 20 2a 2f 0a 20 20 45 78 70 72 20  s in. */.  Expr 
b7c0: 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20  *pExpr          
b7d0: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
b7e0: 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e 61 6c 79  sion to be analy
b7f0: 7a 65 64 2e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  zed. */.){.  int
b800: 20 73 61 76 65 64 48 61 73 41 67 67 3b 0a 20 20   savedHasAgg;.  
b810: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
b820: 65 74 75 72 6e 20 30 3b 0a 23 69 66 20 64 65 66  eturn 0;.#if def
b830: 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
b840: 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ) || SQLITE_MAX_
b850: 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 69  EXPR_DEPTH>0.  i
b860: 66 28 20 28 70 45 78 70 72 2d 3e 6e 48 65 69 67  f( (pExpr->nHeig
b870: 68 74 2b 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e  ht+pNC->pParse->
b880: 6e 48 65 69 67 68 74 29 3e 53 51 4c 49 54 45 5f  nHeight)>SQLITE_
b890: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 20 29  MAX_EXPR_DEPTH )
b8a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
b8b0: 6f 72 4d 73 67 28 70 4e 43 2d 3e 70 50 61 72 73  orMsg(pNC->pPars
b8c0: 65 2c 20 0a 20 20 20 20 20 20 20 22 45 78 70 72  e, .       "Expr
b8d0: 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73 20 74  ession tree is t
b8e0: 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78 69 6d 75  oo large (maximu
b8f0: 6d 20 64 65 70 74 68 20 25 64 29 22 2c 0a 20 20  m depth %d)",.  
b900: 20 20 20 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f       SQLITE_MAX_
b910: 45 58 50 52 5f 44 45 50 54 48 0a 20 20 20 20 29  EXPR_DEPTH.    )
b920: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
b930: 20 20 7d 0a 20 20 70 4e 43 2d 3e 70 50 61 72 73    }.  pNC->pPars
b940: 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 70 45  e->nHeight += pE
b950: 78 70 72 2d 3e 6e 48 65 69 67 68 74 3b 0a 23 65  xpr->nHeight;.#e
b960: 6e 64 69 66 0a 20 20 73 61 76 65 64 48 61 73 41  ndif.  savedHasA
b970: 67 67 20 3d 20 70 4e 43 2d 3e 68 61 73 41 67 67  gg = pNC->hasAgg
b980: 3b 0a 20 20 70 4e 43 2d 3e 68 61 73 41 67 67 20  ;.  pNC->hasAgg 
b990: 3d 20 30 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54  = 0;.  walkExprT
b9a0: 72 65 65 28 70 45 78 70 72 2c 20 6e 61 6d 65 52  ree(pExpr, nameR
b9b0: 65 73 6f 6c 76 65 72 53 74 65 70 2c 20 70 4e 43  esolverStep, pNC
b9c0: 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  );.#if defined(S
b9d0: 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 53  QLITE_TEST) || S
b9e0: 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
b9f0: 45 50 54 48 3e 30 0a 20 20 70 4e 43 2d 3e 70 50  EPTH>0.  pNC->pP
ba00: 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d  arse->nHeight -=
ba10: 20 70 45 78 70 72 2d 3e 6e 48 65 69 67 68 74 3b   pExpr->nHeight;
ba20: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 4e  .#endif.  if( pN
ba30: 43 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20  C->nErr>0 ){.   
ba40: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
ba50: 28 70 45 78 70 72 2c 20 45 50 5f 45 72 72 6f 72  (pExpr, EP_Error
ba60: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 43  );.  }.  if( pNC
ba70: 2d 3e 68 61 73 41 67 67 20 29 7b 0a 20 20 20 20  ->hasAgg ){.    
ba80: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
ba90: 70 45 78 70 72 2c 20 45 50 5f 41 67 67 29 3b 0a  pExpr, EP_Agg);.
baa0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 61 76 65    }else if( save
bab0: 64 48 61 73 41 67 67 20 29 7b 0a 20 20 20 20 70  dHasAgg ){.    p
bac0: 4e 43 2d 3e 68 61 73 41 67 67 20 3d 20 31 3b 0a  NC->hasAgg = 1;.
bad0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 45 78 70    }.  return Exp
bae0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
baf0: 70 72 2c 20 45 50 5f 45 72 72 6f 72 29 3b 0a 7d  pr, EP_Error);.}
bb00: 0a 0a 2f 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65  ../*.** A pointe
bb10: 72 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  r instance of th
bb20: 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20  is structure is 
bb30: 75 73 65 64 20 74 6f 20 70 61 73 73 20 69 6e 66  used to pass inf
bb40: 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 68 72 6f  ormation.** thro
bb50: 75 67 68 20 77 61 6c 6b 45 78 70 72 54 72 65 65  ugh walkExprTree
bb60: 20 69 6e 74 6f 20 63 6f 64 65 53 75 62 71 75 65   into codeSubque
bb70: 72 79 53 74 65 70 28 29 2e 0a 2a 2f 0a 74 79 70  ryStep()..*/.typ
bb80: 65 64 65 66 20 73 74 72 75 63 74 20 51 75 65 72  edef struct Quer
bb90: 79 43 6f 64 65 72 20 51 75 65 72 79 43 6f 64 65  yCoder QueryCode
bba0: 72 3b 0a 73 74 72 75 63 74 20 51 75 65 72 79 43  r;.struct QueryC
bbb0: 6f 64 65 72 20 7b 0a 20 20 50 61 72 73 65 20 2a  oder {.  Parse *
bbc0: 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 2f 2a  pParse;       /*
bbd0: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
bbe0: 74 65 78 74 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f  text */.  NameCo
bbf0: 6e 74 65 78 74 20 2a 70 4e 43 3b 20 20 20 20 2f  ntext *pNC;    /
bc00: 2a 20 4e 61 6d 65 73 70 61 63 65 20 6f 66 20 66  * Namespace of f
bc10: 69 72 73 74 20 65 6e 63 6c 6f 73 69 6e 67 20 71  irst enclosing q
bc20: 75 65 72 79 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a  uery */.};.../*.
bc30: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
bc40: 20 66 6f 72 20 73 63 61 6c 61 72 20 73 75 62 71   for scalar subq
bc50: 75 65 72 69 65 73 20 75 73 65 64 20 61 73 20 61  ueries used as a
bc60: 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  n expression.** 
bc70: 61 6e 64 20 49 4e 20 6f 70 65 72 61 74 6f 72 73  and IN operators
bc80: 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a  .  Examples:.**.
bc90: 2a 2a 20 20 20 20 20 28 53 45 4c 45 43 54 20 61  **     (SELECT a
bca0: 20 46 52 4f 4d 20 62 29 20 20 20 20 20 20 20 20   FROM b)        
bcb0: 20 20 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a    -- subquery.**
bcc0: 20 20 20 20 20 45 58 49 53 54 53 20 28 53 45 4c       EXISTS (SEL
bcd0: 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20  ECT a FROM b)   
bce0: 2d 2d 20 45 58 49 53 54 53 20 73 75 62 71 75 65  -- EXISTS subque
bcf0: 72 79 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28  ry.**     x IN (
bd00: 34 2c 35 2c 31 31 29 20 20 20 20 20 20 20 20 20  4,5,11)         
bd10: 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61       -- IN opera
bd20: 74 6f 72 20 77 69 74 68 20 6c 69 73 74 20 6f 6e  tor with list on
bd30: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
bd40: 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 53 45  .**     x IN (SE
bd50: 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20  LECT a FROM b)  
bd60: 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f     -- IN operato
bd70: 72 20 77 69 74 68 20 73 75 62 71 75 65 72 79 20  r with subquery 
bd80: 6f 6e 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a  on the right.**.
bd90: 2a 2a 20 54 68 65 20 70 45 78 70 72 20 70 61 72  ** The pExpr par
bda0: 61 6d 65 74 65 72 20 64 65 73 63 72 69 62 65 73  ameter describes
bdb0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
bdc0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
bdd0: 65 20 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72  e IN.** operator
bde0: 20 6f 72 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f   or subquery..*/
bdf0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
be00: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 76 6f  OMIT_SUBQUERY.vo
be10: 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75  id sqlite3CodeSu
be20: 62 73 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70  bselect(Parse *p
be30: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
be40: 70 72 29 7b 0a 20 20 69 6e 74 20 74 65 73 74 41  pr){.  int testA
be50: 64 64 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ddr = 0;        
be60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
be70: 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65 73 74 20  * One-time test 
be80: 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 56 64 62  address */.  Vdb
be90: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
bea0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
beb0: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
bec0: 72 6e 3b 0a 0a 0a 20 20 2f 2a 20 54 68 69 73 20  rn;...  /* This 
bed0: 63 6f 64 65 20 6d 75 73 74 20 62 65 20 72 75 6e  code must be run
bee0: 20 69 6e 20 69 74 73 20 65 6e 74 69 72 65 74 79   in its entirety
bef0: 20 65 76 65 72 79 20 74 69 6d 65 20 69 74 20 69   every time it i
bf00: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20  s encountered.  
bf10: 2a 2a 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  ** if any of the
bf20: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72   following is tr
bf30: 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ue:.  **.  **   
bf40: 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61   *  The right-ha
bf50: 6e 64 20 73 69 64 65 20 69 73 20 61 20 63 6f 72  nd side is a cor
bf60: 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79  related subquery
bf70: 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20  .  **    *  The 
bf80: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
bf90: 69 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  is an expression
bfa0: 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67   list containing
bfb0: 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20   variables.  ** 
bfc0: 20 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73     *  We are ins
bfd0: 69 64 65 20 61 20 74 72 69 67 67 65 72 0a 20 20  ide a trigger.  
bfe0: 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f  **.  ** If all o
bff0: 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20  f the above are 
c000: 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63  false, then we c
c010: 61 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65  an run this code
c020: 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20   just once.  ** 
c030: 73 61 76 65 20 74 68 65 20 72 65 73 75 6c 74 73  save the results
c040: 2c 20 61 6e 64 20 72 65 75 73 65 20 74 68 65 20  , and reuse the 
c050: 73 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73  same result on s
c060: 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61  ubsequent invoca
c070: 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tions..  */.  if
c080: 28 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f  ( !ExprHasAnyPro
c090: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
c0a0: 56 61 72 53 65 6c 65 63 74 29 20 26 26 20 21 70  VarSelect) && !p
c0b0: 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b  Parse->trigStack
c0c0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 65 6d 20   ){.    int mem 
c0d0: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b  = pParse->nMem++
c0e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
c0f0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
c100: 4c 6f 61 64 2c 20 6d 65 6d 2c 20 30 29 3b 0a 20  Load, mem, 0);. 
c110: 20 20 20 74 65 73 74 41 64 64 72 20 3d 20 73 71     testAddr = sq
c120: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c130: 2c 20 4f 50 5f 49 66 2c 20 30 2c 20 30 29 3b 0a  , OP_If, 0, 0);.
c140: 20 20 20 20 61 73 73 65 72 74 28 20 74 65 73 74      assert( test
c150: 41 64 64 72 3e 30 20 7c 7c 20 70 50 61 72 73 65  Addr>0 || pParse
c160: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
c170: 65 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ed );.    sqlite
c180: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
c190: 5f 4d 65 6d 49 6e 74 2c 20 31 2c 20 6d 65 6d 29  _MemInt, 1, mem)
c1a0: 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28  ;.  }..  switch(
c1b0: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
c1c0: 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
c1d0: 20 20 20 20 20 20 63 68 61 72 20 61 66 66 69 6e        char affin
c1e0: 69 74 79 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e  ity;.      KeyIn
c1f0: 66 6f 20 6b 65 79 49 6e 66 6f 3b 0a 20 20 20 20  fo keyInfo;.    
c200: 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20    int addr;     
c210: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
c220: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
c230: 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f  l instruction */
c240: 0a 0a 20 20 20 20 20 20 61 66 66 69 6e 69 74 79  ..      affinity
c250: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
c260: 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 4c  finity(pExpr->pL
c270: 65 66 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  eft);..      /* 
c280: 57 68 65 74 68 65 72 20 74 68 69 73 20 69 73 20  Whether this is 
c290: 61 6e 20 27 78 20 49 4e 28 53 45 4c 45 43 54 2e  an 'x IN(SELECT.
c2a0: 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78 20 49 4e  ..)' or an 'x IN
c2b0: 28 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a 20 20  (<exprlist>)'.  
c2c0: 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
c2d0: 6e 20 69 74 20 69 73 20 68 61 6e 64 6c 65 64 20  n it is handled 
c2e0: 74 68 65 20 73 61 6d 65 20 77 61 79 2e 20 41 20  the same way. A 
c2f0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 73  virtual table is
c300: 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65   .      ** fille
c310: 64 20 77 69 74 68 20 73 69 6e 67 6c 65 2d 66 69  d with single-fi
c320: 65 6c 64 20 69 6e 64 65 78 20 6b 65 79 73 20 72  eld index keys r
c330: 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20  epresenting the 
c340: 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a  results.      **
c350: 20 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54   from the SELECT
c360: 20 6f 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73   or the <exprlis
c370: 74 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  t>..      **.   
c380: 20 20 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27     ** If the 'x'
c390: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
c3a0: 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f   column value, o
c3b0: 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a  r the SELECT....
c3c0: 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
c3d0: 6e 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c  nt returns a col
c3e0: 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  umn value, then 
c3f0: 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20  the affinity of 
c400: 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f  that.      ** co
c410: 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20  lumn is used to 
c420: 62 75 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20  build the index 
c430: 6b 65 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78  keys. If both 'x
c440: 27 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20  ' and the.      
c450: 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61  ** SELECT... sta
c460: 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d  tement are colum
c470: 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63  ns, then numeric
c480: 20 61 66 66 69 6e 69 74 79 20 69 73 20 75 73 65   affinity is use
c490: 64 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69  d.      ** if ei
c4a0: 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20  ther column has 
c4b0: 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47  NUMERIC or INTEG
c4c0: 45 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20  ER affinity. If 
c4d0: 6e 65 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a  neither.      **
c4e0: 20 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c   'x' nor the SEL
c4f0: 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74  ECT... statement
c500: 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68   are columns, th
c510: 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  en numeric affin
c520: 69 74 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  ity.      ** is 
c530: 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  used..      */. 
c540: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
c550: 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  le = pParse->nTa
c560: 62 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 20  b++;.      addr 
c570: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
c580: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  Op(v, OP_OpenEph
c590: 65 6d 65 72 61 6c 2c 20 70 45 78 70 72 2d 3e 69  emeral, pExpr->i
c5a0: 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20  Table, 0);.     
c5b0: 20 6d 65 6d 73 65 74 28 26 6b 65 79 49 6e 66 6f   memset(&keyInfo
c5c0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79 49  , 0, sizeof(keyI
c5d0: 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 6b 65 79  nfo));.      key
c5e0: 49 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 31 3b  Info.nField = 1;
c5f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c600: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
c610: 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 70 45 78  tNumColumns, pEx
c620: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 31 29 3b 0a  pr->iTable, 1);.
c630: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
c640: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
c650: 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20       /* Case 1: 
c660: 20 20 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c      expr IN (SEL
c670: 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20  ECT ...).       
c680: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47   **.        ** G
c690: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
c6a0: 77 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74  write the result
c6b0: 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20  s of the select 
c6c0: 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61  into the tempora
c6d0: 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61  ry.        ** ta
c6e0: 62 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  ble allocated an
c6f0: 64 20 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a  d opened above..
c700: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
c710: 20 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70     int iParm = p
c720: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 2b 20 20  Expr->iTable +  
c730: 28 28 28 69 6e 74 29 61 66 66 69 6e 69 74 79 29  (((int)affinity)
c740: 3c 3c 31 36 29 3b 0a 20 20 20 20 20 20 20 20 45  <<16);.        E
c750: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
c760: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
c770: 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 26   (pExpr->iTable&
c780: 30 78 30 30 30 30 46 46 46 46 29 3d 3d 70 45 78  0x0000FFFF)==pEx
c790: 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20  pr->iTable );.  
c7a0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
c7b0: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
c7c0: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20  pExpr->pSelect, 
c7d0: 53 52 54 5f 53 65 74 2c 20 69 50 61 72 6d 2c 20  SRT_Set, iParm, 
c7e0: 30 2c 20 30 2c 20 30 2c 20 30 29 20 29 7b 0a 20  0, 0, 0, 0) ){. 
c7f0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b           return;
c800: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c810: 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70     pEList = pExp
c820: 72 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  r->pSelect->pELi
c830: 73 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  st;.        if( 
c840: 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
c850: 2d 3e 6e 45 78 70 72 3e 30 20 29 7b 20 0a 20 20  ->nExpr>0 ){ .  
c860: 20 20 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e          keyInfo.
c870: 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74  aColl[0] = sqlit
c880: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
c890: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
c8a0: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20 20  Expr->pLeft,.   
c8b0: 20 20 20 20 20 20 20 20 20 20 20 70 45 4c 69 73             pELis
c8c0: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  t->a[0].pExpr);.
c8d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c8e0: 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d  }else if( pExpr-
c8f0: 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  >pList ){.      
c900: 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20    /* Case 2:    
c910: 20 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69   expr IN (exprli
c920: 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  st).        **. 
c930: 20 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 65 61         ** For ea
c940: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 62  ch expression, b
c950: 75 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b 65  uild an index ke
c960: 79 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c 75  y from the evalu
c970: 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20  ation and.      
c980: 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69 6e    ** store it in
c990: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
c9a0: 61 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e 20  able. If <expr> 
c9b0: 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65  is a column, the
c9c0: 6e 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a  n use.        **
c9d0: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66   that columns af
c9e0: 66 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69 6c  finity when buil
c9f0: 64 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73 2e  ding index keys.
ca00: 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f   If <expr> is no
ca10: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63  t.        ** a c
ca20: 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72  olumn, use numer
ca30: 69 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20  ic affinity..   
ca40: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
ca50: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 45  int i;.        E
ca60: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
ca70: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20   pExpr->pList;. 
ca80: 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78         struct Ex
ca90: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
caa0: 65 6d 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28  em;..        if(
cab0: 20 21 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20   !affinity ){.  
cac0: 20 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79          affinity
cad0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
cae0: 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NE;.        }.  
caf0: 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43        keyInfo.aC
cb00: 6f 6c 6c 5b 30 5d 20 3d 20 70 45 78 70 72 2d 3e  oll[0] = pExpr->
cb10: 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 0a 20  pLeft->pColl;.. 
cb20: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74         /* Loop t
cb30: 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72  hrough each expr
cb40: 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c  ession in <exprl
cb50: 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ist>. */.       
cb60: 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45   for(i=pList->nE
cb70: 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74  xpr, pItem=pList
cb80: 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70  ->a; i>0; i--, p
cb90: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
cba0: 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70     Expr *pE2 = p
cbb0: 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20  Item->pExpr;..  
cbc0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
cbd0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
cbe0: 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74 68 65  not constant the
cbf0: 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  n we will need t
cc00: 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64  o.          ** d
cc10: 69 73 61 62 6c 65 20 74 68 65 20 74 65 73 74 20  isable the test 
cc20: 74 68 61 74 20 77 61 73 20 67 65 6e 65 72 61 74  that was generat
cc30: 65 64 20 61 62 6f 76 65 20 74 68 61 74 20 6d 61  ed above that ma
cc40: 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20 20 20  kes sure.       
cc50: 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20     ** this code 
cc60: 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e  only executes on
cc70: 63 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72  ce.  Because for
cc80: 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a   a non-constant.
cc90: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70            ** exp
cca0: 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64 20  ression we need 
ccb0: 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63 6f  to rerun this co
ccc0: 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20  de each time..  
ccd0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
cce0: 20 20 20 20 20 69 66 28 20 74 65 73 74 41 64 64       if( testAdd
ccf0: 72 3e 30 20 26 26 20 21 73 71 6c 69 74 65 33 45  r>0 && !sqlite3E
cd00: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45  xprIsConstant(pE
cd10: 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  2) ){.          
cd20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
cd30: 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 74 65 73  ngeToNoop(v, tes
cd40: 74 41 64 64 72 2d 31 2c 20 33 29 3b 0a 20 20 20  tAddr-1, 3);.   
cd50: 20 20 20 20 20 20 20 20 20 74 65 73 74 41 64 64           testAdd
cd60: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  r = 0;.         
cd70: 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   }..          /*
cd80: 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 78   Evaluate the ex
cd90: 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73  pression and ins
cda0: 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20  ert it into the 
cdb0: 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20  temp table */.  
cdc0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
cdd0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
cde0: 70 45 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pE2);.          
cdf0: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
ce00: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
ce10: 20 31 2c 20 30 2c 20 26 61 66 66 69 6e 69 74 79   1, 0, &affinity
ce20: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
ce30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ce40: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
ce50: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
ce60: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
ce70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
ce80: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
ce90: 28 76 2c 20 61 64 64 72 2c 20 28 76 6f 69 64 20  (v, addr, (void 
cea0: 2a 29 26 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b  *)&keyInfo, P3_K
ceb0: 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 62  EYINFO);.      b
cec0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
ced0: 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
cee0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
cef0: 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ECT: {.      /* 
cf00: 54 68 69 73 20 68 61 73 20 74 6f 20 62 65 20 61  This has to be a
cf10: 20 73 63 61 6c 61 72 20 53 45 4c 45 43 54 2e 20   scalar SELECT. 
cf20: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
cf30: 6f 20 70 75 74 20 74 68 65 0a 20 20 20 20 20 20  o put the.      
cf40: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  ** value of this
cf50: 20 73 65 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d   select in a mem
cf60: 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 63  ory cell and rec
cf70: 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 0a 20  ord the number. 
cf80: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d       ** of the m
cf90: 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43  emory cell in iC
cfa0: 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  olumn..      */.
cfb0: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
cfc0: 73 74 20 54 6f 6b 65 6e 20 6f 6e 65 20 3d 20 7b  st Token one = {
cfd0: 20 28 75 38 2a 29 22 31 22 2c 20 30 2c 20 31 20   (u8*)"1", 0, 1 
cfe0: 7d 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  };.      Select 
cff0: 2a 70 53 65 6c 3b 0a 20 20 20 20 20 20 69 6e 74  *pSel;.      int
d000: 20 69 4d 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74   iMem;.      int
d010: 20 73 6f 70 3b 0a 0a 20 20 20 20 20 20 70 45 78   sop;..      pEx
d020: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 4d  pr->iColumn = iM
d030: 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
d040: 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 53 65 6c 20  m++;.      pSel 
d050: 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  = pExpr->pSelect
d060: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
d070: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
d080: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 6f 70 20   ){.        sop 
d090: 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20  = SRT_Mem;.     
d0a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d0b0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4e 75 6c  dOp(v, OP_MemNul
d0c0: 6c 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20  l, iMem, 0);.   
d0d0: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
d0e0: 28 28 76 2c 20 22 23 20 49 6e 69 74 20 73 75 62  ((v, "# Init sub
d0f0: 71 75 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b  query result"));
d100: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
d110: 20 20 20 20 20 20 73 6f 70 20 3d 20 53 52 54 5f        sop = SRT_
d120: 45 78 69 73 74 73 3b 0a 20 20 20 20 20 20 20 20  Exists;.        
d130: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d140: 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 30  (v, OP_MemInt, 0
d150: 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20  , iMem);.       
d160: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
d170: 20 22 23 20 49 6e 69 74 20 45 58 49 53 54 53 20   "# Init EXISTS 
d180: 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20  result"));.     
d190: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
d1a0: 45 78 70 72 44 65 6c 65 74 65 28 70 53 65 6c 2d  ExprDelete(pSel-
d1b0: 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >pLimit);.      
d1c0: 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73  pSel->pLimit = s
d1d0: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
d1e0: 73 65 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20  se, TK_INTEGER, 
d1f0: 30 2c 20 30 2c 20 26 6f 6e 65 29 3b 0a 20 20 20  0, 0, &one);.   
d200: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65     if( sqlite3Se
d210: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
d220: 6c 2c 20 73 6f 70 2c 20 69 4d 65 6d 2c 20 30 2c  l, sop, iMem, 0,
d230: 20 30 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20   0, 0, 0) ){.   
d240: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
d250: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
d260: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
d270: 66 28 20 74 65 73 74 41 64 64 72 20 29 7b 0a 20  f( testAddr ){. 
d280: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
d290: 6d 70 48 65 72 65 28 76 2c 20 74 65 73 74 41 64  mpHere(v, testAd
d2a0: 64 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  dr);.  }..  retu
d2b0: 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rn;.}.#endif /* 
d2c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
d2d0: 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47  UERY */../*.** G
d2e0: 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72  enerate an instr
d2f0: 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c  uction that will
d300: 20 70 75 74 20 74 68 65 20 69 6e 74 65 67 65 72   put the integer
d310: 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20   describe by.** 
d320: 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 6f  text z[0..n-1] o
d330: 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a  n the stack..*/.
d340: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
d350: 49 6e 74 65 67 65 72 28 56 64 62 65 20 2a 76 2c  Integer(Vdbe *v,
d360: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
d370: 69 6e 74 20 6e 29 7b 0a 20 20 61 73 73 65 72 74  int n){.  assert
d380: 28 20 7a 20 7c 7c 20 76 3d 3d 30 20 7c 7c 20 73  ( z || v==0 || s
d390: 71 6c 69 74 65 33 56 64 62 65 44 62 28 76 29 2d  qlite3VdbeDb(v)-
d3a0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
d3b0: 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20  .  if( z ){.    
d3c0: 69 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20 73  int i;.    if( s
d3d0: 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a  qlite3GetInt32(z
d3e0: 2c 20 26 69 29 20 29 7b 0a 20 20 20 20 20 20 73  , &i) ){.      s
d3f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
d400: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69  v, OP_Integer, i
d410: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  , 0);.    }else 
d420: 69 66 28 20 73 71 6c 69 74 65 33 46 69 74 73 49  if( sqlite3FitsI
d430: 6e 36 34 42 69 74 73 28 7a 29 20 29 7b 0a 20 20  n64Bits(z) ){.  
d440: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
d450: 70 33 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20  p3(v, OP_Int64, 
d460: 30 2c 20 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  0, 0, z, n);.   
d470: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
d480: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
d490: 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 30 2c 20 7a  OP_Real, 0, 0, z
d4a0: 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , n);.    }.  }.
d4b0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
d4c0: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
d4d0: 6c 20 65 78 74 72 61 63 74 20 74 68 65 20 69 43  l extract the iC
d4e0: 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20  olumn-th column 
d4f0: 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54  from.** table pT
d500: 61 62 20 61 6e 64 20 70 75 73 68 20 74 68 61 74  ab and push that
d510: 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 6f 6e   column value on
d520: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 54 68 65   the stack.  The
d530: 72 65 0a 2a 2a 20 69 73 20 61 6e 20 6f 70 65 6e  re.** is an open
d540: 20 63 75 72 73 6f 72 20 74 6f 20 70 54 61 62 20   cursor to pTab 
d550: 69 6e 20 69 54 61 62 6c 65 2e 20 20 49 66 20 69  in iTable.  If i
d560: 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 0a 2a 2a  Column<0 then.**
d570: 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74   code is generat
d580: 65 64 20 74 68 61 74 20 65 78 74 72 61 63 74 73  ed that extracts
d590: 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 76   the rowid..*/.v
d5a0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
d5b0: 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 56 64 62  odeGetColumn(Vdb
d5c0: 65 20 2a 76 2c 20 54 61 62 6c 65 20 2a 70 54 61  e *v, Table *pTa
d5d0: 62 2c 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20  b, int iColumn, 
d5e0: 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 69  int iTable){.  i
d5f0: 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  f( iColumn<0 ){.
d600: 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 28 70 54      int op = (pT
d610: 61 62 20 26 26 20 49 73 56 69 72 74 75 61 6c 28  ab && IsVirtual(
d620: 70 54 61 62 29 29 20 3f 20 4f 50 5f 56 52 6f 77  pTab)) ? OP_VRow
d630: 69 64 20 3a 20 4f 50 5f 52 6f 77 69 64 3b 0a 20  id : OP_Rowid;. 
d640: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d650: 64 4f 70 28 76 2c 20 6f 70 2c 20 69 54 61 62 6c  dOp(v, op, iTabl
d660: 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69  e, 0);.  }else i
d670: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
d680: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d690: 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  Op(v, OP_Column,
d6a0: 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e   iTable, iColumn
d6b0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
d6c0: 69 6e 74 20 6f 70 20 3d 20 49 73 56 69 72 74 75  int op = IsVirtu
d6d0: 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f 56 43  al(pTab) ? OP_VC
d6e0: 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d  olumn : OP_Colum
d6f0: 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  n;.    sqlite3Vd
d700: 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 69  beAddOp(v, op, i
d710: 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 29 3b  Table, iColumn);
d720: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75  .    sqlite3Colu
d730: 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61  mnDefault(v, pTa
d740: 62 2c 20 69 43 6f 6c 75 6d 6e 29 3b 0a 23 69 66  b, iColumn);.#if
d750: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d760: 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
d770: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 61 43      if( pTab->aC
d780: 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69  ol[iColumn].affi
d790: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
d7a0: 5f 52 45 41 4c 20 29 7b 0a 20 20 20 20 20 20 73  _REAL ){.      s
d7b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
d7c0: 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69  v, OP_RealAffini
d7d0: 74 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  ty, 0, 0);.    }
d7e0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f  .#endif.  }.}../
d7f0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
d800: 64 65 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72  de into the curr
d810: 65 6e 74 20 56 64 62 65 20 74 6f 20 65 76 61 6c  ent Vdbe to eval
d820: 75 61 74 65 20 74 68 65 20 67 69 76 65 6e 0a 2a  uate the given.*
d830: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  * expression and
d840: 20 6c 65 61 76 65 20 74 68 65 20 72 65 73 75 6c   leave the resul
d850: 74 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20  t on the top of 
d860: 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  stack..**.** Thi
d870: 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f  s code depends o
d880: 6e 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  n the fact that 
d890: 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61  certain token va
d8a0: 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29  lues (ex: TK_EQ)
d8b0: 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65  .** are the same
d8c0: 20 61 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65   as opcode value
d8d0: 73 20 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68  s (ex: OP_Eq) th
d8e0: 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  at implement the
d8f0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
d900: 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70  * operation.  Sp
d910: 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69  ecial comments i
d920: 6e 20 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65  n vdbe.c and the
d930: 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73   mkopcodeh.awk s
d940: 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20  cript in.** the 
d950: 6d 61 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75  make process cau
d960: 73 65 20 74 68 65 73 65 20 76 61 6c 75 65 73 20  se these values 
d970: 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72  to align.  Asser
d980: 74 28 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65  t()s in the code
d990: 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79  .** below verify
d9a0: 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72   that the number
d9b0: 73 20 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f  s are aligned co
d9c0: 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  rrectly..*/.void
d9d0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
d9e0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
d9f0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
da00: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
da10: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f  ->pVdbe;.  int o
da20: 70 3b 0a 20 20 69 6e 74 20 73 74 61 63 6b 43 68  p;.  int stackCh
da30: 6e 67 20 3d 20 31 3b 20 20 20 20 2f 2a 20 41 6d  ng = 1;    /* Am
da40: 6f 75 6e 74 20 6f 66 20 63 68 61 6e 67 65 20 74  ount of change t
da50: 6f 20 73 74 61 63 6b 20 64 65 70 74 68 20 2a 2f  o stack depth */
da60: 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ..  if( v==0 ) r
da70: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78  eturn;.  if( pEx
da80: 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  pr==0 ){.    sql
da90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
daa0: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b   OP_Null, 0, 0);
dab0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
dac0: 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f  .  op = pExpr->o
dad0: 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  p;.  switch( op 
dae0: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
daf0: 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  GG_COLUMN: {.   
db00: 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67     AggInfo *pAgg
db10: 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41  Info = pExpr->pA
db20: 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74  ggInfo;.      st
db30: 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
db40: 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e   *pCol = &pAggIn
db50: 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e  fo->aCol[pExpr->
db60: 69 41 67 67 5d 3b 0a 20 20 20 20 20 20 69 66 28  iAgg];.      if(
db70: 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65   !pAggInfo->dire
db80: 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  ctMode ){.      
db90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
dba0: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64  Op(v, OP_MemLoad
dbb0: 2c 20 70 43 6f 6c 2d 3e 69 4d 65 6d 2c 20 30 29  , pCol->iMem, 0)
dbc0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
dbd0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
dbe0: 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f   pAggInfo->useSo
dbf0: 72 74 69 6e 67 49 64 78 20 29 7b 0a 20 20 20 20  rtingIdx ){.    
dc00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
dc10: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  ddOp(v, OP_Colum
dc20: 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72  n, pAggInfo->sor
dc30: 74 69 6e 67 49 64 78 2c 0a 20 20 20 20 20 20 20  tingIdx,.       
dc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc50: 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
dc60: 72 74 65 72 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  rterColumn);.   
dc70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
dc80: 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68    }.      /* Oth
dc90: 65 72 77 69 73 65 2c 20 66 61 6c 6c 20 74 68 72  erwise, fall thr
dca0: 75 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f  u into the TK_CO
dcb0: 4c 55 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20  LUMN case */.   
dcc0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43   }.    case TK_C
dcd0: 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69  OLUMN: {.      i
dce0: 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  f( pExpr->iTable
dcf0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  <0 ){.        /*
dd00: 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65   This only happe
dd10: 6e 73 20 77 68 65 6e 20 63 6f 64 69 6e 67 20 63  ns when coding c
dd20: 68 65 63 6b 20 63 6f 6e 73 74 72 61 69 6e 74 73  heck constraints
dd30: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
dd40: 72 74 28 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66  rt( pParse->ckOf
dd50: 66 73 65 74 3e 30 20 29 3b 0a 20 20 20 20 20 20  fset>0 );.      
dd60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
dd70: 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 70 50  Op(v, OP_Dup, pP
dd80: 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74 2d 70  arse->ckOffset-p
dd90: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 2c  Expr->iColumn-1,
dda0: 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   1);.      }else
ddb0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
ddc0: 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
ddd0: 6d 6e 28 76 2c 20 70 45 78 70 72 2d 3e 70 54 61  mn(v, pExpr->pTa
dde0: 62 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  b, pExpr->iColum
ddf0: 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  n, pExpr->iTable
de00: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
de10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
de20: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45    case TK_INTEGE
de30: 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64 65 49  R: {.      codeI
de40: 6e 74 65 67 65 72 28 76 2c 20 28 63 68 61 72 2a  nteger(v, (char*
de50: 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c  )pExpr->token.z,
de60: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29   pExpr->token.n)
de70: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
de80: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
de90: 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65  _FLOAT:.    case
dea0: 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20   TK_STRING: {.  
deb0: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 46      assert( TK_F
dec0: 4c 4f 41 54 3d 3d 4f 50 5f 52 65 61 6c 20 29 3b  LOAT==OP_Real );
ded0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
dee0: 4b 5f 53 54 52 49 4e 47 3d 3d 4f 50 5f 53 74 72  K_STRING==OP_Str
def0: 69 6e 67 38 20 29 3b 0a 20 20 20 20 20 20 73 71  ing8 );.      sq
df00: 6c 69 74 65 33 44 65 71 75 6f 74 65 45 78 70 72  lite3DequoteExpr
df10: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78  (pParse->db, pEx
df20: 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pr);.      sqlit
df30: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 6f 70 2c  e3VdbeOp3(v, op,
df40: 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29 70 45   0, 0, (char*)pE
df50: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45  xpr->token.z, pE
df60: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20  xpr->token.n);. 
df70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
df80: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55  }.    case TK_NU
df90: 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  LL: {.      sqli
dfa0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
dfb0: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a  OP_Null, 0, 0);.
dfc0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
dfd0: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
dfe0: 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45  E_OMIT_BLOB_LITE
dff0: 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  RAL.    case TK_
e000: 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e  BLOB: {.      in
e010: 74 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  t n;.      const
e020: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20   char *z;.      
e030: 61 73 73 65 72 74 28 20 54 4b 5f 42 4c 4f 42 3d  assert( TK_BLOB=
e040: 3d 4f 50 5f 48 65 78 42 6c 6f 62 20 29 3b 0a 20  =OP_HexBlob );. 
e050: 20 20 20 20 20 6e 20 3d 20 70 45 78 70 72 2d 3e       n = pExpr->
e060: 74 6f 6b 65 6e 2e 6e 20 2d 20 33 3b 0a 20 20 20  token.n - 3;.   
e070: 20 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 70 45     z = (char*)pE
e080: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 2b 20 32  xpr->token.z + 2
e090: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
e0a0: 6e 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  n>=0 );.      if
e0b0: 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( n==0 ){.      
e0c0: 20 20 7a 20 3d 20 22 22 3b 0a 20 20 20 20 20 20    z = "";.      
e0d0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
e0e0: 64 62 65 4f 70 33 28 76 2c 20 6f 70 2c 20 30 2c  dbeOp3(v, op, 0,
e0f0: 20 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20   0, z, n);.     
e100: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
e110: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b  ndif.    case TK
e120: 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20  _VARIABLE: {.   
e130: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e140: 64 4f 70 28 76 2c 20 4f 50 5f 56 61 72 69 61 62  dOp(v, OP_Variab
e150: 6c 65 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  le, pExpr->iTabl
e160: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  e, 0);.      if(
e170: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3e   pExpr->token.n>
e180: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
e190: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
e1a0: 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 70  (v, -1, (char*)p
e1b0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  Expr->token.z, p
e1c0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a  Expr->token.n);.
e1d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
e1e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
e1f0: 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a  ase TK_REGISTER:
e200: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
e210: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
e220: 4d 65 6d 4c 6f 61 64 2c 20 70 45 78 70 72 2d 3e  MemLoad, pExpr->
e230: 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20  iTable, 0);.    
e240: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
e250: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e260: 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65  IT_CAST.    case
e270: 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20   TK_CAST: {.    
e280: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
e290: 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20   of the form:   
e2a0: 43 41 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f  CAST(pLeft AS to
e2b0: 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ken) */.      in
e2c0: 74 20 61 66 66 2c 20 74 6f 5f 6f 70 3b 0a 20 20  t aff, to_op;.  
e2d0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
e2e0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
e2f0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
e300: 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 41 66   aff = sqlite3Af
e310: 66 69 6e 69 74 79 54 79 70 65 28 26 70 45 78 70  finityType(&pExp
e320: 72 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  r->token);.     
e330: 20 74 6f 5f 6f 70 20 3d 20 61 66 66 20 2d 20 53   to_op = aff - S
e340: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 2b  QLITE_AFF_TEXT +
e350: 20 4f 50 5f 54 6f 54 65 78 74 3b 0a 20 20 20 20   OP_ToText;.    
e360: 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d    assert( to_op=
e370: 3d 4f 50 5f 54 6f 54 65 78 74 20 20 20 20 7c 7c  =OP_ToText    ||
e380: 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46   aff!=SQLITE_AFF
e390: 5f 54 45 58 54 20 20 20 20 29 3b 0a 20 20 20 20  _TEXT    );.    
e3a0: 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d    assert( to_op=
e3b0: 3d 4f 50 5f 54 6f 42 6c 6f 62 20 20 20 20 7c 7c  =OP_ToBlob    ||
e3c0: 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46   aff!=SQLITE_AFF
e3d0: 5f 4e 4f 4e 45 20 20 20 20 29 3b 0a 20 20 20 20  _NONE    );.    
e3e0: 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d    assert( to_op=
e3f0: 3d 4f 50 5f 54 6f 4e 75 6d 65 72 69 63 20 7c 7c  =OP_ToNumeric ||
e400: 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46   aff!=SQLITE_AFF
e410: 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 20 20  _NUMERIC );.    
e420: 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d    assert( to_op=
e430: 3d 4f 50 5f 54 6f 49 6e 74 20 20 20 20 20 7c 7c  =OP_ToInt     ||
e440: 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46   aff!=SQLITE_AFF
e450: 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20  _INTEGER );.    
e460: 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d    assert( to_op=
e470: 3d 4f 50 5f 54 6f 52 65 61 6c 20 20 20 20 7c 7c  =OP_ToReal    ||
e480: 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46   aff!=SQLITE_AFF
e490: 5f 52 45 41 4c 20 20 20 20 29 3b 0a 20 20 20 20  _REAL    );.    
e4a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e4b0: 4f 70 28 76 2c 20 74 6f 5f 6f 70 2c 20 30 2c 20  Op(v, to_op, 0, 
e4c0: 30 29 3b 0a 20 20 20 20 20 20 73 74 61 63 6b 43  0);.      stackC
e4d0: 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  hng = 0;.      b
e4e0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
e4f0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
e500: 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61  T_CAST */.    ca
e510: 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
e520: 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
e530: 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
e540: 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61  se TK_GE:.    ca
e550: 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
e560: 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20  se TK_EQ: {.    
e570: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d    assert( TK_LT=
e580: 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20  =OP_Lt );.      
e590: 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f  assert( TK_LE==O
e5a0: 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Le );.      as
e5b0: 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f  sert( TK_GT==OP_
e5c0: 47 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Gt );.      asse
e5d0: 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65  rt( TK_GE==OP_Ge
e5e0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
e5f0: 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29  ( TK_EQ==OP_Eq )
e600: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
e610: 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a  TK_NE==OP_Ne );.
e620: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
e630: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
e640: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
e650: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
e660: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
e670: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
e680: 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
e690: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
e6a0: 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
e6b0: 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  , op, 0, 0);.   
e6c0: 20 20 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 2d     stackChng = -
e6d0: 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  1;.      break;.
e6e0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
e6f0: 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20  K_AND:.    case 
e700: 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20  TK_OR:.    case 
e710: 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61 73  TK_PLUS:.    cas
e720: 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63  e TK_STAR:.    c
e730: 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20  ase TK_MINUS:.  
e740: 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20    case TK_REM:. 
e750: 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e     case TK_BITAN
e760: 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  D:.    case TK_B
e770: 49 54 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54  ITOR:.    case T
e780: 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63 61 73  K_SLASH:.    cas
e790: 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20  e TK_LSHIFT:.   
e7a0: 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a   case TK_RSHIFT:
e7b0: 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f   .    case TK_CO
e7c0: 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73  NCAT: {.      as
e7d0: 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50  sert( TK_AND==OP
e7e0: 5f 41 6e 64 20 29 3b 0a 20 20 20 20 20 20 61 73  _And );.      as
e7f0: 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f  sert( TK_OR==OP_
e800: 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Or );.      asse
e810: 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f  rt( TK_PLUS==OP_
e820: 41 64 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Add );.      ass
e830: 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f  ert( TK_MINUS==O
e840: 50 5f 53 75 62 74 72 61 63 74 20 29 3b 0a 20 20  P_Subtract );.  
e850: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52      assert( TK_R
e860: 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72  EM==OP_Remainder
e870: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
e880: 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f  ( TK_BITAND==OP_
e890: 42 69 74 41 6e 64 20 29 3b 0a 20 20 20 20 20 20  BitAnd );.      
e8a0: 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4f 52  assert( TK_BITOR
e8b0: 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 0a 20 20  ==OP_BitOr );.  
e8c0: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53      assert( TK_S
e8d0: 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20  LASH==OP_Divide 
e8e0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
e8f0: 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53   TK_LSHIFT==OP_S
e900: 68 69 66 74 4c 65 66 74 20 29 3b 0a 20 20 20 20  hiftLeft );.    
e910: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 53 48    assert( TK_RSH
e920: 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67  IFT==OP_ShiftRig
e930: 68 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ht );.      asse
e940: 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f  rt( TK_CONCAT==O
e950: 50 5f 43 6f 6e 63 61 74 20 29 3b 0a 20 20 20 20  P_Concat );.    
e960: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
e970: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
e980: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
e990: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
e9a0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
e9b0: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  ight);.      sql
e9c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
e9d0: 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20   op, 0, 0);.    
e9e0: 20 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 2d 31    stackChng = -1
e9f0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
ea00: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
ea10: 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20  _UMINUS: {.     
ea20: 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
ea30: 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
ea40: 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74     assert( pLeft
ea50: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
ea60: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41  eft->op==TK_FLOA
ea70: 54 20 7c 7c 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d  T || pLeft->op==
ea80: 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20  TK_INTEGER ){.  
ea90: 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 20 3d        Token *p =
eaa0: 20 26 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a   &pLeft->token;.
eab0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20          char *z 
eac0: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
ead0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 2d 25  (pParse->db, "-%
eae0: 2e 2a 73 22 2c 20 70 2d 3e 6e 2c 20 70 2d 3e 7a  .*s", p->n, p->z
eaf0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
eb00: 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f  Left->op==TK_FLO
eb10: 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AT ){.          
eb20: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
eb30: 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 30 2c  , OP_Real, 0, 0,
eb40: 20 7a 2c 20 70 2d 3e 6e 2b 31 29 3b 0a 20 20 20   z, p->n+1);.   
eb50: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
eb60: 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65        codeIntege
eb70: 72 28 76 2c 20 7a 2c 20 70 2d 3e 6e 2b 31 29 3b  r(v, z, p->n+1);
eb80: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
eb90: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
eba0: 7a 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  z);.        brea
ebb0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
ebc0: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
ebd0: 20 69 6e 74 6f 20 54 4b 5f 4e 4f 54 20 2a 2f 0a   into TK_NOT */.
ebe0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
ebf0: 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61  K_BITNOT:.    ca
ec00: 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
ec10: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49     assert( TK_BI
ec20: 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20  TNOT==OP_BitNot 
ec30: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
ec40: 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20   TK_NOT==OP_Not 
ec50: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ec60: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
ec70: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
ec80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ec90: 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c  eAddOp(v, op, 0,
eca0: 20 30 29 3b 0a 20 20 20 20 20 20 73 74 61 63 6b   0);.      stack
ecb0: 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  Chng = 0;.      
ecc0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
ecd0: 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
ece0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
ecf0: 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e  NULL: {.      in
ed00: 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20 61 73  t dest;.      as
ed10: 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d  sert( TK_ISNULL=
ed20: 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20  =OP_IsNull );.  
ed30: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
ed40: 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75  OTNULL==OP_NotNu
ed50: 6c 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ll );.      sqli
ed60: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
ed70: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 30  OP_Integer, 1, 0
ed80: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ed90: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
eda0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
edb0: 20 20 20 20 20 20 64 65 73 74 20 3d 20 73 71 6c        dest = sql
edc0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
edd0: 64 64 72 28 76 29 20 2b 20 32 3b 0a 20 20 20 20  ddr(v) + 2;.    
ede0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
edf0: 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73  Op(v, op, 1, des
ee00: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
ee10: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
ee20: 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b  _AddImm, -1, 0);
ee30: 0a 20 20 20 20 20 20 73 74 61 63 6b 43 68 6e 67  .      stackChng
ee40: 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
ee50: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
ee60: 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  e TK_AGG_FUNCTIO
ee70: 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e  N: {.      AggIn
ee80: 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70  fo *pInfo = pExp
ee90: 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20  r->pAggInfo;.   
eea0: 20 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20     if( pInfo==0 
eeb0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
eec0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
eed0: 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67  e, "misuse of ag
eee0: 67 72 65 67 61 74 65 3a 20 25 54 22 2c 0a 20 20  gregate: %T",.  
eef0: 20 20 20 20 20 20 20 20 20 20 26 70 45 78 70 72            &pExpr
ef00: 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d  ->span);.      }
ef10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
ef20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
ef30: 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 49  , OP_MemLoad, pI
ef40: 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72  nfo->aFunc[pExpr
ef50: 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 2c 20 30 29  ->iAgg].iMem, 0)
ef60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ef70: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
ef80: 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46   case TK_CONST_F
ef90: 55 4e 43 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UNC:.    case TK
efa0: 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
efb0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
efc0: 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  st = pExpr->pLis
efd0: 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78  t;.      int nEx
efe0: 70 72 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69  pr = pList ? pLi
eff0: 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20  st->nExpr : 0;. 
f000: 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44       FuncDef *pD
f010: 65 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 49  ef;.      int nI
f020: 64 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  d;.      const c
f030: 68 61 72 20 2a 7a 49 64 3b 0a 20 20 20 20 20 20  har *zId;.      
f040: 69 6e 74 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20  int constMask = 
f050: 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  0;.      int i;.
f060: 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
f070: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
f080: 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45        u8 enc = E
f090: 4e 43 28 64 62 29 3b 0a 20 20 20 20 20 20 43 6f  NC(db);.      Co
f0a0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30  llSeq *pColl = 0
f0b0: 3b 0a 0a 20 20 20 20 20 20 7a 49 64 20 3d 20 28  ;..      zId = (
f0c0: 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b  char*)pExpr->tok
f0d0: 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 6e 49 64 20  en.z;.      nId 
f0e0: 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  = pExpr->token.n
f0f0: 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73  ;.      pDef = s
f100: 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
f110: 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  on(pParse->db, z
f120: 49 64 2c 20 6e 49 64 2c 20 6e 45 78 70 72 2c 20  Id, nId, nExpr, 
f130: 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  enc, 0);.      a
f140: 73 73 65 72 74 28 20 70 44 65 66 21 3d 30 20 29  ssert( pDef!=0 )
f150: 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20  ;.      nExpr = 
f160: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
f170: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
f180: 70 4c 69 73 74 29 3b 0a 23 69 66 6e 64 65 66 20  pList);.#ifndef 
f190: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
f1a0: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f  UALTABLE.      /
f1b0: 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c  * Possibly overl
f1c0: 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  oad the function
f1d0: 20 69 66 20 74 68 65 20 66 69 72 73 74 20 61 72   if the first ar
f1e0: 67 75 6d 65 6e 74 20 69 73 0a 20 20 20 20 20 20  gument is.      
f1f0: 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ** a virtual tab
f200: 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20  le column..     
f210: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72   **.      ** For
f220: 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73   infix functions
f230: 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45   (LIKE, GLOB, RE
f240: 47 45 58 50 2c 20 61 6e 64 20 4d 41 54 43 48 29  GEXP, and MATCH)
f250: 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 2a   use the.      *
f260: 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  * second argumen
f270: 74 2c 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74  t, not the first
f280: 2c 20 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e  , as the argumen
f290: 74 20 74 6f 20 74 65 73 74 20 74 6f 0a 20 20 20  t to test to.   
f2a0: 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20     ** see if it 
f2b0: 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61  is a column in a
f2c0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
f2d0: 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65   This is done be
f2e0: 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74  cause.      ** t
f2f0: 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20  he left operand 
f300: 6f 66 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f  of infix functio
f310: 6e 73 20 28 74 68 65 20 6f 70 65 72 61 6e 64 20  ns (the operand 
f320: 77 65 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 20  we want to.     
f330: 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72   ** control over
f340: 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73 20 75 70  loading) ends up
f350: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
f360: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20  rgument to the. 
f370: 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
f380: 2e 20 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  .  The expressio
f390: 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 69 73 20  n "A glob B" is 
f3a0: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20  equivalent to . 
f3b0: 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c       ** "glob(B,
f3c0: 41 29 2e 20 20 57 65 20 77 61 6e 74 20 74 6f 20  A).  We want to 
f3d0: 75 73 65 20 74 68 65 20 41 20 69 6e 20 22 41 20  use the A in "A 
f3e0: 67 6c 6f 62 20 42 22 20 74 6f 20 74 65 73 74 0a  glob B" to test.
f3f0: 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e        ** for fun
f400: 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e  ction overloadin
f410: 67 2e 20 20 42 75 74 20 77 65 20 75 73 65 20 74  g.  But we use t
f420: 68 65 20 42 20 74 65 72 6d 20 69 6e 20 22 67 6c  he B term in "gl
f430: 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20 20 20 20  ob(B,A)"..      
f440: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78  */.      if( nEx
f450: 70 72 3e 3d 32 20 26 26 20 28 70 45 78 70 72 2d  pr>=2 && (pExpr-
f460: 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 66 69  >flags & EP_Infi
f470: 78 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20  xFunc) ){.      
f480: 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
f490: 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63  VtabOverloadFunc
f4a0: 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e  tion(db, pDef, n
f4b0: 45 78 70 72 2c 20 70 4c 69 73 74 2d 3e 61 5b 31  Expr, pList->a[1
f4c0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
f4d0: 7d 65 6c 73 65 20 69 66 28 20 6e 45 78 70 72 3e  }else if( nExpr>
f4e0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  0 ){.        pDe
f4f0: 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f  f = sqlite3VtabO
f500: 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28  verloadFunction(
f510: 64 62 2c 20 70 44 65 66 2c 20 6e 45 78 70 72 2c  db, pDef, nExpr,
f520: 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78   pList->a[0].pEx
f530: 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  pr);.      }.#en
f540: 64 69 66 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  dif.      for(i=
f550: 30 3b 20 69 3c 6e 45 78 70 72 20 26 26 20 69 3c  0; i<nExpr && i<
f560: 33 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  32; i++){.      
f570: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
f580: 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 4c 69 73  rIsConstant(pLis
f590: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  t->a[i].pExpr) )
f5a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  {.          cons
f5b0: 74 4d 61 73 6b 20 7c 3d 20 28 31 3c 3c 69 29 3b  tMask |= (1<<i);
f5c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f5d0: 20 20 20 69 66 28 20 70 44 65 66 2d 3e 6e 65 65     if( pDef->nee
f5e0: 64 43 6f 6c 6c 53 65 71 20 26 26 20 21 70 43 6f  dCollSeq && !pCo
f5f0: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
f600: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
f610: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
f620: 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  e, pList->a[i].p
f630: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Expr);.        }
f640: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
f650: 66 28 20 70 44 65 66 2d 3e 6e 65 65 64 43 6f 6c  f( pDef->needCol
f660: 6c 53 65 71 20 29 7b 0a 20 20 20 20 20 20 20 20  lSeq ){.        
f670: 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
f680: 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  ll = pParse->db-
f690: 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20  >pDfltColl; .   
f6a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f6b0: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65  Op3(v, OP_CollSe
f6c0: 71 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a  q, 0, 0, (char *
f6d0: 29 70 43 6f 6c 6c 2c 20 50 33 5f 43 4f 4c 4c 53  )pColl, P3_COLLS
f6e0: 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  EQ);.      }.   
f6f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
f700: 33 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e  3(v, OP_Function
f710: 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 6e 45 78  , constMask, nEx
f720: 70 72 2c 20 28 63 68 61 72 2a 29 70 44 65 66 2c  pr, (char*)pDef,
f730: 20 50 33 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P3_FUNCDEF);.  
f740: 20 20 20 20 73 74 61 63 6b 43 68 6e 67 20 3d 20      stackChng = 
f750: 31 2d 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 62  1-nExpr;.      b
f760: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
f770: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f780: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
f790: 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20  e TK_EXISTS:.   
f7a0: 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
f7b0: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   {.      if( pEx
f7c0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 29  pr->iColumn==0 )
f7d0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
f7e0: 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  3CodeSubselect(p
f7f0: 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
f800: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
f810: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
f820: 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 45 78   OP_MemLoad, pEx
f830: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 30 29 3b  pr->iColumn, 0);
f840: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
f850: 6e 74 28 28 76 2c 20 22 23 20 6c 6f 61 64 20 73  nt((v, "# load s
f860: 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 22 29  ubquery result")
f870: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
f880: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
f890: 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_IN: {.      in
f8a0: 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 63 68  t addr;.      ch
f8b0: 61 72 20 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  ar affinity;.   
f8c0: 20 20 20 69 6e 74 20 63 6b 4f 66 66 73 65 74 20     int ckOffset 
f8d0: 3d 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73  = pParse->ckOffs
f8e0: 65 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  et;.      sqlite
f8f0: 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  3CodeSubselect(p
f900: 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 0a  Parse, pExpr);..
f910: 20 20 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20        /* Figure 
f920: 6f 75 74 20 74 68 65 20 61 66 66 69 6e 69 74 79  out the affinity
f930: 20 74 6f 20 75 73 65 20 74 6f 20 63 72 65 61 74   to use to creat
f940: 65 20 61 20 6b 65 79 20 66 72 6f 6d 20 74 68 65  e a key from the
f950: 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a   results.      *
f960: 2a 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  * of the express
f970: 69 6f 6e 2e 20 61 66 66 69 6e 69 74 79 53 74 72  ion. affinityStr
f980: 20 73 74 6f 72 65 73 20 61 20 73 74 61 74 69 63   stores a static
f990: 20 73 74 72 69 6e 67 20 73 75 69 74 61 62 6c 65   string suitable
f9a0: 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 50 33   for.      ** P3
f9b0: 20 6f 66 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72   of OP_MakeRecor
f9c0: 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
f9d0: 20 20 61 66 66 69 6e 69 74 79 20 3d 20 63 6f 6d    affinity = com
f9e0: 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28  parisonAffinity(
f9f0: 70 45 78 70 72 29 3b 0a 0a 20 20 20 20 20 20 73  pExpr);..      s
fa00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
fa10: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
fa20: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72  , 0);.      pPar
fa30: 73 65 2d 3e 63 6b 4f 66 66 73 65 74 20 3d 20 28  se->ckOffset = (
fa40: 63 6b 4f 66 66 73 65 74 20 3f 20 28 63 6b 4f 66  ckOffset ? (ckOf
fa50: 66 73 65 74 2b 31 29 20 3a 20 30 29 3b 0a 0a 20  fset+1) : 0);.. 
fa60: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
fa70: 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65   <expr> from "<e
fa80: 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 20  xpr> IN (...)". 
fa90: 54 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  The temporary ta
faa0: 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 70 45 78  ble.      ** pEx
fab0: 70 72 2d 3e 69 54 61 62 6c 65 20 63 6f 6e 74 61  pr->iTable conta
fac0: 69 6e 73 20 74 68 65 20 76 61 6c 75 65 73 20 74  ins the values t
fad0: 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20  hat make up the 
fae0: 28 2e 2e 2e 29 20 73 65 74 2e 0a 20 20 20 20 20  (...) set..     
faf0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
fb00: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
fb10: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
fb20: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
fb30: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
fb40: 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
fb50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
fb60: 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d  v, OP_NotNull, -
fb70: 31 2c 20 61 64 64 72 2b 34 29 3b 20 20 20 20 20  1, addr+4);     
fb80: 20 20 20 20 20 20 20 2f 2a 20 61 64 64 72 20 2b         /* addr +
fb90: 20 30 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69   0 */.      sqli
fba0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
fbb0: 4f 50 5f 50 6f 70 2c 20 32 2c 20 30 29 3b 0a 20  OP_Pop, 2, 0);. 
fbc0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fbd0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c  AddOp(v, OP_Null
fbe0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
fbf0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
fc00: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
fc10: 64 64 72 2b 37 29 3b 0a 20 20 20 20 20 20 73 71  ddr+7);.      sq
fc20: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
fc30: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31  OP_MakeRecord, 1
fc40: 2c 20 30 2c 20 26 61 66 66 69 6e 69 74 79 2c 20  , 0, &affinity, 
fc50: 31 29 3b 20 20 20 2f 2a 20 61 64 64 72 20 2b 20  1);   /* addr + 
fc60: 34 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  4 */.      sqlit
fc70: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
fc80: 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e  P_Found, pExpr->
fc90: 69 54 61 62 6c 65 2c 20 61 64 64 72 2b 37 29 3b  iTable, addr+7);
fca0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
fcb0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64  beAddOp(v, OP_Ad
fcc0: 64 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b 20 20 20  dImm, -1, 0);   
fcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fce0: 2a 20 61 64 64 72 20 2b 20 36 20 2a 2f 0a 0a 20  * addr + 6 */.. 
fcf0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
fd00: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
fd10: 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
fd20: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
fd30: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
fd40: 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  ;.      struct E
fd50: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c  xprList_item *pL
fd60: 49 74 65 6d 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Item = pExpr->pL
fd70: 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 45 78  ist->a;.      Ex
fd80: 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 4c 49  pr *pRight = pLI
fd90: 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  tem->pExpr;.    
fda0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
fdb0: 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29  e(pParse, pLeft)
fdc0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
fdd0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
fde0: 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  up, 0, 0);.     
fdf0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
fe00: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
fe10: 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
fe20: 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66  are(pParse, pLef
fe30: 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 65  t, pRight, OP_Ge
fe40: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
fe50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
fe60: 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30  v, OP_Pull, 1, 0
fe70: 29 3b 0a 20 20 20 20 20 20 70 4c 49 74 65 6d 2b  );.      pLItem+
fe80: 2b 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 20  +;.      pRight 
fe90: 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b  = pLItem->pExpr;
fea0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
feb0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
fec0: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f  Right);.      co
fed0: 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
fee0: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
fef0: 20 4f 50 5f 4c 65 2c 20 30 2c 20 30 29 3b 0a 20   OP_Le, 0, 0);. 
ff00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ff10: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 6e 64 2c  AddOp(v, OP_And,
ff20: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72   0, 0);.      br
ff30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
ff40: 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a  ase TK_UPLUS: {.
ff50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
ff60: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
ff70: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
ff80: 20 20 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 30     stackChng = 0
ff90: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
ffa0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
ffb0: 5f 43 41 53 45 3a 20 7b 0a 20 20 20 20 20 20 69  _CASE: {.      i
ffc0: 6e 74 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65  nt expr_end_labe
ffd0: 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 75 6d  l;.      int jum
ffe0: 70 49 6e 73 74 3b 0a 20 20 20 20 20 20 69 6e 74  pInst;.      int
fff0: 20 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e   nExpr;.      in
10000 74 20 69 3b 0a 20 20 20 20 20 20 45 78 70 72 4c  t i;.      ExprL
10010 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20  ist *pEList;.   
10020 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
10030 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c  st_item *aListel
10040 65 6d 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  em;..      asser
10050 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 29 3b  t(pExpr->pList);
10060 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 28 70  .      assert((p
10070 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  Expr->pList->nEx
10080 70 72 20 25 20 32 29 20 3d 3d 20 30 29 3b 0a 20  pr % 2) == 0);. 
10090 20 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70       assert(pExp
100a0 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  r->pList->nExpr 
100b0 3e 20 30 29 3b 0a 20 20 20 20 20 20 70 45 4c 69  > 0);.      pELi
100c0 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  st = pExpr->pLis
100d0 74 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65 6c  t;.      aListel
100e0 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a  em = pEList->a;.
100f0 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45        nExpr = pE
10100 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
10110 20 20 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65     expr_end_labe
10120 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  l = sqlite3VdbeM
10130 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
10140 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c     if( pExpr->pL
10150 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  eft ){.        s
10160 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
10170 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
10180 65 66 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  eft);.      }.  
10190 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
101a0 45 78 70 72 3b 20 69 3d 69 2b 32 29 7b 0a 20 20  Expr; i=i+2){.  
101b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
101c0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61 4c  rCode(pParse, aL
101d0 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72  istelem[i].pExpr
101e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
101f0 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20  Expr->pLeft ){. 
10200 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
10210 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10220 44 75 70 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  Dup, 1, 1);.    
10230 20 20 20 20 20 20 6a 75 6d 70 49 6e 73 74 20 3d        jumpInst =
10240 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
10250 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
10260 74 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e  t, aListelem[i].
10270 70 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  pExpr,.         
10280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10290 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 2c 20 30          OP_Ne, 0
102a0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
102b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
102c0 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30  (v, OP_Pop, 1, 0
102d0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
102e0 7b 0a 20 20 20 20 20 20 20 20 20 20 6a 75 6d 70  {.          jump
102f0 49 6e 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Inst = sqlite3Vd
10300 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66  beAddOp(v, OP_If
10310 4e 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  Not, 1, 0);.    
10320 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
10330 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
10340 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b  arse, aListelem[
10350 69 2b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  i+1].pExpr);.   
10360 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10370 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
10380 2c 20 30 2c 20 65 78 70 72 5f 65 6e 64 5f 6c 61  , 0, expr_end_la
10390 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  bel);.        sq
103a0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
103b0 65 28 76 2c 20 6a 75 6d 70 49 6e 73 74 29 3b 0a  e(v, jumpInst);.
103c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
103d0 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29  ( pExpr->pLeft )
103e0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
103f0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10400 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20  _Pop, 1, 0);.   
10410 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
10420 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a  Expr->pRight ){.
10430 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
10440 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
10450 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
10460 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10470 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10480 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c  AddOp(v, OP_Null
10490 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
104a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
104b0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
104c0 2c 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c  , expr_end_label
104d0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
104e0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
104f0 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
10500 52 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41  R.    case TK_RA
10510 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ISE: {.      if(
10520 20 21 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74   !pParse->trigSt
10530 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ack ){.        s
10540 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
10550 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
10560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52                "R
10570 41 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20  AISE() may only 
10580 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 61  be used within a
10590 20 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d   trigger-program
105a0 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
105b0 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
105c0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
105d0 6c 75 6d 6e 21 3d 4f 45 5f 49 67 6e 6f 72 65 20  lumn!=OE_Ignore 
105e0 29 7b 0a 20 20 20 20 20 20 20 20 20 61 73 73 65  ){.         asse
105f0 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  rt( pExpr->iColu
10600 6d 6e 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20  mn==OE_Rollback 
10610 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ||.             
10620 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
10630 6d 6e 20 3d 3d 20 4f 45 5f 41 62 6f 72 74 20 7c  mn == OE_Abort |
10640 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
10650 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
10660 6e 20 3d 3d 20 4f 45 5f 46 61 69 6c 20 29 3b 0a  n == OE_Fail );.
10670 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
10680 44 65 71 75 6f 74 65 45 78 70 72 28 70 50 61 72  DequoteExpr(pPar
10690 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 29 3b 0a  se->db, pExpr);.
106a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
106b0 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 48 61  VdbeOp3(v, OP_Ha
106c0 6c 74 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  lt, SQLITE_CONST
106d0 52 41 49 4e 54 2c 20 70 45 78 70 72 2d 3e 69 43  RAINT, pExpr->iC
106e0 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20  olumn,.         
106f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
10700 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b  char*)pExpr->tok
10710 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  en.z, pExpr->tok
10720 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 20 65  en.n);.      } e
10730 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 61  lse {.         a
10740 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43  ssert( pExpr->iC
10750 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 49 67 6e 6f  olumn == OE_Igno
10760 72 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 73  re );.         s
10770 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
10780 76 2c 20 4f 50 5f 43 6f 6e 74 65 78 74 50 6f 70  v, OP_ContextPop
10790 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
107a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
107b0 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
107c0 2c 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74  , pParse->trigSt
107d0 61 63 6b 2d 3e 69 67 6e 6f 72 65 4a 75 6d 70 29  ack->ignoreJump)
107e0 3b 0a 20 20 20 20 20 20 20 20 20 56 64 62 65 43  ;.         VdbeC
107f0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 72 61  omment((v, "# ra
10800 69 73 65 28 49 47 4e 4f 52 45 29 22 29 29 3b 0a  ise(IGNORE)"));.
10810 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74        }.      st
10820 61 63 6b 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20  ackChng = 0;.   
10830 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
10840 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66  #endif.  }..  if
10850 28 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73  ( pParse->ckOffs
10860 65 74 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  et ){.    pParse
10870 2d 3e 63 6b 4f 66 66 73 65 74 20 2b 3d 20 73 74  ->ckOffset += st
10880 61 63 6b 43 68 6e 67 3b 0a 20 20 20 20 61 73 73  ackChng;.    ass
10890 65 72 74 28 20 70 50 61 72 73 65 2d 3e 63 6b 4f  ert( pParse->ckO
108a0 66 66 73 65 74 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  ffset );.  }.}..
108b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
108c0 4d 49 54 5f 54 52 49 47 47 45 52 0a 2f 2a 0a 2a  MIT_TRIGGER./*.*
108d0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
108e0 74 68 61 74 20 65 76 61 6c 75 74 65 73 20 74 68  that evalutes th
108f0 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
10900 6f 6e 20 61 6e 64 20 6c 65 61 76 65 73 20 74 68  on and leaves th
10910 65 20 72 65 73 75 6c 74 0a 2a 2a 20 6f 6e 20 74  e result.** on t
10920 68 65 20 73 74 61 63 6b 2e 20 20 53 65 65 20 61  he stack.  See a
10930 6c 73 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43  lso sqlite3ExprC
10940 6f 64 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ode()..**.** Thi
10950 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
10960 61 6c 73 6f 20 63 61 63 68 65 20 74 68 65 20 72  also cache the r
10970 65 73 75 6c 74 20 61 6e 64 20 6d 6f 64 69 66 79  esult and modify
10980 20 74 68 65 20 70 45 78 70 72 20 74 72 65 65 0a   the pExpr tree.
10990 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 77 69  ** so that it wi
109a0 6c 6c 20 6d 61 6b 65 20 75 73 65 20 6f 66 20 74  ll make use of t
109b0 68 65 20 63 61 63 68 65 64 20 72 65 73 75 6c 74  he cached result
109c0 20 6f 6e 20 73 75 62 73 65 71 75 65 6e 74 20 65   on subsequent e
109d0 76 61 6c 75 61 74 69 6f 6e 73 0a 2a 2a 20 72 61  valuations.** ra
109e0 74 68 65 72 20 74 68 61 6e 20 65 76 61 6c 75 61  ther than evalua
109f0 74 65 20 74 68 65 20 77 68 6f 6c 65 20 65 78 70  te the whole exp
10a00 72 65 73 73 69 6f 6e 20 61 67 61 69 6e 2e 20 20  ression again.  
10a10 54 72 69 76 69 61 6c 20 65 78 70 72 65 73 73 69  Trivial expressi
10a20 6f 6e 73 20 61 72 65 0a 2a 2a 20 6e 6f 74 20 63  ons are.** not c
10a30 61 63 68 65 64 2e 20 20 49 66 20 74 68 65 20 65  ached.  If the e
10a40 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 61 63  xpression is cac
10a50 68 65 64 2c 20 69 74 73 20 72 65 73 75 6c 74 20  hed, its result 
10a60 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20 0a  is stored in a .
10a70 2a 2a 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  ** memory locati
10a80 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
10a90 74 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43 61  te3ExprCodeAndCa
10aa0 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  che(Parse *pPars
10ab0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
10ac0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
10ad0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
10ae0 74 20 69 4d 65 6d 3b 0a 20 20 69 6e 74 20 61 64  t iMem;.  int ad
10af0 64 72 31 2c 20 61 64 64 72 32 3b 0a 20 20 69 66  dr1, addr2;.  if
10b00 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
10b10 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74  .  addr1 = sqlit
10b20 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
10b30 72 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  r(v);.  sqlite3E
10b40 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
10b50 70 45 78 70 72 29 3b 0a 20 20 61 64 64 72 32 20  pExpr);.  addr2 
10b60 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
10b70 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69  rentAddr(v);.  i
10b80 66 28 20 61 64 64 72 32 3e 61 64 64 72 31 2b 31  f( addr2>addr1+1
10b90 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65 47   || sqlite3VdbeG
10ba0 65 74 4f 70 28 76 2c 20 61 64 64 72 31 29 2d 3e  etOp(v, addr1)->
10bb0 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 75 6e 63 74  opcode==OP_Funct
10bc0 69 6f 6e 20 29 7b 0a 20 20 20 20 69 4d 65 6d 20  ion ){.    iMem 
10bd0 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  = pExpr->iTable 
10be0 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b  = pParse->nMem++
10bf0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
10c00 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
10c10 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20 30 29 3b  Store, iMem, 0);
10c20 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d  .    pExpr->op =
10c30 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20   TK_REGISTER;.  
10c40 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
10c50 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
10c60 74 68 61 74 20 70 75 73 68 65 73 20 74 68 65 20  that pushes the 
10c70 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65  value of every e
10c80 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69  lement of the gi
10c90 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
10ca0 6e 20 6c 69 73 74 20 6f 6e 74 6f 20 74 68 65 20  n list onto the 
10cb0 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  stack..**.** Ret
10cc0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
10cd0 66 20 65 6c 65 6d 65 6e 74 73 20 70 75 73 68 65  f elements pushe
10ce0 64 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b  d onto the stack
10cf0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
10d00 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
10d10 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
10d20 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
10d30 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
10d40 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 20  xprList *pList  
10d50 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
10d60 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63  ion list to be c
10d70 6f 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  oded */.){.  str
10d80 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
10d90 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
10da0 69 2c 20 6e 3b 0a 20 20 69 66 28 20 70 4c 69 73  i, n;.  if( pLis
10db0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
10dc0 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  .  n = pList->nE
10dd0 78 70 72 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d  xpr;.  for(pItem
10de0 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 6e 3b 20  =pList->a, i=n; 
10df0 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b  i>0; i--, pItem+
10e00 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  +){.    sqlite3E
10e10 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
10e20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
10e30 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d   }.  return n;.}
10e40 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
10e50 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c   code for a bool
10e60 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73  ean expression s
10e70 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20  uch that a jump 
10e80 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68  is made.** to th
10e90 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69  e label "dest" i
10ea0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
10eb0 20 69 73 20 74 72 75 65 20 62 75 74 20 65 78 65   is true but exe
10ec0 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e  cution.** contin
10ed0 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72  ues straight thr
10ee0 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  u if the express
10ef0 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a  ion is false..**
10f00 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
10f10 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20  ssion evaluates 
10f20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72  to NULL (neither
10f30 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29   true nor false)
10f40 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74  , then.** take t
10f50 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a  he jump if the j
10f60 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69  umpIfNull flag i
10f70 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  s true..**.** Th
10f80 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20  is code depends 
10f90 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68 61 74  on the fact that
10fa0 20 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76   certain token v
10fb0 61 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f 45 51  alues (ex: TK_EQ
10fc0 29 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d  ).** are the sam
10fd0 65 20 61 73 20 6f 70 63 6f 64 65 20 76 61 6c 75  e as opcode valu
10fe0 65 73 20 28 65 78 3a 20 4f 50 5f 45 71 29 20 74  es (ex: OP_Eq) t
10ff0 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68  hat implement th
11000 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
11010 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53  ** operation.  S
11020 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20  pecial comments 
11030 69 6e 20 76 64 62 65 2e 63 20 61 6e 64 20 74 68  in vdbe.c and th
11040 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20  e mkopcodeh.awk 
11050 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65  script in.** the
11060 20 6d 61 6b 65 20 70 72 6f 63 65 73 73 20 63 61   make process ca
11070 75 73 65 20 74 68 65 73 65 20 76 61 6c 75 65 73  use these values
11080 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73 65   to align.  Asse
11090 72 74 28 29 73 20 69 6e 20 74 68 65 20 63 6f 64  rt()s in the cod
110a0 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69 66  e.** below verif
110b0 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65  y that the numbe
110c0 72 73 20 61 72 65 20 61 6c 69 67 6e 65 64 20 63  rs are aligned c
110d0 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69  orrectly..*/.voi
110e0 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54  d sqlite3ExprIfT
110f0 72 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  rue(Parse *pPars
11100 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
11110 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75  int dest, int ju
11120 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62  mpIfNull){.  Vdb
11130 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
11140 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d  Vdbe;.  int op =
11150 20 30 3b 0a 20 20 69 6e 74 20 63 6b 4f 66 66 73   0;.  int ckOffs
11160 65 74 20 3d 20 70 50 61 72 73 65 2d 3e 63 6b 4f  et = pParse->ckO
11170 66 66 73 65 74 3b 0a 20 20 69 66 28 20 76 3d 3d  ffset;.  if( v==
11180 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29 20  0 || pExpr==0 ) 
11190 72 65 74 75 72 6e 3b 0a 20 20 6f 70 20 3d 20 70  return;.  op = p
111a0 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74  Expr->op;.  swit
111b0 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
111c0 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20  se TK_AND: {.   
111d0 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69     int d2 = sqli
111e0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
111f0 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
11200 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
11210 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
11220 66 74 2c 20 64 32 2c 20 21 6a 75 6d 70 49 66 4e  ft, d2, !jumpIfN
11230 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
11240 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
11250 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
11260 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
11270 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
11280 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
11290 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20  Label(v, d2);.  
112a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
112b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
112c0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
112d0 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
112e0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
112f0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
11300 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
11310 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
11320 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
11330 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
11340 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
11350 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
11360 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
11370 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
11380 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
11390 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
113a0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
113b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
113c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
113d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
113e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
113f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
11400 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
11410 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
11420 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
11430 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b   TK_LT==OP_Lt );
11440 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
11450 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20  K_LE==OP_Le );. 
11460 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
11470 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20  GT==OP_Gt );.   
11480 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45     assert( TK_GE
11490 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20 20  ==OP_Ge );.     
114a0 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d   assert( TK_EQ==
114b0 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 61  OP_Eq );.      a
114c0 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50  ssert( TK_NE==OP
114d0 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  _Ne );.      sql
114e0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
114f0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
11500 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
11510 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
11520 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
11530 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
11540 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
11550 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
11560 3e 70 52 69 67 68 74 2c 20 6f 70 2c 20 64 65 73  >pRight, op, des
11570 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
11580 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11590 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
115a0 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
115b0 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
115c0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49      assert( TK_I
115d0 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c  SNULL==OP_IsNull
115e0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
115f0 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50  ( TK_NOTNULL==OP
11600 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20  _NotNull );.    
11610 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
11620 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
11630 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
11640 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
11650 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b  v, op, 1, dest);
11660 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11670 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
11680 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
11690 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
116a0 6f 6e 20 22 78 20 42 45 54 57 45 45 4e 20 79 20  on "x BETWEEN y 
116b0 41 4e 44 20 7a 22 20 69 73 20 69 6d 70 6c 65 6d  AND z" is implem
116c0 65 6e 74 65 64 20 61 73 3a 0a 20 20 20 20 20 20  ented as:.      
116d0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 31 20 49 46  **.      ** 1 IF
116e0 20 28 78 20 3c 20 79 29 20 47 4f 54 4f 20 33 0a   (x < y) GOTO 3.
116f0 20 20 20 20 20 20 2a 2a 20 32 20 49 46 20 28 78        ** 2 IF (x
11700 20 3c 3d 20 7a 29 20 47 4f 54 4f 20 3c 64 65 73   <= z) GOTO <des
11710 74 3e 0a 20 20 20 20 20 20 2a 2a 20 33 20 2e 2e  t>.      ** 3 ..
11720 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
11730 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
11740 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
11750 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
11760 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
11770 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  = pExpr->pList->
11780 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[0].pExpr;.    
11790 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
117a0 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29  e(pParse, pLeft)
117b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
117c0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
117d0 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  up, 0, 0);.     
117e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
117f0 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
11800 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 63  ;.      addr = c
11810 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
11820 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
11830 2c 20 4f 50 5f 4c 74 2c 20 30 2c 20 21 6a 75 6d  , OP_Lt, 0, !jum
11840 70 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20 20  pIfNull);..     
11850 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d   pRight = pExpr-
11860 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  >pList->a[1].pEx
11870 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
11880 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
11890 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  , pRight);.     
118a0 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
118b0 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
118c0 68 74 2c 20 4f 50 5f 4c 65 2c 20 64 65 73 74 2c  ht, OP_Le, dest,
118d0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 0a 20   jumpIfNull);.. 
118e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
118f0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
11900 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ger, 0, 0);.    
11910 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
11920 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
11930 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11940 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
11950 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  , 1, 0);.      b
11960 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
11970 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
11980 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
11990 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
119a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
119b0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66  beAddOp(v, OP_If
119c0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65  , jumpIfNull, de
119d0 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
119e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50  ;.    }.  }.  pP
119f0 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74 20 3d  arse->ckOffset =
11a00 20 63 6b 4f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a   ckOffset;.}../*
11a10 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
11a20 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20  e for a boolean 
11a30 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20  expression such 
11a40 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d  that a jump is m
11a50 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61  ade.** to the la
11a60 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68  bel "dest" if th
11a70 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
11a80 66 61 6c 73 65 20 62 75 74 20 65 78 65 63 75 74  false but execut
11a90 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73  ion.** continues
11aa0 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69   straight thru i
11ab0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
11ac0 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20   is true..**.** 
11ad0 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
11ae0 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e  n evaluates to N
11af0 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75  ULL (neither tru
11b00 65 20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65  e nor false) the
11b10 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d  n.** jump if jum
11b20 70 49 66 4e 75 6c 6c 20 69 73 20 74 72 75 65 20  pIfNull is true 
11b30 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  or fall through 
11b40 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73  if jumpIfNull is
11b50 20 66 61 6c 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20   false..*/.void 
11b60 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
11b70 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  se(Parse *pParse
11b80 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
11b90 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d  nt dest, int jum
11ba0 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65  pIfNull){.  Vdbe
11bb0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
11bc0 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20  dbe;.  int op = 
11bd0 30 3b 0a 20 20 69 6e 74 20 63 6b 4f 66 66 73 65  0;.  int ckOffse
11be0 74 20 3d 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66  t = pParse->ckOf
11bf0 66 73 65 74 3b 0a 20 20 69 66 28 20 76 3d 3d 30  fset;.  if( v==0
11c00 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29 20 72   || pExpr==0 ) r
11c10 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65  eturn;..  /* The
11c20 20 76 61 6c 75 65 20 6f 66 20 70 45 78 70 72 2d   value of pExpr-
11c30 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72 65 20 72  >op and op are r
11c40 65 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77  elated as follow
11c50 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
11c60 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20 20     pExpr->op    
11c70 20 20 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a 20          op.  ** 
11c80 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20        --------- 
11c90 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d           -------
11ca0 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  ---.  **       T
11cb0 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20 20 20  K_ISNULL        
11cc0 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a    OP_NotNull.  *
11cd0 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e 55  *       TK_NOTNU
11ce0 4c 4c 20 20 20 20 20 20 20 20 20 4f 50 5f 49 73  LL         OP_Is
11cf0 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20  Null.  **       
11d00 54 4b 5f 4e 45 20 20 20 20 20 20 20 20 20 20 20  TK_NE           
11d10 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20 20     OP_Eq.  **   
11d20 20 20 20 20 54 4b 5f 45 51 20 20 20 20 20 20 20      TK_EQ       
11d30 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20 2a         OP_Ne.  *
11d40 2a 20 20 20 20 20 20 20 54 4b 5f 47 54 20 20 20  *       TK_GT   
11d50 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 65             OP_Le
11d60 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c  .  **       TK_L
11d70 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  E              O
11d80 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Gt.  **       
11d90 54 4b 5f 47 45 20 20 20 20 20 20 20 20 20 20 20  TK_GE           
11da0 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20 20     OP_Lt.  **   
11db0 20 20 20 20 54 4b 5f 4c 54 20 20 20 20 20 20 20      TK_LT       
11dc0 20 20 20 20 20 20 20 4f 50 5f 47 65 0a 20 20 2a         OP_Ge.  *
11dd0 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65 72  *.  ** For other
11de0 20 76 61 6c 75 65 73 20 6f 66 20 70 45 78 70 72   values of pExpr
11df0 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64 65  ->op, op is unde
11e00 66 69 6e 65 64 20 61 6e 64 20 75 6e 75 73 65 64  fined and unused
11e10 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65  ..  ** The value
11e20 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20   of TK_ and OP_ 
11e30 63 6f 6e 73 74 61 6e 74 73 20 61 72 65 20 61 72  constants are ar
11e40 72 61 6e 67 65 64 20 73 75 63 68 20 74 68 61 74  ranged such that
11e50 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f 6d   we.  ** can com
11e60 70 75 74 65 20 74 68 65 20 6d 61 70 70 69 6e 67  pute the mapping
11e70 20 61 62 6f 76 65 20 75 73 69 6e 67 20 74 68 65   above using the
11e80 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65   following expre
11e90 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73 65  ssion..  ** Asse
11ea0 72 74 28 29 73 20 76 65 72 69 66 79 20 74 68 61  rt()s verify tha
11eb0 74 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f  t the computatio
11ec0 6e 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20  n is correct..  
11ed0 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45 78 70  */.  op = ((pExp
11ee0 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c  r->op+(TK_ISNULL
11ef0 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e 55  &1))^1)-(TK_ISNU
11f00 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65 72  LL&1);..  /* Ver
11f10 69 66 79 20 63 6f 72 72 65 63 74 20 61 6c 69 67  ify correct alig
11f20 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e 64  nment of TK_ and
11f30 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a 20   OP_ constants. 
11f40 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45   */.  assert( pE
11f50 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55  xpr->op!=TK_ISNU
11f60 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74  LL || op==OP_Not
11f70 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Null );.  assert
11f80 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
11f90 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f  NOTNULL || op==O
11fa0 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61 73  P_IsNull );.  as
11fb0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
11fc0 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_NE || op==OP
11fd0 5f 45 71 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Eq );.  assert(
11fe0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45   pExpr->op!=TK_E
11ff0 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29  Q || op==OP_Ne )
12000 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
12010 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20  r->op!=TK_LT || 
12020 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 61  op==OP_Ge );.  a
12030 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
12040 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_LE || op==O
12050 50 5f 47 74 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Gt );.  assert
12060 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
12070 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20  GT || op==OP_Le 
12080 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
12090 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c  pr->op!=TK_GE ||
120a0 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20   op==OP_Lt );.. 
120b0 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
120c0 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
120d0 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 73  K_AND: {.      s
120e0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
120f0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
12100 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
12110 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
12120 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
12130 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
12140 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
12150 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
12160 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
12170 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
12180 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20   {.      int d2 
12190 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
121a0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
121b0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
121c0 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
121d0 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 21 6a 75  ->pLeft, d2, !ju
121e0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
121f0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
12200 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
12210 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
12220 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
12230 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
12240 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
12250 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  2);.      break;
12260 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
12270 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_NOT: {.      
12280 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
12290 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
122a0 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
122b0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
122c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
122d0 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
122e0 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
122f0 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
12300 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
12310 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
12320 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a    case TK_EQ: {.
12330 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
12340 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
12350 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
12360 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
12370 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
12380 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
12390 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
123a0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
123b0 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
123c0 2c 20 6f 70 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , op, dest, jump
123d0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
123e0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
123f0 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
12400 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
12410 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ULL: {.      sql
12420 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
12430 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
12440 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
12450 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  3VdbeAddOp(v, op
12460 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  , 1, dest);.    
12470 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
12480 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
12490 45 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  EN: {.      /* T
124a0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
124b0 20 22 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e   "x BETWEEN y AN
124c0 44 20 7a 22 2e 20 49 74 20 69 73 20 69 6d 70 6c  D z". It is impl
124d0 65 6d 65 6e 74 65 64 20 61 73 3a 0a 20 20 20 20  emented as:.    
124e0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 31 20    **.      ** 1 
124f0 49 46 20 28 78 20 3e 3d 20 79 29 20 47 4f 54 4f  IF (x >= y) GOTO
12500 20 33 0a 20 20 20 20 20 20 2a 2a 20 32 20 47 4f   3.      ** 2 GO
12510 54 4f 20 3c 64 65 73 74 3e 0a 20 20 20 20 20 20  TO <dest>.      
12520 2a 2a 20 33 20 49 46 20 28 78 20 3e 20 7a 29 20  ** 3 IF (x > z) 
12530 47 4f 54 4f 20 3c 64 65 73 74 3e 0a 20 20 20 20  GOTO <dest>.    
12540 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61    */.      int a
12550 64 64 72 3b 0a 20 20 20 20 20 20 45 78 70 72 20  ddr;.      Expr 
12560 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
12570 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 45 78 70  pLeft;.      Exp
12580 72 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78 70  r *pRight = pExp
12590 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  r->pList->a[0].p
125a0 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
125b0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
125c0 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20  se, pLeft);.    
125d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
125e0 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c  Op(v, OP_Dup, 0,
125f0 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
12600 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
12610 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  e, pRight);.    
12620 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
12630 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
12640 76 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  v);.      codeCo
12650 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c  mpare(pParse, pL
12660 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f  eft, pRight, OP_
12670 47 65 2c 20 61 64 64 72 2b 33 2c 20 21 6a 75 6d  Ge, addr+3, !jum
12680 70 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20 20  pIfNull);..     
12690 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
126a0 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20  p(v, OP_Pop, 1, 
126b0 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
126c0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
126d0 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 29 3b  _Goto, 0, dest);
126e0 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20  .      pRight = 
126f0 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
12700 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  1].pExpr;.      
12710 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
12720 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b  pParse, pRight);
12730 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
12740 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  re(pParse, pLeft
12750 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 74 2c  , pRight, OP_Gt,
12760 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
12770 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
12780 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
12790 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  lt: {.      sqli
127a0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
127b0 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  se, pExpr);.    
127c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
127d0 4f 70 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  Op(v, OP_IfNot, 
127e0 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73 74  jumpIfNull, dest
127f0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
12800 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72      }.  }.  pPar
12810 73 65 2d 3e 63 6b 4f 66 66 73 65 74 20 3d 20 63  se->ckOffset = c
12820 6b 4f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  kOffset;.}../*.*
12830 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d 70  * Do a deep comp
12840 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78  arison of two ex
12850 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e 20  pression trees. 
12860 20 52 65 74 75 72 6e 20 54 52 55 45 20 28 6e 6f   Return TRUE (no
12870 6e 2d 7a 65 72 6f 29 0a 2a 2a 20 69 66 20 74 68  n-zero).** if th
12880 65 79 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c  ey are identical
12890 20 61 6e 64 20 72 65 74 75 72 6e 20 46 41 4c 53   and return FALS
128a0 45 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72  E if they differ
128b0 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a   in any way..**.
128c0 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 69  ** Sometimes thi
128d0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
128e0 65 74 75 72 6e 20 46 41 4c 53 45 20 65 76 65 6e  eturn FALSE even
128f0 20 69 66 20 74 68 65 20 74 77 6f 20 65 78 70 72   if the two expr
12900 65 73 73 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c  essions.** reall
12910 79 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74  y are equivalent
12920 2e 20 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20  .  If we cannot 
12930 70 72 6f 76 65 20 74 68 61 74 20 74 68 65 20 65  prove that the e
12940 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a  xpressions are.*
12950 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 77 65 20  * identical, we 
12960 72 65 74 75 72 6e 20 46 41 4c 53 45 20 6a 75 73  return FALSE jus
12970 74 20 74 6f 20 62 65 20 73 61 66 65 2e 20 20 53  t to be safe.  S
12980 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  o if this routin
12990 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 66 61 6c  e.** returns fal
129a0 73 65 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20  se, then you do 
129b0 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20  not really know 
129c0 66 6f 72 20 63 65 72 74 61 69 6e 20 69 66 20 74  for certain if t
129d0 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73  he two.** expres
129e0 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61  sions are the sa
129f0 6d 65 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20  me.  But if you 
12a00 67 65 74 20 61 20 54 52 55 45 20 72 65 74 75 72  get a TRUE retur
12a10 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63  n, then you.** c
12a20 61 6e 20 62 65 20 73 75 72 65 20 74 68 65 20 65  an be sure the e
12a30 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74  xpressions are t
12a40 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74 68 65  he same.  In the
12a50 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a 2a 2a   places where.**
12a60 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
12a70 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73 20 6e   used, it does n
12a80 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74 20 61  ot hurt to get a
12a90 6e 20 65 78 74 72 61 20 46 41 4c 53 45 20 2d 20  n extra FALSE - 
12aa0 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67  that.** just mig
12ab0 68 74 20 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d  ht result in som
12ac0 65 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65  e slightly slowe
12ad0 72 20 63 6f 64 65 2e 20 20 42 75 74 20 72 65 74  r code.  But ret
12ae0 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63  urning.** an inc
12af0 6f 72 72 65 63 74 20 54 52 55 45 20 63 6f 75 6c  orrect TRUE coul
12b00 64 20 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66  d lead to a malf
12b10 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  unction..*/.int 
12b20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
12b30 72 65 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70  re(Expr *pA, Exp
12b40 72 20 2a 70 42 29 7b 0a 20 20 69 6e 74 20 69 3b  r *pB){.  int i;
12b50 0a 20 20 69 66 28 20 70 41 3d 3d 30 7c 7c 70 42  .  if( pA==0||pB
12b60 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
12b70 6e 20 70 42 3d 3d 70 41 3b 0a 20 20 7d 0a 20 20  n pB==pA;.  }.  
12b80 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e  if( pA->op!=pB->
12b90 6f 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  op ) return 0;. 
12ba0 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20   if( (pA->flags 
12bb0 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 21 3d  & EP_Distinct)!=
12bc0 28 70 42 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  (pB->flags & EP_
12bd0 44 69 73 74 69 6e 63 74 29 20 29 20 72 65 74 75  Distinct) ) retu
12be0 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c  rn 0;.  if( !sql
12bf0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
12c00 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70  pA->pLeft, pB->p
12c10 4c 65 66 74 29 20 29 20 72 65 74 75 72 6e 20 30  Left) ) return 0
12c20 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
12c30 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e  ExprCompare(pA->
12c40 70 52 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67  pRight, pB->pRig
12c50 68 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ht) ) return 0;.
12c60 20 20 69 66 28 20 70 41 2d 3e 70 4c 69 73 74 20    if( pA->pList 
12c70 29 7b 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 70  ){.    if( pB->p
12c80 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
12c90 20 30 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e   0;.    if( pA->
12ca0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 42  pList->nExpr!=pB
12cb0 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  ->pList->nExpr )
12cc0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 66   return 0;.    f
12cd0 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 70 4c  or(i=0; i<pA->pL
12ce0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
12cf0 7b 0a 20 20 20 20 20 20 69 66 28 20 21 73 71 6c  {.      if( !sql
12d00 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
12d10 70 41 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  pA->pList->a[i].
12d20 70 45 78 70 72 2c 20 70 42 2d 3e 70 4c 69 73 74  pExpr, pB->pList
12d30 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b  ->a[i].pExpr) ){
12d40 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
12d50 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
12d60 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 2d  .  }else if( pB-
12d70 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 72 65  >pList ){.    re
12d80 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
12d90 28 20 70 41 2d 3e 70 53 65 6c 65 63 74 20 7c 7c  ( pA->pSelect ||
12da0 20 70 42 2d 3e 70 53 65 6c 65 63 74 20 29 20 72   pB->pSelect ) r
12db0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
12dc0 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69  A->iTable!=pB->i
12dd0 54 61 62 6c 65 20 7c 7c 20 70 41 2d 3e 69 43 6f  Table || pA->iCo
12de0 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d  lumn!=pB->iColum
12df0 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  n ) return 0;.  
12e00 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43  if( pA->op!=TK_C
12e10 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 74 6f 6b  OLUMN && pA->tok
12e20 65 6e 2e 7a 20 29 7b 0a 20 20 20 20 69 66 28 20  en.z ){.    if( 
12e30 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29  pB->token.z==0 )
12e40 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69   return 0;.    i
12e50 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d  f( pB->token.n!=
12e60 70 41 2d 3e 74 6f 6b 65 6e 2e 6e 20 29 20 72 65  pA->token.n ) re
12e70 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20  turn 0;.    if( 
12e80 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
12e90 28 63 68 61 72 2a 29 70 41 2d 3e 74 6f 6b 65 6e  (char*)pA->token
12ea0 2e 7a 2c 28 63 68 61 72 2a 29 70 42 2d 3e 74 6f  .z,(char*)pB->to
12eb0 6b 65 6e 2e 7a 2c 70 42 2d 3e 74 6f 6b 65 6e 2e  ken.z,pB->token.
12ec0 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  n)!=0 ){.      r
12ed0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
12ee0 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
12ef0 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  .../*.** Add a n
12f00 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
12f10 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  e pAggInfo->aCol
12f20 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72  [] array.  Retur
12f30 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a  n the index of.*
12f40 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e  * the new elemen
12f50 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67  t.  Return a neg
12f60 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20  ative number if 
12f70 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f  malloc fails..*/
12f80 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41  .static int addA
12f90 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c  ggInfoColumn(sql
12fa0 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66  ite3 *db, AggInf
12fb0 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74  o *pInfo){.  int
12fc0 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f   i;.  pInfo->aCo
12fd0 6c 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79  l = sqlite3Array
12fe0 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20  Allocate(.      
12ff0 20 64 62 2c 0a 20 20 20 20 20 20 20 70 49 6e 66   db,.       pInf
13000 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20  o->aCol,.       
13010 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43  sizeof(pInfo->aC
13020 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 33  ol[0]),.       3
13030 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d  ,.       &pInfo-
13040 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  >nColumn,.      
13050 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e   &pInfo->nColumn
13060 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 20 26 69  Alloc,.       &i
13070 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  .  );.  return i
13080 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41  ;.}    ../*.** A
13090 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
130a0 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f   to the pAggInfo
130b0 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e  ->aFunc[] array.
130c0 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64    Return the ind
130d0 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ex of.** the new
130e0 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72   element.  Retur
130f0 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  n a negative num
13100 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61  ber if malloc fa
13110 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
13120 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e  nt addAggInfoFun
13130 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41  c(sqlite3 *db, A
13140 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a  ggInfo *pInfo){.
13150 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f    int i;.  pInfo
13160 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69 74 65  ->aFunc = sqlite
13170 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a  3ArrayAllocate(.
13180 20 20 20 20 20 20 20 64 62 2c 20 0a 20 20 20 20         db, .    
13190 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c     pInfo->aFunc,
131a0 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70  .       sizeof(p
131b0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c  Info->aFunc[0]),
131c0 0a 20 20 20 20 20 20 20 33 2c 0a 20 20 20 20 20  .       3,.     
131d0 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c    &pInfo->nFunc,
131e0 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e  .       &pInfo->
131f0 6e 46 75 6e 63 41 6c 6c 6f 63 2c 0a 20 20 20 20  nFuncAlloc,.    
13200 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74     &i.  );.  ret
13210 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a  urn i;.}    ../*
13220 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 78  .** This is an x
13230 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b 45 78 70  Func for walkExp
13240 72 54 72 65 65 28 29 20 75 73 65 64 20 74 6f 20  rTree() used to 
13250 69 6d 70 6c 65 6d 65 6e 74 20 0a 2a 2a 20 73 71  implement .** sq
13260 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
13270 41 67 67 72 65 67 61 74 65 73 28 29 2e 20 20 53  Aggregates().  S
13280 65 65 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  ee sqlite3ExprAn
13290 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 0a  alyzeAggregates.
132a0 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ** for additiona
132b0 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
132c0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
132d0 65 20 61 6e 61 6c 79 7a 65 73 20 74 68 65 20 61  e analyzes the a
132e0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
132f0 6e 20 61 74 20 70 45 78 70 72 2e 0a 2a 2f 0a 73  n at pExpr..*/.s
13300 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a  tatic int analyz
13310 65 41 67 67 72 65 67 61 74 65 28 76 6f 69 64 20  eAggregate(void 
13320 2a 70 41 72 67 2c 20 45 78 70 72 20 2a 70 45 78  *pArg, Expr *pEx
13330 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  pr){.  int i;.  
13340 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
13350 20 3d 20 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20   = (NameContext 
13360 2a 29 70 41 72 67 3b 0a 20 20 50 61 72 73 65 20  *)pArg;.  Parse 
13370 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  *pParse = pNC->p
13380 50 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73 74  Parse;.  SrcList
13390 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43   *pSrcList = pNC
133a0 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 41 67  ->pSrcList;.  Ag
133b0 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20  gInfo *pAggInfo 
133c0 3d 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b  = pNC->pAggInfo;
133d0 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
133e0 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
133f0 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
13400 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
13410 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  UMN: {.      /* 
13420 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
13430 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e  the column is in
13440 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c   one of the tabl
13450 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20  es in the FROM. 
13460 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f       ** clause o
13470 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
13480 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69  query */.      i
13490 66 28 20 70 53 72 63 4c 69 73 74 20 29 7b 0a 20  f( pSrcList ){. 
134a0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72         struct Sr
134b0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
134c0 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b  m = pSrcList->a;
134d0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
134e0 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53  ; i<pSrcList->nS
134f0 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
13500 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  ){.          str
13510 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
13520 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20  *pCol;.         
13530 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62   if( pExpr->iTab
13540 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73  le==pItem->iCurs
13550 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  or ){.          
13560 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
13570 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20   this point, it 
13580 6d 65 61 6e 73 20 74 68 61 74 20 70 45 78 70 72  means that pExpr
13590 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
135a0 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  le.            *
135b0 2a 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65  * that is in the
135c0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
135d0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75  the aggregate qu
135e0 65 72 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20  ery.  .         
135f0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
13600 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74    ** Make an ent
13610 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ry for the colum
13620 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61  n in pAggInfo->a
13630 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20  Col[] if there. 
13640 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73             ** is
13650 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68   not an entry th
13660 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20  ere already..   
13670 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
13680 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20          int k;. 
13690 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20             pCol 
136a0 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  = pAggInfo->aCol
136b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
136c0 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66  r(k=0; k<pAggInf
136d0 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c  o->nColumn; k++,
136e0 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   pCol++){.      
136f0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
13700 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d  ->iTable==pExpr-
13710 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20  >iTable &&.     
13720 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
13730 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70  l->iColumn==pExp
13740 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  r->iColumn ){.  
13750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
13760 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
13770 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
13780 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
13790 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d  f( (k>=pAggInfo-
137a0 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20  >nColumn).      
137b0 20 20 20 20 20 20 20 26 26 20 28 6b 20 3d 20 61         && (k = a
137c0 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28  ddAggInfoColumn(
137d0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67  pParse->db, pAgg
137e0 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20  Info))>=0 .     
137f0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
13800 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26          pCol = &
13810 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b  pAggInfo->aCol[k
13820 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
13830 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45   pCol->pTab = pE
13840 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  xpr->pTab;.     
13850 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
13860 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69  Table = pExpr->i
13870 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
13880 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75       pCol->iColu
13890 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  mn = pExpr->iCol
138a0 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  umn;.           
138b0 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20     pCol->iMem = 
138c0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a  pParse->nMem++;.
138d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
138e0 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
138f0 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  n = -1;.        
13900 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70        pCol->pExp
13910 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  r = pExpr;.     
13920 20 20 20 20 20 20 20 20 20 69 66 28 20 70 41 67           if( pAg
13930 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20  gInfo->pGroupBy 
13940 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
13950 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20     int j, n;.   
13960 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
13970 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67  rList *pGB = pAg
13980 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b  gInfo->pGroupBy;
13990 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
139a0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
139b0 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70  _item *pTerm = p
139c0 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20  GB->a;.         
139d0 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e         n = pGB->
139e0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  nExpr;.         
139f0 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
13a00 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b  j<n; j++, pTerm+
13a10 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
13a20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
13a30 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
13a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a50 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
13a60 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54  COLUMN && pE->iT
13a70 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61  able==pExpr->iTa
13a80 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20  ble &&.         
13a90 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 2d               pE-
13aa0 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d  >iColumn==pExpr-
13ab0 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
13ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ad0 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
13ae0 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  umn = j;.       
13af0 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
13b00 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
13b10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
13b20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13b30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13b40 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
13b50 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c  ->iSorterColumn<
13b60 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
13b70 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
13b80 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49  erColumn = pAggI
13b90 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c  nfo->nSortingCol
13ba0 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  umn++;.         
13bb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
13bc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
13bd0 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77   /* There is now
13be0 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45   an entry for pE
13bf0 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  xpr in pAggInfo-
13c00 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a  >aCol[] (either.
13c10 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62              ** b
13c20 65 63 61 75 73 65 20 69 74 20 77 61 73 20 74 68  ecause it was th
13c30 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65  ere before or be
13c40 63 61 75 73 65 20 77 65 20 6a 75 73 74 20 63 72  cause we just cr
13c50 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20  eated it)..     
13c60 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72         ** Conver
13c70 74 20 74 68 65 20 70 45 78 70 72 20 74 6f 20 62  t the pExpr to b
13c80 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  e a TK_AGG_COLUM
13c90 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74  N referring to t
13ca0 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  hat.            
13cb0 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  ** pAggInfo->aCo
13cc0 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20  l[] entry..     
13cd0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
13ce0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67        pExpr->pAg
13cf0 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f  gInfo = pAggInfo
13d00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
13d10 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47  xpr->op = TK_AGG
13d20 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20  _COLUMN;.       
13d30 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67       pExpr->iAgg
13d40 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20   = k;.          
13d50 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
13d60 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45     } /* endif pE
13d70 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74  xpr->iTable==pIt
13d80 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20  em->iCursor */. 
13d90 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20         } /* end 
13da0 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63 4c 69  loop over pSrcLi
13db0 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  st */.      }.  
13dc0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
13dd0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
13de0 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a  AGG_FUNCTION: {.
13df0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 4e 43        /* The pNC
13e00 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 74 65 73 74  ->nDepth==0 test
13e10 20 63 61 75 73 65 73 20 61 67 67 72 65 67 61 74   causes aggregat
13e20 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 73  e functions in s
13e30 75 62 71 75 65 72 69 65 73 0a 20 20 20 20 20 20  ubqueries.      
13e40 2a 2a 20 74 6f 20 62 65 20 69 67 6e 6f 72 65 64  ** to be ignored
13e50 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4e   */.      if( pN
13e60 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 29 7b 0a  C->nDepth==0 ){.
13e70 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
13e80 20 74 6f 20 73 65 65 20 69 66 20 70 45 78 70 72   to see if pExpr
13e90 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20   is a duplicate 
13ea0 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65  of another aggre
13eb0 67 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  gate .        **
13ec0 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69   function that i
13ed0 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
13ee0 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74   pAggInfo struct
13ef0 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ure.        */. 
13f00 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
13f10 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65  gInfo_func *pIte
13f20 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  m = pAggInfo->aF
13f30 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  unc;.        for
13f40 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f  (i=0; i<pAggInfo
13f50 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49  ->nFunc; i++, pI
13f60 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
13f70 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
13f80 72 43 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e  rCompare(pItem->
13f90 70 45 78 70 72 2c 20 70 45 78 70 72 29 20 29 7b  pExpr, pExpr) ){
13fa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
13fb0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
13fc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13fd0 20 20 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66    if( i>=pAggInf
13fe0 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20  o->nFunc ){.    
13ff0 20 20 20 20 20 20 2f 2a 20 70 45 78 70 72 20 69        /* pExpr i
14000 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b  s original.  Mak
14010 65 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  e a new entry in
14020 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
14030 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  [].          */.
14040 20 20 20 20 20 20 20 20 20 20 75 38 20 65 6e 63            u8 enc
14050 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64   = ENC(pParse->d
14060 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20  b);.          i 
14070 3d 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63  = addAggInfoFunc
14080 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67  (pParse->db, pAg
14090 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  gInfo);.        
140a0 20 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20    if( i>=0 ){.  
140b0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 20            pItem 
140c0 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  = &pAggInfo->aFu
140d0 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  nc[i];.         
140e0 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20     pItem->pExpr 
140f0 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
14100 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d       pItem->iMem
14110 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
14120 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  +;.            p
14130 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71  Item->pFunc = sq
14140 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
14150 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20  n(pParse->db,.  
14160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14170 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74   (char*)pExpr->t
14180 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74  oken.z, pExpr->t
14190 6f 6b 65 6e 2e 6e 2c 0a 20 20 20 20 20 20 20 20  oken.n,.        
141a0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
141b0 2d 3e 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d  ->pList ? pExpr-
141c0 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20  >pList->nExpr : 
141d0 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20  0, enc, 0);.    
141e0 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
141f0 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69  r->flags & EP_Di
14200 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20  stinct ){.      
14210 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
14220 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73  Distinct = pPars
14230 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
14240 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
14250 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
14260 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d  m->iDistinct = -
14270 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
14280 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
14290 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
142a0 2a 20 4d 61 6b 65 20 70 45 78 70 72 20 70 6f 69  * Make pExpr poi
142b0 6e 74 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70  nt to the approp
142c0 72 69 61 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e  riate pAggInfo->
142d0 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20  aFunc[] entry.  
142e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
142f0 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 69   pExpr->iAgg = i
14300 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
14310 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67  >pAggInfo = pAgg
14320 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 72 65  Info;.        re
14330 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
14340 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
14350 52 65 63 75 72 73 69 76 65 6c 79 20 77 61 6c 6b  Recursively walk
14360 20 73 75 62 71 75 65 72 69 65 73 20 6c 6f 6f 6b   subqueries look
14370 69 6e 67 20 66 6f 72 20 54 4b 5f 43 4f 4c 55 4d  ing for TK_COLUM
14380 4e 20 6e 6f 64 65 73 20 74 68 61 74 20 6e 65 65  N nodes that nee
14390 64 0a 20 20 2a 2a 20 74 6f 20 62 65 20 63 68 61  d.  ** to be cha
143a0 6e 67 65 64 20 74 6f 20 54 4b 5f 41 47 47 5f 43  nged to TK_AGG_C
143b0 4f 4c 55 4d 4e 2e 20 20 42 75 74 20 69 6e 63 72  OLUMN.  But incr
143c0 65 6d 65 6e 74 20 6e 44 65 70 74 68 20 73 6f 20  ement nDepth so 
143d0 74 68 61 74 0a 20 20 2a 2a 20 54 4b 5f 41 47 47  that.  ** TK_AGG
143e0 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20  _FUNCTION nodes 
143f0 69 6e 20 73 75 62 71 75 65 72 69 65 73 20 77 69  in subqueries wi
14400 6c 6c 20 62 65 20 75 6e 63 68 61 6e 67 65 64 2e  ll be unchanged.
14410 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  .  */.  if( pExp
14420 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  r->pSelect ){.  
14430 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2b 2b 3b    pNC->nDepth++;
14440 0a 20 20 20 20 77 61 6c 6b 53 65 6c 65 63 74 45  .    walkSelectE
14450 78 70 72 28 70 45 78 70 72 2d 3e 70 53 65 6c 65  xpr(pExpr->pSele
14460 63 74 2c 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  ct, analyzeAggre
14470 67 61 74 65 2c 20 70 4e 43 29 3b 0a 20 20 20 20  gate, pNC);.    
14480 70 4e 43 2d 3e 6e 44 65 70 74 68 2d 2d 3b 0a 20  pNC->nDepth--;. 
14490 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
144a0 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  ../*.** Analyze 
144b0 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
144c0 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  sion looking for
144d0 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
144e0 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
144f0 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e  variables that n
14500 65 65 64 20 74 6f 20 62 65 20 61 64 64 65 64 20  eed to be added 
14510 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61  to the pParse->a
14520 41 67 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 20  Agg[] array..** 
14530 4d 61 6b 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  Make additional 
14540 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65 20 70  entries to the p
14550 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72  Parse->aAgg[] ar
14560 72 61 79 20 61 73 20 6e 65 63 65 73 73 61 72 79  ray as necessary
14570 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
14580 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  tine should only
14590 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72   be called after
145a0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
145b0 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c  has been.** anal
145c0 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 45  yzed by sqlite3E
145d0 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28  xprResolveNames(
145e0 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 72 72 6f  )..**.** If erro
145f0 72 73 20 61 72 65 20 73 65 65 6e 2c 20 6c 65 61  rs are seen, lea
14600 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
14610 61 67 65 20 69 6e 20 7a 45 72 72 4d 73 67 20 61  age in zErrMsg a
14620 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65  nd return.** the
14630 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
14640 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
14650 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
14660 65 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65  egates(NameConte
14670 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70  xt *pNC, Expr *p
14680 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 6e 45 72  Expr){.  int nEr
14690 72 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d  r = pNC->pParse-
146a0 3e 6e 45 72 72 3b 0a 20 20 77 61 6c 6b 45 78 70  >nErr;.  walkExp
146b0 72 54 72 65 65 28 70 45 78 70 72 2c 20 61 6e 61  rTree(pExpr, ana
146c0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 2c 20 70  lyzeAggregate, p
146d0 4e 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e  NC);.  return pN
146e0 43 2d 3e 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  C->pParse->nErr 
146f0 2d 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  - nErr;.}../*.**
14700 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70   Call sqlite3Exp
14710 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
14720 65 73 28 29 20 66 6f 72 20 65 76 65 72 79 20 65  es() for every e
14730 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a  xpression in an.
14740 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
14750 73 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  st.  Return the 
14760 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
14770 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
14780 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68  ror is found, th
14790 65 20 61 6e 61 6c 79 73 69 73 20 69 73 20 63 75  e analysis is cu
147a0 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 69 6e 74 20  t short..*/.int 
147b0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
147c0 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f  zeAggList(NameCo
147d0 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72  ntext *pNC, Expr
147e0 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
147f0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
14800 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
14810 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 45 72 72  nt i;.  int nErr
14820 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4c 69 73   = 0;.  if( pLis
14830 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49 74  t ){.    for(pIt
14840 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
14850 3b 20 6e 45 72 72 3d 3d 30 20 26 26 20 69 3c 70  ; nErr==0 && i<p
14860 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
14870 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
14880 20 20 6e 45 72 72 20 2b 3d 20 73 71 6c 69 74 65    nErr += sqlite
14890 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
148a0 65 67 61 74 65 73 28 70 4e 43 2c 20 70 49 74 65  egates(pNC, pIte
148b0 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d  m->pExpr);.    }
148c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45  .  }.  return nE
148d0 72 72 3b 0a 7d 0a                                rr;.}.