/ Hex Artifact Content
Login

Artifact ef4af51136d98c74abf4ff17c2999a7d36519db9:


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 30 32 20 32 30 30 37 2f 30 38 2f 30 37 20  .302 2007/08/07 
0220: 31 37 3a 30 34 3a 35 39 20 64 72 68 20 45 78 70  17:04:59 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 4d 61 6c 6c   from sqliteMall
1a80: 6f 63 28 29 2e 20 20 54 68 65 20 63 61 6c 6c 69  oc().  The calli
1a90: 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  ng function.** i
1aa0: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
1ab0: 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 74 68  r making sure th
1ac0: 65 20 6e 6f 64 65 20 65 76 65 6e 74 75 61 6c 6c  e node eventuall
1ad0: 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a 2a 2f  y gets freed..*/
1ae0: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
1af0: 70 72 28 69 6e 74 20 6f 70 2c 20 45 78 70 72 20  pr(int op, Expr 
1b00: 2a 70 4c 65 66 74 2c 20 45 78 70 72 20 2a 70 52  *pLeft, Expr *pR
1b10: 69 67 68 74 2c 20 63 6f 6e 73 74 20 54 6f 6b 65  ight, const Toke
1b20: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78  n *pToken){.  Ex
1b30: 70 72 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77  pr *pNew;.  pNew
1b40: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
1b50: 20 73 69 7a 65 6f 66 28 45 78 70 72 29 20 29 3b   sizeof(Expr) );
1b60: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
1b70: 7b 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 6d 61  {.    /* When ma
1b80: 6c 6c 6f 63 20 66 61 69 6c 73 2c 20 64 65 6c 65  lloc fails, dele
1b90: 74 65 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69  te pLeft and pRi
1ba0: 67 68 74 2e 20 45 78 70 72 65 73 73 69 6f 6e 73  ght. Expressions
1bb0: 20 70 61 73 73 65 64 20 74 6f 20 0a 20 20 20 20   passed to .    
1bc0: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
1bd0: 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 20   must always be 
1be0: 61 6c 6c 6f 63 61 74 65 64 20 77 69 74 68 20 73  allocated with s
1bf0: 71 6c 69 74 65 33 45 78 70 72 28 29 20 66 6f 72  qlite3Expr() for
1c00: 20 74 68 69 73 20 0a 20 20 20 20 2a 2a 20 72 65   this .    ** re
1c10: 61 73 6f 6e 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  ason. .    */.  
1c20: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
1c30: 65 74 65 28 70 4c 65 66 74 29 3b 0a 20 20 20 20  ete(pLeft);.    
1c40: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1c50: 65 28 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72  e(pRight);.    r
1c60: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
1c70: 4e 65 77 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20  New->op = op;.  
1c80: 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 4c  pNew->pLeft = pL
1c90: 65 66 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69  eft;.  pNew->pRi
1ca0: 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  ght = pRight;.  
1cb0: 70 4e 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b  pNew->iAgg = -1;
1cc0: 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b  .  if( pToken ){
1cd0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f  .    assert( pTo
1ce0: 6b 65 6e 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20  ken->dyn==0 );. 
1cf0: 20 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20     pNew->span = 
1d00: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70  pNew->token = *p
1d10: 54 6f 6b 65 6e 3b 0a 20 20 7d 65 6c 73 65 20 69  Token;.  }else i
1d20: 66 28 20 70 4c 65 66 74 20 29 7b 0a 20 20 20 20  f( pLeft ){.    
1d30: 69 66 28 20 70 52 69 67 68 74 20 29 7b 0a 20 20  if( pRight ){.  
1d40: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53      sqlite3ExprS
1d50: 70 61 6e 28 70 4e 65 77 2c 20 26 70 4c 65 66 74  pan(pNew, &pLeft
1d60: 2d 3e 73 70 61 6e 2c 20 26 70 52 69 67 68 74 2d  ->span, &pRight-
1d70: 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 69 66  >span);.      if
1d80: 28 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20  ( pRight->flags 
1d90: 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20  & EP_ExpCollate 
1da0: 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
1db0: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78 70  >flags |= EP_Exp
1dc0: 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 20  Collate;.       
1dd0: 20 70 4e 65 77 2d 3e 70 43 6f 6c 6c 20 3d 20 70   pNew->pColl = p
1de0: 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 3b 0a 20 20  Right->pColl;.  
1df0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1e00: 69 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73  if( pLeft->flags
1e10: 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65   & EP_ExpCollate
1e20: 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   ){.      pNew->
1e30: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78 70 43  flags |= EP_ExpC
1e40: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 70 4e  ollate;.      pN
1e50: 65 77 2d 3e 70 43 6f 6c 6c 20 3d 20 70 4c 65 66  ew->pColl = pLef
1e60: 74 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a  t->pColl;.    }.
1e70: 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 45 78    }..  sqlite3Ex
1e80: 70 72 53 65 74 48 65 69 67 68 74 28 70 4e 65 77  prSetHeight(pNew
1e90: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  );.  return pNew
1ea0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 6f 72 6b 73  ;.}../*.** Works
1eb0: 20 6c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70   like sqlite3Exp
1ec0: 72 28 29 20 62 75 74 20 66 72 65 65 73 20 69 74  r() but frees it
1ed0: 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67  s pLeft and pRig
1ee0: 68 74 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2a 20  ht arguments.** 
1ef0: 69 66 20 69 74 20 66 61 69 6c 73 20 64 75 65 20  if it fails due 
1f00: 74 6f 20 61 20 6d 61 6c 6c 6f 63 20 70 72 6f 62  to a malloc prob
1f10: 6c 65 6d 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  lem..*/.Expr *sq
1f20: 6c 69 74 65 33 45 78 70 72 4f 72 46 72 65 65 28  lite3ExprOrFree(
1f30: 69 6e 74 20 6f 70 2c 20 45 78 70 72 20 2a 70 4c  int op, Expr *pL
1f40: 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68  eft, Expr *pRigh
1f50: 74 2c 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a  t, const Token *
1f60: 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20  pToken){.  Expr 
1f70: 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45  *pNew = sqlite3E
1f80: 78 70 72 28 6f 70 2c 20 70 4c 65 66 74 2c 20 70  xpr(op, pLeft, p
1f90: 52 69 67 68 74 2c 20 70 54 6f 6b 65 6e 29 3b 0a  Right, pToken);.
1fa0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
1fb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1fc0: 44 65 6c 65 74 65 28 70 4c 65 66 74 29 3b 0a 20  Delete(pLeft);. 
1fd0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
1fe0: 6c 65 74 65 28 70 52 69 67 68 74 29 3b 0a 20 20  lete(pRight);.  
1ff0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
2000: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64  .}../*.** When d
2010: 6f 69 6e 67 20 61 20 6e 65 73 74 65 64 20 70 61  oing a nested pa
2020: 72 73 65 2c 20 79 6f 75 20 63 61 6e 20 69 6e 63  rse, you can inc
2030: 6c 75 64 65 20 74 65 72 6d 73 20 69 6e 20 61 6e  lude terms in an
2040: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74   expression.** t
2050: 68 61 74 20 6c 6f 6f 6b 20 6c 69 6b 65 20 74 68  hat look like th
2060: 69 73 3a 20 20 20 23 30 20 23 31 20 23 32 20 2e  is:   #0 #1 #2 .
2070: 2e 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73 20  ..  These terms 
2080: 72 65 66 65 72 20 74 6f 20 65 6c 65 6d 65 6e 74  refer to element
2090: 73 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61 63  s.** on the stac
20a0: 6b 2e 20 20 22 23 30 22 20 6d 65 61 6e 73 20 74  k.  "#0" means t
20b0: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
20c0: 61 63 6b 2e 0a 2a 2a 20 22 23 31 22 20 6d 65 61  ack..** "#1" mea
20d0: 6e 73 20 74 68 65 20 6e 65 78 74 20 64 6f 77 6e  ns the next down
20e0: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
20f0: 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a  And so forth..**
2100: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2110: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
2120: 65 20 70 61 72 73 65 72 20 74 6f 20 64 65 61 6c  e parser to deal
2130: 20 77 69 74 68 20 6f 6e 20 6f 66 20 74 68 6f 73   with on of thos
2140: 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 49 74 20 69  e terms..** It i
2150: 6d 6d 65 64 69 61 74 65 6c 79 20 67 65 6e 65 72  mmediately gener
2160: 61 74 65 73 20 63 6f 64 65 20 74 6f 20 73 74 6f  ates code to sto
2170: 72 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  re the value in 
2180: 61 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  a memory locatio
2190: 6e 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  n..** The return
21a0: 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  s an expression 
21b0: 74 68 61 74 20 77 69 6c 6c 20 63 6f 64 65 20 74  that will code t
21c0: 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 76 61  o extract the va
21d0: 6c 75 65 20 66 72 6f 6d 0a 2a 2a 20 74 68 61 74  lue from.** that
21e0: 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
21f0: 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 45   as needed..*/.E
2200: 78 70 72 20 2a 73 71 6c 69 74 65 33 52 65 67 69  xpr *sqlite3Regi
2210: 73 74 65 72 45 78 70 72 28 50 61 72 73 65 20 2a  sterExpr(Parse *
2220: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
2230: 54 6f 6b 65 6e 29 7b 0a 20 20 56 64 62 65 20 2a  Token){.  Vdbe *
2240: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
2250: 65 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20  e;.  Expr *p;.  
2260: 69 6e 74 20 64 65 70 74 68 3b 0a 20 20 69 66 28  int depth;.  if(
2270: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d   pParse->nested=
2280: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
2290: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
22a0: 2c 20 22 6e 65 61 72 20 5c 22 25 54 5c 22 3a 20  , "near \"%T\": 
22b0: 73 79 6e 74 61 78 20 65 72 72 6f 72 22 2c 20 70  syntax error", p
22c0: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 72 65 74 75  Token);.    retu
22d0: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 28 54  rn sqlite3Expr(T
22e0: 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20 30 29  K_NULL, 0, 0, 0)
22f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 76 3d 3d 30  ;.  }.  if( v==0
2300: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
2310: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
2320: 4b 5f 52 45 47 49 53 54 45 52 2c 20 30 2c 20 30  K_REGISTER, 0, 0
2330: 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28  , pToken);.  if(
2340: 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74   p==0 ){.    ret
2350: 75 72 6e 20 30 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  urn 0;  /* Mallo
2360: 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a  c failed */.  }.
2370: 20 20 64 65 70 74 68 20 3d 20 61 74 6f 69 28 28    depth = atoi((
2380: 63 68 61 72 2a 29 26 70 54 6f 6b 65 6e 2d 3e 7a  char*)&pToken->z
2390: 5b 31 5d 29 3b 0a 20 20 70 2d 3e 69 54 61 62 6c  [1]);.  p->iTabl
23a0: 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  e = pParse->nMem
23b0: 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ++;.  sqlite3Vdb
23c0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70  eAddOp(v, OP_Dup
23d0: 2c 20 64 65 70 74 68 2c 20 30 29 3b 0a 20 20 73  , depth, 0);.  s
23e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
23f0: 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
2400: 70 2d 3e 69 54 61 62 6c 65 2c 20 31 29 3b 0a 20  p->iTable, 1);. 
2410: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
2420: 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70  .** Join two exp
2430: 72 65 73 73 69 6f 6e 73 20 75 73 69 6e 67 20 61  ressions using a
2440: 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20  n AND operator. 
2450: 20 49 66 20 65 69 74 68 65 72 20 65 78 70 72 65   If either expre
2460: 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c  ssion is.** NULL
2470: 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75  , then just retu
2480: 72 6e 20 74 68 65 20 6f 74 68 65 72 20 65 78 70  rn the other exp
2490: 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 45 78 70 72  ression..*/.Expr
24a0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64   *sqlite3ExprAnd
24b0: 28 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78  (Expr *pLeft, Ex
24c0: 70 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69  pr *pRight){.  i
24d0: 66 28 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20  f( pLeft==0 ){. 
24e0: 20 20 20 72 65 74 75 72 6e 20 70 52 69 67 68 74     return pRight
24f0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52  ;.  }else if( pR
2500: 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ight==0 ){.    r
2510: 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d  eturn pLeft;.  }
2520: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
2530: 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f   sqlite3Expr(TK_
2540: 41 4e 44 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  AND, pLeft, pRig
2550: 68 74 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ht, 0);.  }.}../
2560: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70  *.** Set the Exp
2570: 72 2e 73 70 61 6e 20 66 69 65 6c 64 20 6f 66 20  r.span field of 
2580: 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
2590: 73 69 6f 6e 20 74 6f 20 73 70 61 6e 20 61 6c 6c  sion to span all
25a0: 0a 2a 2a 20 74 65 78 74 20 62 65 74 77 65 65 6e  .** text between
25b0: 20 74 68 65 20 74 77 6f 20 67 69 76 65 6e 20 74   the two given t
25c0: 6f 6b 65 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  okens..*/.void s
25d0: 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28 45  qlite3ExprSpan(E
25e0: 78 70 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65  xpr *pExpr, Toke
25f0: 6e 20 2a 70 4c 65 66 74 2c 20 54 6f 6b 65 6e 20  n *pLeft, Token 
2600: 2a 70 52 69 67 68 74 29 7b 0a 20 20 61 73 73 65  *pRight){.  asse
2610: 72 74 28 20 70 52 69 67 68 74 21 3d 30 20 29 3b  rt( pRight!=0 );
2620: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74  .  assert( pLeft
2630: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 73 71  !=0 );.  if( !sq
2640: 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65  lite3MallocFaile
2650: 64 28 29 20 26 26 20 70 52 69 67 68 74 2d 3e 7a  d() && pRight->z
2660: 20 26 26 20 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a   && pLeft->z ){.
2670: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66      assert( pLef
2680: 74 2d 3e 64 79 6e 3d 3d 30 20 7c 7c 20 70 4c 65  t->dyn==0 || pLe
2690: 66 74 2d 3e 7a 5b 70 4c 65 66 74 2d 3e 6e 5d 3d  ft->z[pLeft->n]=
26a0: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  =0 );.    if( pL
26b0: 65 66 74 2d 3e 64 79 6e 3d 3d 30 20 26 26 20 70  eft->dyn==0 && p
26c0: 52 69 67 68 74 2d 3e 64 79 6e 3d 3d 30 20 29 7b  Right->dyn==0 ){
26d0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70  .      pExpr->sp
26e0: 61 6e 2e 7a 20 3d 20 70 4c 65 66 74 2d 3e 7a 3b  an.z = pLeft->z;
26f0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70  .      pExpr->sp
2700: 61 6e 2e 6e 20 3d 20 70 52 69 67 68 74 2d 3e 6e  an.n = pRight->n
2710: 20 2b 20 28 70 52 69 67 68 74 2d 3e 7a 20 2d 20   + (pRight->z - 
2720: 70 4c 65 66 74 2d 3e 7a 29 3b 0a 20 20 20 20 7d  pLeft->z);.    }
2730: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 45 78 70  else{.      pExp
2740: 72 2d 3e 73 70 61 6e 2e 7a 20 3d 20 30 3b 0a 20  r->span.z = 0;. 
2750: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
2760: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65  * Construct a ne
2770: 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  w expression nod
2780: 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e  e for a function
2790: 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a   with multiple.*
27a0: 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a  * arguments..*/.
27b0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
27c0: 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 4c 69  rFunction(ExprLi
27d0: 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e  st *pList, Token
27e0: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70   *pToken){.  Exp
27f0: 72 20 2a 70 4e 65 77 3b 0a 20 20 61 73 73 65 72  r *pNew;.  asser
2800: 74 28 20 70 54 6f 6b 65 6e 20 29 3b 0a 20 20 70  t( pToken );.  p
2810: 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  New = sqliteMall
2820: 6f 63 28 20 73 69 7a 65 6f 66 28 45 78 70 72 29  oc( sizeof(Expr)
2830: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
2840: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
2850: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
2860: 4c 69 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20  List); /* Avoid 
2870: 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 77  leaking memory w
2880: 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73  hen malloc fails
2890: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30   */.    return 0
28a0: 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70  ;.  }.  pNew->op
28b0: 20 3d 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3b 0a   = TK_FUNCTION;.
28c0: 20 20 70 4e 65 77 2d 3e 70 4c 69 73 74 20 3d 20    pNew->pList = 
28d0: 70 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74 28  pList;.  assert(
28e0: 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e 3d 3d 30 20   pToken->dyn==0 
28f0: 29 3b 0a 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e  );.  pNew->token
2900: 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 70 4e   = *pToken;.  pN
2910: 65 77 2d 3e 73 70 61 6e 20 3d 20 70 4e 65 77 2d  ew->span = pNew-
2920: 3e 74 6f 6b 65 6e 3b 0a 0a 20 20 73 71 6c 69 74  >token;..  sqlit
2930: 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74 28  e3ExprSetHeight(
2940: 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20  pNew);.  return 
2950: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  pNew;.}../*.** A
2960: 73 73 69 67 6e 20 61 20 76 61 72 69 61 62 6c 65  ssign a variable
2970: 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20 65 78   number to an ex
2980: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 65 6e  pression that en
2990: 63 6f 64 65 73 20 61 20 77 69 6c 64 63 61 72 64  codes a wildcard
29a0: 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69 67 69  .** in the origi
29b0: 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  nal SQL statemen
29c0: 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63  t.  .**.** Wildc
29d0: 61 72 64 73 20 63 6f 6e 73 69 73 74 69 6e 67 20  ards consisting 
29e0: 6f 66 20 61 20 73 69 6e 67 6c 65 20 22 3f 22 20  of a single "?" 
29f0: 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 68 65  are assigned the
2a00: 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69 61 6c   next sequential
2a10: 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  .** variable num
2a20: 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63  ber..**.** Wildc
2a30: 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ards of the form
2a40: 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73 73 69   "?nnn" are assi
2a50: 67 6e 65 64 20 74 68 65 20 6e 75 6d 62 65 72 20  gned the number 
2a60: 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a  "nnn".  We make.
2a70: 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20 69 73  ** sure "nnn" is
2a80: 20 6e 6f 74 20 74 6f 6f 20 62 65 20 74 6f 20 61   not too be to a
2a90: 76 6f 69 64 20 61 20 64 65 6e 69 61 6c 20 6f 66  void a denial of
2aa0: 20 73 65 72 76 69 63 65 20 61 74 74 61 63 6b 20   service attack 
2ab0: 77 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20  when.** the SQL 
2ac0: 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20  statement comes 
2ad0: 66 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c  from an external
2ae0: 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57   source..**.** W
2af0: 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20  ildcards of the 
2b00: 66 6f 72 6d 20 22 3a 61 61 61 22 20 6f 72 20 22  form ":aaa" or "
2b10: 24 61 61 61 22 20 61 72 65 20 61 73 73 69 67 6e  $aaa" are assign
2b20: 65 64 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ed the same numb
2b30: 65 72 0a 2a 2a 20 61 73 20 74 68 65 20 70 72 65  er.** as the pre
2b40: 76 69 6f 75 73 20 69 6e 73 74 61 6e 63 65 20 6f  vious instance o
2b50: 66 20 74 68 65 20 73 61 6d 65 20 77 69 6c 64 63  f the same wildc
2b60: 61 72 64 2e 20 20 4f 72 20 69 66 20 74 68 69 73  ard.  Or if this
2b70: 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   is the first.**
2b80: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
2b90: 20 77 69 6c 64 63 61 72 64 2c 20 74 68 65 20 6e   wildcard, the n
2ba0: 65 78 74 20 73 65 71 75 65 6e 69 61 6c 20 76 61  ext sequenial va
2bb0: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 73  riable number is
2bc0: 0a 2a 2a 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f  .** assigned..*/
2bd0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
2be0: 72 41 73 73 69 67 6e 56 61 72 4e 75 6d 62 65 72  rAssignVarNumber
2bf0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2c00: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
2c10: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 3b 0a 20  Token *pToken;. 
2c20: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
2c30: 72 65 74 75 72 6e 3b 0a 20 20 70 54 6f 6b 65 6e  return;.  pToken
2c40: 20 3d 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e   = &pExpr->token
2c50: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b  ;.  assert( pTok
2c60: 65 6e 2d 3e 6e 3e 3d 31 20 29 3b 0a 20 20 61 73  en->n>=1 );.  as
2c70: 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21  sert( pToken->z!
2c80: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2c90: 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 21 3d 30 20  pToken->z[0]!=0 
2ca0: 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d  );.  if( pToken-
2cb0: 3e 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20  >n==1 ){.    /* 
2cc0: 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20  Wildcard of the 
2cd0: 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73 69 67  form "?".  Assig
2ce0: 6e 20 74 68 65 20 6e 65 78 74 20 76 61 72 69 61  n the next varia
2cf0: 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ble number */.  
2d00: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
2d10: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72  = ++pParse->nVar
2d20: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54  ;.  }else if( pT
2d30: 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 3f 27 20  oken->z[0]=='?' 
2d40: 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61  ){.    /* Wildca
2d50: 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rd of the form "
2d60: 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20  ?nnn".  Convert 
2d70: 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65  "nnn" to an inte
2d80: 67 65 72 20 61 6e 64 0a 20 20 20 20 2a 2a 20 75  ger and.    ** u
2d90: 73 65 20 69 74 20 61 73 20 74 68 65 20 76 61 72  se it as the var
2da0: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  iable number */.
2db0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 70      int i;.    p
2dc0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69  Expr->iTable = i
2dd0: 20 3d 20 61 74 6f 69 28 28 63 68 61 72 2a 29 26   = atoi((char*)&
2de0: 70 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d 29 3b 0a 20  pToken->z[1]);. 
2df0: 20 20 20 69 66 28 20 69 3c 31 20 7c 7c 20 69 3e     if( i<1 || i>
2e00: 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41  SQLITE_MAX_VARIA
2e10: 42 4c 45 5f 4e 55 4d 42 45 52 20 29 7b 0a 20 20  BLE_NUMBER ){.  
2e20: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
2e30: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 61 72  Msg(pParse, "var
2e40: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73  iable number mus
2e50: 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20  t be between ?1 
2e60: 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20  and ?%d",.      
2e70: 20 20 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56      SQLITE_MAX_V
2e80: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 29 3b  ARIABLE_NUMBER);
2e90: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
2ea0: 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b  >pParse->nVar ){
2eb0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
2ec0: 56 61 72 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20  Var = i;.    }. 
2ed0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57   }else{.    /* W
2ee0: 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20  ildcards of the 
2ef0: 66 6f 72 6d 20 22 3a 61 61 61 22 20 6f 72 20 22  form ":aaa" or "
2f00: 24 61 61 61 22 2e 20 20 52 65 75 73 65 20 74 68  $aaa".  Reuse th
2f10: 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 0a  e same variable.
2f20: 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73      ** number as
2f30: 20 74 68 65 20 70 72 69 6f 72 20 61 70 70 65 61   the prior appea
2f40: 72 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d  rance of the sam
2f50: 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68  e name, or if th
2f60: 65 20 6e 61 6d 65 0a 20 20 20 20 2a 2a 20 68 61  e name.    ** ha
2f70: 73 20 6e 65 76 65 72 20 61 70 70 65 61 72 65 64  s never appeared
2f80: 20 62 65 66 6f 72 65 2c 20 72 65 75 73 65 20 74   before, reuse t
2f90: 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65  he same variable
2fa0: 20 6e 75 6d 62 65 72 0a 20 20 20 20 2a 2f 0a 20   number.    */. 
2fb0: 20 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 20     int i, n;.   
2fc0: 20 6e 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 3b 0a   n = pToken->n;.
2fd0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
2fe0: 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 3b  Parse->nVarExpr;
2ff0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
3000: 72 20 2a 70 45 3b 0a 20 20 20 20 20 20 69 66 28  r *pE;.      if(
3010: 20 28 70 45 20 3d 20 70 50 61 72 73 65 2d 3e 61   (pE = pParse->a
3020: 70 56 61 72 45 78 70 72 5b 69 5d 29 21 3d 30 0a  pVarExpr[i])!=0.
3030: 20 20 20 20 20 20 20 20 20 20 26 26 20 70 45 2d            && pE-
3040: 3e 74 6f 6b 65 6e 2e 6e 3d 3d 6e 0a 20 20 20 20  >token.n==n.    
3050: 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28        && memcmp(
3060: 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 54 6f  pE->token.z, pTo
3070: 6b 65 6e 2d 3e 7a 2c 20 6e 29 3d 3d 30 20 29 7b  ken->z, n)==0 ){
3080: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
3090: 69 54 61 62 6c 65 20 3d 20 70 45 2d 3e 69 54 61  iTable = pE->iTa
30a0: 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ble;.        bre
30b0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
30c0: 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 70 50 61  }.    if( i>=pPa
30d0: 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 20 29 7b  rse->nVarExpr ){
30e0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54  .      pExpr->iT
30f0: 61 62 6c 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d  able = ++pParse-
3100: 3e 6e 56 61 72 3b 0a 20 20 20 20 20 20 69 66 28  >nVar;.      if(
3110: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70   pParse->nVarExp
3120: 72 3e 3d 70 50 61 72 73 65 2d 3e 6e 56 61 72 45  r>=pParse->nVarE
3130: 78 70 72 41 6c 6c 6f 63 2d 31 20 29 7b 0a 20 20  xprAlloc-1 ){.  
3140: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56        pParse->nV
3150: 61 72 45 78 70 72 41 6c 6c 6f 63 20 2b 3d 20 70  arExprAlloc += p
3160: 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41  Parse->nVarExprA
3170: 6c 6c 6f 63 20 2b 20 31 30 3b 0a 20 20 20 20 20  lloc + 10;.     
3180: 20 20 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72     pParse->apVar
3190: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 52 65 61  Expr = sqliteRea
31a0: 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50 61 72 73  llocOrFree(pPars
31b0: 65 2d 3e 61 70 56 61 72 45 78 70 72 2c 0a 20 20  e->apVarExpr,.  
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61       pParse->nVa
31e0: 72 45 78 70 72 41 6c 6c 6f 63 2a 73 69 7a 65 6f  rExprAlloc*sizeo
31f0: 66 28 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45  f(pParse->apVarE
3200: 78 70 72 5b 30 5d 29 20 29 3b 0a 20 20 20 20 20  xpr[0]) );.     
3210: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73 71   }.      if( !sq
3220: 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65  lite3MallocFaile
3230: 64 28 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61  d() ){.        a
3240: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 61  ssert( pParse->a
3250: 70 56 61 72 45 78 70 72 21 3d 30 20 29 3b 0a 20  pVarExpr!=0 );. 
3260: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
3270: 70 56 61 72 45 78 70 72 5b 70 50 61 72 73 65 2d  pVarExpr[pParse-
3280: 3e 6e 56 61 72 45 78 70 72 2b 2b 5d 20 3d 20 70  >nVarExpr++] = p
3290: 45 78 70 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Expr;.      }.  
32a0: 20 20 7d 0a 20 20 7d 20 0a 20 20 69 66 28 20 21    }.  } .  if( !
32b0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 26 26 20  pParse->nErr && 
32c0: 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 53 51 4c  pParse->nVar>SQL
32d0: 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45  ITE_MAX_VARIABLE
32e0: 5f 4e 55 4d 42 45 52 20 29 7b 0a 20 20 20 20 73  _NUMBER ){.    s
32f0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
3300: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
3310: 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73 22 29   SQL variables")
3320: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
3330: 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74  ecursively delet
3340: 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
3350: 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tree..*/.void sq
3360: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
3370: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
3380: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
3390: 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 64 79 6e   if( p->span.dyn
33a0: 20 29 20 73 71 6c 69 74 65 46 72 65 65 28 28 63   ) sqliteFree((c
33b0: 68 61 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a 29 3b  har*)p->span.z);
33c0: 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e  .  if( p->token.
33d0: 64 79 6e 20 29 20 73 71 6c 69 74 65 46 72 65 65  dyn ) sqliteFree
33e0: 28 28 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e  ((char*)p->token
33f0: 2e 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  .z);.  sqlite3Ex
3400: 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c 65 66  prDelete(p->pLef
3410: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t);.  sqlite3Exp
3420: 72 44 65 6c 65 74 65 28 70 2d 3e 70 52 69 67 68  rDelete(p->pRigh
3430: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t);.  sqlite3Exp
3440: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70  rListDelete(p->p
3450: 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  List);.  sqlite3
3460: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 2d 3e  SelectDelete(p->
3470: 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69  pSelect);.  sqli
3480: 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a  teFree(p);.}../*
3490: 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e 74 6f 6b  .** The Expr.tok
34a0: 65 6e 20 66 69 65 6c 64 20 6d 69 67 68 74 20 62  en field might b
34b0: 65 20 61 20 73 74 72 69 6e 67 20 6c 69 74 65 72  e a string liter
34c0: 61 6c 20 74 68 61 74 20 69 73 20 71 75 6f 74 65  al that is quote
34d0: 64 2e 0a 2a 2a 20 49 66 20 73 6f 2c 20 72 65 6d  d..** If so, rem
34e0: 6f 76 65 20 74 68 65 20 71 75 6f 74 61 74 69 6f  ove the quotatio
34f0: 6e 20 6d 61 72 6b 73 2e 0a 2a 2f 0a 76 6f 69 64  n marks..*/.void
3500: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 45   sqlite3DequoteE
3510: 78 70 72 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  xpr(Expr *p){.  
3520: 69 66 28 20 45 78 70 72 48 61 73 41 6e 79 50 72  if( ExprHasAnyPr
3530: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 44 65 71  operty(p, EP_Deq
3540: 75 6f 74 65 64 29 20 29 7b 0a 20 20 20 20 72 65  uoted) ){.    re
3550: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 45 78 70 72  turn;.  }.  Expr
3560: 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45  SetProperty(p, E
3570: 50 5f 44 65 71 75 6f 74 65 64 29 3b 0a 20 20 69  P_Dequoted);.  i
3580: 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 3d  f( p->token.dyn=
3590: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
35a0: 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 2d 3e 74  3TokenCopy(&p->t
35b0: 6f 6b 65 6e 2c 20 26 70 2d 3e 74 6f 6b 65 6e 29  oken, &p->token)
35c0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
35d0: 65 71 75 6f 74 65 28 28 63 68 61 72 2a 29 70 2d  equote((char*)p-
35e0: 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 7d 0a 0a 0a 2f  >token.z);.}.../
35f0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
3600: 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74  ng group of rout
3610: 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63  ines make deep c
3620: 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65 73 73  opies of express
3630: 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73  ions,.** express
3640: 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69  ion lists, ID li
3650: 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20  sts, and select 
3660: 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65  statements.  The
3670: 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62   copies can.** b
3680: 65 20 64 65 6c 65 74 65 64 20 28 62 79 20 62 65  e deleted (by be
3690: 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74 68  ing passed to th
36a0: 65 69 72 20 72 65 73 70 65 63 74 69 76 65 20 2e  eir respective .
36b0: 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69  ..Delete() routi
36c0: 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20  nes).** without 
36d0: 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72  effecting the or
36e0: 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54  iginals..**.** T
36f0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
3700: 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72  st, ID, and sour
3710: 63 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20  ce lists return 
3720: 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  by sqlite3ExprLi
3730: 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69  stDup(),.** sqli
3740: 74 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20  te3IdListDup(), 
3750: 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  and sqlite3SrcLi
3760: 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20  stDup() can not 
3770: 62 65 20 66 75 72 74 68 65 72 20 65 78 70 61 6e  be further expan
3780: 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65  ded .** by subse
3790: 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73  quent calls to s
37a0: 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64  qlite*ListAppend
37b0: 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a  () routines..**.
37c0: 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68  ** Any tables th
37d0: 61 74 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d  at the SrcList m
37e0: 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72  ight point to ar
37f0: 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64  e not duplicated
3800: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
3810: 65 33 45 78 70 72 44 75 70 28 45 78 70 72 20 2a  e3ExprDup(Expr *
3820: 70 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  p){.  Expr *pNew
3830: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
3840: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20  eturn 0;.  pNew 
3850: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
3860: 77 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b  w( sizeof(*p) );
3870: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
3880: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d   return 0;.  mem
3890: 63 70 79 28 70 4e 65 77 2c 20 70 2c 20 73 69 7a  cpy(pNew, p, siz
38a0: 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69  eof(*pNew));.  i
38b0: 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 21 3d 30  f( p->token.z!=0
38c0: 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f   ){.    pNew->to
38d0: 6b 65 6e 2e 7a 20 3d 20 28 75 38 2a 29 73 71 6c  ken.z = (u8*)sql
38e0: 69 74 65 53 74 72 4e 44 75 70 28 28 63 68 61 72  iteStrNDup((char
38f0: 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 2d  *)p->token.z, p-
3900: 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 70  >token.n);.    p
3910: 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d  New->token.dyn =
3920: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
3930: 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 74   assert( pNew->t
3940: 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 3b 0a 20 20 7d  oken.z==0 );.  }
3950: 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e 2e 7a 20  .  pNew->span.z 
3960: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65  = 0;.  pNew->pLe
3970: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
3980: 44 75 70 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20  Dup(p->pLeft);. 
3990: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20   pNew->pRight = 
39a0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
39b0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 70 4e 65  ->pRight);.  pNe
39c0: 77 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  w->pList = sqlit
39d0: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 2d  e3ExprListDup(p-
39e0: 3e 70 4c 69 73 74 29 3b 0a 20 20 70 4e 65 77 2d  >pList);.  pNew-
39f0: 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
3a00: 65 33 53 65 6c 65 63 74 44 75 70 28 70 2d 3e 70  e3SelectDup(p->p
3a10: 53 65 6c 65 63 74 29 3b 0a 20 20 72 65 74 75 72  Select);.  retur
3a20: 6e 20 70 4e 65 77 3b 0a 7d 0a 76 6f 69 64 20 73  n pNew;.}.void s
3a30: 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28  qlite3TokenCopy(
3a40: 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 54 6f 6b 65  Token *pTo, Toke
3a50: 6e 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28  n *pFrom){.  if(
3a60: 20 70 54 6f 2d 3e 64 79 6e 20 29 20 73 71 6c 69   pTo->dyn ) sqli
3a70: 74 65 46 72 65 65 28 28 63 68 61 72 2a 29 70 54  teFree((char*)pT
3a80: 6f 2d 3e 7a 29 3b 0a 20 20 69 66 28 20 70 46 72  o->z);.  if( pFr
3a90: 6f 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 70 54 6f  om->z ){.    pTo
3aa0: 2d 3e 6e 20 3d 20 70 46 72 6f 6d 2d 3e 6e 3b 0a  ->n = pFrom->n;.
3ab0: 20 20 20 20 70 54 6f 2d 3e 7a 20 3d 20 28 75 38      pTo->z = (u8
3ac0: 2a 29 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28  *)sqliteStrNDup(
3ad0: 28 63 68 61 72 2a 29 70 46 72 6f 6d 2d 3e 7a 2c  (char*)pFrom->z,
3ae0: 20 70 46 72 6f 6d 2d 3e 6e 29 3b 0a 20 20 20 20   pFrom->n);.    
3af0: 70 54 6f 2d 3e 64 79 6e 20 3d 20 31 3b 0a 20 20  pTo->dyn = 1;.  
3b00: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 6f 2d 3e  }else{.    pTo->
3b10: 7a 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 45 78 70  z = 0;.  }.}.Exp
3b20: 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78  rList *sqlite3Ex
3b30: 70 72 4c 69 73 74 44 75 70 28 45 78 70 72 4c 69  prListDup(ExprLi
3b40: 73 74 20 2a 70 29 7b 0a 20 20 45 78 70 72 4c 69  st *p){.  ExprLi
3b50: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75  st *pNew;.  stru
3b60: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
3b70: 20 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74   *pItem, *pOldIt
3b80: 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  em;.  int i;.  i
3b90: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
3ba0: 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   0;.  pNew = sql
3bb0: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
3bc0: 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
3bd0: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
3be0: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45  rn 0;.  pNew->nE
3bf0: 78 70 72 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c  xpr = pNew->nAll
3c00: 6f 63 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20  oc = p->nExpr;. 
3c10: 20 70 4e 65 77 2d 3e 61 20 3d 20 70 49 74 65 6d   pNew->a = pItem
3c20: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
3c30: 20 70 2d 3e 6e 45 78 70 72 2a 73 69 7a 65 6f 66   p->nExpr*sizeof
3c40: 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69  (p->a[0]) );.  i
3c50: 66 28 20 70 49 74 65 6d 3d 3d 30 20 29 7b 0a 20  f( pItem==0 ){. 
3c60: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4e     sqliteFree(pN
3c70: 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ew);.    return 
3c80: 30 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49 74  0;.  } .  pOldIt
3c90: 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72  em = p->a;.  for
3ca0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72  (i=0; i<p->nExpr
3cb0: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20  ; i++, pItem++, 
3cc0: 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  pOldItem++){.   
3cd0: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 2c   Expr *pNewExpr,
3ce0: 20 2a 70 4f 6c 64 45 78 70 72 3b 0a 20 20 20 20   *pOldExpr;.    
3cf0: 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70  pItem->pExpr = p
3d00: 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65  NewExpr = sqlite
3d10: 33 45 78 70 72 44 75 70 28 70 4f 6c 64 45 78 70  3ExprDup(pOldExp
3d20: 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45  r = pOldItem->pE
3d30: 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  xpr);.    if( pO
3d40: 6c 64 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 21 3d  ldExpr->span.z!=
3d50: 30 20 26 26 20 70 4e 65 77 45 78 70 72 20 29 7b  0 && pNewExpr ){
3d60: 0a 20 20 20 20 20 20 2f 2a 20 41 6c 77 61 79 73  .      /* Always
3d70: 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
3d80: 74 68 65 20 73 70 61 6e 20 66 6f 72 20 74 6f 70  the span for top
3d90: 2d 6c 65 76 65 6c 20 65 78 70 72 65 73 73 69 6f  -level expressio
3da0: 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  ns in the.      
3db0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
3dc0: 73 74 2e 20 20 54 68 65 20 6c 6f 67 69 63 20 69  st.  The logic i
3dd0: 6e 20 53 45 4c 45 43 54 20 70 72 6f 63 65 73 73  n SELECT process
3de0: 69 6e 67 20 74 68 61 74 20 64 65 74 65 72 6d 69  ing that determi
3df0: 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  nes.      ** the
3e00: 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e   names of column
3e10: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
3e20: 73 65 74 20 6e 65 65 64 73 20 74 68 69 73 20 69  set needs this i
3e30: 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
3e40: 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e      sqlite3Token
3e50: 43 6f 70 79 28 26 70 4e 65 77 45 78 70 72 2d 3e  Copy(&pNewExpr->
3e60: 73 70 61 6e 2c 20 26 70 4f 6c 64 45 78 70 72 2d  span, &pOldExpr-
3e70: 3e 73 70 61 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  >span);.    }.  
3e80: 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 45 78    assert( pNewEx
3e90: 70 72 3d 3d 30 20 7c 7c 20 70 4e 65 77 45 78 70  pr==0 || pNewExp
3ea0: 72 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 0a 20 20  r->span.z!=0 .  
3eb0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4f 6c            || pOl
3ec0: 64 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 3d 3d 30  dExpr->span.z==0
3ed0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
3ee0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69  sqlite3MallocFai
3ef0: 6c 65 64 28 29 20 29 3b 0a 20 20 20 20 70 49 74  led() );.    pIt
3f00: 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
3f10: 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49 74 65  teStrDup(pOldIte
3f20: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
3f30: 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20  Item->sortOrder 
3f40: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74  = pOldItem->sort
3f50: 4f 72 64 65 72 3b 0a 20 20 20 20 70 49 74 65 6d  Order;.    pItem
3f60: 2d 3e 69 73 41 67 67 20 3d 20 70 4f 6c 64 49 74  ->isAgg = pOldIt
3f70: 65 6d 2d 3e 69 73 41 67 67 3b 0a 20 20 20 20 70  em->isAgg;.    p
3f80: 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a  Item->done = 0;.
3f90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
3fa0: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63  w;.}../*.** If c
3fb0: 75 72 73 6f 72 73 2c 20 74 72 69 67 67 65 72 73  ursors, triggers
3fc0: 2c 20 76 69 65 77 73 20 61 6e 64 20 73 75 62 71  , views and subq
3fd0: 75 65 72 69 65 73 20 61 72 65 20 61 6c 6c 20 6f  ueries are all o
3fe0: 6d 69 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74  mitted from.** t
3ff0: 68 65 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e  he build, then n
4000: 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
4010: 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20 65  wing routines, e
4020: 78 63 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71  xcept for .** sq
4030: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29  lite3SelectDup()
4040: 2c 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e  , can be called.
4050: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
4060: 70 28 29 20 69 73 20 73 6f 6d 65 74 69 6d 65 73  p() is sometimes
4070: 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20  .** called with 
4080: 61 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e  a NULL argument.
4090: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
40a0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
40b0: 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  W) || !defined(S
40c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
40d0: 45 52 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e  ER) \. || !defin
40e0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
40f0: 55 42 51 55 45 52 59 29 0a 53 72 63 4c 69 73 74  UBQUERY).SrcList
4100: 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74   *sqlite3SrcList
4110: 44 75 70 28 53 72 63 4c 69 73 74 20 2a 70 29 7b  Dup(SrcList *p){
4120: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77  .  SrcList *pNew
4130: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
4140: 20 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 70 3d   nByte;.  if( p=
4150: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
4160: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
4170: 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30  *p) + (p->nSrc>0
4180: 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30   ? sizeof(p->a[0
4190: 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29  ]) * (p->nSrc-1)
41a0: 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20   : 0);.  pNew = 
41b0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
41c0: 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20   nByte );.  if( 
41d0: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
41e0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63   0;.  pNew->nSrc
41f0: 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20   = pNew->nAlloc 
4200: 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72  = p->nSrc;.  for
4210: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b  (i=0; i<p->nSrc;
4220: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
4230: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
4240: 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77  pNewItem = &pNew
4250: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75  ->a[i];.    stru
4260: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
4270: 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e  *pOldItem = &p->
4280: 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20  a[i];.    Table 
4290: 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 49  *pTab;.    pNewI
42a0: 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d  tem->zDatabase =
42b0: 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 70 4f   sqliteStrDup(pO
42c0: 6c 64 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ldItem->zDatabas
42d0: 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  e);.    pNewItem
42e0: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
42f0: 53 74 72 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d  StrDup(pOldItem-
4300: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65  >zName);.    pNe
4310: 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20  wItem->zAlias = 
4320: 73 71 6c 69 74 65 53 74 72 44 75 70 28 70 4f 6c  sqliteStrDup(pOl
4330: 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  dItem->zAlias);.
4340: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6a 6f      pNewItem->jo
4350: 69 6e 74 79 70 65 20 3d 20 70 4f 6c 64 49 74 65  intype = pOldIte
4360: 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20  m->jointype;.   
4370: 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43 75 72 73   pNewItem->iCurs
4380: 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  or = pOldItem->i
4390: 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77  Cursor;.    pNew
43a0: 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65  Item->isPopulate
43b0: 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 73  d = pOldItem->is
43c0: 50 6f 70 75 6c 61 74 65 64 3b 0a 20 20 20 20 70  Populated;.    p
43d0: 54 61 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e  Tab = pNewItem->
43e0: 70 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  pTab = pOldItem-
43f0: 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70  >pTab;.    if( p
4400: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54 61  Tab ){.      pTa
4410: 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d  b->nRef++;.    }
4420: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
4430: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
4440: 53 65 6c 65 63 74 44 75 70 28 70 4f 6c 64 49 74  SelectDup(pOldIt
4450: 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  em->pSelect);.  
4460: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20    pNewItem->pOn 
4470: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
4480: 28 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 29 3b  (pOldItem->pOn);
4490: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
44a0: 55 73 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 49  Using = sqlite3I
44b0: 64 4c 69 73 74 44 75 70 28 70 4f 6c 64 49 74 65  dListDup(pOldIte
44c0: 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20  m->pUsing);.    
44d0: 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65  pNewItem->colUse
44e0: 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f  d = pOldItem->co
44f0: 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74  lUsed;.  }.  ret
4500: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69  urn pNew;.}.IdLi
4510: 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73  st *sqlite3IdLis
4520: 74 44 75 70 28 49 64 4c 69 73 74 20 2a 70 29 7b  tDup(IdList *p){
4530: 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b  .  IdList *pNew;
4540: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
4550: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
4560: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
4570: 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f  MallocRaw( sizeo
4580: 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
4590: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
45a0: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49  rn 0;.  pNew->nI
45b0: 64 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63  d = pNew->nAlloc
45c0: 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65   = p->nId;.  pNe
45d0: 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65 4d 61 6c  w->a = sqliteMal
45e0: 6c 6f 63 52 61 77 28 20 70 2d 3e 6e 49 64 2a 73  locRaw( p->nId*s
45f0: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29  izeof(p->a[0]) )
4600: 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d  ;.  if( pNew->a=
4610: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
4620: 46 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20  Free(pNew);.    
4630: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
4640: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49  for(i=0; i<p->nI
4650: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  d; i++){.    str
4660: 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20  uct IdList_item 
4670: 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65  *pNewItem = &pNe
4680: 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72  w->a[i];.    str
4690: 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20  uct IdList_item 
46a0: 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e  *pOldItem = &p->
46b0: 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74  a[i];.    pNewIt
46c0: 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
46d0: 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49 74 65  teStrDup(pOldIte
46e0: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
46f0: 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70  NewItem->idx = p
4700: 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20  OldItem->idx;.  
4710: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
4720: 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74  .}.Select *sqlit
4730: 65 33 53 65 6c 65 63 74 44 75 70 28 53 65 6c 65  e3SelectDup(Sele
4740: 63 74 20 2a 70 29 7b 0a 20 20 53 65 6c 65 63 74  ct *p){.  Select
4750: 20 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d   *pNew;.  if( p=
4760: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
4770: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61   pNew = sqliteMa
4780: 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28  llocRaw( sizeof(
4790: 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  *p) );.  if( pNe
47a0: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
47b0: 0a 20 20 70 4e 65 77 2d 3e 69 73 44 69 73 74 69  .  pNew->isDisti
47c0: 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69  nct = p->isDisti
47d0: 6e 63 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 45 4c  nct;.  pNew->pEL
47e0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
47f0: 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 45 4c 69  rListDup(p->pELi
4800: 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72  st);.  pNew->pSr
4810: 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
4820: 73 74 44 75 70 28 70 2d 3e 70 53 72 63 29 3b 0a  stDup(p->pSrc);.
4830: 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d    pNew->pWhere =
4840: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
4850: 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 70 4e  p->pWhere);.  pN
4860: 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73  ew->pGroupBy = s
4870: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
4880: 70 28 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a  p(p->pGroupBy);.
4890: 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20    pNew->pHaving 
48a0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
48b0: 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20  (p->pHaving);.  
48c0: 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
48d0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
48e0: 44 75 70 28 70 2d 3e 70 4f 72 64 65 72 42 79 29  Dup(p->pOrderBy)
48f0: 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70  ;.  pNew->op = p
4900: 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 50  ->op;.  pNew->pP
4910: 72 69 6f 72 20 3d 20 73 71 6c 69 74 65 33 53 65  rior = sqlite3Se
4920: 6c 65 63 74 44 75 70 28 70 2d 3e 70 50 72 69 6f  lectDup(p->pPrio
4930: 72 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d  r);.  pNew->pLim
4940: 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  it = sqlite3Expr
4950: 44 75 70 28 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  Dup(p->pLimit);.
4960: 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20    pNew->pOffset 
4970: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
4980: 28 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20  (p->pOffset);.  
4990: 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d  pNew->iLimit = -
49a0: 31 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73  1;.  pNew->iOffs
49b0: 65 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  et = -1;.  pNew-
49c0: 3e 69 73 52 65 73 6f 6c 76 65 64 20 3d 20 70 2d  >isResolved = p-
49d0: 3e 69 73 52 65 73 6f 6c 76 65 64 3b 0a 20 20 70  >isResolved;.  p
49e0: 4e 65 77 2d 3e 69 73 41 67 67 20 3d 20 70 2d 3e  New->isAgg = p->
49f0: 69 73 41 67 67 3b 0a 20 20 70 4e 65 77 2d 3e 75  isAgg;.  pNew->u
4a00: 73 65 73 45 70 68 6d 20 3d 20 30 3b 0a 20 20 70  sesEphm = 0;.  p
4a10: 4e 65 77 2d 3e 64 69 73 61 6c 6c 6f 77 4f 72 64  New->disallowOrd
4a20: 65 72 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65 77  erBy = 0;.  pNew
4a30: 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30  ->pRightmost = 0
4a40: 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70  ;.  pNew->addrOp
4a50: 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a  enEphm[0] = -1;.
4a60: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
4a70: 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[1] = -1;.  
4a80: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
4a90: 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 72 65  hm[2] = -1;.  re
4aa0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c  turn pNew;.}.#el
4ab0: 73 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74  se.Select *sqlit
4ac0: 65 33 53 65 6c 65 63 74 44 75 70 28 53 65 6c 65  e3SelectDup(Sele
4ad0: 63 74 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  ct *p){.  assert
4ae0: 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  ( p==0 );.  retu
4af0: 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 0;.}.#endif..
4b00: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
4b10: 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
4b20: 65 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73  end of an expres
4b30: 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70  sion list.  If p
4b40: 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69  List is.** initi
4b50: 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  ally NULL, then 
4b60: 63 72 65 61 74 65 20 61 20 6e 65 77 20 65 78 70  create a new exp
4b70: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f  ression list..*/
4b80: 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74  .ExprList *sqlit
4b90: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
4ba0: 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74  (ExprList *pList
4bb0: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 54  , Expr *pExpr, T
4bc0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
4bd0: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
4be0: 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
4bf0: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
4c00: 28 45 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20  (ExprList) );.  
4c10: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
4c20: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f  {.      goto no_
4c30: 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  mem;.    }.    a
4c40: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 41  ssert( pList->nA
4c50: 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20  lloc==0 );.  }. 
4c60: 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c   if( pList->nAll
4c70: 6f 63 3c 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72  oc<=pList->nExpr
4c80: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
4c90: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b  xprList_item *a;
4ca0: 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c 69  .    int n = pLi
4cb0: 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 34  st->nAlloc*2 + 4
4cc0: 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65  ;.    a = sqlite
4cd0: 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61  Realloc(pList->a
4ce0: 2c 20 6e 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74  , n*sizeof(pList
4cf0: 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66  ->a[0]));.    if
4d00: 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( a==0 ){.      
4d10: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20  goto no_mem;.   
4d20: 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20   }.    pList->a 
4d30: 3d 20 61 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  = a;.    pList->
4d40: 6e 41 6c 6c 6f 63 20 3d 20 6e 3b 0a 20 20 7d 0a  nAlloc = n;.  }.
4d50: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
4d60: 3e 61 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  >a!=0 );.  if( p
4d70: 45 78 70 72 20 7c 7c 20 70 4e 61 6d 65 20 29 7b  Expr || pName ){
4d80: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
4d90: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
4da0: 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
4db0: 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20  st->nExpr++];.  
4dc0: 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20    memset(pItem, 
4dd0: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d  0, sizeof(*pItem
4de0: 29 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a  ));.    pItem->z
4df0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
4e00: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d  meFromToken(pNam
4e10: 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70  e);.    pItem->p
4e20: 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
4e30: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  }.  return pList
4e40: 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a  ;..no_mem:     .
4e50: 20 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69    /* Avoid leaki
4e60: 6e 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c  ng memory if mal
4e70: 6c 6f 63 20 68 61 73 20 66 61 69 6c 65 64 2e 20  loc has failed. 
4e80: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  */.  sqlite3Expr
4e90: 44 65 6c 65 74 65 28 70 45 78 70 72 29 3b 0a 20  Delete(pExpr);. 
4ea0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
4eb0: 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
4ec0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
4ed0: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
4ee0: 73 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73  ssion list pELis
4ef0: 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20  t contains more 
4f00: 74 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d  than iLimit elem
4f10: 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61  ents,.** leave a
4f20: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
4f30: 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f  in pParse..*/.vo
4f40: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
4f50: 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20  stCheckLength(. 
4f60: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a   Parse *pParse,.
4f70: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
4f80: 73 74 2c 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74  st,.  int iLimit
4f90: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
4fa0: 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69 66 28  zObject.){.  if(
4fb0: 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
4fc0: 74 2d 3e 6e 45 78 70 72 3e 69 4c 69 6d 69 74 20  t->nExpr>iLimit 
4fd0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
4fe0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
4ff0: 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  too many columns
5000: 20 69 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63 74   in %s", zObject
5010: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 23 69 66 20 53  );.  }.}...#if S
5020: 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
5030: 45 50 54 48 3e 30 0a 2f 2a 20 54 68 65 20 66 6f  EPTH>0./* The fo
5040: 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 66 75  llowing three fu
5050: 6e 63 74 69 6f 6e 73 2c 20 68 65 69 67 68 74 4f  nctions, heightO
5060: 66 45 78 70 72 28 29 2c 20 68 65 69 67 68 74 4f  fExpr(), heightO
5070: 66 45 78 70 72 4c 69 73 74 28 29 0a 2a 2a 20 61  fExprList().** a
5080: 6e 64 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63  nd heightOfSelec
5090: 74 28 29 2c 20 61 72 65 20 75 73 65 64 20 74 6f  t(), are used to
50a0: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d   determine the m
50b0: 61 78 69 6d 75 6d 20 68 65 69 67 68 74 0a 2a 2a  aximum height.**
50c0: 20 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73 69   of any expressi
50d0: 6f 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e 63  on tree referenc
50e0: 65 64 20 62 79 20 74 68 65 20 73 74 72 75 63 74  ed by the struct
50f0: 75 72 65 20 70 61 73 73 65 64 20 61 73 20 74 68  ure passed as th
5100: 65 0a 2a 2a 20 66 69 72 73 74 20 61 72 67 75 6d  e.** first argum
5110: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ent..**.** If th
5120: 69 73 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68  is maximum heigh
5130: 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
5140: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  n the current va
5150: 6c 75 65 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74  lue pointed.** t
5160: 6f 20 62 79 20 70 6e 48 65 69 67 68 74 2c 20 74  o by pnHeight, t
5170: 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
5180: 74 65 72 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  ter, then set *p
5190: 6e 48 65 69 67 68 74 20 74 6f 20 74 68 61 74 0a  nHeight to that.
51a0: 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61  ** value..*/.sta
51b0: 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f  tic void heightO
51c0: 66 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69  fExpr(Expr *p, i
51d0: 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20  nt *pnHeight){. 
51e0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66   if( p ){.    if
51f0: 28 20 70 2d 3e 6e 48 65 69 67 68 74 3e 2a 70 6e  ( p->nHeight>*pn
5200: 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  Height ){.      
5210: 2a 70 6e 48 65 69 67 68 74 20 3d 20 70 2d 3e 6e  *pnHeight = p->n
5220: 48 65 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20  Height;.    }.  
5230: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
5240: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
5250: 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e  (ExprList *p, in
5260: 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20  t *pnHeight){.  
5270: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74  if( p ){.    int
5280: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
5290: 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b   i<p->nExpr; i++
52a0: 29 7b 0a 20 20 20 20 20 20 68 65 69 67 68 74 4f  ){.      heightO
52b0: 66 45 78 70 72 28 70 2d 3e 61 5b 69 5d 2e 70 45  fExpr(p->a[i].pE
52c0: 78 70 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  xpr, pnHeight);.
52d0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74      }.  }.}.stat
52e0: 69 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66  ic void heightOf
52f0: 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70  Select(Select *p
5300: 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29  , int *pnHeight)
5310: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
5320: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
5330: 3e 70 57 68 65 72 65 2c 20 70 6e 48 65 69 67 68  >pWhere, pnHeigh
5340: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
5350: 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c  Expr(p->pHaving,
5360: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
5370: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
5380: 70 4c 69 6d 69 74 2c 20 70 6e 48 65 69 67 68 74  pLimit, pnHeight
5390: 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  );.    heightOfE
53a0: 78 70 72 28 70 2d 3e 70 4f 66 66 73 65 74 2c 20  xpr(p->pOffset, 
53b0: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
53c0: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
53d0: 70 2d 3e 70 45 4c 69 73 74 2c 20 70 6e 48 65 69  p->pEList, pnHei
53e0: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
53f0: 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47  OfExprList(p->pG
5400: 72 6f 75 70 42 79 2c 20 70 6e 48 65 69 67 68 74  roupBy, pnHeight
5410: 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  );.    heightOfE
5420: 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65  xprList(p->pOrde
5430: 72 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  rBy, pnHeight);.
5440: 20 20 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65      heightOfSele
5450: 63 74 28 70 2d 3e 70 50 72 69 6f 72 2c 20 70 6e  ct(p->pPrior, pn
5460: 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  Height);.  }.}..
5470: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78  /*.** Set the Ex
5480: 70 72 2e 6e 48 65 69 67 68 74 20 76 61 72 69 61  pr.nHeight varia
5490: 62 6c 65 20 69 6e 20 74 68 65 20 73 74 72 75 63  ble in the struc
54a0: 74 75 72 65 20 70 61 73 73 65 64 20 61 73 20 61  ture passed as a
54b0: 6e 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20  n .** argument. 
54c0: 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69  An expression wi
54d0: 74 68 20 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20  th no children, 
54e0: 45 78 70 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a  Expr.pList or .*
54f0: 2a 20 45 78 70 72 2e 70 53 65 6c 65 63 74 20 6d  * Expr.pSelect m
5500: 65 6d 62 65 72 20 68 61 73 20 61 20 68 65 69 67  ember has a heig
5510: 68 74 20 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68  ht of 1. Any oth
5520: 65 72 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  er expression.**
5530: 20 68 61 73 20 61 20 68 65 69 67 68 74 20 65 71   has a height eq
5540: 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  ual to the maxim
5550: 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79  um height of any
5560: 20 6f 74 68 65 72 20 0a 2a 2a 20 72 65 66 65 72   other .** refer
5570: 65 6e 63 65 64 20 45 78 70 72 20 70 6c 75 73 20  enced Expr plus 
5580: 6f 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  one..*/.void sql
5590: 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68  ite3ExprSetHeigh
55a0: 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e  t(Expr *p){.  in
55b0: 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20  t nHeight = 0;. 
55c0: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
55d0: 3e 70 4c 65 66 74 2c 20 26 6e 48 65 69 67 68 74  >pLeft, &nHeight
55e0: 29 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70  );.  heightOfExp
55f0: 72 28 70 2d 3e 70 52 69 67 68 74 2c 20 26 6e 48  r(p->pRight, &nH
5600: 65 69 67 68 74 29 3b 0a 20 20 68 65 69 67 68 74  eight);.  height
5610: 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4c  OfExprList(p->pL
5620: 69 73 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  ist, &nHeight);.
5630: 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74    heightOfSelect
5640: 28 70 2d 3e 70 53 65 6c 65 63 74 2c 20 26 6e 48  (p->pSelect, &nH
5650: 65 69 67 68 74 29 3b 0a 20 20 70 2d 3e 6e 48 65  eight);.  p->nHe
5660: 69 67 68 74 20 3d 20 6e 48 65 69 67 68 74 20 2b  ight = nHeight +
5670: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   1;.}../*.** Ret
5680: 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  urn the maximum 
5690: 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 65 78  height of any ex
56a0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65  pression tree re
56b0: 66 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74  ferenced.** by t
56c0: 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  he select statem
56d0: 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 61 6e  ent passed as an
56e0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e   argument..*/.in
56f0: 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  t sqlite3SelectE
5700: 78 70 72 48 65 69 67 68 74 28 53 65 6c 65 63 74  xprHeight(Select
5710: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69   *p){.  int nHei
5720: 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68  ght = 0;.  heigh
5730: 74 4f 66 53 65 6c 65 63 74 28 70 2c 20 26 6e 48  tOfSelect(p, &nH
5740: 65 69 67 68 74 29 3b 0a 20 20 72 65 74 75 72 6e  eight);.  return
5750: 20 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65 6e 64   nHeight;.}.#end
5760: 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  if../*.** Delete
5770: 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65   an entire expre
5780: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76  ssion list..*/.v
5790: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
57a0: 69 73 74 44 65 6c 65 74 65 28 45 78 70 72 4c 69  istDelete(ExprLi
57b0: 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
57c0: 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 45 78  t i;.  struct Ex
57d0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
57e0: 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  em;.  if( pList=
57f0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  =0 ) return;.  a
5800: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21  ssert( pList->a!
5810: 3d 30 20 7c 7c 20 28 70 4c 69 73 74 2d 3e 6e 45  =0 || (pList->nE
5820: 78 70 72 3d 3d 30 20 26 26 20 70 4c 69 73 74 2d  xpr==0 && pList-
5830: 3e 6e 41 6c 6c 6f 63 3d 3d 30 29 20 29 3b 0a 20  >nAlloc==0) );. 
5840: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
5850: 6e 45 78 70 72 3c 3d 70 4c 69 73 74 2d 3e 6e 41  nExpr<=pList->nA
5860: 6c 6c 6f 63 20 29 3b 0a 20 20 66 6f 72 28 70 49  lloc );.  for(pI
5870: 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d  tem=pList->a, i=
5880: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
5890: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
58a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
58b0: 72 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70  rDelete(pItem->p
58c0: 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  Expr);.    sqlit
58d0: 65 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a 4e 61  eFree(pItem->zNa
58e0: 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  me);.  }.  sqlit
58f0: 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b  eFree(pList->a);
5900: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c  .  sqliteFree(pL
5910: 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  ist);.}../*.** W
5920: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
5930: 6e 20 74 72 65 65 2e 20 20 43 61 6c 6c 20 78 46  n tree.  Call xF
5940: 75 6e 63 20 66 6f 72 20 65 61 63 68 20 6e 6f 64  unc for each nod
5950: 65 20 76 69 73 69 74 65 64 2e 0a 2a 2a 0a 2a 2a  e visited..**.**
5960: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
5970: 65 20 66 72 6f 6d 20 78 46 75 6e 63 20 64 65 74  e from xFunc det
5980: 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20  ermines whether 
5990: 74 68 65 20 74 72 65 65 20 77 61 6c 6b 20 63 6f  the tree walk co
59a0: 6e 74 69 6e 75 65 73 2e 0a 2a 2a 20 30 20 6d 65  ntinues..** 0 me
59b0: 61 6e 73 20 63 6f 6e 74 69 6e 75 65 20 77 61 6c  ans continue wal
59c0: 6b 69 6e 67 20 74 68 65 20 74 72 65 65 2e 20 20  king the tree.  
59d0: 31 20 6d 65 61 6e 73 20 64 6f 20 6e 6f 74 20 77  1 means do not w
59e0: 61 6c 6b 20 63 68 69 6c 64 72 65 6e 0a 2a 2a 20  alk children.** 
59f0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e  of the current n
5a00: 6f 64 65 20 62 75 74 20 63 6f 6e 74 69 6e 75 65  ode but continue
5a10: 20 77 69 74 68 20 73 69 62 6c 69 6e 67 73 2e 20   with siblings. 
5a20: 20 32 20 6d 65 61 6e 73 20 61 62 61 6e 64 6f 6e   2 means abandon
5a30: 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 77 61 6c  .** the tree wal
5a40: 6b 20 63 6f 6d 70 6c 65 74 65 6c 79 2e 0a 2a 2a  k completely..**
5a50: 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
5a60: 61 6c 75 65 20 66 72 6f 6d 20 74 68 69 73 20 72  alue from this r
5a70: 6f 75 74 69 6e 65 20 69 73 20 31 20 74 6f 20 61  outine is 1 to a
5a80: 62 61 6e 64 6f 6e 20 74 68 65 20 74 72 65 65 20  bandon the tree 
5a90: 77 61 6c 6b 0a 2a 2a 20 61 6e 64 20 30 20 74 6f  walk.** and 0 to
5aa0: 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a   continue..**.**
5ab0: 20 4e 4f 54 49 43 45 3a 20 20 54 68 69 73 20 72   NOTICE:  This r
5ac0: 6f 75 74 69 6e 65 20 64 6f 65 73 20 2a 6e 6f 74  outine does *not
5ad0: 2a 20 64 65 73 63 65 6e 64 20 69 6e 74 6f 20 73  * descend into s
5ae0: 75 62 71 75 65 72 69 65 73 2e 0a 2a 2f 0a 73 74  ubqueries..*/.st
5af0: 61 74 69 63 20 69 6e 74 20 77 61 6c 6b 45 78 70  atic int walkExp
5b00: 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a  rList(ExprList *
5b10: 2c 20 69 6e 74 20 28 2a 29 28 76 6f 69 64 20 2a  , int (*)(void *
5b20: 2c 20 45 78 70 72 2a 29 2c 20 76 6f 69 64 20 2a  , Expr*), void *
5b30: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61  );.static int wa
5b40: 6c 6b 45 78 70 72 54 72 65 65 28 45 78 70 72 20  lkExprTree(Expr 
5b50: 2a 70 45 78 70 72 2c 20 69 6e 74 20 28 2a 78 46  *pExpr, int (*xF
5b60: 75 6e 63 29 28 76 6f 69 64 2a 2c 45 78 70 72 2a  unc)(void*,Expr*
5b70: 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  ), void *pArg){.
5b80: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
5b90: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
5ba0: 6e 20 30 3b 0a 20 20 72 63 20 3d 20 28 2a 78 46  n 0;.  rc = (*xF
5bb0: 75 6e 63 29 28 70 41 72 67 2c 20 70 45 78 70 72  unc)(pArg, pExpr
5bc0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29  );.  if( rc==0 )
5bd0: 7b 0a 20 20 20 20 69 66 28 20 77 61 6c 6b 45 78  {.    if( walkEx
5be0: 70 72 54 72 65 65 28 70 45 78 70 72 2d 3e 70 4c  prTree(pExpr->pL
5bf0: 65 66 74 2c 20 78 46 75 6e 63 2c 20 70 41 72 67  eft, xFunc, pArg
5c00: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
5c10: 20 20 69 66 28 20 77 61 6c 6b 45 78 70 72 54 72    if( walkExprTr
5c20: 65 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  ee(pExpr->pRight
5c30: 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 20 29  , xFunc, pArg) )
5c40: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69   return 1;.    i
5c50: 66 28 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28  f( walkExprList(
5c60: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20 78 46  pExpr->pList, xF
5c70: 75 6e 63 2c 20 70 41 72 67 29 20 29 20 72 65 74  unc, pArg) ) ret
5c80: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
5c90: 75 72 6e 20 72 63 3e 31 3b 0a 7d 0a 0a 2f 2a 0a  urn rc>1;.}../*.
5ca0: 2a 2a 20 43 61 6c 6c 20 77 61 6c 6b 45 78 70 72  ** Call walkExpr
5cb0: 54 72 65 65 28 29 20 66 6f 72 20 65 76 65 72 79  Tree() for every
5cc0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 6c   expression in l
5cd0: 69 73 74 20 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  ist p..*/.static
5ce0: 20 69 6e 74 20 77 61 6c 6b 45 78 70 72 4c 69 73   int walkExprLis
5cf0: 74 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69  t(ExprList *p, i
5d00: 6e 74 20 28 2a 78 46 75 6e 63 29 28 76 6f 69 64  nt (*xFunc)(void
5d10: 20 2a 2c 20 45 78 70 72 2a 29 2c 20 76 6f 69 64   *, Expr*), void
5d20: 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 69   *pArg){.  int i
5d30: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
5d40: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
5d50: 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75  .  if( !p ) retu
5d60: 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 70 2d  rn 0;.  for(i=p-
5d70: 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d  >nExpr, pItem=p-
5d80: 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49  >a; i>0; i--, pI
5d90: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  tem++){.    if( 
5da0: 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70 49 74  walkExprTree(pIt
5db0: 65 6d 2d 3e 70 45 78 70 72 2c 20 78 46 75 6e 63  em->pExpr, xFunc
5dc0: 2c 20 70 41 72 67 29 20 29 20 72 65 74 75 72 6e  , pArg) ) return
5dd0: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
5de0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c   0;.}../*.** Cal
5df0: 6c 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 29  l walkExprTree()
5e00: 20 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65   for every expre
5e10: 73 73 69 6f 6e 20 69 6e 20 53 65 6c 65 63 74 20  ssion in Select 
5e20: 70 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67  p, not including
5e30: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20  .** expressions 
5e40: 74 68 61 74 20 61 72 65 20 70 61 72 74 20 6f 66  that are part of
5e50: 20 73 75 62 2d 73 65 6c 65 63 74 73 20 69 6e 20   sub-selects in 
5e60: 61 6e 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  any FROM clause 
5e70: 6f 72 20 74 68 65 20 4c 49 4d 49 54 0a 2a 2a 20  or the LIMIT.** 
5e80: 6f 72 20 4f 46 46 53 45 54 20 65 78 70 72 65 73  or OFFSET expres
5e90: 73 69 6f 6e 73 2e 2e 0a 2a 2f 0a 73 74 61 74 69  sions...*/.stati
5ea0: 63 20 69 6e 74 20 77 61 6c 6b 53 65 6c 65 63 74  c int walkSelect
5eb0: 45 78 70 72 28 53 65 6c 65 63 74 20 2a 70 2c 20  Expr(Select *p, 
5ec0: 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 76 6f 69  int (*xFunc)(voi
5ed0: 64 20 2a 2c 20 45 78 70 72 2a 29 2c 20 76 6f 69  d *, Expr*), voi
5ee0: 64 20 2a 70 41 72 67 29 7b 0a 20 20 77 61 6c 6b  d *pArg){.  walk
5ef0: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69  ExprList(p->pELi
5f00: 73 74 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29  st, xFunc, pArg)
5f10: 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65  ;.  walkExprTree
5f20: 28 70 2d 3e 70 57 68 65 72 65 2c 20 78 46 75 6e  (p->pWhere, xFun
5f30: 63 2c 20 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b  c, pArg);.  walk
5f40: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f  ExprList(p->pGro
5f50: 75 70 42 79 2c 20 78 46 75 6e 63 2c 20 70 41 72  upBy, xFunc, pAr
5f60: 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72  g);.  walkExprTr
5f70: 65 65 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 78  ee(p->pHaving, x
5f80: 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 77  Func, pArg);.  w
5f90: 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  alkExprList(p->p
5fa0: 4f 72 64 65 72 42 79 2c 20 78 46 75 6e 63 2c 20  OrderBy, xFunc, 
5fb0: 70 41 72 67 29 3b 0a 20 20 69 66 28 20 70 2d 3e  pArg);.  if( p->
5fc0: 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 77 61  pPrior ){.    wa
5fd0: 6c 6b 53 65 6c 65 63 74 45 78 70 72 28 70 2d 3e  lkSelectExpr(p->
5fe0: 70 50 72 69 6f 72 2c 20 78 46 75 6e 63 2c 20 70  pPrior, xFunc, p
5ff0: 41 72 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Arg);.  }.  retu
6000: 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn 0;.}.../*.** 
6010: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
6020: 64 65 73 69 67 6e 65 64 20 61 73 20 61 6e 20 78  designed as an x
6030: 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b 45 78 70  Func for walkExp
6040: 72 54 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 70  rTree()..**.** p
6050: 41 72 67 20 69 73 20 72 65 61 6c 6c 79 20 61 20  Arg is really a 
6060: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  pointer to an in
6070: 74 65 67 65 72 2e 20 20 49 66 20 77 65 20 63 61  teger.  If we ca
6080: 6e 20 74 65 6c 6c 20 62 79 20 6c 6f 6f 6b 69 6e  n tell by lookin
6090: 67 0a 2a 2a 20 61 74 20 70 45 78 70 72 20 74 68  g.** at pExpr th
60a0: 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  at the expressio
60b0: 6e 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  n that contains 
60c0: 70 45 78 70 72 20 69 73 20 6e 6f 74 20 61 20 63  pExpr is not a c
60d0: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 65 78 70 72 65  onstant.** expre
60e0: 73 73 69 6f 6e 2c 20 74 68 65 6e 20 73 65 74 20  ssion, then set 
60f0: 2a 70 41 72 67 20 74 6f 20 30 20 61 6e 64 20 72  *pArg to 0 and r
6100: 65 74 75 72 6e 20 32 20 74 6f 20 61 62 61 6e 64  eturn 2 to aband
6110: 6f 6e 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b  on the tree walk
6120: 2e 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 64 6f  ..** If pExpr do
6130: 65 73 20 64 6f 65 73 20 6e 6f 74 20 64 69 73 71  es does not disq
6140: 75 61 6c 69 66 79 20 74 68 65 20 65 78 70 72 65  ualify the expre
6150: 73 73 69 6f 6e 20 66 72 6f 6d 20 62 65 69 6e 67  ssion from being
6160: 20 61 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74   a constant.** t
6170: 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a  hen do nothing..
6180: 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 77 61 6c 6b  **.** After walk
6190: 69 6e 67 20 74 68 65 20 77 68 6f 6c 65 20 74 72  ing the whole tr
61a0: 65 65 2c 20 69 66 20 6e 6f 20 6e 6f 64 65 73 20  ee, if no nodes 
61b0: 61 72 65 20 66 6f 75 6e 64 20 74 68 61 74 20 64  are found that d
61c0: 69 73 71 75 61 6c 69 66 79 0a 2a 2a 20 74 68 65  isqualify.** the
61d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20 63   expression as c
61e0: 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 77 65  onstant, then we
61f0: 20 61 73 73 75 6d 65 20 74 68 65 20 77 68 6f 6c   assume the whol
6200: 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  e expression.** 
6210: 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 53 65  is constant.  Se
6220: 65 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  e sqlite3ExprIsC
6230: 6f 6e 73 74 61 6e 74 28 29 20 66 6f 72 20 61 64  onstant() for ad
6240: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
6250: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
6260: 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  int exprNodeIsCo
6270: 6e 73 74 61 6e 74 28 76 6f 69 64 20 2a 70 41 72  nstant(void *pAr
6280: 67 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  g, Expr *pExpr){
6290: 0a 20 20 69 6e 74 20 2a 70 4e 20 3d 20 28 69 6e  .  int *pN = (in
62a0: 74 2a 29 70 41 72 67 3b 0a 0a 20 20 2f 2a 20 49  t*)pArg;..  /* I
62b0: 66 20 2a 70 41 72 67 20 69 73 20 33 20 74 68 65  f *pArg is 3 the
62c0: 6e 20 61 6e 79 20 74 65 72 6d 20 6f 66 20 74 68  n any term of th
62d0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
62e0: 74 20 63 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a  t comes from.  *
62f0: 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  * the ON or USIN
6300: 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a  G clauses of a j
6310: 6f 69 6e 20 64 69 73 71 75 61 6c 69 66 69 65 73  oin disqualifies
6320: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
6330: 20 20 2a 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20    ** from being 
6340: 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 6e 73 74  considered const
6350: 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 28 2a  ant. */.  if( (*
6360: 70 4e 29 3d 3d 33 20 26 26 20 45 78 70 72 48 61  pN)==3 && ExprHa
6370: 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78  sAnyProperty(pEx
6380: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
6390: 20 29 7b 0a 20 20 20 20 2a 70 4e 20 3d 20 30 3b   ){.    *pN = 0;
63a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20  .    return 2;. 
63b0: 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45   }..  switch( pE
63c0: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f  xpr->op ){.    /
63d0: 2a 20 43 6f 6e 73 69 64 65 72 20 66 75 6e 63 74  * Consider funct
63e0: 69 6f 6e 73 20 74 6f 20 62 65 20 63 6f 6e 73 74  ions to be const
63f0: 61 6e 74 20 69 66 20 61 6c 6c 20 74 68 65 69 72  ant if all their
6400: 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 63   arguments are c
6410: 6f 6e 73 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61  onstant.    ** a
6420: 6e 64 20 2a 70 41 72 67 3d 3d 32 20 2a 2f 0a 20  nd *pArg==2 */. 
6430: 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
6440: 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 28  ION:.      if( (
6450: 2a 70 4e 29 3d 3d 32 20 29 20 72 65 74 75 72 6e  *pN)==2 ) return
6460: 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c   0;.      /* Fal
6470: 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20  l through */.   
6480: 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20   case TK_ID:.   
6490: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
64a0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f 54  .    case TK_DOT
64b0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  :.    case TK_AG
64c0: 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  G_FUNCTION:.    
64d0: 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
64e0: 4d 4e 3a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  MN:.#ifndef SQLI
64f0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
6500: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
6510: 45 43 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ECT:.    case TK
6520: 5f 45 58 49 53 54 53 3a 0a 23 65 6e 64 69 66 0a  _EXISTS:.#endif.
6530: 20 20 20 20 20 20 2a 70 4e 20 3d 20 30 3b 0a 20        *pN = 0;. 
6540: 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20       return 2;. 
6550: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 0a 20     case TK_IN:. 
6560: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
6570: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
6580: 20 20 20 2a 70 4e 20 3d 20 30 3b 0a 20 20 20 20     *pN = 0;.    
6590: 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20      return 2;.  
65a0: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
65b0: 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
65c0: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
65d0: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
65e0: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
65f0: 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73   1 if the expres
6600: 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
6610: 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20  .** and 0 if it 
6620: 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c  involves variabl
6630: 65 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63  es or function c
6640: 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  alls..**.** For 
6650: 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
6660: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
6670: 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73   double-quoted s
6680: 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22  tring (ex: "abc"
6690: 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72  ).** is consider
66a0: 65 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75  ed a variable bu
66b0: 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65  t a single-quote
66c0: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61  d string (ex: 'a
66d0: 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e  bc') is.** a con
66e0: 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  stant..*/.int sq
66f0: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
6700: 61 6e 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ant(Expr *p){.  
6710: 69 6e 74 20 69 73 43 6f 6e 73 74 20 3d 20 31 3b  int isConst = 1;
6720: 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  .  walkExprTree(
6730: 70 2c 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e  p, exprNodeIsCon
6740: 73 74 61 6e 74 2c 20 26 69 73 43 6f 6e 73 74 29  stant, &isConst)
6750: 3b 0a 20 20 72 65 74 75 72 6e 20 69 73 43 6f 6e  ;.  return isCon
6760: 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c  st;.}../*.** Wal
6770: 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
6780: 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20  tree.  Return 1 
6790: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
67a0: 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  n is constant.**
67b0: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 20 6f 72   that does no or
67c0: 69 67 69 6e 61 74 65 20 66 72 6f 6d 20 74 68 65  iginate from the
67d0: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
67e0: 75 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a  uses of a join..
67f0: 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 69  ** Return 0 if i
6800: 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61  t involves varia
6810: 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e  bles or function
6820: 20 63 61 6c 6c 73 20 6f 72 20 74 65 72 6d 73 20   calls or terms 
6830: 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72  from.** an ON or
6840: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a   USING clause..*
6850: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
6860: 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
6870: 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  in(Expr *p){.  i
6880: 6e 74 20 69 73 43 6f 6e 73 74 20 3d 20 33 3b 0a  nt isConst = 3;.
6890: 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70    walkExprTree(p
68a0: 2c 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73  , exprNodeIsCons
68b0: 74 61 6e 74 2c 20 26 69 73 43 6f 6e 73 74 29 3b  tant, &isConst);
68c0: 0a 20 20 72 65 74 75 72 6e 20 69 73 43 6f 6e 73  .  return isCons
68d0: 74 21 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  t!=0;.}../*.** W
68e0: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
68f0: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
6900: 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  1 if the express
6910: 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
6920: 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e  ** or a function
6930: 20 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e 73 74   call with const
6940: 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20  ant arguments.  
6950: 52 65 74 75 72 6e 20 61 6e 64 20 30 20 69 66 20  Return and 0 if 
6960: 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79  there.** are any
6970: 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a   variables..**.*
6980: 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
6990: 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  es of this funct
69a0: 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75  ion, a double-qu
69b0: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
69c0: 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f   "abc").** is co
69d0: 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61  nsidered a varia
69e0: 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65  ble but a single
69f0: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
6a00: 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a  ex: 'abc') is.**
6a10: 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a   a constant..*/.
6a20: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
6a30: 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74  sConstantOrFunct
6a40: 69 6f 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ion(Expr *p){.  
6a50: 69 6e 74 20 69 73 43 6f 6e 73 74 20 3d 20 32 3b  int isConst = 2;
6a60: 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  .  walkExprTree(
6a70: 70 2c 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e  p, exprNodeIsCon
6a80: 73 74 61 6e 74 2c 20 26 69 73 43 6f 6e 73 74 29  stant, &isConst)
6a90: 3b 0a 20 20 72 65 74 75 72 6e 20 69 73 43 6f 6e  ;.  return isCon
6aa0: 73 74 21 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  st!=0;.}../*.** 
6ab0: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
6ac0: 6e 20 70 20 63 6f 64 65 73 20 61 20 63 6f 6e 73  n p codes a cons
6ad0: 74 61 6e 74 20 69 6e 74 65 67 65 72 20 74 68 61  tant integer tha
6ae0: 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  t is small enoug
6af0: 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61  h.** to fit in a
6b00: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c   32-bit integer,
6b10: 20 72 65 74 75 72 6e 20 31 20 61 6e 64 20 70 75   return 1 and pu
6b20: 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
6b30: 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e  he integer.** in
6b40: 20 2a 70 56 61 6c 75 65 2e 20 20 49 66 20 74 68   *pValue.  If th
6b50: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
6b60: 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6f  not an integer o
6b70: 72 20 69 66 20 69 74 20 69 73 20 74 6f 6f 20 62  r if it is too b
6b80: 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20  ig.** to fit in 
6b90: 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20  a signed 32-bit 
6ba0: 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20  integer, return 
6bb0: 30 20 61 6e 64 20 6c 65 61 76 65 20 2a 70 56 61  0 and leave *pVa
6bc0: 6c 75 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  lue unchanged..*
6bd0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
6be0: 72 49 73 49 6e 74 65 67 65 72 28 45 78 70 72 20  rIsInteger(Expr 
6bf0: 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65 29  *p, int *pValue)
6c00: 7b 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f  {.  switch( p->o
6c10: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
6c20: 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
6c30: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 65 74    if( sqlite3Get
6c40: 49 6e 74 33 32 28 28 63 68 61 72 2a 29 70 2d 3e  Int32((char*)p->
6c50: 74 6f 6b 65 6e 2e 7a 2c 20 70 56 61 6c 75 65 29  token.z, pValue)
6c60: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
6c70: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
6c80: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6c90: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c  .    case TK_UPL
6ca0: 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  US: {.      retu
6cb0: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  rn sqlite3ExprIs
6cc0: 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74  Integer(p->pLeft
6cd0: 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 7d  , pValue);.    }
6ce0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49  .    case TK_UMI
6cf0: 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  NUS: {.      int
6d00: 20 76 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71   v;.      if( sq
6d10: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
6d20: 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29  er(p->pLeft, &v)
6d30: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 56 61   ){.        *pVa
6d40: 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20  lue = -v;.      
6d50: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
6d60: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
6d70: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
6d80: 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  lt: break;.  }. 
6d90: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
6da0: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
6db0: 69 66 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  if the given str
6dc0: 69 6e 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20  ing is a row-id 
6dd0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a  column name..*/.
6de0: 69 6e 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77  int sqlite3IsRow
6df0: 69 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  id(const char *z
6e00: 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
6e10: 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57  StrICmp(z, "_ROW
6e20: 49 44 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72  ID_")==0 ) retur
6e30: 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
6e40: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f  e3StrICmp(z, "RO
6e50: 57 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72  WID")==0 ) retur
6e60: 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
6e70: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49  e3StrICmp(z, "OI
6e80: 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  D")==0 ) return 
6e90: 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  1;.  return 0;.}
6ea0: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
6eb0: 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75  e name of a colu
6ec0: 6d 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58  mn of the form X
6ed0: 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20 6f 72 20 6a  .Y.Z or Y.Z or j
6ee0: 75 73 74 20 5a 2c 20 6c 6f 6f 6b 20 75 70 0a 2a  ust Z, look up.*
6ef0: 2a 20 74 68 61 74 20 6e 61 6d 65 20 69 6e 20 74  * that name in t
6f00: 68 65 20 73 65 74 20 6f 66 20 73 6f 75 72 63 65  he set of source
6f10: 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 4c   tables in pSrcL
6f20: 69 73 74 20 61 6e 64 20 6d 61 6b 65 20 74 68 65  ist and make the
6f30: 20 70 45 78 70 72 20 0a 2a 2a 20 65 78 70 72 65   pExpr .** expre
6f40: 73 73 69 6f 6e 20 6e 6f 64 65 20 72 65 66 65 72  ssion node refer
6f50: 20 62 61 63 6b 20 74 6f 20 74 68 61 74 20 73 6f   back to that so
6f60: 75 72 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68  urce column.  Th
6f70: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e  e following chan
6f80: 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20  ges.** are made 
6f90: 74 6f 20 70 45 78 70 72 3a 0a 2a 2a 0a 2a 2a 20  to pExpr:.**.** 
6fa0: 20 20 20 70 45 78 70 72 2d 3e 69 44 62 20 20 20     pExpr->iDb   
6fb0: 20 20 20 20 20 20 20 20 53 65 74 20 74 68 65 20          Set the 
6fc0: 69 6e 64 65 78 20 69 6e 20 64 62 2d 3e 61 44 62  index in db->aDb
6fd0: 5b 5d 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  [] of the databa
6fe0: 73 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 20 20  se holding.**   
6ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7000: 20 20 20 20 20 20 74 68 65 20 74 61 62 6c 65 2e        the table.
7010: 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 69 54  .**    pExpr->iT
7020: 61 62 6c 65 20 20 20 20 20 20 20 20 53 65 74 20  able        Set 
7030: 74 6f 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  to the cursor nu
7040: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
7050: 6c 65 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 20  le obtained.**  
7060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7070: 20 20 20 20 20 20 20 66 72 6f 6d 20 70 53 72 63         from pSrc
7080: 4c 69 73 74 2e 0a 2a 2a 20 20 20 20 70 45 78 70  List..**    pExp
7090: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 20 20 20 20 20  r->iColumn      
70a0: 20 53 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75   Set to the colu
70b0: 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74 68 69 6e  mn number within
70c0: 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20   the table..**  
70d0: 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20 20 20    pExpr->op     
70e0: 20 20 20 20 20 20 20 53 65 74 20 74 6f 20 54 4b         Set to TK
70f0: 5f 43 4f 4c 55 4d 4e 2e 0a 2a 2a 20 20 20 20 70  _COLUMN..**    p
7100: 45 78 70 72 2d 3e 70 4c 65 66 74 20 20 20 20 20  Expr->pLeft     
7110: 20 20 20 20 41 6e 79 20 65 78 70 72 65 73 73 69      Any expressi
7120: 6f 6e 20 74 68 69 73 20 70 6f 69 6e 74 73 20 74  on this points t
7130: 6f 20 69 73 20 64 65 6c 65 74 65 64 0a 2a 2a 20  o is deleted.** 
7140: 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74     pExpr->pRight
7150: 20 20 20 20 20 20 20 20 41 6e 79 20 65 78 70 72          Any expr
7160: 65 73 73 69 6f 6e 20 74 68 69 73 20 70 6f 69 6e  ession this poin
7170: 74 73 20 74 6f 20 69 73 20 64 65 6c 65 74 65 64  ts to is deleted
7180: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 44 62 54  ..**.** The pDbT
7190: 6f 6b 65 6e 20 69 73 20 74 68 65 20 6e 61 6d 65  oken is the name
71a0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
71b0: 20 28 74 68 65 20 22 58 22 29 2e 20 20 54 68 69   (the "X").  Thi
71c0: 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 0a 2a  s value may be.*
71d0: 2a 20 4e 55 4c 4c 20 6d 65 61 6e 69 6e 67 20 74  * NULL meaning t
71e0: 68 61 74 20 6e 61 6d 65 20 69 73 20 6f 66 20 74  hat name is of t
71f0: 68 65 20 66 6f 72 6d 20 59 2e 5a 20 6f 72 20 5a  he form Y.Z or Z
7200: 2e 20 20 41 6e 79 20 61 76 61 69 6c 61 62 6c 65  .  Any available
7210: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 61 6e   database.** can
7220: 20 62 65 20 75 73 65 64 2e 20 20 54 68 65 20 70   be used.  The p
7230: 54 61 62 6c 65 54 6f 6b 65 6e 20 69 73 20 74 68  TableToken is th
7240: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
7250: 62 6c 65 20 28 74 68 65 20 22 59 22 29 2e 20 20  ble (the "Y").  
7260: 54 68 69 73 0a 2a 2a 20 76 61 6c 75 65 20 63 61  This.** value ca
7270: 6e 20 62 65 20 4e 55 4c 4c 20 69 66 20 70 44 62  n be NULL if pDb
7280: 54 6f 6b 65 6e 20 69 73 20 61 6c 73 6f 20 4e 55  Token is also NU
7290: 4c 4c 2e 20 20 49 66 20 70 54 61 62 6c 65 54 6f  LL.  If pTableTo
72a0: 6b 65 6e 20 69 73 20 4e 55 4c 4c 20 69 74 0a 2a  ken is NULL it.*
72b0: 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  * means that the
72c0: 20 66 6f 72 6d 20 6f 66 20 74 68 65 20 6e 61 6d   form of the nam
72d0: 65 20 69 73 20 5a 20 61 6e 64 20 74 68 61 74 20  e is Z and that 
72e0: 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 61 6e 79  columns from any
72f0: 20 74 61 62 6c 65 0a 2a 2a 20 63 61 6e 20 62 65   table.** can be
7300: 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   used..**.** If 
7310: 74 68 65 20 6e 61 6d 65 20 63 61 6e 6e 6f 74 20  the name cannot 
7320: 62 65 20 72 65 73 6f 6c 76 65 64 20 75 6e 61 6d  be resolved unam
7330: 62 69 67 75 6f 75 73 6c 79 2c 20 6c 65 61 76 65  biguously, leave
7340: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
7350: 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65 20 61  e.** in pParse a
7360: 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  nd return non-ze
7370: 72 6f 2e 20 20 52 65 74 75 72 6e 20 7a 65 72 6f  ro.  Return zero
7380: 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a   on success..*/.
7390: 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 6f 6b 75  static int looku
73a0: 70 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a  pName(.  Parse *
73b0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
73c0: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
73d0: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
73e0: 2a 70 44 62 54 6f 6b 65 6e 2c 20 20 20 20 20 2f  *pDbToken,     /
73f0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
7400: 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e  tabase containin
7410: 67 20 74 61 62 6c 65 2c 20 6f 72 20 4e 55 4c 4c  g table, or NULL
7420: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61   */.  Token *pTa
7430: 62 6c 65 54 6f 6b 65 6e 2c 20 20 2f 2a 20 4e 61  bleToken,  /* Na
7440: 6d 65 20 6f 66 20 74 61 62 6c 65 20 63 6f 6e 74  me of table cont
7450: 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 2c 20 6f  aining column, o
7460: 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65  r NULL */.  Toke
7470: 6e 20 2a 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2c  n *pColumnToken,
7480: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
7490: 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20 20 4e 61 6d  column. */.  Nam
74a0: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20  eContext *pNC,  
74b0: 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 63 6f    /* The name co
74c0: 6e 74 65 78 74 20 75 73 65 64 20 74 6f 20 72 65  ntext used to re
74d0: 73 6f 6c 76 65 20 74 68 65 20 6e 61 6d 65 20 2a  solve the name *
74e0: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20  /.  Expr *pExpr 
74f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65           /* Make
7500: 20 74 68 69 73 20 45 58 50 52 20 6e 6f 64 65 20   this EXPR node 
7510: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 65 6c  point to the sel
7520: 65 63 74 65 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  ected column */.
7530: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 62 20 3d  ){.  char *zDb =
7540: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d   0;       /* Nam
7550: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
7560: 65 2e 20 20 54 68 65 20 22 58 22 20 69 6e 20 58  e.  The "X" in X
7570: 2e 59 2e 5a 20 2a 2f 0a 20 20 63 68 61 72 20 2a  .Y.Z */.  char *
7580: 7a 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 2f  zTab = 0;      /
7590: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
75a0: 62 6c 65 2e 20 20 54 68 65 20 22 59 22 20 69 6e  ble.  The "Y" in
75b0: 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20 2a 2f   X.Y.Z or Y.Z */
75c0: 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20  .  char *zCol = 
75d0: 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  0;      /* Name 
75e0: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 20  of the column.  
75f0: 54 68 65 20 22 5a 22 20 2a 2f 0a 20 20 69 6e 74  The "Z" */.  int
7600: 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
7610: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
7620: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 20  rs */.  int cnt 
7630: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
7640: 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69  Number of matchi
7650: 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ng column names 
7660: 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 54 61 62 20  */.  int cntTab 
7670: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d  = 0;      /* Num
7680: 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20  ber of matching 
7690: 74 61 62 6c 65 20 6e 61 6d 65 73 20 2a 2f 0a 20  table names */. 
76a0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
76b0: 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 54  Parse->db;  /* T
76c0: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
76d0: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
76e0: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 20 20  item *pItem;    
76f0: 20 20 20 2f 2a 20 55 73 65 20 66 6f 72 20 6c 6f     /* Use for lo
7700: 6f 70 69 6e 67 20 6f 76 65 72 20 70 53 72 63 4c  oping over pSrcL
7710: 69 73 74 20 69 74 65 6d 73 20 2a 2f 0a 20 20 73  ist items */.  s
7720: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
7730: 65 6d 20 2a 70 4d 61 74 63 68 20 3d 20 30 3b 20  em *pMatch = 0; 
7740: 20 2f 2a 20 54 68 65 20 6d 61 74 63 68 69 6e 67   /* The matching
7750: 20 70 53 72 63 4c 69 73 74 20 69 74 65 6d 20 2a   pSrcList item *
7760: 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  /.  NameContext 
7770: 2a 70 54 6f 70 4e 43 20 3d 20 70 4e 43 3b 20 20  *pTopNC = pNC;  
7780: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6e        /* First n
7790: 61 6d 65 63 6f 6e 74 65 78 74 20 69 6e 20 74 68  amecontext in th
77a0: 65 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73  e list */..  ass
77b0: 65 72 74 28 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65  ert( pColumnToke
77c0: 6e 20 26 26 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65  n && pColumnToke
77d0: 6e 2d 3e 7a 20 29 3b 20 2f 2a 20 54 68 65 20 5a  n->z ); /* The Z
77e0: 20 69 6e 20 58 2e 59 2e 5a 20 63 61 6e 6e 6f 74   in X.Y.Z cannot
77f0: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 7a 44   be NULL */.  zD
7800: 62 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  b = sqlite3NameF
7810: 72 6f 6d 54 6f 6b 65 6e 28 70 44 62 54 6f 6b 65  romToken(pDbToke
7820: 6e 29 3b 0a 20 20 7a 54 61 62 20 3d 20 73 71 6c  n);.  zTab = sql
7830: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
7840: 6e 28 70 54 61 62 6c 65 54 6f 6b 65 6e 29 3b 0a  n(pTableToken);.
7850: 20 20 7a 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33    zCol = sqlite3
7860: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 43  NameFromToken(pC
7870: 6f 6c 75 6d 6e 54 6f 6b 65 6e 29 3b 0a 20 20 69  olumnToken);.  i
7880: 66 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  f( sqlite3Malloc
7890: 46 61 69 6c 65 64 28 29 20 29 7b 0a 20 20 20 20  Failed() ){.    
78a0: 67 6f 74 6f 20 6c 6f 6f 6b 75 70 6e 61 6d 65 5f  goto lookupname_
78b0: 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 70 45 78 70  end;.  }..  pExp
78c0: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2d 31 3b 0a  r->iTable = -1;.
78d0: 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20    while( pNC && 
78e0: 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78  cnt==0 ){.    Ex
78f0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
7900: 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72      SrcList *pSr
7910: 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72  cList = pNC->pSr
7920: 63 4c 69 73 74 3b 0a 0a 20 20 20 20 69 66 28 20  cList;..    if( 
7930: 70 53 72 63 4c 69 73 74 20 29 7b 0a 20 20 20 20  pSrcList ){.    
7940: 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d    for(i=0, pItem
7950: 3d 70 53 72 63 4c 69 73 74 2d 3e 61 3b 20 69 3c  =pSrcList->a; i<
7960: 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pSrcList->nSrc; 
7970: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
7980: 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54         Table *pT
7990: 61 62 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ab;.        int 
79a0: 69 44 62 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c  iDb;.        Col
79b0: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 0a 20 20  umn *pCol;.  .  
79c0: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 49 74        pTab = pIt
79d0: 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  em->pTab;.      
79e0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d    assert( pTab!=
79f0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 44 62  0 );.        iDb
7a00: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
7a10: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
7a20: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
7a30: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
7a40: 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20  ->nCol>0 );.    
7a50: 20 20 20 20 69 66 28 20 7a 54 61 62 20 29 7b 0a      if( zTab ){.
7a60: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
7a70: 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20  tem->zAlias ){. 
7a80: 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
7a90: 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 49 74 65  *zTabName = pIte
7aa0: 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20  m->zAlias;.     
7ab0: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
7ac0: 65 33 53 74 72 49 43 6d 70 28 7a 54 61 62 4e 61  e3StrICmp(zTabNa
7ad0: 6d 65 2c 20 7a 54 61 62 29 21 3d 30 20 29 20 63  me, zTab)!=0 ) c
7ae0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
7af0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7b00: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62        char *zTab
7b10: 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  Name = pTab->zNa
7b20: 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
7b30: 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20  if( zTabName==0 
7b40: 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  || sqlite3StrICm
7b50: 70 28 7a 54 61 62 4e 61 6d 65 2c 20 7a 54 61 62  p(zTabName, zTab
7b60: 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
7b70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
7b80: 20 7a 44 62 21 3d 30 20 26 26 20 73 71 6c 69 74   zDb!=0 && sqlit
7b90: 65 33 53 74 72 49 43 6d 70 28 64 62 2d 3e 61 44  e3StrICmp(db->aD
7ba0: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 7a 44  b[iDb].zName, zD
7bb0: 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  b)!=0 ){.       
7bc0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
7bd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
7be0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7bf0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
7c00: 20 30 3d 3d 28 63 6e 74 54 61 62 2b 2b 29 20 29   0==(cntTab++) )
7c10: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70  {.          pExp
7c20: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 49 74 65  r->iTable = pIte
7c30: 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
7c40: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 53 63        pExpr->pSc
7c50: 68 65 6d 61 20 3d 20 70 54 61 62 2d 3e 70 53 63  hema = pTab->pSc
7c60: 68 65 6d 61 3b 0a 20 20 20 20 20 20 20 20 20 20  hema;.          
7c70: 70 4d 61 74 63 68 20 3d 20 70 49 74 65 6d 3b 0a  pMatch = pItem;.
7c80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7c90: 20 20 66 6f 72 28 6a 3d 30 2c 20 70 43 6f 6c 3d    for(j=0, pCol=
7ca0: 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54  pTab->aCol; j<pT
7cb0: 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70  ab->nCol; j++, p
7cc0: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
7cd0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
7ce0: 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  ICmp(pCol->zName
7cf0: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20  , zCol)==0 ){.  
7d00: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
7d10: 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 54  char *zColl = pT
7d20: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c  ab->aCol[j].zCol
7d30: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 49  l;.            I
7d40: 64 4c 69 73 74 20 2a 70 55 73 69 6e 67 3b 0a 20  dList *pUsing;. 
7d50: 20 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b             cnt++
7d60: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
7d70: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 49  xpr->iTable = pI
7d80: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
7d90: 20 20 20 20 20 20 20 20 20 20 70 4d 61 74 63 68            pMatch
7da0: 20 3d 20 70 49 74 65 6d 3b 0a 20 20 20 20 20 20   = pItem;.      
7db0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 53 63        pExpr->pSc
7dc0: 68 65 6d 61 20 3d 20 70 54 61 62 2d 3e 70 53 63  hema = pTab->pSc
7dd0: 68 65 6d 61 3b 0a 20 20 20 20 20 20 20 20 20 20  hema;.          
7de0: 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20    /* Substitute 
7df0: 74 68 65 20 72 6f 77 69 64 20 28 63 6f 6c 75 6d  the rowid (colum
7e00: 6e 20 2d 31 29 20 66 6f 72 20 74 68 65 20 49 4e  n -1) for the IN
7e10: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
7e20: 59 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  Y */.           
7e30: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
7e40: 3d 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79  = j==pTab->iPKey
7e50: 20 3f 20 2d 31 20 3a 20 6a 3b 0a 20 20 20 20 20   ? -1 : j;.     
7e60: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66         pExpr->af
7e70: 66 69 6e 69 74 79 20 3d 20 70 54 61 62 2d 3e 61  finity = pTab->a
7e80: 43 6f 6c 5b 6a 5d 2e 61 66 66 69 6e 69 74 79 3b  Col[j].affinity;
7e90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
7ea0: 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26   (pExpr->flags &
7eb0: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3d   EP_ExpCollate)=
7ec0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
7ed0: 20 20 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c      pExpr->pColl
7ee0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
7ef0: 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62  llSeq(db, ENC(db
7f00: 29 2c 20 7a 43 6f 6c 6c 2c 2d 31 2c 20 30 29 3b  ), zColl,-1, 0);
7f10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
7f20: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
7f30: 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 2d  <pSrcList->nSrc-
7f40: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
7f50: 20 20 20 69 66 28 20 70 49 74 65 6d 5b 31 5d 2e     if( pItem[1].
7f60: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41  jointype & JT_NA
7f70: 54 55 52 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  TURAL ){.       
7f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
7f90: 68 69 73 20 6d 61 74 63 68 20 6f 63 63 75 72 72  his match occurr
7fa0: 65 64 20 69 6e 20 74 68 65 20 6c 65 66 74 20 74  ed in the left t
7fb0: 61 62 6c 65 20 6f 66 20 61 20 6e 61 74 75 72 61  able of a natura
7fc0: 6c 20 6a 6f 69 6e 2c 0a 20 20 20 20 20 20 20 20  l join,.        
7fd0: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
7fe0: 73 6b 69 70 20 74 68 65 20 72 69 67 68 74 20 74  skip the right t
7ff0: 61 62 6c 65 20 74 6f 20 61 76 6f 69 64 20 61 20  able to avoid a 
8000: 64 75 70 6c 69 63 61 74 65 20 6d 61 74 63 68 20  duplicate match 
8010: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
8020: 20 20 20 70 49 74 65 6d 2b 2b 3b 0a 20 20 20 20     pItem++;.    
8030: 20 20 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b              i++;
8040: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
8050: 65 6c 73 65 20 69 66 28 20 28 70 55 73 69 6e 67  else if( (pUsing
8060: 20 3d 20 70 49 74 65 6d 5b 31 5d 2e 70 55 73 69   = pItem[1].pUsi
8070: 6e 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ng)!=0 ){.      
8080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
8090: 74 68 69 73 20 6d 61 74 63 68 20 6f 63 63 75 72  this match occur
80a0: 73 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 74 68  s on a column th
80b0: 61 74 20 69 73 20 69 6e 20 74 68 65 20 55 53 49  at is in the USI
80c0: 4e 47 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20  NG clause.      
80d0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20            ** of 
80e0: 61 20 6a 6f 69 6e 2c 20 73 6b 69 70 20 74 68 65  a join, skip the
80f0: 20 73 65 61 72 63 68 20 6f 66 20 74 68 65 20 72   search of the r
8100: 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20 74 68  ight table of th
8110: 65 20 6a 6f 69 6e 0a 20 20 20 20 20 20 20 20 20  e join.         
8120: 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f         ** to avo
8130: 69 64 20 61 20 64 75 70 6c 69 63 61 74 65 20 6d  id a duplicate m
8140: 61 74 63 68 20 74 68 65 72 65 2e 20 2a 2f 0a 20  atch there. */. 
8150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
8160: 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt k;.          
8170: 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
8180: 3c 70 55 73 69 6e 67 2d 3e 6e 49 64 3b 20 6b 2b  <pUsing->nId; k+
8190: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
81a0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
81b0: 33 53 74 72 49 43 6d 70 28 70 55 73 69 6e 67 2d  3StrICmp(pUsing-
81c0: 3e 61 5b 6b 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f  >a[k].zName, zCo
81d0: 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)==0 ){.       
81e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
81f0: 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  em++;.          
8200: 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20            i++;. 
8210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8220: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8230: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
8240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
8250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
8260: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
8270: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
8280: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
8290: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
82a0: 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
82b0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
82c0: 52 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 68  R.    /* If we h
82d0: 61 76 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  ave not already 
82e0: 72 65 73 6f 6c 76 65 64 20 74 68 65 20 6e 61 6d  resolved the nam
82f0: 65 2c 20 74 68 65 6e 20 6d 61 79 62 65 20 0a 20  e, then maybe . 
8300: 20 20 20 2a 2a 20 69 74 20 69 73 20 61 20 6e 65     ** it is a ne
8310: 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 74 72 69  w.* or old.* tri
8320: 67 67 65 72 20 61 72 67 75 6d 65 6e 74 20 72 65  gger argument re
8330: 66 65 72 65 6e 63 65 0a 20 20 20 20 2a 2f 0a 20  ference.    */. 
8340: 20 20 20 69 66 28 20 7a 44 62 3d 3d 30 20 26 26     if( zDb==0 &&
8350: 20 7a 54 61 62 21 3d 30 20 26 26 20 63 6e 74 3d   zTab!=0 && cnt=
8360: 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 74 72  =0 && pParse->tr
8370: 69 67 53 74 61 63 6b 21 3d 30 20 29 7b 0a 20 20  igStack!=0 ){.  
8380: 20 20 20 20 54 72 69 67 67 65 72 53 74 61 63 6b      TriggerStack
8390: 20 2a 70 54 72 69 67 67 65 72 53 74 61 63 6b 20   *pTriggerStack 
83a0: 3d 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74  = pParse->trigSt
83b0: 61 63 6b 3b 0a 20 20 20 20 20 20 54 61 62 6c 65  ack;.      Table
83c0: 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20   *pTab = 0;.    
83d0: 20 20 69 66 28 20 70 54 72 69 67 67 65 72 53 74    if( pTriggerSt
83e0: 61 63 6b 2d 3e 6e 65 77 49 64 78 20 21 3d 20 2d  ack->newIdx != -
83f0: 31 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  1 && sqlite3StrI
8400: 43 6d 70 28 22 6e 65 77 22 2c 20 7a 54 61 62 29  Cmp("new", zTab)
8410: 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 20 20 20   == 0 ){.       
8420: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
8430: 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e   pTriggerStack->
8440: 6e 65 77 49 64 78 3b 0a 20 20 20 20 20 20 20 20  newIdx;.        
8450: 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72  assert( pTrigger
8460: 53 74 61 63 6b 2d 3e 70 54 61 62 20 29 3b 0a 20  Stack->pTab );. 
8470: 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54         pTab = pT
8480: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61  riggerStack->pTa
8490: 62 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  b;.      }else i
84a0: 66 28 20 70 54 72 69 67 67 65 72 53 74 61 63 6b  f( pTriggerStack
84b0: 2d 3e 6f 6c 64 49 64 78 20 21 3d 20 2d 31 20 26  ->oldIdx != -1 &
84c0: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
84d0: 28 22 6f 6c 64 22 2c 20 7a 54 61 62 29 3d 3d 30  ("old", zTab)==0
84e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70   ){.        pExp
84f0: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 54 72 69  r->iTable = pTri
8500: 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 49 64  ggerStack->oldId
8510: 78 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  x;.        asser
8520: 74 28 20 70 54 72 69 67 67 65 72 53 74 61 63 6b  t( pTriggerStack
8530: 2d 3e 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20  ->pTab );.      
8540: 20 20 70 54 61 62 20 3d 20 70 54 72 69 67 67 65    pTab = pTrigge
8550: 72 53 74 61 63 6b 2d 3e 70 54 61 62 3b 0a 20 20  rStack->pTab;.  
8560: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
8570: 20 70 54 61 62 20 29 7b 20 0a 20 20 20 20 20 20   pTab ){ .      
8580: 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20    int iCol;.    
8590: 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c      Column *pCol
85a0: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 3b 0a 0a   = pTab->aCol;..
85b0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
85c0: 53 63 68 65 6d 61 20 3d 20 70 54 61 62 2d 3e 70  Schema = pTab->p
85d0: 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20 20 20  Schema;.        
85e0: 63 6e 74 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  cntTab++;.      
85f0: 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43    for(iCol=0; iC
8600: 6f 6c 20 3c 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b  ol < pTab->nCol;
8610: 20 69 43 6f 6c 2b 2b 2c 20 70 43 6f 6c 2b 2b 29   iCol++, pCol++)
8620: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   {.          if(
8630: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
8640: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  pCol->zName, zCo
8650: 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)==0 ){.       
8660: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
8670: 2a 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61  *zColl = pTab->a
8680: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 43 6f 6c 6c 3b  Col[iCol].zColl;
8690: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6e 74  .            cnt
86a0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
86b0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
86c0: 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b   iCol==pTab->iPK
86d0: 65 79 20 3f 20 2d 31 20 3a 20 69 43 6f 6c 3b 0a  ey ? -1 : iCol;.
86e0: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
86f0: 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 70 54  r->affinity = pT
8700: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 61  ab->aCol[iCol].a
8710: 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20  ffinity;.       
8720: 20 20 20 20 20 69 66 28 20 28 70 45 78 70 72 2d       if( (pExpr-
8730: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
8740: 6f 6c 6c 61 74 65 29 3d 3d 30 20 29 7b 0a 20 20  ollate)==0 ){.  
8750: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
8760: 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  r->pColl = sqlit
8770: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
8780: 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c  , ENC(db), zColl
8790: 2c 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ,-1, 0);.       
87a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
87b0: 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d     pExpr->pTab =
87c0: 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20   pTab;.         
87d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
87e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
87f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
8800: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
8810: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49  (SQLITE_OMIT_TRI
8820: 47 47 45 52 29 20 2a 2f 0a 0a 20 20 20 20 2f 2a  GGER) */..    /*
8830: 0a 20 20 20 20 2a 2a 20 50 65 72 68 61 70 73 20  .    ** Perhaps 
8840: 74 68 65 20 6e 61 6d 65 20 69 73 20 61 20 72 65  the name is a re
8850: 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 52  ference to the R
8860: 4f 57 49 44 0a 20 20 20 20 2a 2f 0a 20 20 20 20  OWID.    */.    
8870: 69 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 63 6e  if( cnt==0 && cn
8880: 74 54 61 62 3d 3d 31 20 26 26 20 73 71 6c 69 74  tTab==1 && sqlit
8890: 65 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c 29 20  e3IsRowid(zCol) 
88a0: 29 7b 0a 20 20 20 20 20 20 63 6e 74 20 3d 20 31  ){.      cnt = 1
88b0: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  ;.      pExpr->i
88c0: 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
88d0: 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69     pExpr->affini
88e0: 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ty = SQLITE_AFF_
88f0: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 7d 0a 0a  INTEGER;.    }..
8900: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66      /*.    ** If
8910: 20 74 68 65 20 69 6e 70 75 74 20 69 73 20 6f 66   the input is of
8920: 20 74 68 65 20 66 6f 72 6d 20 5a 20 28 6e 6f 74   the form Z (not
8930: 20 59 2e 5a 20 6f 72 20 58 2e 59 2e 5a 29 20 74   Y.Z or X.Y.Z) t
8940: 68 65 6e 20 74 68 65 20 6e 61 6d 65 20 5a 0a 20  hen the name Z. 
8950: 20 20 20 2a 2a 20 6d 69 67 68 74 20 72 65 66 65     ** might refe
8960: 72 20 74 6f 20 61 6e 20 72 65 73 75 6c 74 2d 73  r to an result-s
8970: 65 74 20 61 6c 69 61 73 2e 20 20 54 68 69 73 20  et alias.  This 
8980: 68 61 70 70 65 6e 73 2c 20 66 6f 72 20 65 78 61  happens, for exa
8990: 6d 70 6c 65 2c 20 77 68 65 6e 0a 20 20 20 20 2a  mple, when.    *
89a0: 2a 20 77 65 20 61 72 65 20 72 65 73 6f 6c 76 69  * we are resolvi
89b0: 6e 67 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20  ng names in the 
89c0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20  WHERE clause of 
89d0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  the following co
89e0: 6d 6d 61 6e 64 3a 0a 20 20 20 20 2a 2a 0a 20 20  mmand:.    **.  
89f0: 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
8a00: 61 2b 62 20 41 53 20 78 20 46 52 4f 4d 20 74 61  a+b AS x FROM ta
8a10: 62 6c 65 20 57 48 45 52 45 20 78 3c 31 30 3b 0a  ble WHERE x<10;.
8a20: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e      **.    ** In
8a30: 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69 73   cases like this
8a40: 2c 20 72 65 70 6c 61 63 65 20 70 45 78 70 72 20  , replace pExpr 
8a50: 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74  with a copy of t
8a60: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
8a70: 61 74 0a 20 20 20 20 2a 2a 20 66 6f 72 6d 73 20  at.    ** forms 
8a80: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 65  the result set e
8a90: 6e 74 72 79 20 28 22 61 2b 62 22 20 69 6e 20 74  ntry ("a+b" in t
8aa0: 68 65 20 65 78 61 6d 70 6c 65 29 20 61 6e 64 20  he example) and 
8ab0: 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65  return immediate
8ac0: 6c 79 2e 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20  ly..    ** Note 
8ad0: 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73  that the express
8ae0: 69 6f 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ion in the resul
8af0: 74 20 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76  t set should hav
8b00: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20  e already been. 
8b10: 20 20 20 2a 2a 20 72 65 73 6f 6c 76 65 64 20 62     ** resolved b
8b20: 79 20 74 68 65 20 74 69 6d 65 20 74 68 65 20 57  y the time the W
8b30: 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 72  HERE clause is r
8b40: 65 73 6f 6c 76 65 64 2e 0a 20 20 20 20 2a 2f 0a  esolved..    */.
8b50: 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26      if( cnt==0 &
8b60: 26 20 28 70 45 4c 69 73 74 20 3d 20 70 4e 43 2d  & (pEList = pNC-
8b70: 3e 70 45 4c 69 73 74 29 21 3d 30 20 26 26 20 7a  >pEList)!=0 && z
8b80: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
8b90: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 45 4c 69 73  for(j=0; j<pELis
8ba0: 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a  t->nExpr; j++){.
8bb0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41          char *zA
8bc0: 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d  s = pEList->a[j]
8bd0: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
8be0: 69 66 28 20 7a 41 73 21 3d 30 20 26 26 20 73 71  if( zAs!=0 && sq
8bf0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 73  lite3StrICmp(zAs
8c00: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20  , zCol)==0 ){.  
8c10: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 44          Expr *pD
8c20: 75 70 2c 20 2a 70 4f 72 69 67 3b 0a 20 20 20 20  up, *pOrig;.    
8c30: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
8c40: 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26  xpr->pLeft==0 &&
8c50: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d   pExpr->pRight==
8c60: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  0 );.          a
8c70: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
8c80: 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ist==0 );.      
8c90: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
8ca0: 72 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b  r->pSelect==0 );
8cb0: 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72 69 67  .          pOrig
8cc0: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   = pEList->a[j].
8cd0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
8ce0: 20 69 66 28 20 21 70 4e 43 2d 3e 61 6c 6c 6f 77   if( !pNC->allow
8cf0: 41 67 67 20 26 26 20 45 78 70 72 48 61 73 50 72  Agg && ExprHasPr
8d00: 6f 70 65 72 74 79 28 70 4f 72 69 67 2c 20 45 50  operty(pOrig, EP
8d10: 5f 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20 20  _Agg) ){.       
8d20: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
8d30: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69  rMsg(pParse, "mi
8d40: 73 75 73 65 20 6f 66 20 61 6c 69 61 73 65 64 20  suse of aliased 
8d50: 61 67 67 72 65 67 61 74 65 20 25 73 22 2c 20 7a  aggregate %s", z
8d60: 41 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  As);.           
8d70: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 43 6f 6c   sqliteFree(zCol
8d80: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
8d90: 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 20 20 20  eturn 2;.       
8da0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
8db0: 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Dup = sqlite3Exp
8dc0: 72 44 75 70 28 70 4f 72 69 67 29 3b 0a 20 20 20  rDup(pOrig);.   
8dd0: 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
8de0: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70  ->flags & EP_Exp
8df0: 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20  Collate ){.     
8e00: 20 20 20 20 20 20 20 70 44 75 70 2d 3e 70 43 6f         pDup->pCo
8e10: 6c 6c 20 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c  ll = pExpr->pCol
8e20: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  l;.            p
8e30: 44 75 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  Dup->flags |= EP
8e40: 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20  _ExpCollate;.   
8e50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8e60: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 73 70     if( pExpr->sp
8e70: 61 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74 65 46  an.dyn ) sqliteF
8e80: 72 65 65 28 28 63 68 61 72 2a 29 70 45 78 70 72  ree((char*)pExpr
8e90: 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20 20 20 20  ->span.z);.     
8ea0: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
8eb0: 74 6f 6b 65 6e 2e 64 79 6e 20 29 20 73 71 6c 69  token.dyn ) sqli
8ec0: 74 65 46 72 65 65 28 28 63 68 61 72 2a 29 70 45  teFree((char*)pE
8ed0: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20  xpr->token.z);. 
8ee0: 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
8ef0: 70 45 78 70 72 2c 20 70 44 75 70 2c 20 73 69 7a  pExpr, pDup, siz
8f00: 65 6f 66 28 2a 70 45 78 70 72 29 29 3b 0a 20 20  eof(*pExpr));.  
8f10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
8f20: 65 65 28 70 44 75 70 29 3b 0a 20 20 20 20 20 20  ee(pDup);.      
8f30: 20 20 20 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20      cnt = 1;.   
8f40: 20 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20         pMatch = 
8f50: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  0;.          ass
8f60: 65 72 74 28 20 7a 54 61 62 3d 3d 30 20 26 26 20  ert( zTab==0 && 
8f70: 7a 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  zDb==0 );.      
8f80: 20 20 20 20 67 6f 74 6f 20 6c 6f 6f 6b 75 70 6e      goto lookupn
8f90: 61 6d 65 5f 65 6e 64 5f 32 3b 0a 20 20 20 20 20  ame_end_2;.     
8fa0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 0a 20 20     }.      } .  
8fb0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 76 61    }..    /* Adva
8fc0: 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  nce to the next 
8fd0: 6e 61 6d 65 20 63 6f 6e 74 65 78 74 2e 20 20 54  name context.  T
8fe0: 68 65 20 6c 6f 6f 70 20 77 69 6c 6c 20 65 78 69  he loop will exi
8ff0: 74 20 77 68 65 6e 20 65 69 74 68 65 72 0a 20 20  t when either.  
9000: 20 20 2a 2a 20 77 65 20 68 61 76 65 20 61 20 6d    ** we have a m
9010: 61 74 63 68 20 28 63 6e 74 3e 30 29 20 6f 72 20  atch (cnt>0) or 
9020: 77 68 65 6e 20 77 65 20 72 75 6e 20 6f 75 74 20  when we run out 
9030: 6f 66 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 73  of name contexts
9040: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
9050: 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20   cnt==0 ){.     
9060: 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78   pNC = pNC->pNex
9070: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
9080: 2f 2a 0a 20 20 2a 2a 20 49 66 20 58 20 61 6e 64  /*.  ** If X and
9090: 20 59 20 61 72 65 20 4e 55 4c 4c 20 28 69 6e 20   Y are NULL (in 
90a0: 6f 74 68 65 72 20 77 6f 72 64 73 20 69 66 20 6f  other words if o
90b0: 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  nly the column n
90c0: 61 6d 65 20 5a 20 69 73 0a 20 20 2a 2a 20 73 75  ame Z is.  ** su
90d0: 70 70 6c 69 65 64 29 20 61 6e 64 20 74 68 65 20  pplied) and the 
90e0: 76 61 6c 75 65 20 6f 66 20 5a 20 69 73 20 65 6e  value of Z is en
90f0: 63 6c 6f 73 65 64 20 69 6e 20 64 6f 75 62 6c 65  closed in double
9100: 2d 71 75 6f 74 65 73 2c 20 74 68 65 6e 0a 20 20  -quotes, then.  
9110: 2a 2a 20 5a 20 69 73 20 61 20 73 74 72 69 6e 67  ** Z is a string
9120: 20 6c 69 74 65 72 61 6c 20 69 66 20 69 74 20 64   literal if it d
9130: 6f 65 73 6e 27 74 20 6d 61 74 63 68 20 61 6e 79  oesn't match any
9140: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20   column names.  
9150: 49 6e 20 74 68 61 74 0a 20 20 2a 2a 20 63 61 73  In that.  ** cas
9160: 65 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65  e, we need to re
9170: 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 20  turn right away 
9180: 61 6e 64 20 6e 6f 74 20 6d 61 6b 65 20 61 6e 79  and not make any
9190: 20 63 68 61 6e 67 65 73 20 74 6f 0a 20 20 2a 2a   changes to.  **
91a0: 20 70 45 78 70 72 2e 0a 20 20 2a 2a 0a 20 20 2a   pExpr..  **.  *
91b0: 2a 20 42 65 63 61 75 73 65 20 6e 6f 20 72 65 66  * Because no ref
91c0: 65 72 65 6e 63 65 20 77 61 73 20 6d 61 64 65 20  erence was made 
91d0: 74 6f 20 6f 75 74 65 72 20 63 6f 6e 74 65 78 74  to outer context
91e0: 73 2c 20 74 68 65 20 70 4e 43 2d 3e 6e 52 65 66  s, the pNC->nRef
91f0: 0a 20 20 2a 2a 20 66 69 65 6c 64 73 20 61 72 65  .  ** fields are
9200: 20 6e 6f 74 20 63 68 61 6e 67 65 64 20 69 6e 20   not changed in 
9210: 61 6e 79 20 63 6f 6e 74 65 78 74 2e 0a 20 20 2a  any context..  *
9220: 2f 0a 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26  /.  if( cnt==0 &
9230: 26 20 7a 54 61 62 3d 3d 30 20 26 26 20 70 43 6f  & zTab==0 && pCo
9240: 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d  lumnToken->z[0]=
9250: 3d 27 22 27 20 29 7b 0a 20 20 20 20 73 71 6c 69  ='"' ){.    sqli
9260: 74 65 46 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20  teFree(zCol);.  
9270: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
9280: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63 6e 74 3d 3d  .  /*.  ** cnt==
9290: 30 20 6d 65 61 6e 73 20 74 68 65 72 65 20 77 61  0 means there wa
92a0: 73 20 6e 6f 74 20 6d 61 74 63 68 2e 20 20 63 6e  s not match.  cn
92b0: 74 3e 31 20 6d 65 61 6e 73 20 74 68 65 72 65 20  t>1 means there 
92c0: 77 65 72 65 20 74 77 6f 20 6f 72 0a 20 20 2a 2a  were two or.  **
92d0: 20 6d 6f 72 65 20 6d 61 74 63 68 65 73 2e 20 20   more matches.  
92e0: 45 69 74 68 65 72 20 77 61 79 2c 20 77 65 20 68  Either way, we h
92f0: 61 76 65 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20  ave an error..  
9300: 2a 2f 0a 20 20 69 66 28 20 63 6e 74 21 3d 31 20  */.  if( cnt!=1 
9310: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  ){.    char *z =
9320: 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45   0;.    char *zE
9330: 72 72 3b 0a 20 20 20 20 7a 45 72 72 20 3d 20 63  rr;.    zErr = c
9340: 6e 74 3d 3d 30 20 3f 20 22 6e 6f 20 73 75 63 68  nt==0 ? "no such
9350: 20 63 6f 6c 75 6d 6e 3a 20 25 73 22 20 3a 20 22   column: %s" : "
9360: 61 6d 62 69 67 75 6f 75 73 20 63 6f 6c 75 6d 6e  ambiguous column
9370: 20 6e 61 6d 65 3a 20 25 73 22 3b 0a 20 20 20 20   name: %s";.    
9380: 69 66 28 20 7a 44 62 20 29 7b 0a 20 20 20 20 20  if( zDb ){.     
9390: 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
93a0: 67 28 26 7a 2c 20 7a 44 62 2c 20 22 2e 22 2c 20  g(&z, zDb, ".", 
93b0: 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c  zTab, ".", zCol,
93c0: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
93d0: 7d 65 6c 73 65 20 69 66 28 20 7a 54 61 62 20 29  }else if( zTab )
93e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
93f0: 65 74 53 74 72 69 6e 67 28 26 7a 2c 20 7a 54 61  etString(&z, zTa
9400: 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20 28 63  b, ".", zCol, (c
9410: 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 7d 65 6c  har*)0);.    }el
9420: 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71  se{.      z = sq
9430: 6c 69 74 65 53 74 72 44 75 70 28 7a 43 6f 6c 29  liteStrDup(zCol)
9440: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
9450: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
9460: 73 65 2c 20 7a 45 72 72 2c 20 7a 29 3b 0a 20 20  se, zErr, z);.  
9470: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b    sqliteFree(z);
9480: 0a 20 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 45 72  .    pTopNC->nEr
9490: 72 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  r++;.  }..  /* I
94a0: 66 20 61 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20  f a column from 
94b0: 61 20 74 61 62 6c 65 20 69 6e 20 70 53 72 63 4c  a table in pSrcL
94c0: 69 73 74 20 69 73 20 72 65 66 65 72 65 6e 63 65  ist is reference
94d0: 64 2c 20 74 68 65 6e 20 72 65 63 6f 72 64 0a 20  d, then record. 
94e0: 20 2a 2a 20 74 68 69 73 20 66 61 63 74 20 69 6e   ** this fact in
94f0: 20 74 68 65 20 70 53 72 63 4c 69 73 74 2e 61 5b   the pSrcList.a[
9500: 5d 2e 63 6f 6c 55 73 65 64 20 62 69 74 6d 61 73  ].colUsed bitmas
9510: 6b 2e 20 20 43 6f 6c 75 6d 6e 20 30 20 63 61 75  k.  Column 0 cau
9520: 73 65 73 0a 20 20 2a 2a 20 62 69 74 20 30 20 74  ses.  ** bit 0 t
9530: 6f 20 62 65 20 73 65 74 2e 20 20 43 6f 6c 75 6d  o be set.  Colum
9540: 6e 20 31 20 73 65 74 73 20 62 69 74 20 31 2e 20  n 1 sets bit 1. 
9550: 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20   And so forth.  
9560: 49 66 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6c 75  If the.  ** colu
9570: 6d 6e 20 6e 75 6d 62 65 72 20 69 73 20 67 72 65  mn number is gre
9580: 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6e 75  ater than the nu
9590: 6d 62 65 72 20 6f 66 20 62 69 74 73 20 69 6e 20  mber of bits in 
95a0: 74 68 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a  the bitmask.  **
95b0: 20 74 68 65 6e 20 73 65 74 20 74 68 65 20 68 69   then set the hi
95c0: 67 68 2d 6f 72 64 65 72 20 62 69 74 20 6f 66 20  gh-order bit of 
95d0: 74 68 65 20 62 69 74 6d 61 73 6b 2e 0a 20 20 2a  the bitmask..  *
95e0: 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69  /.  if( pExpr->i
95f0: 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 4d 61  Column>=0 && pMa
9600: 74 63 68 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  tch!=0 ){.    in
9610: 74 20 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  t n = pExpr->iCo
9620: 6c 75 6d 6e 3b 0a 20 20 20 20 69 66 28 20 6e 3e  lumn;.    if( n>
9630: 3d 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29  =sizeof(Bitmask)
9640: 2a 38 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20  *8 ){.      n = 
9650: 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a  sizeof(Bitmask)*
9660: 38 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  8-1;.    }.    a
9670: 73 73 65 72 74 28 20 70 4d 61 74 63 68 2d 3e 69  ssert( pMatch->i
9680: 43 75 72 73 6f 72 3d 3d 70 45 78 70 72 2d 3e 69  Cursor==pExpr->i
9690: 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 70 4d 61  Table );.    pMa
96a0: 74 63 68 2d 3e 63 6f 6c 55 73 65 64 20 7c 3d 20  tch->colUsed |= 
96b0: 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 6e 3b  ((Bitmask)1)<<n;
96c0: 0a 20 20 7d 0a 0a 6c 6f 6f 6b 75 70 6e 61 6d 65  .  }..lookupname
96d0: 5f 65 6e 64 3a 0a 20 20 2f 2a 20 43 6c 65 61 6e  _end:.  /* Clean
96e0: 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 0a 20   up and return. 
96f0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 46 72 65 65   */.  sqliteFree
9700: 28 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 46  (zDb);.  sqliteF
9710: 72 65 65 28 7a 54 61 62 29 3b 0a 20 20 73 71 6c  ree(zTab);.  sql
9720: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
9730: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
9740: 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30  pExpr->pLeft = 0
9750: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
9760: 65 6c 65 74 65 28 70 45 78 70 72 2d 3e 70 52 69  elete(pExpr->pRi
9770: 67 68 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70  ght);.  pExpr->p
9780: 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 70 45 78  Right = 0;.  pEx
9790: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55  pr->op = TK_COLU
97a0: 4d 4e 3b 0a 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65  MN;.lookupname_e
97b0: 6e 64 5f 32 3a 0a 20 20 73 71 6c 69 74 65 46 72  nd_2:.  sqliteFr
97c0: 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 69 66 28 20  ee(zCol);.  if( 
97d0: 63 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 61 73  cnt==1 ){.    as
97e0: 73 65 72 74 28 20 70 4e 43 21 3d 30 20 29 3b 0a  sert( pNC!=0 );.
97f0: 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 68 52      sqlite3AuthR
9800: 65 61 64 28 70 50 61 72 73 65 2c 20 70 45 78 70  ead(pParse, pExp
9810: 72 2c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74  r, pNC->pSrcList
9820: 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 61 74 63  );.    if( pMatc
9830: 68 20 26 26 20 21 70 4d 61 74 63 68 2d 3e 70 53  h && !pMatch->pS
9840: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 70  elect ){.      p
9850: 45 78 70 72 2d 3e 70 54 61 62 20 3d 20 70 4d 61  Expr->pTab = pMa
9860: 74 63 68 2d 3e 70 54 61 62 3b 0a 20 20 20 20 7d  tch->pTab;.    }
9870: 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  .    /* Incremen
9880: 74 20 74 68 65 20 6e 52 65 66 20 76 61 6c 75 65  t the nRef value
9890: 20 6f 6e 20 61 6c 6c 20 6e 61 6d 65 20 63 6f 6e   on all name con
98a0: 74 65 78 74 73 20 66 72 6f 6d 20 54 6f 70 4e 43  texts from TopNC
98b0: 20 75 70 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68   up to.    ** th
98c0: 65 20 70 6f 69 6e 74 20 77 68 65 72 65 20 74 68  e point where th
98d0: 65 20 6e 61 6d 65 20 6d 61 74 63 68 65 64 2e 20  e name matched. 
98e0: 2a 2f 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a  */.    for(;;){.
98f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
9900: 6f 70 4e 43 21 3d 30 20 29 3b 0a 20 20 20 20 20  opNC!=0 );.     
9910: 20 70 54 6f 70 4e 43 2d 3e 6e 52 65 66 2b 2b 3b   pTopNC->nRef++;
9920: 0a 20 20 20 20 20 20 69 66 28 20 70 54 6f 70 4e  .      if( pTopN
9930: 43 3d 3d 70 4e 43 20 29 20 62 72 65 61 6b 3b 0a  C==pNC ) break;.
9940: 20 20 20 20 20 20 70 54 6f 70 4e 43 20 3d 20 70        pTopNC = p
9950: 54 6f 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20  TopNC->pNext;.  
9960: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30    }.    return 0
9970: 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
9980: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d   return 1;.  }.}
9990: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
99a0: 74 69 6e 65 20 69 73 20 64 65 73 69 67 6e 65 64  tine is designed
99b0: 20 61 73 20 61 6e 20 78 46 75 6e 63 20 66 6f 72   as an xFunc for
99c0: 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 29 2e   walkExprTree().
99d0: 0a 2a 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 73  .**.** Resolve s
99e0: 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 73 20 69 6e  ymbolic names in
99f0: 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6f 70 65  to TK_COLUMN ope
9a00: 72 61 74 6f 72 73 20 66 6f 72 20 74 68 65 20 63  rators for the c
9a10: 75 72 72 65 6e 74 0a 2a 2a 20 6e 6f 64 65 20 69  urrent.** node i
9a20: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
9a30: 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 30   tree.  Return 0
9a40: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 74 68 65   to continue the
9a50: 20 73 65 61 72 63 68 20 64 6f 77 6e 0a 2a 2a 20   search down.** 
9a60: 74 68 65 20 74 72 65 65 20 6f 72 20 32 20 74 6f  the tree or 2 to
9a70: 20 61 62 6f 72 74 20 74 68 65 20 74 72 65 65 20   abort the tree 
9a80: 77 61 6c 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  walk..**.** This
9a90: 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 64 6f   routine also do
9aa0: 65 73 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e  es error checkin
9ab0: 67 20 61 6e 64 20 6e 61 6d 65 20 72 65 73 6f 6c  g and name resol
9ac0: 75 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 66 75 6e  ution for.** fun
9ad0: 63 74 69 6f 6e 20 6e 61 6d 65 73 2e 20 20 54 68  ction names.  Th
9ae0: 65 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 61  e operator for a
9af0: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
9b00: 6e 73 20 69 73 20 63 68 61 6e 67 65 64 0a 2a 2a  ns is changed.**
9b10: 20 74 6f 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54   to TK_AGG_FUNCT
9b20: 49 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ION..*/.static i
9b30: 6e 74 20 6e 61 6d 65 52 65 73 6f 6c 76 65 72 53  nt nameResolverS
9b40: 74 65 70 28 76 6f 69 64 20 2a 70 41 72 67 2c 20  tep(void *pArg, 
9b50: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
9b60: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
9b70: 20 3d 20 28 4e 61 6d 65 43 6f 6e 74 65 78 74 2a   = (NameContext*
9b80: 29 70 41 72 67 3b 0a 20 20 50 61 72 73 65 20 2a  )pArg;.  Parse *
9b90: 70 50 61 72 73 65 3b 0a 0a 20 20 69 66 28 20 70  pParse;..  if( p
9ba0: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
9bb0: 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e   1;.  assert( pN
9bc0: 43 21 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65  C!=0 );.  pParse
9bd0: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
9be0: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 41 6e  .  if( ExprHasAn
9bf0: 79 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  yProperty(pExpr,
9c00: 20 45 50 5f 52 65 73 6f 6c 76 65 64 29 20 29 20   EP_Resolved) ) 
9c10: 72 65 74 75 72 6e 20 31 3b 0a 20 20 45 78 70 72  return 1;.  Expr
9c20: 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70  SetProperty(pExp
9c30: 72 2c 20 45 50 5f 52 65 73 6f 6c 76 65 64 29 3b  r, EP_Resolved);
9c40: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
9c50: 20 20 69 66 28 20 70 4e 43 2d 3e 70 53 72 63 4c    if( pNC->pSrcL
9c60: 69 73 74 20 26 26 20 70 4e 43 2d 3e 70 53 72 63  ist && pNC->pSrc
9c70: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3e 30 20 29  List->nAlloc>0 )
9c80: 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70  {.    SrcList *p
9c90: 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70  SrcList = pNC->p
9ca0: 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74  SrcList;.    int
9cb0: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
9cc0: 20 69 3c 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   i<pNC->pSrcList
9cd0: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
9ce0: 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
9cf0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  List->a[i].iCurs
9d00: 6f 72 3e 3d 30 20 26 26 20 70 53 72 63 4c 69 73  or>=0 && pSrcLis
9d10: 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3c  t->a[i].iCursor<
9d20: 70 50 61 72 73 65 2d 3e 6e 54 61 62 29 3b 0a 20  pParse->nTab);. 
9d30: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
9d40: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
9d50: 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f  >op ){.    /* Do
9d60: 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  uble-quoted stri
9d70: 6e 67 73 20 28 65 78 3a 20 22 61 62 63 22 29 20  ngs (ex: "abc") 
9d80: 61 72 65 20 75 73 65 64 20 61 73 20 69 64 65 6e  are used as iden
9d90: 74 69 66 69 65 72 73 20 69 66 0a 20 20 20 20 2a  tifiers if.    *
9da0: 2a 20 70 6f 73 73 69 62 6c 65 2e 20 20 4f 74 68  * possible.  Oth
9db0: 65 72 77 69 73 65 20 74 68 65 79 20 72 65 6d 61  erwise they rema
9dc0: 69 6e 20 61 73 20 73 74 72 69 6e 67 73 2e 20 20  in as strings.  
9dd0: 53 69 6e 67 6c 65 2d 71 75 6f 74 65 64 0a 20 20  Single-quoted.  
9de0: 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 28 65 78    ** strings (ex
9df0: 3a 20 27 61 62 63 27 29 20 61 72 65 20 61 6c 77  : 'abc') are alw
9e00: 61 79 73 20 73 74 72 69 6e 67 20 6c 69 74 65 72  ays string liter
9e10: 61 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  als..    */.    
9e20: 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20  case TK_STRING: 
9e30: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  {.      if( pExp
9e40: 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d 3d 27  r->token.z[0]=='
9e50: 5c 27 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  \'' ) break;.   
9e60: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20     /* Fall thru 
9e70: 69 6e 74 6f 20 74 68 65 20 54 4b 5f 49 44 20 63  into the TK_ID c
9e80: 61 73 65 20 69 66 20 74 68 69 73 20 69 73 20 61  ase if this is a
9e90: 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73   double-quoted s
9ea0: 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 0a 20  tring */.    }. 
9eb0: 20 20 20 2f 2a 20 41 20 6c 6f 6e 65 20 69 64 65     /* A lone ide
9ec0: 6e 74 69 66 69 65 72 20 69 73 20 74 68 65 20 6e  ntifier is the n
9ed0: 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 2e  ame of a column.
9ee0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
9ef0: 20 54 4b 5f 49 44 3a 20 7b 0a 20 20 20 20 20 20   TK_ID: {.      
9f00: 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70 50 61 72 73  lookupName(pPars
9f10: 65 2c 20 30 2c 20 30 2c 20 26 70 45 78 70 72 2d  e, 0, 0, &pExpr-
9f20: 3e 74 6f 6b 65 6e 2c 20 70 4e 43 2c 20 70 45 78  >token, pNC, pEx
9f30: 70 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  pr);.      retur
9f40: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  n 1;.    }.  .  
9f50: 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 6e 61 6d    /* A table nam
9f60: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e and column nam
9f70: 65 3a 20 20 20 20 20 49 44 2e 49 44 0a 20 20 20  e:     ID.ID.   
9f80: 20 2a 2a 20 4f 72 20 61 20 64 61 74 61 62 61 73   ** Or a databas
9f90: 65 2c 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c  e, table and col
9fa0: 75 6d 6e 3a 20 20 49 44 2e 49 44 2e 49 44 0a 20  umn:  ID.ID.ID. 
9fb0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54     */.    case T
9fc0: 4b 5f 44 4f 54 3a 20 7b 0a 20 20 20 20 20 20 54  K_DOT: {.      T
9fd0: 6f 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e 3b 0a 20  oken *pColumn;. 
9fe0: 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62       Token *pTab
9ff0: 6c 65 3b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20  le;.      Token 
a000: 2a 70 44 62 3b 0a 20 20 20 20 20 20 45 78 70 72  *pDb;.      Expr
a010: 20 2a 70 52 69 67 68 74 3b 0a 0a 20 20 20 20 20   *pRight;..     
a020: 20 2f 2a 20 69 66 28 20 70 53 72 63 4c 69 73 74   /* if( pSrcList
a030: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 20 2a 2f 0a  ==0 ) break; */.
a040: 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70        pRight = p
a050: 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
a060: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
a070: 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20  op==TK_ID ){.   
a080: 20 20 20 20 20 70 44 62 20 3d 20 30 3b 0a 20 20       pDb = 0;.  
a090: 20 20 20 20 20 20 70 54 61 62 6c 65 20 3d 20 26        pTable = &
a0a0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 74 6f  pExpr->pLeft->to
a0b0: 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  ken;.        pCo
a0c0: 6c 75 6d 6e 20 3d 20 26 70 52 69 67 68 74 2d 3e  lumn = &pRight->
a0d0: 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 65 6c  token;.      }el
a0e0: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
a0f0: 72 74 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d  rt( pRight->op==
a100: 54 4b 5f 44 4f 54 20 29 3b 0a 20 20 20 20 20 20  TK_DOT );.      
a110: 20 20 70 44 62 20 3d 20 26 70 45 78 70 72 2d 3e    pDb = &pExpr->
a120: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  pLeft->token;.  
a130: 20 20 20 20 20 20 70 54 61 62 6c 65 20 3d 20 26        pTable = &
a140: 70 52 69 67 68 74 2d 3e 70 4c 65 66 74 2d 3e 74  pRight->pLeft->t
a150: 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 70 43  oken;.        pC
a160: 6f 6c 75 6d 6e 20 3d 20 26 70 52 69 67 68 74 2d  olumn = &pRight-
a170: 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 3b 0a  >pRight->token;.
a180: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6c 6f        }.      lo
a190: 6f 6b 75 70 4e 61 6d 65 28 70 50 61 72 73 65 2c  okupName(pParse,
a1a0: 20 70 44 62 2c 20 70 54 61 62 6c 65 2c 20 70 43   pDb, pTable, pC
a1b0: 6f 6c 75 6d 6e 2c 20 70 4e 43 2c 20 70 45 78 70  olumn, pNC, pExp
a1c0: 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
a1d0: 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   1;.    }..    /
a1e0: 2a 20 52 65 73 6f 6c 76 65 20 66 75 6e 63 74 69  * Resolve functi
a1f0: 6f 6e 20 6e 61 6d 65 73 0a 20 20 20 20 2a 2f 0a  on names.    */.
a200: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53      case TK_CONS
a210: 54 5f 46 55 4e 43 3a 0a 20 20 20 20 63 61 73 65  T_FUNC:.    case
a220: 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a   TK_FUNCTION: {.
a230: 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
a240: 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70  pList = pExpr->p
a250: 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  List;    /* The 
a260: 61 72 67 75 6d 65 6e 74 20 6c 69 73 74 20 2a 2f  argument list */
a270: 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70  .      int n = p
a280: 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45  List ? pList->nE
a290: 78 70 72 20 3a 20 30 3b 20 20 2f 2a 20 4e 75 6d  xpr : 0;  /* Num
a2a0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
a2b0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 6f   */.      int no
a2c0: 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20 30 3b 20  _such_func = 0; 
a2d0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
a2e0: 20 6e 6f 20 73 75 63 68 20 66 75 6e 63 74 69 6f   no such functio
a2f0: 6e 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20  n exists */.    
a300: 20 20 69 6e 74 20 77 72 6f 6e 67 5f 6e 75 6d 5f    int wrong_num_
a310: 61 72 67 73 20 3d 20 30 3b 20 20 20 20 20 2f 2a  args = 0;     /*
a320: 20 54 72 75 65 20 69 66 20 77 72 6f 6e 67 20 6e   True if wrong n
a330: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
a340: 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
a350: 69 73 5f 61 67 67 20 3d 20 30 3b 20 20 20 20 20  is_agg = 0;     
a360: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
a370: 69 66 20 69 73 20 61 6e 20 61 67 67 72 65 67 61  if is an aggrega
a380: 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  te function */. 
a390: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
a3a0: 20 20 69 6e 74 20 61 75 74 68 3b 20 20 20 20 20    int auth;     
a3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a3c0: 20 41 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74   Authorization t
a3d0: 6f 20 75 73 65 20 74 68 65 20 66 75 6e 63 74 69  o use the functi
a3e0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  on */.      int 
a3f0: 6e 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  nId;            
a400: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
a410: 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  r of characters 
a420: 69 6e 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  in function name
a430: 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   */.      const 
a440: 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20  char *zId;      
a450: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e        /* The fun
a460: 63 74 69 6f 6e 20 6e 61 6d 65 2e 20 2a 2f 0a 20  ction name. */. 
a470: 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44       FuncDef *pD
a480: 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
a490: 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
a4a0: 61 62 6f 75 74 20 74 68 65 20 66 75 6e 63 74 69  about the functi
a4b0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  on */.      int 
a4c0: 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65  enc = ENC(pParse
a4d0: 2d 3e 64 62 29 3b 20 20 2f 2a 20 54 68 65 20 64  ->db);  /* The d
a4e0: 61 74 61 62 61 73 65 20 65 6e 63 6f 64 69 6e 67  atabase encoding
a4f0: 20 2a 2f 0a 0a 20 20 20 20 20 20 7a 49 64 20 3d   */..      zId =
a500: 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74   (char*)pExpr->t
a510: 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 6e 49  oken.z;.      nI
a520: 64 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  d = pExpr->token
a530: 2e 6e 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d  .n;.      pDef =
a540: 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
a550: 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  tion(pParse->db,
a560: 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 2c 20 65 6e   zId, nId, n, en
a570: 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  c, 0);.      if(
a580: 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20   pDef==0 ){.    
a590: 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
a5a0: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70  e3FindFunction(p
a5b0: 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20  Parse->db, zId, 
a5c0: 6e 49 64 2c 20 2d 31 2c 20 65 6e 63 2c 20 30 29  nId, -1, enc, 0)
a5d0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 44  ;.        if( pD
a5e0: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ef==0 ){.       
a5f0: 20 20 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20     no_such_func 
a600: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 1;.        }el
a610: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 72  se{.          wr
a620: 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 31  ong_num_args = 1
a630: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a640: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a650: 20 69 73 5f 61 67 67 20 3d 20 70 44 65 66 2d 3e   is_agg = pDef->
a660: 78 46 75 6e 63 3d 3d 30 3b 0a 20 20 20 20 20 20  xFunc==0;.      
a670: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
a680: 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
a690: 49 4f 4e 0a 20 20 20 20 20 20 69 66 28 20 70 44  ION.      if( pD
a6a0: 65 66 20 29 7b 0a 20 20 20 20 20 20 20 20 61 75  ef ){.        au
a6b0: 74 68 20 3d 20 73 71 6c 69 74 65 33 41 75 74 68  th = sqlite3Auth
a6c0: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
a6d0: 4c 49 54 45 5f 46 55 4e 43 54 49 4f 4e 2c 20 30  LITE_FUNCTION, 0
a6e0: 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 30  , pDef->zName, 0
a6f0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
a700: 75 74 68 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  uth!=SQLITE_OK )
a710: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
a720: 61 75 74 68 3d 3d 53 51 4c 49 54 45 5f 44 45 4e  auth==SQLITE_DEN
a730: 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  Y ){.           
a740: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
a750: 28 70 50 61 72 73 65 2c 20 22 6e 6f 74 20 61 75  (pParse, "not au
a760: 74 68 6f 72 69 7a 65 64 20 74 6f 20 75 73 65 20  thorized to use 
a770: 66 75 6e 63 74 69 6f 6e 3a 20 25 73 22 2c 0a 20  function: %s",. 
a780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7a0: 20 20 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 29 3b     pDef->zName);
a7b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 43  .            pNC
a7c0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
a7d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
a7e0: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e  pExpr->op = TK_N
a7f0: 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 72  ULL;.          r
a800: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
a810: 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
a820: 66 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f 61  f.      if( is_a
a830: 67 67 20 26 26 20 21 70 4e 43 2d 3e 61 6c 6c 6f  gg && !pNC->allo
a840: 77 41 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20  wAgg ){.        
a850: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
a860: 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20  pParse, "misuse 
a870: 6f 66 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  of aggregate fun
a880: 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 20 6e  ction %.*s()", n
a890: 49 64 2c 7a 49 64 29 3b 0a 20 20 20 20 20 20 20  Id,zId);.       
a8a0: 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20   pNC->nErr++;.  
a8b0: 20 20 20 20 20 20 69 73 5f 61 67 67 20 3d 20 30        is_agg = 0
a8c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
a8d0: 28 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 29  ( no_such_func )
a8e0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
a8f0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
a900: 2c 20 22 6e 6f 20 73 75 63 68 20 66 75 6e 63 74  , "no such funct
a910: 69 6f 6e 3a 20 25 2e 2a 73 22 2c 20 6e 49 64 2c  ion: %.*s", nId,
a920: 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20 70   zId);.        p
a930: 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  NC->nErr++;.    
a940: 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72 6f 6e    }else if( wron
a950: 67 5f 6e 75 6d 5f 61 72 67 73 20 29 7b 0a 20 20  g_num_args ){.  
a960: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
a970: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 77 72  orMsg(pParse,"wr
a980: 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  ong number of ar
a990: 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74  guments to funct
a9a0: 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 0a 20 20 20  ion %.*s()",.   
a9b0: 20 20 20 20 20 20 20 20 20 20 6e 49 64 2c 20 7a            nId, z
a9c0: 49 64 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 43  Id);.        pNC
a9d0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
a9e0: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f 61  }.      if( is_a
a9f0: 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45  gg ){.        pE
aa00: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47  xpr->op = TK_AGG
aa10: 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 20 20 20  _FUNCTION;.     
aa20: 20 20 20 70 4e 43 2d 3e 68 61 73 41 67 67 20 3d     pNC->hasAgg =
aa30: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
aa40: 20 20 69 66 28 20 69 73 5f 61 67 67 20 29 20 70    if( is_agg ) p
aa50: 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 3d 20 30  NC->allowAgg = 0
aa60: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
aa70: 20 70 4e 43 2d 3e 6e 45 72 72 3d 3d 30 20 26 26   pNC->nErr==0 &&
aa80: 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
aa90: 20 20 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65      walkExprTree
aaa0: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  (pList->a[i].pEx
aab0: 70 72 2c 20 6e 61 6d 65 52 65 73 6f 6c 76 65 72  pr, nameResolver
aac0: 53 74 65 70 2c 20 70 4e 43 29 3b 0a 20 20 20 20  Step, pNC);.    
aad0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73    }.      if( is
aae0: 5f 61 67 67 20 29 20 70 4e 43 2d 3e 61 6c 6c 6f  _agg ) pNC->allo
aaf0: 77 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  wAgg = 1;.      
ab00: 2f 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6d 70  /* FIX ME:  Comp
ab10: 75 74 65 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  ute pExpr->affin
ab20: 69 74 79 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ity based on the
ab30: 20 65 78 70 65 63 74 65 64 20 72 65 74 75 72 6e   expected return
ab40: 0a 20 20 20 20 20 20 2a 2a 20 74 79 70 65 20 6f  .      ** type o
ab50: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 0a  f the function .
ab60: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
ab70: 65 74 75 72 6e 20 69 73 5f 61 67 67 3b 0a 20 20  eturn is_agg;.  
ab80: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
ab90: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
aba0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
abb0: 45 43 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ECT:.    case TK
abc0: 5f 45 58 49 53 54 53 3a 0a 23 65 6e 64 69 66 0a  _EXISTS:.#endif.
abd0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
abe0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  {.      if( pExp
abf0: 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  r->pSelect ){.  
ac00: 20 20 20 20 20 20 69 6e 74 20 6e 52 65 66 20 3d        int nRef =
ac10: 20 70 4e 43 2d 3e 6e 52 65 66 3b 0a 23 69 66 6e   pNC->nRef;.#ifn
ac20: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ac30: 43 48 45 43 4b 0a 20 20 20 20 20 20 20 20 69 66  CHECK.        if
ac40: 28 20 70 4e 43 2d 3e 69 73 43 68 65 63 6b 20 29  ( pNC->isCheck )
ac50: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
ac60: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
ac70: 73 65 2c 22 73 75 62 71 75 65 72 69 65 73 20 70  se,"subqueries p
ac80: 72 6f 68 69 62 69 74 65 64 20 69 6e 20 43 48 45  rohibited in CHE
ac90: 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 22 29  CK constraints")
aca0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  ;.        }.#end
acb0: 69 66 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  if.        sqlit
acc0: 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28  e3SelectResolve(
acd0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
ace0: 53 65 6c 65 63 74 2c 20 70 4e 43 29 3b 0a 20 20  Select, pNC);.  
acf0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
ad00: 43 2d 3e 6e 52 65 66 3e 3d 6e 52 65 66 20 29 3b  C->nRef>=nRef );
ad10: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 52 65  .        if( nRe
ad20: 66 21 3d 70 4e 43 2d 3e 6e 52 65 66 20 29 7b 0a  f!=pNC->nRef ){.
ad30: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 53 65            ExprSe
ad40: 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  tProperty(pExpr,
ad50: 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29 3b 0a   EP_VarSelect);.
ad60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ad70: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
ad80: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
ad90: 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20  ITE_OMIT_CHECK. 
ada0: 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41     case TK_VARIA
adb0: 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  BLE: {.      if(
adc0: 20 70 4e 43 2d 3e 69 73 43 68 65 63 6b 20 29 7b   pNC->isCheck ){
add0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ade0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
adf0: 22 70 61 72 61 6d 65 74 65 72 73 20 70 72 6f 68  "parameters proh
ae00: 69 62 69 74 65 64 20 69 6e 20 43 48 45 43 4b 20  ibited in CHECK 
ae10: 63 6f 6e 73 74 72 61 69 6e 74 73 22 29 3b 0a 20  constraints");. 
ae20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
ae30: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
ae40: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
ae50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
ae60: 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 61 6e 20  outine walks an 
ae70: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
ae80: 61 6e 64 20 72 65 73 6f 6c 76 65 73 20 72 65 66  and resolves ref
ae90: 65 72 65 6e 63 65 73 20 74 6f 0a 2a 2a 20 74 61  erences to.** ta
aea0: 62 6c 65 20 63 6f 6c 75 6d 6e 73 2e 20 20 4e 6f  ble columns.  No
aeb0: 64 65 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  des of the form 
aec0: 49 44 2e 49 44 20 6f 72 20 49 44 20 72 65 73 6f  ID.ID or ID reso
aed0: 6c 76 65 20 69 6e 74 6f 20 61 6e 0a 2a 2a 20 69  lve into an.** i
aee0: 6e 64 65 78 20 74 6f 20 74 68 65 20 74 61 62 6c  ndex to the tabl
aef0: 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6c  e in the table l
af00: 69 73 74 20 61 6e 64 20 61 20 63 6f 6c 75 6d 6e  ist and a column
af10: 20 6f 66 66 73 65 74 2e 20 20 54 68 65 20 0a 2a   offset.  The .*
af20: 2a 20 45 78 70 72 2e 6f 70 63 6f 64 65 20 66 6f  * Expr.opcode fo
af30: 72 20 73 75 63 68 20 6e 6f 64 65 73 20 69 73 20  r such nodes is 
af40: 63 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f 43 4f  changed to TK_CO
af50: 4c 55 4d 4e 2e 20 20 54 68 65 20 45 78 70 72 2e  LUMN.  The Expr.
af60: 69 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65 20  iTable.** value 
af70: 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 74 68  is changed to th
af80: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 72  e index of the r
af90: 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 20  eferenced table 
afa0: 69 6e 20 70 54 61 62 4c 69 73 74 0a 2a 2a 20 70  in pTabList.** p
afb0: 6c 75 73 20 74 68 65 20 22 62 61 73 65 22 20 76  lus the "base" v
afc0: 61 6c 75 65 2e 20 20 54 68 65 20 62 61 73 65 20  alue.  The base 
afd0: 76 61 6c 75 65 20 77 69 6c 6c 20 75 6c 74 69 6d  value will ultim
afe0: 61 74 65 6c 79 20 62 65 63 6f 6d 65 20 74 68 65  ately become the
aff0: 0a 2a 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20  .** VDBE cursor 
b000: 6e 75 6d 62 65 72 20 66 6f 72 20 61 20 63 75 72  number for a cur
b010: 73 6f 72 20 74 68 61 74 20 69 73 20 70 6f 69 6e  sor that is poin
b020: 74 69 6e 67 20 69 6e 74 6f 20 74 68 65 20 72 65  ting into the re
b030: 66 65 72 65 6e 63 65 64 0a 2a 2a 20 74 61 62 6c  ferenced.** tabl
b040: 65 2e 20 20 54 68 65 20 45 78 70 72 2e 69 43 6f  e.  The Expr.iCo
b050: 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73 20 63 68  lumn value is ch
b060: 61 6e 67 65 64 20 74 6f 20 74 68 65 20 69 6e 64  anged to the ind
b070: 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ex of the column
b080: 20 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65 66 65   .** of the refe
b090: 72 65 6e 63 65 64 20 74 61 62 6c 65 2e 20 20 54  renced table.  T
b0a0: 68 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20  he Expr.iColumn 
b0b0: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 70  value for the sp
b0c0: 65 63 69 61 6c 0a 2a 2a 20 52 4f 57 49 44 20 63  ecial.** ROWID c
b0d0: 6f 6c 75 6d 6e 20 69 73 20 2d 31 2e 20 20 41 6e  olumn is -1.  An
b0e0: 79 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  y INTEGER PRIMAR
b0f0: 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 69 73 20  Y KEY column is 
b100: 74 72 69 65 64 20 61 73 20 61 6e 0a 2a 2a 20 61  tried as an.** a
b110: 6c 69 61 73 20 66 6f 72 20 52 4f 57 49 44 2e 0a  lias for ROWID..
b120: 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 73 6f 6c  **.** Also resol
b130: 76 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  ve function name
b140: 73 20 61 6e 64 20 63 68 65 63 6b 20 74 68 65 20  s and check the 
b150: 66 75 6e 63 74 69 6f 6e 73 20 66 6f 72 20 70 72  functions for pr
b160: 6f 70 65 72 0a 2a 2a 20 75 73 61 67 65 2e 20 20  oper.** usage.  
b170: 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 66 75  Make sure all fu
b180: 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 20 61 72 65  nction names are
b190: 20 72 65 63 6f 67 6e 69 7a 65 64 20 61 6e 64 20   recognized and 
b1a0: 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a  all functions.**
b1b0: 20 68 61 76 65 20 74 68 65 20 63 6f 72 72 65 63   have the correc
b1c0: 74 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  t number of argu
b1d0: 6d 65 6e 74 73 2e 20 20 4c 65 61 76 65 20 61 6e  ments.  Leave an
b1e0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a   error message.*
b1f0: 2a 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  * in pParse->zEr
b200: 72 4d 73 67 20 69 66 20 61 6e 79 74 68 69 6e 67  rMsg if anything
b210: 20 69 73 20 61 6d 69 73 73 2e 20 20 52 65 74 75   is amiss.  Retu
b220: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
b230: 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49   errors..**.** I
b240: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
b250: 20 63 6f 6e 74 61 69 6e 73 20 61 67 67 72 65 67   contains aggreg
b260: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  ate functions th
b270: 65 6e 20 73 65 74 20 74 68 65 20 45 50 5f 41 67  en set the EP_Ag
b280: 67 0a 2a 2a 20 70 72 6f 70 65 72 74 79 20 6f 6e  g.** property on
b290: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
b2a0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
b2b0: 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28  xprResolveNames(
b2c0: 20 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20   .  NameContext 
b2d0: 2a 70 4e 43 2c 20 20 20 20 20 20 20 2f 2a 20 4e  *pNC,       /* N
b2e0: 61 6d 65 73 70 61 63 65 20 74 6f 20 72 65 73 6f  amespace to reso
b2f0: 6c 76 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  lve expressions 
b300: 69 6e 2e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  in. */.  Expr *p
b310: 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
b320: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
b330: 6f 6e 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  on to be analyze
b340: 64 2e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 73  d. */.){.  int s
b350: 61 76 65 64 48 61 73 41 67 67 3b 0a 20 20 69 66  avedHasAgg;.  if
b360: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
b370: 75 72 6e 20 30 3b 0a 23 69 66 20 53 51 4c 49 54  urn 0;.#if SQLIT
b380: 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
b390: 3e 30 0a 20 20 69 66 28 20 28 70 45 78 70 72 2d  >0.  if( (pExpr-
b3a0: 3e 6e 48 65 69 67 68 74 2b 70 4e 43 2d 3e 70 50  >nHeight+pNC->pP
b3b0: 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 29 3e 53  arse->nHeight)>S
b3c0: 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
b3d0: 45 50 54 48 20 29 7b 0a 20 20 20 20 73 71 6c 69  EPTH ){.    sqli
b3e0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 4e 43 2d  te3ErrorMsg(pNC-
b3f0: 3e 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  >pParse, .      
b400: 20 22 45 78 70 72 65 73 73 69 6f 6e 20 74 72 65   "Expression tre
b410: 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 28  e is too large (
b420: 6d 61 78 69 6d 75 6d 20 64 65 70 74 68 20 25 64  maximum depth %d
b430: 29 22 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54  )",.       SQLIT
b440: 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
b450: 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 65 74 75  .    );.    retu
b460: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 70 4e 43 2d  rn 1;.  }.  pNC-
b470: 3e 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74  >pParse->nHeight
b480: 20 2b 3d 20 70 45 78 70 72 2d 3e 6e 48 65 69 67   += pExpr->nHeig
b490: 68 74 3b 0a 23 65 6e 64 69 66 0a 20 20 73 61 76  ht;.#endif.  sav
b4a0: 65 64 48 61 73 41 67 67 20 3d 20 70 4e 43 2d 3e  edHasAgg = pNC->
b4b0: 68 61 73 41 67 67 3b 0a 20 20 70 4e 43 2d 3e 68  hasAgg;.  pNC->h
b4c0: 61 73 41 67 67 20 3d 20 30 3b 0a 20 20 77 61 6c  asAgg = 0;.  wal
b4d0: 6b 45 78 70 72 54 72 65 65 28 70 45 78 70 72 2c  kExprTree(pExpr,
b4e0: 20 6e 61 6d 65 52 65 73 6f 6c 76 65 72 53 74 65   nameResolverSte
b4f0: 70 2c 20 70 4e 43 29 3b 0a 23 69 66 20 53 51 4c  p, pNC);.#if SQL
b500: 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
b510: 54 48 3e 30 0a 20 20 70 4e 43 2d 3e 70 50 61 72  TH>0.  pNC->pPar
b520: 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 70  se->nHeight -= p
b530: 45 78 70 72 2d 3e 6e 48 65 69 67 68 74 3b 0a 23  Expr->nHeight;.#
b540: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 4e 43 2d  endif.  if( pNC-
b550: 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20 20 45  >nErr>0 ){.    E
b560: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
b570: 45 78 70 72 2c 20 45 50 5f 45 72 72 6f 72 29 3b  Expr, EP_Error);
b580: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 43 2d 3e  .  }.  if( pNC->
b590: 68 61 73 41 67 67 20 29 7b 0a 20 20 20 20 45 78  hasAgg ){.    Ex
b5a0: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
b5b0: 78 70 72 2c 20 45 50 5f 41 67 67 29 3b 0a 20 20  xpr, EP_Agg);.  
b5c0: 7d 65 6c 73 65 20 69 66 28 20 73 61 76 65 64 48  }else if( savedH
b5d0: 61 73 41 67 67 20 29 7b 0a 20 20 20 20 70 4e 43  asAgg ){.    pNC
b5e0: 2d 3e 68 61 73 41 67 67 20 3d 20 31 3b 0a 20 20  ->hasAgg = 1;.  
b5f0: 7d 0a 20 20 72 65 74 75 72 6e 20 45 78 70 72 48  }.  return ExprH
b600: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
b610: 2c 20 45 50 5f 45 72 72 6f 72 29 3b 0a 7d 0a 0a  , EP_Error);.}..
b620: 2f 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20  /*.** A pointer 
b630: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
b640: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73   structure is us
b650: 65 64 20 74 6f 20 70 61 73 73 20 69 6e 66 6f 72  ed to pass infor
b660: 6d 61 74 69 6f 6e 0a 2a 2a 20 74 68 72 6f 75 67  mation.** throug
b670: 68 20 77 61 6c 6b 45 78 70 72 54 72 65 65 20 69  h walkExprTree i
b680: 6e 74 6f 20 63 6f 64 65 53 75 62 71 75 65 72 79  nto codeSubquery
b690: 53 74 65 70 28 29 2e 0a 2a 2f 0a 74 79 70 65 64  Step()..*/.typed
b6a0: 65 66 20 73 74 72 75 63 74 20 51 75 65 72 79 43  ef struct QueryC
b6b0: 6f 64 65 72 20 51 75 65 72 79 43 6f 64 65 72 3b  oder QueryCoder;
b6c0: 0a 73 74 72 75 63 74 20 51 75 65 72 79 43 6f 64  .struct QueryCod
b6d0: 65 72 20 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  er {.  Parse *pP
b6e0: 61 72 73 65 3b 20 20 20 20 20 20 20 2f 2a 20 54  arse;       /* T
b6f0: 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
b700: 78 74 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  xt */.  NameCont
b710: 65 78 74 20 2a 70 4e 43 3b 20 20 20 20 2f 2a 20  ext *pNC;    /* 
b720: 4e 61 6d 65 73 70 61 63 65 20 6f 66 20 66 69 72  Namespace of fir
b730: 73 74 20 65 6e 63 6c 6f 73 69 6e 67 20 71 75 65  st enclosing que
b740: 72 79 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a  ry */.};.../*.**
b750: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
b760: 6f 72 20 73 63 61 6c 61 72 20 73 75 62 71 75 65  or scalar subque
b770: 72 69 65 73 20 75 73 65 64 20 61 73 20 61 6e 20  ries used as an 
b780: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 6e  expression.** an
b790: 64 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e 20  d IN operators. 
b7a0: 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a   Examples:.**.**
b7b0: 20 20 20 20 20 28 53 45 4c 45 43 54 20 61 20 46       (SELECT a F
b7c0: 52 4f 4d 20 62 29 20 20 20 20 20 20 20 20 20 20  ROM b)          
b7d0: 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20  -- subquery.**  
b7e0: 20 20 20 45 58 49 53 54 53 20 28 53 45 4c 45 43     EXISTS (SELEC
b7f0: 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d  T a FROM b)   --
b800: 20 45 58 49 53 54 53 20 73 75 62 71 75 65 72 79   EXISTS subquery
b810: 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 34 2c  .**     x IN (4,
b820: 35 2c 31 31 29 20 20 20 20 20 20 20 20 20 20 20  5,11)           
b830: 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f     -- IN operato
b840: 72 20 77 69 74 68 20 6c 69 73 74 20 6f 6e 20 72  r with list on r
b850: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a  ight-hand side.*
b860: 2a 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45  *     x IN (SELE
b870: 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20  CT a FROM b)    
b880: 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   -- IN operator 
b890: 77 69 74 68 20 73 75 62 71 75 65 72 79 20 6f 6e  with subquery on
b8a0: 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a   the right.**.**
b8b0: 20 54 68 65 20 70 45 78 70 72 20 70 61 72 61 6d   The pExpr param
b8c0: 65 74 65 72 20 64 65 73 63 72 69 62 65 73 20 74  eter describes t
b8d0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
b8e0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
b8f0: 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 6f  IN.** operator o
b900: 72 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 23  r subquery..*/.#
b910: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b920: 49 54 5f 53 55 42 51 55 45 52 59 0a 76 6f 69 64  IT_SUBQUERY.void
b930: 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
b940: 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61  elect(Parse *pPa
b950: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
b960: 29 7b 0a 20 20 69 6e 74 20 74 65 73 74 41 64 64  ){.  int testAdd
b970: 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
b980: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b990: 4f 6e 65 2d 74 69 6d 65 20 74 65 73 74 20 61 64  One-time test ad
b9a0: 64 72 65 73 73 20 2a 2f 0a 20 20 56 64 62 65 20  dress */.  Vdbe 
b9b0: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
b9c0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
b9d0: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
b9e0: 3b 0a 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f  ;...  /* This co
b9f0: 64 65 20 6d 75 73 74 20 62 65 20 72 75 6e 20 69  de must be run i
ba00: 6e 20 69 74 73 20 65 6e 74 69 72 65 74 79 20 65  n its entirety e
ba10: 76 65 72 79 20 74 69 6d 65 20 69 74 20 69 73 20  very time it is 
ba20: 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a  encountered.  **
ba30: 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   if any of the f
ba40: 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65  ollowing is true
ba50: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a  :.  **.  **    *
ba60: 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64    The right-hand
ba70: 20 73 69 64 65 20 69 73 20 61 20 63 6f 72 72 65   side is a corre
ba80: 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 0a 20  lated subquery. 
ba90: 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69   **    *  The ri
baa0: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
bab0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
bac0: 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76  ist containing v
bad0: 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20  ariables.  **   
bae0: 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69 64   *  We are insid
baf0: 65 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a  e a trigger.  **
bb00: 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20  .  ** If all of 
bb10: 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 66 61  the above are fa
bb20: 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e  lse, then we can
bb30: 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 6a   run this code j
bb40: 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61  ust once.  ** sa
bb50: 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20  ve the results, 
bb60: 61 6e 64 20 72 65 75 73 65 20 74 68 65 20 73 61  and reuse the sa
bb70: 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62  me result on sub
bb80: 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69  sequent invocati
bb90: 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
bba0: 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65  !ExprHasAnyPrope
bbb0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61  rty(pExpr, EP_Va
bbc0: 72 53 65 6c 65 63 74 29 20 26 26 20 21 70 50 61  rSelect) && !pPa
bbd0: 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 29  rse->trigStack )
bbe0: 7b 0a 20 20 20 20 69 6e 74 20 6d 65 6d 20 3d 20  {.    int mem = 
bbf0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a  pParse->nMem++;.
bc00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
bc10: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f  ddOp(v, OP_MemLo
bc20: 61 64 2c 20 6d 65 6d 2c 20 30 29 3b 0a 20 20 20  ad, mem, 0);.   
bc30: 20 74 65 73 74 41 64 64 72 20 3d 20 73 71 6c 69   testAddr = sqli
bc40: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
bc50: 4f 50 5f 49 66 2c 20 30 2c 20 30 29 3b 0a 20 20  OP_If, 0, 0);.  
bc60: 20 20 61 73 73 65 72 74 28 20 74 65 73 74 41 64    assert( testAd
bc70: 64 72 3e 30 20 7c 7c 20 73 71 6c 69 74 65 33 4d  dr>0 || sqlite3M
bc80: 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 3b  allocFailed() );
bc90: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
bca0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49  AddOp(v, OP_MemI
bcb0: 6e 74 2c 20 31 2c 20 6d 65 6d 29 3b 0a 20 20 7d  nt, 1, mem);.  }
bcc0: 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
bcd0: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
bce0: 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
bcf0: 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 0a   char affinity;.
bd00: 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 6b 65        KeyInfo ke
bd10: 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 6e 74  yInfo;.      int
bd20: 20 61 64 64 72 3b 20 20 20 20 20 20 20 20 2f 2a   addr;        /*
bd30: 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f   Address of OP_O
bd40: 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
bd50: 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20  truction */..   
bd60: 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73 71     affinity = sq
bd70: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
bd80: 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  y(pExpr->pLeft);
bd90: 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74 68  ..      /* Wheth
bda0: 65 72 20 74 68 69 73 20 69 73 20 61 6e 20 27 78  er this is an 'x
bdb0: 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29 27 20   IN(SELECT...)' 
bdc0: 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c 65 78 70  or an 'x IN(<exp
bdd0: 72 6c 69 73 74 3e 29 27 0a 20 20 20 20 20 20 2a  rlist>)'.      *
bde0: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69 74 20  * expression it 
bdf0: 69 73 20 68 61 6e 64 6c 65 64 20 74 68 65 20 73  is handled the s
be00: 61 6d 65 20 77 61 79 2e 20 41 20 76 69 72 74 75  ame way. A virtu
be10: 61 6c 20 74 61 62 6c 65 20 69 73 20 0a 20 20 20  al table is .   
be20: 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74     ** filled wit
be30: 68 20 73 69 6e 67 6c 65 2d 66 69 65 6c 64 20 69  h single-field i
be40: 6e 64 65 78 20 6b 65 79 73 20 72 65 70 72 65 73  ndex keys repres
be50: 65 6e 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c  enting the resul
be60: 74 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d  ts.      ** from
be70: 20 74 68 65 20 53 45 4c 45 43 54 20 6f 72 20 74   the SELECT or t
be80: 68 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20  he <exprlist>.. 
be90: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
bea0: 20 49 66 20 74 68 65 20 27 78 27 20 65 78 70 72   If the 'x' expr
beb0: 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75  ession is a colu
bec0: 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74 68 65  mn value, or the
bed0: 20 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20   SELECT....     
bee0: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65   ** statement re
bef0: 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76  turns a column v
bf00: 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 61  alue, then the a
bf10: 66 66 69 6e 69 74 79 20 6f 66 20 74 68 61 74 0a  ffinity of that.
bf20: 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20        ** column 
bf30: 69 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64  is used to build
bf40: 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79 73 2e   the index keys.
bf50: 20 49 66 20 62 6f 74 68 20 27 78 27 20 61 6e 64   If both 'x' and
bf60: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 53 45   the.      ** SE
bf70: 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e  LECT... statemen
bf80: 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74  t are columns, t
bf90: 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69  hen numeric affi
bfa0: 6e 69 74 79 20 69 73 20 75 73 65 64 0a 20 20 20  nity is used.   
bfb0: 20 20 20 2a 2a 20 69 66 20 65 69 74 68 65 72 20     ** if either 
bfc0: 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52  column has NUMER
bfd0: 49 43 20 6f 72 20 49 4e 54 45 47 45 52 20 61 66  IC or INTEGER af
bfe0: 66 69 6e 69 74 79 2e 20 49 66 20 6e 65 69 74 68  finity. If neith
bff0: 65 72 0a 20 20 20 20 20 20 2a 2a 20 27 78 27 20  er.      ** 'x' 
c000: 6e 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e  nor the SELECT..
c010: 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20  . statement are 
c020: 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75  columns, then nu
c030: 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 0a 20  meric affinity. 
c040: 20 20 20 20 20 2a 2a 20 69 73 20 75 73 65 64 2e       ** is used.
c050: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
c060: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
c070: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
c080: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
c090: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
c0a0: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
c0b0: 6c 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  l, pExpr->iTable
c0c0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73  , 0);.      mems
c0d0: 65 74 28 26 6b 65 79 49 6e 66 6f 2c 20 30 2c 20  et(&keyInfo, 0, 
c0e0: 73 69 7a 65 6f 66 28 6b 65 79 49 6e 66 6f 29 29  sizeof(keyInfo))
c0f0: 3b 0a 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e  ;.      keyInfo.
c100: 6e 46 69 65 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nField = 1;.    
c110: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c120: 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43  Op(v, OP_SetNumC
c130: 6f 6c 75 6d 6e 73 2c 20 70 45 78 70 72 2d 3e 69  olumns, pExpr->i
c140: 54 61 62 6c 65 2c 20 31 29 3b 0a 0a 20 20 20 20  Table, 1);..    
c150: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65    if( pExpr->pSe
c160: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
c170: 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20 65  /* Case 1:     e
c180: 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
c190: 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ..).        **. 
c1a0: 20 20 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61         ** Genera
c1b0: 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65  te code to write
c1c0: 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
c1d0: 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20  the select into 
c1e0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  the temporary.  
c1f0: 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61        ** table a
c200: 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f 70 65  llocated and ope
c210: 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 20  ned above..     
c220: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e     */.        in
c230: 74 20 69 50 61 72 6d 20 3d 20 70 45 78 70 72 2d  t iParm = pExpr-
c240: 3e 69 54 61 62 6c 65 20 2b 20 20 28 28 28 69 6e  >iTable +  (((in
c250: 74 29 61 66 66 69 6e 69 74 79 29 3c 3c 31 36 29  t)affinity)<<16)
c260: 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69  ;.        ExprLi
c270: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20  st *pEList;.    
c280: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 45 78      assert( (pEx
c290: 70 72 2d 3e 69 54 61 62 6c 65 26 30 78 30 30 30  pr->iTable&0x000
c2a0: 30 46 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69  0FFFF)==pExpr->i
c2b0: 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 20  Table );.       
c2c0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
c2d0: 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ct(pParse, pExpr
c2e0: 2d 3e 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 53  ->pSelect, SRT_S
c2f0: 65 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c  et, iParm, 0, 0,
c300: 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20   0, 0) ){.      
c310: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
c320: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 45      }.        pE
c330: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 53  List = pExpr->pS
c340: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  elect->pEList;. 
c350: 20 20 20 20 20 20 20 69 66 28 20 70 45 4c 69 73         if( pELis
c360: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
c370: 70 72 3e 30 20 29 7b 20 0a 20 20 20 20 20 20 20  pr>0 ){ .       
c380: 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c     keyInfo.aColl
c390: 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  [0] = sqlite3Bin
c3a0: 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
c3b0: 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  q(pParse, pExpr-
c3c0: 3e 70 4c 65 66 74 2c 0a 20 20 20 20 20 20 20 20  >pLeft,.        
c3d0: 20 20 20 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b        pEList->a[
c3e0: 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  0].pExpr);.     
c3f0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
c400: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 69 73   if( pExpr->pLis
c410: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
c420: 43 61 73 65 20 32 3a 20 20 20 20 20 65 78 70 72  Case 2:     expr
c430: 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20   IN (exprlist). 
c440: 20 20 20 20 20 20 20 2a 2a 0a 09 2a 2a 20 46 6f         **..** Fo
c450: 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  r each expressio
c460: 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69 6e 64 65  n, build an inde
c470: 78 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 65  x key from the e
c480: 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20  valuation and.  
c490: 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 69        ** store i
c4a0: 74 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61  t in the tempora
c4b0: 72 79 20 74 61 62 6c 65 2e 20 49 66 20 3c 65 78  ry table. If <ex
c4c0: 70 72 3e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c  pr> is a column,
c4d0: 20 74 68 65 6e 20 75 73 65 0a 20 20 20 20 20 20   then use.      
c4e0: 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e    ** that column
c4f0: 73 20 61 66 66 69 6e 69 74 79 20 77 68 65 6e 20  s affinity when 
c500: 62 75 69 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b  building index k
c510: 65 79 73 2e 20 49 66 20 3c 65 78 70 72 3e 20 69  eys. If <expr> i
c520: 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a  s not.        **
c530: 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e   a column, use n
c540: 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 2e  umeric affinity.
c550: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
c560: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
c570: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
c580: 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  st = pExpr->pLis
c590: 74 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  t;.        struc
c5a0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
c5b0: 2a 70 49 74 65 6d 3b 0a 0a 20 20 20 20 20 20 20  *pItem;..       
c5c0: 20 69 66 28 20 21 61 66 66 69 6e 69 74 79 20 29   if( !affinity )
c5d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 69  {.          affi
c5e0: 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46  nity = SQLITE_AF
c5f0: 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  F_NONE;.        
c600: 7d 0a 20 20 20 20 20 20 20 20 6b 65 79 49 6e 66  }.        keyInf
c610: 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 70 45 78  o.aColl[0] = pEx
c620: 70 72 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c  pr->pLeft->pColl
c630: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f  ;..        /* Lo
c640: 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  op through each 
c650: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65  expression in <e
c660: 78 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20  xprlist>. */.   
c670: 20 20 20 20 20 66 6f 72 28 69 3d 70 4c 69 73 74       for(i=pList
c680: 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70  ->nExpr, pItem=p
c690: 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d  List->a; i>0; i-
c6a0: 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
c6b0: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 32         Expr *pE2
c6c0: 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
c6d0: 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ..          /* I
c6e0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
c6f0: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74   is not constant
c700: 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65   then we will ne
c710: 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20  ed to.          
c720: 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 65 20 74  ** disable the t
c730: 65 73 74 20 74 68 61 74 20 77 61 73 20 67 65 6e  est that was gen
c740: 65 72 61 74 65 64 20 61 62 6f 76 65 20 74 68 61  erated above tha
c750: 74 20 6d 61 6b 65 73 20 73 75 72 65 0a 20 20 20  t makes sure.   
c760: 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63         ** this c
c770: 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63 75 74 65  ode only execute
c780: 73 20 6f 6e 63 65 2e 20 20 42 65 63 61 75 73 65  s once.  Because
c790: 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74   for a non-const
c7a0: 61 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ant.          **
c7b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 77 65 20 6e   expression we n
c7c0: 65 65 64 20 74 6f 20 72 65 72 75 6e 20 74 68 69  eed to rerun thi
c7d0: 73 20 63 6f 64 65 20 65 61 63 68 20 74 69 6d 65  s code each time
c7e0: 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
c7f0: 20 20 20 20 20 20 20 20 20 69 66 28 20 74 65 73           if( tes
c800: 74 41 64 64 72 3e 30 20 26 26 20 21 73 71 6c 69  tAddr>0 && !sqli
c810: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
c820: 74 28 70 45 32 29 20 29 7b 0a 20 20 20 20 20 20  t(pE2) ){.      
c830: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c840: 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
c850: 20 74 65 73 74 41 64 64 72 2d 31 2c 20 33 29 3b   testAddr-1, 3);
c860: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
c870: 74 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20  tAddr = 0;.     
c880: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
c890: 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68    /* Evaluate th
c8a0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  e expression and
c8b0: 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20   insert it into 
c8c0: 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20 2a  the temp table *
c8d0: 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  /.          sqli
c8e0: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
c8f0: 73 65 2c 20 70 45 32 29 3b 0a 20 20 20 20 20 20  se, pE2);.      
c900: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
c910: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
c920: 6f 72 64 2c 20 31 2c 20 30 2c 20 26 61 66 66 69  ord, 1, 0, &affi
c930: 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20  nity, 1);.      
c940: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c950: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e  ddOp(v, OP_IdxIn
c960: 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  sert, pExpr->iTa
c970: 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ble, 0);.       
c980: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
c990: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
c9a0: 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 28 76  geP3(v, addr, (v
c9b0: 6f 69 64 20 2a 29 26 6b 65 79 49 6e 66 6f 2c 20  oid *)&keyInfo, 
c9c0: 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P3_KEYINFO);.   
c9d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
c9e0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49  .    case TK_EXI
c9f0: 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  STS:.    case TK
ca00: 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20  _SELECT: {.     
ca10: 20 2f 2a 20 54 68 69 73 20 68 61 73 20 74 6f 20   /* This has to 
ca20: 62 65 20 61 20 73 63 61 6c 61 72 20 53 45 4c 45  be a scalar SELE
ca30: 43 54 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f  CT.  Generate co
ca40: 64 65 20 74 6f 20 70 75 74 20 74 68 65 0a 20 20  de to put the.  
ca50: 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20      ** value of 
ca60: 74 68 69 73 20 73 65 6c 65 63 74 20 69 6e 20 61  this select in a
ca70: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
ca80: 20 72 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62   record the numb
ca90: 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  er.      ** of t
caa0: 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69  he memory cell i
cab0: 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20  n iColumn..     
cac0: 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63   */.      static
cad0: 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 6f 6e 65   const Token one
cae0: 20 3d 20 7b 20 28 75 38 2a 29 22 31 22 2c 20 30   = { (u8*)"1", 0
caf0: 2c 20 31 20 7d 3b 0a 20 20 20 20 20 20 53 65 6c  , 1 };.      Sel
cb00: 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 20 20 20  ect *pSel;.     
cb10: 20 69 6e 74 20 69 4d 65 6d 3b 0a 20 20 20 20 20   int iMem;.     
cb20: 20 69 6e 74 20 73 6f 70 3b 0a 0a 20 20 20 20 20   int sop;..     
cb30: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
cb40: 3d 20 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d  = iMem = pParse-
cb50: 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70  >nMem++;.      p
cb60: 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e 70 53 65  Sel = pExpr->pSe
cb70: 6c 65 63 74 3b 0a 20 20 20 20 20 20 69 66 28 20  lect;.      if( 
cb80: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
cb90: 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LECT ){.        
cba0: 73 6f 70 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20  sop = SRT_Mem;. 
cbb0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
cbc0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
cbd0: 6d 4e 75 6c 6c 2c 20 69 4d 65 6d 2c 20 30 29 3b  mNull, iMem, 0);
cbe0: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
cbf0: 6d 65 6e 74 28 28 76 2c 20 22 23 20 49 6e 69 74  ment((v, "# Init
cc00: 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74   subquery result
cc10: 22 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  "));.      }else
cc20: 7b 0a 20 20 20 20 20 20 20 20 73 6f 70 20 3d 20  {.        sop = 
cc30: 53 52 54 5f 45 78 69 73 74 73 3b 0a 20 20 20 20  SRT_Exists;.    
cc40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
cc50: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e  ddOp(v, OP_MemIn
cc60: 74 2c 20 30 2c 20 69 4d 65 6d 29 3b 0a 20 20 20  t, 0, iMem);.   
cc70: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
cc80: 28 28 76 2c 20 22 23 20 49 6e 69 74 20 45 58 49  ((v, "# Init EXI
cc90: 53 54 53 20 72 65 73 75 6c 74 22 29 29 3b 0a 20  STS result"));. 
cca0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
ccb0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
ccc0: 53 65 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  Sel->pLimit);.  
ccd0: 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74      pSel->pLimit
cce0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
ccf0: 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c  K_INTEGER, 0, 0,
cd00: 20 26 6f 6e 65 29 3b 0a 20 20 20 20 20 20 69 66   &one);.      if
cd10: 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  ( sqlite3Select(
cd20: 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20 73 6f  pParse, pSel, so
cd30: 70 2c 20 69 4d 65 6d 2c 20 30 2c 20 30 2c 20 30  p, iMem, 0, 0, 0
cd40: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
cd50: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
cd60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
cd70: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 74 65   }.  }..  if( te
cd80: 73 74 41 64 64 72 20 29 7b 0a 20 20 20 20 73 71  stAddr ){.    sq
cd90: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
cda0: 65 28 76 2c 20 74 65 73 74 41 64 64 72 29 3b 0a  e(v, testAddr);.
cdb0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 3b 0a 7d    }..  return;.}
cdc0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
cdd0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
cde0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  */../*.** Genera
cdf0: 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f  te an instructio
ce00: 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20  n that will put 
ce10: 74 68 65 20 69 6e 74 65 67 65 72 20 64 65 73 63  the integer desc
ce20: 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74 20  ribe by.** text 
ce30: 7a 5b 30 2e 2e 6e 2d 31 5d 20 6f 6e 20 74 68 65  z[0..n-1] on the
ce40: 20 73 74 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69   stack..*/.stati
ce50: 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65 67  c void codeInteg
ce60: 65 72 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73  er(Vdbe *v, cons
ce70: 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  t char *z, int n
ce80: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 7a 20 7c  ){.  assert( z |
ce90: 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46  | sqlite3MallocF
cea0: 61 69 6c 65 64 28 29 20 29 3b 0a 20 20 69 66 28  ailed() );.  if(
ceb0: 20 7a 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b   z ){.    int i;
cec0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
ced0: 47 65 74 49 6e 74 33 32 28 7a 2c 20 26 69 29 20  GetInt32(z, &i) 
cee0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
cef0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
cf00: 49 6e 74 65 67 65 72 2c 20 69 2c 20 30 29 3b 0a  Integer, i, 0);.
cf10: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
cf20: 6c 69 74 65 33 46 69 74 73 49 6e 36 34 42 69 74  lite3FitsIn64Bit
cf30: 73 28 7a 29 20 29 7b 0a 20 20 20 20 20 20 73 71  s(z) ){.      sq
cf40: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
cf50: 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20 30 2c 20  OP_Int64, 0, 0, 
cf60: 7a 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  z, n);.    }else
cf70: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
cf80: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61  dbeOp3(v, OP_Rea
cf90: 6c 2c 20 30 2c 20 30 2c 20 7a 2c 20 6e 29 3b 0a  l, 0, 0, z, n);.
cfa0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a      }.  }.}.../*
cfb0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
cfc0: 65 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72  e that will extr
cfd0: 61 63 74 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d  act the iColumn-
cfe0: 74 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a  th column from.*
cff0: 2a 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64  * table pTab and
d000: 20 70 75 73 68 20 74 68 61 74 20 63 6f 6c 75 6d   push that colum
d010: 6e 20 76 61 6c 75 65 20 6f 6e 20 74 68 65 20 73  n value on the s
d020: 74 61 63 6b 2e 20 20 54 68 65 72 65 0a 2a 2a 20  tack.  There.** 
d030: 69 73 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f  is an open curso
d040: 72 20 74 6f 20 70 54 61 62 20 69 6e 20 69 54 61  r to pTab in iTa
d050: 62 6c 65 2e 20 20 49 66 20 69 43 6f 6c 75 6d 6e  ble.  If iColumn
d060: 3c 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 64 65 20  <0 then.** code 
d070: 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 68 61  is generated tha
d080: 74 20 65 78 74 72 61 63 74 73 20 74 68 65 20 72  t extracts the r
d090: 6f 77 69 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  owid..*/.void sq
d0a0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
d0b0: 43 6f 6c 75 6d 6e 28 56 64 62 65 20 2a 76 2c 20  Column(Vdbe *v, 
d0c0: 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 69 6e 74  Table *pTab, int
d0d0: 20 69 43 6f 6c 75 6d 6e 2c 20 69 6e 74 20 69 54   iColumn, int iT
d0e0: 61 62 6c 65 29 7b 0a 20 20 69 66 28 20 69 43 6f  able){.  if( iCo
d0f0: 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 69 6e  lumn<0 ){.    in
d100: 74 20 6f 70 20 3d 20 28 70 54 61 62 20 26 26 20  t op = (pTab && 
d110: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 29  IsVirtual(pTab))
d120: 20 3f 20 4f 50 5f 56 52 6f 77 69 64 20 3a 20 4f   ? OP_VRowid : O
d130: 50 5f 52 6f 77 69 64 3b 0a 20 20 20 20 73 71 6c  P_Rowid;.    sql
d140: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
d150: 20 6f 70 2c 20 69 54 61 62 6c 65 2c 20 30 29 3b   op, iTable, 0);
d160: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61  .  }else if( pTa
d170: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  b==0 ){.    sqli
d180: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
d190: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 6c  OP_Column, iTabl
d1a0: 65 2c 20 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 7d  e, iColumn);.  }
d1b0: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6f 70  else{.    int op
d1c0: 20 3d 20 49 73 56 69 72 74 75 61 6c 28 70 54 61   = IsVirtual(pTa
d1d0: 62 29 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20  b) ? OP_VColumn 
d1e0: 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20  : OP_Column;.   
d1f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d200: 70 28 76 2c 20 6f 70 2c 20 69 54 61 62 6c 65 2c  p(v, op, iTable,
d210: 20 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 73   iColumn);.    s
d220: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61  qlite3ColumnDefa
d230: 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69 43 6f  ult(v, pTab, iCo
d240: 6c 75 6d 6e 29 3b 0a 23 69 66 6e 64 65 66 20 53  lumn);.#ifndef S
d250: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
d260: 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 69 66  ING_POINT.    if
d270: 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  ( pTab->aCol[iCo
d280: 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3d 3d  lumn].affinity==
d290: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
d2a0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
d2b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
d2c0: 52 65 61 6c 41 66 66 69 6e 69 74 79 2c 20 30 2c  RealAffinity, 0,
d2d0: 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69   0);.    }.#endi
d2e0: 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  f.  }.}../*.** G
d2f0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
d300: 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 56 64  o the current Vd
d310: 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  be to evaluate t
d320: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72  he given.** expr
d330: 65 73 73 69 6f 6e 20 61 6e 64 20 6c 65 61 76 65  ession and leave
d340: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 6e 20 74   the result on t
d350: 68 65 20 74 6f 70 20 6f 66 20 73 74 61 63 6b 2e  he top of stack.
d360: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65  .**.** This code
d370: 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20   depends on the 
d380: 66 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69  fact that certai
d390: 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28  n token values (
d3a0: 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72  ex: TK_EQ).** ar
d3b0: 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70  e the same as op
d3c0: 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a  code values (ex:
d3d0: 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70   OP_Eq) that imp
d3e0: 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65  lement the corre
d3f0: 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72  sponding.** oper
d400: 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20  ation.  Special 
d410: 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65  comments in vdbe
d420: 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63  .c and the mkopc
d430: 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20  odeh.awk script 
d440: 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70  in.** the make p
d450: 72 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65  rocess cause the
d460: 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69  se values to ali
d470: 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69  gn.  Assert()s i
d480: 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65  n the code.** be
d490: 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20  low verify that 
d4a0: 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20  the numbers are 
d4b0: 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c  aligned correctl
d4c0: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
d4d0: 65 33 45 78 70 72 43 6f 64 65 28 50 61 72 73 65  e3ExprCode(Parse
d4e0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
d4f0: 70 45 78 70 72 29 7b 0a 20 20 56 64 62 65 20 2a  pExpr){.  Vdbe *
d500: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
d510: 65 3b 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20 69  e;.  int op;.  i
d520: 6e 74 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 31  nt stackChng = 1
d530: 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f  ;    /* Amount o
d540: 66 20 63 68 61 6e 67 65 20 74 6f 20 73 74 61 63  f change to stac
d550: 6b 20 64 65 70 74 68 20 2a 2f 0a 0a 20 20 69 66  k depth */..  if
d560: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
d570: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
d580: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
d590: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75  beAddOp(v, OP_Nu
d5a0: 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 72  ll, 0, 0);.    r
d5b0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 70 20  eturn;.  }.  op 
d5c0: 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73  = pExpr->op;.  s
d5d0: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
d5e0: 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
d5f0: 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67  UMN: {.      Agg
d600: 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d  Info *pAggInfo =
d610: 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
d620: 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 41  ;.      struct A
d630: 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
d640: 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43   = &pAggInfo->aC
d650: 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b  ol[pExpr->iAgg];
d660: 0a 20 20 20 20 20 20 69 66 28 20 21 70 41 67 67  .      if( !pAgg
d670: 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65  Info->directMode
d680: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
d690: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
d6a0: 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 43 6f 6c  OP_MemLoad, pCol
d6b0: 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20  ->iMem, 0);.    
d6c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
d6d0: 20 7d 65 6c 73 65 20 69 66 28 20 70 41 67 67 49   }else if( pAggI
d6e0: 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67 49  nfo->useSortingI
d6f0: 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  dx ){.        sq
d700: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
d710: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67  , OP_Column, pAg
d720: 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64  gInfo->sortingId
d730: 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  x,.             
d740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d750: 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
d760: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 62  lumn);.        b
d770: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
d780: 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65      /* Otherwise
d790: 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f  , fall thru into
d7a0: 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63   the TK_COLUMN c
d7b0: 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ase */.    }.   
d7c0: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
d7d0: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   {.      if( pEx
d7e0: 70 72 2d 3e 69 54 61 62 6c 65 3c 30 20 29 7b 0a  pr->iTable<0 ){.
d7f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
d800: 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65  only happens whe
d810: 6e 20 63 6f 64 69 6e 67 20 63 68 65 63 6b 20 63  n coding check c
d820: 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
d830: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
d840: 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74 3e 30  arse->ckOffset>0
d850: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
d860: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
d870: 4f 50 5f 44 75 70 2c 20 70 50 61 72 73 65 2d 3e  OP_Dup, pParse->
d880: 63 6b 4f 66 66 73 65 74 2d 70 45 78 70 72 2d 3e  ckOffset-pExpr->
d890: 69 43 6f 6c 75 6d 6e 2d 31 2c 20 31 29 3b 0a 20  iColumn-1, 1);. 
d8a0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d8b0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
d8c0: 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 76 2c 20  odeGetColumn(v, 
d8d0: 70 45 78 70 72 2d 3e 70 54 61 62 2c 20 70 45 78  pExpr->pTab, pEx
d8e0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 45 78  pr->iColumn, pEx
d8f0: 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20  pr->iTable);.   
d900: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
d910: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
d920: 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20   TK_INTEGER: {. 
d930: 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72       codeInteger
d940: 28 76 2c 20 28 63 68 61 72 2a 29 70 45 78 70 72  (v, (char*)pExpr
d950: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72  ->token.z, pExpr
d960: 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20  ->token.n);.    
d970: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
d980: 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54     case TK_FLOAT
d990: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  :.    case TK_ST
d9a0: 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 61 73  RING: {.      as
d9b0: 73 65 72 74 28 20 54 4b 5f 46 4c 4f 41 54 3d 3d  sert( TK_FLOAT==
d9c0: 4f 50 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20 20  OP_Real );.     
d9d0: 20 61 73 73 65 72 74 28 20 54 4b 5f 53 54 52 49   assert( TK_STRI
d9e0: 4e 47 3d 3d 4f 50 5f 53 74 72 69 6e 67 38 20 29  NG==OP_String8 )
d9f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
da00: 65 71 75 6f 74 65 45 78 70 72 28 70 45 78 70 72  equoteExpr(pExpr
da10: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
da20: 56 64 62 65 4f 70 33 28 76 2c 20 6f 70 2c 20 30  VdbeOp3(v, op, 0
da30: 2c 20 30 2c 20 28 63 68 61 72 2a 29 70 45 78 70  , 0, (char*)pExp
da40: 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70  r->token.z, pExp
da50: 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20  r->token.n);.   
da60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
da70: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c      case TK_NULL
da80: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
da90: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
daa0: 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20  _Null, 0, 0);.  
dab0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
dac0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
dad0: 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41  OMIT_BLOB_LITERA
dae0: 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c  L.    case TK_BL
daf0: 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  OB: {.      int 
db00: 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  n;.      const c
db10: 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 61 73  har *z;.      as
db20: 73 65 72 74 28 20 54 4b 5f 42 4c 4f 42 3d 3d 4f  sert( TK_BLOB==O
db30: 50 5f 48 65 78 42 6c 6f 62 20 29 3b 0a 20 20 20  P_HexBlob );.   
db40: 20 20 20 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f     n = pExpr->to
db50: 6b 65 6e 2e 6e 20 2d 20 33 3b 0a 20 20 20 20 20  ken.n - 3;.     
db60: 20 7a 20 3d 20 28 63 68 61 72 2a 29 70 45 78 70   z = (char*)pExp
db70: 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 2b 20 32 3b 0a  r->token.z + 2;.
db80: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3e        assert( n>
db90: 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
dba0: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
dbb0: 7a 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 7d 0a  z = "";.      }.
dbc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
dbd0: 65 4f 70 33 28 76 2c 20 6f 70 2c 20 30 2c 20 30  eOp3(v, op, 0, 0
dbe0: 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 62  , z, n);.      b
dbf0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
dc00: 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56  if.    case TK_V
dc10: 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20  ARIABLE: {.     
dc20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
dc30: 70 28 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65  p(v, OP_Variable
dc40: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
dc50: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
dc60: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3e 31 20  Expr->token.n>1 
dc70: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
dc80: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
dc90: 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 45 78  , -1, (char*)pEx
dca0: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
dcb0: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20  pr->token.n);.  
dcc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
dcd0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
dce0: 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b  e TK_REGISTER: {
dcf0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
dd00: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
dd10: 6d 4c 6f 61 64 2c 20 70 45 78 70 72 2d 3e 69 54  mLoad, pExpr->iT
dd20: 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  able, 0);.      
dd30: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
dd40: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
dd50: 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65 20 54  _CAST.    case T
dd60: 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20  K_CAST: {.      
dd70: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f  /* Expressions o
dd80: 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41  f the form:   CA
dd90: 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65  ST(pLeft AS toke
dda0: 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  n) */.      int 
ddb0: 61 66 66 2c 20 74 6f 5f 6f 70 3b 0a 20 20 20 20  aff, to_op;.    
ddc0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
ddd0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
dde0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61  >pLeft);.      a
ddf0: 66 66 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69  ff = sqlite3Affi
de00: 6e 69 74 79 54 79 70 65 28 26 70 45 78 70 72 2d  nityType(&pExpr-
de10: 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 74  >token);.      t
de20: 6f 5f 6f 70 20 3d 20 61 66 66 20 2d 20 53 51 4c  o_op = aff - SQL
de30: 49 54 45 5f 41 46 46 5f 54 45 58 54 20 2b 20 4f  ITE_AFF_TEXT + O
de40: 50 5f 54 6f 54 65 78 74 3b 0a 20 20 20 20 20 20  P_ToText;.      
de50: 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f  assert( to_op==O
de60: 50 5f 54 6f 54 65 78 74 20 20 20 20 7c 7c 20 61  P_ToText    || a
de70: 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  ff!=SQLITE_AFF_T
de80: 45 58 54 20 20 20 20 29 3b 0a 20 20 20 20 20 20  EXT    );.      
de90: 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f  assert( to_op==O
dea0: 50 5f 54 6f 42 6c 6f 62 20 20 20 20 7c 7c 20 61  P_ToBlob    || a
deb0: 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff!=SQLITE_AFF_N
dec0: 4f 4e 45 20 20 20 20 29 3b 0a 20 20 20 20 20 20  ONE    );.      
ded0: 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f  assert( to_op==O
dee0: 50 5f 54 6f 4e 75 6d 65 72 69 63 20 7c 7c 20 61  P_ToNumeric || a
def0: 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff!=SQLITE_AFF_N
df00: 55 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 20 20  UMERIC );.      
df10: 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f  assert( to_op==O
df20: 50 5f 54 6f 49 6e 74 20 20 20 20 20 7c 7c 20 61  P_ToInt     || a
df30: 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ff!=SQLITE_AFF_I
df40: 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 20 20  NTEGER );.      
df50: 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f  assert( to_op==O
df60: 50 5f 54 6f 52 65 61 6c 20 20 20 20 7c 7c 20 61  P_ToReal    || a
df70: 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ff!=SQLITE_AFF_R
df80: 45 41 4c 20 20 20 20 29 3b 0a 20 20 20 20 20 20  EAL    );.      
df90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dfa0: 28 76 2c 20 74 6f 5f 6f 70 2c 20 30 2c 20 30 29  (v, to_op, 0, 0)
dfb0: 3b 0a 20 20 20 20 20 20 73 74 61 63 6b 43 68 6e  ;.      stackChn
dfc0: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  g = 0;.      bre
dfd0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
dfe0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
dff0: 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73 65  CAST */.    case
e000: 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
e010: 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
e020: 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
e030: 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
e040: 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
e050: 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
e060: 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f  assert( TK_LT==O
e070: 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Lt );.      as
e080: 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f  sert( TK_LE==OP_
e090: 4c 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Le );.      asse
e0a0: 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74  rt( TK_GT==OP_Gt
e0b0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
e0c0: 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29  ( TK_GE==OP_Ge )
e0d0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
e0e0: 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a  TK_EQ==OP_Eq );.
e0f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
e100: 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20  _NE==OP_Ne );.  
e110: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
e120: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
e130: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
e140: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
e150: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
e160: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63  pRight);.      c
e170: 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
e180: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
e190: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
e1a0: 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  op, 0, 0);.     
e1b0: 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 2d 31 3b   stackChng = -1;
e1c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
e1d0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
e1e0: 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  AND:.    case TK
e1f0: 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _OR:.    case TK
e200: 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20  _PLUS:.    case 
e210: 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73  TK_STAR:.    cas
e220: 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20  e TK_MINUS:.    
e230: 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20  case TK_REM:.   
e240: 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a   case TK_BITAND:
e250: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
e260: 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OR:.    case TK_
e270: 53 4c 41 53 48 3a 0a 20 20 20 20 63 61 73 65 20  SLASH:.    case 
e280: 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20 63  TK_LSHIFT:.    c
e290: 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a  ase TK_RSHIFT: .
e2a0: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43      case TK_CONC
e2b0: 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  AT: {.      asse
e2c0: 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41  rt( TK_AND==OP_A
e2d0: 6e 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  nd );.      asse
e2e0: 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72  rt( TK_OR==OP_Or
e2f0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
e300: 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64  ( TK_PLUS==OP_Ad
e310: 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d );.      asser
e320: 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f  t( TK_MINUS==OP_
e330: 53 75 62 74 72 61 63 74 20 29 3b 0a 20 20 20 20  Subtract );.    
e340: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 45 4d    assert( TK_REM
e350: 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20 29  ==OP_Remainder )
e360: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
e370: 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69  TK_BITAND==OP_Bi
e380: 74 41 6e 64 20 29 3b 0a 20 20 20 20 20 20 61 73  tAnd );.      as
e390: 73 65 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d  sert( TK_BITOR==
e3a0: 4f 50 5f 42 69 74 4f 72 20 29 3b 0a 20 20 20 20  OP_BitOr );.    
e3b0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53 4c 41    assert( TK_SLA
e3c0: 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b  SH==OP_Divide );
e3d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
e3e0: 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69  K_LSHIFT==OP_Shi
e3f0: 66 74 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20  ftLeft );.      
e400: 61 73 73 65 72 74 28 20 54 4b 5f 52 53 48 49 46  assert( TK_RSHIF
e410: 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68 74  T==OP_ShiftRight
e420: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
e430: 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f  ( TK_CONCAT==OP_
e440: 43 6f 6e 63 61 74 20 29 3b 0a 20 20 20 20 20 20  Concat );.      
e450: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
e460: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
e470: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
e480: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
e490: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
e4a0: 68 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ht);.      sqlit
e4b0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f  e3VdbeAddOp(v, o
e4c0: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
e4d0: 73 74 61 63 6b 43 68 6e 67 20 3d 20 2d 31 3b 0a  stackChng = -1;.
e4e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e4f0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
e500: 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45  MINUS: {.      E
e510: 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
e520: 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
e530: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29   assert( pLeft )
e540: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66  ;.      if( pLef
e550: 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20  t->op==TK_FLOAT 
e560: 7c 7c 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  || pLeft->op==TK
e570: 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
e580: 20 20 20 20 54 6f 6b 65 6e 20 2a 70 20 3d 20 26      Token *p = &
e590: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  pLeft->token;.  
e5a0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20        char *z = 
e5b0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
e5c0: 2d 25 2e 2a 73 22 2c 20 70 2d 3e 6e 2c 20 70 2d  -%.*s", p->n, p-
e5d0: 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  >z);.        if(
e5e0: 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46   pLeft->op==TK_F
e5f0: 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LOAT ){.        
e600: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
e610: 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20  (v, OP_Real, 0, 
e620: 30 2c 20 7a 2c 20 70 2d 3e 6e 2b 31 29 3b 0a 20  0, z, p->n+1);. 
e630: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
e640: 20 20 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65          codeInte
e650: 67 65 72 28 76 2c 20 7a 2c 20 70 2d 3e 6e 2b 31  ger(v, z, p->n+1
e660: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
e670: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
e680: 7a 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  z);.        brea
e690: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
e6a0: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
e6b0: 20 69 6e 74 6f 20 54 4b 5f 4e 4f 54 20 2a 2f 0a   into TK_NOT */.
e6c0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
e6d0: 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61  K_BITNOT:.    ca
e6e0: 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
e6f0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49     assert( TK_BI
e700: 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20  TNOT==OP_BitNot 
e710: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
e720: 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20   TK_NOT==OP_Not 
e730: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e740: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
e750: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
e760: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e770: 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c  eAddOp(v, op, 0,
e780: 20 30 29 3b 0a 20 20 20 20 20 20 73 74 61 63 6b   0);.      stack
e790: 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  Chng = 0;.      
e7a0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
e7b0: 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
e7c0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
e7d0: 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e  NULL: {.      in
e7e0: 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20 61 73  t dest;.      as
e7f0: 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d  sert( TK_ISNULL=
e800: 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20  =OP_IsNull );.  
e810: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
e820: 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75  OTNULL==OP_NotNu
e830: 6c 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ll );.      sqli
e840: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
e850: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 30  OP_Integer, 1, 0
e860: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e870: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
e880: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
e890: 20 20 20 20 20 20 64 65 73 74 20 3d 20 73 71 6c        dest = sql
e8a0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
e8b0: 64 64 72 28 76 29 20 2b 20 32 3b 0a 20 20 20 20  ddr(v) + 2;.    
e8c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e8d0: 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73  Op(v, op, 1, des
e8e0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
e8f0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
e900: 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b  _AddImm, -1, 0);
e910: 0a 20 20 20 20 20 20 73 74 61 63 6b 43 68 6e 67  .      stackChng
e920: 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
e930: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
e940: 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  e TK_AGG_FUNCTIO
e950: 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e  N: {.      AggIn
e960: 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70  fo *pInfo = pExp
e970: 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20  r->pAggInfo;.   
e980: 20 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20     if( pInfo==0 
e990: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
e9a0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
e9b0: 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67  e, "misuse of ag
e9c0: 67 72 65 67 61 74 65 3a 20 25 54 22 2c 0a 20 20  gregate: %T",.  
e9d0: 20 20 20 20 20 20 20 20 20 20 26 70 45 78 70 72            &pExpr
e9e0: 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d  ->span);.      }
e9f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
ea00: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
ea10: 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 49  , OP_MemLoad, pI
ea20: 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72  nfo->aFunc[pExpr
ea30: 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 2c 20 30 29  ->iAgg].iMem, 0)
ea40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ea50: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
ea60: 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46   case TK_CONST_F
ea70: 55 4e 43 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UNC:.    case TK
ea80: 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
ea90: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
eaa0: 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  st = pExpr->pLis
eab0: 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78  t;.      int nEx
eac0: 70 72 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69  pr = pList ? pLi
ead0: 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20  st->nExpr : 0;. 
eae0: 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44       FuncDef *pD
eaf0: 65 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 49  ef;.      int nI
eb00: 64 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  d;.      const c
eb10: 68 61 72 20 2a 7a 49 64 3b 0a 20 20 20 20 20 20  har *zId;.      
eb20: 69 6e 74 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20  int constMask = 
eb30: 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  0;.      int i;.
eb40: 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45        u8 enc = E
eb50: 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  NC(pParse->db);.
eb60: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
eb70: 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  Coll = 0;.      
eb80: 7a 49 64 20 3d 20 28 63 68 61 72 2a 29 70 45 78  zId = (char*)pEx
eb90: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20  pr->token.z;.   
eba0: 20 20 20 6e 49 64 20 3d 20 70 45 78 70 72 2d 3e     nId = pExpr->
ebb0: 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 70  token.n;.      p
ebc0: 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Def = sqlite3Fin
ebd0: 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  dFunction(pParse
ebe0: 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20  ->db, zId, nId, 
ebf0: 6e 45 78 70 72 2c 20 65 6e 63 2c 20 30 29 3b 0a  nExpr, enc, 0);.
ec00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44        assert( pD
ec10: 65 66 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e  ef!=0 );.      n
ec20: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
ec30: 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
ec40: 50 61 72 73 65 2c 20 70 4c 69 73 74 29 3b 0a 23  Parse, pList);.#
ec50: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ec60: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
ec70: 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c        /* Possibl
ec80: 79 20 6f 76 65 72 6c 6f 61 64 20 74 68 65 20 66  y overload the f
ec90: 75 6e 63 74 69 6f 6e 20 69 66 20 74 68 65 20 66  unction if the f
eca0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
ecb0: 0a 20 20 20 20 20 20 2a 2a 20 61 20 76 69 72 74  .      ** a virt
ecc0: 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  ual table column
ecd0: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
ece0: 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78 20 66 75   ** For infix fu
ecf0: 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47  nctions (LIKE, G
ed00: 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20 61 6e 64  LOB, REGEXP, and
ed10: 20 4d 41 54 43 48 29 20 75 73 65 20 74 68 65 0a   MATCH) use the.
ed20: 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20        ** second 
ed30: 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68  argument, not th
ed40: 65 20 66 69 72 73 74 2c 20 61 73 20 74 68 65 20  e first, as the 
ed50: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 65 73 74  argument to test
ed60: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65   to.      ** see
ed70: 20 69 66 20 69 74 20 69 73 20 61 20 63 6f 6c 75   if it is a colu
ed80: 6d 6e 20 69 6e 20 61 20 76 69 72 74 75 61 6c 20  mn in a virtual 
ed90: 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20  table.  This is 
eda0: 64 6f 6e 65 20 62 65 63 61 75 73 65 0a 20 20 20  done because.   
edb0: 20 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f     ** the left o
edc0: 70 65 72 61 6e 64 20 6f 66 20 69 6e 66 69 78 20  perand of infix 
edd0: 66 75 6e 63 74 69 6f 6e 73 20 28 74 68 65 20 6f  functions (the o
ede0: 70 65 72 61 6e 64 20 77 65 20 77 61 6e 74 20 74  perand we want t
edf0: 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72  o.      ** contr
ee00: 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20  ol overloading) 
ee10: 65 6e 64 73 20 75 70 20 61 73 20 74 68 65 20 73  ends up as the s
ee20: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
ee30: 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66  o the.      ** f
ee40: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 65 78  unction.  The ex
ee50: 70 72 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62  pression "A glob
ee60: 20 42 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e   B" is equivalen
ee70: 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22  t to .      ** "
ee80: 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57 65 20 77  glob(B,A).  We w
ee90: 61 6e 74 20 74 6f 20 75 73 65 20 74 68 65 20 41  ant to use the A
eea0: 20 69 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 74   in "A glob B" t
eeb0: 6f 20 74 65 73 74 0a 20 20 20 20 20 20 2a 2a 20  o test.      ** 
eec0: 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65  for function ove
eed0: 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75 74 20 77  rloading.  But w
eee0: 65 20 75 73 65 20 74 68 65 20 42 20 74 65 72 6d  e use the B term
eef0: 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e   in "glob(B,A)".
ef00: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
ef10: 69 66 28 20 6e 45 78 70 72 3e 3d 32 20 26 26 20  if( nExpr>=2 && 
ef20: 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20  (pExpr->flags & 
ef30: 45 50 5f 49 6e 66 69 78 46 75 6e 63 29 20 29 7b  EP_InfixFunc) ){
ef40: 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20  .        pDef = 
ef50: 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c  sqlite3VtabOverl
ef60: 6f 61 64 46 75 6e 63 74 69 6f 6e 28 70 44 65 66  oadFunction(pDef
ef70: 2c 20 6e 45 78 70 72 2c 20 70 4c 69 73 74 2d 3e  , nExpr, pList->
ef80: 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[1].pExpr);.   
ef90: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 45 78     }else if( nEx
efa0: 70 72 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  pr>0 ){.        
efb0: 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74  pDef = sqlite3Vt
efc0: 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69  abOverloadFuncti
efd0: 6f 6e 28 70 44 65 66 2c 20 6e 45 78 70 72 2c 20  on(pDef, nExpr, 
efe0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
eff0: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  r);.      }.#end
f000: 69 66 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  if.      for(i=0
f010: 3b 20 69 3c 6e 45 78 70 72 20 26 26 20 69 3c 33  ; i<nExpr && i<3
f020: 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  2; i++){.       
f030: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
f040: 49 73 43 6f 6e 73 74 61 6e 74 28 70 4c 69 73 74  IsConstant(pList
f050: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b  ->a[i].pExpr) ){
f060: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
f070: 4d 61 73 6b 20 7c 3d 20 28 31 3c 3c 69 29 3b 0a  Mask |= (1<<i);.
f080: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f090: 20 20 69 66 28 20 70 44 65 66 2d 3e 6e 65 65 64    if( pDef->need
f0a0: 43 6f 6c 6c 53 65 71 20 26 26 20 21 70 43 6f 6c  CollSeq && !pCol
f0b0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  l ){.          p
f0c0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
f0d0: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
f0e0: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
f0f0: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  xpr);.        }.
f100: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
f110: 28 20 70 44 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c  ( pDef->needColl
f120: 53 65 71 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Seq ){.        i
f130: 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
f140: 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
f150: 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20  pDfltColl; .    
f160: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
f170: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71  p3(v, OP_CollSeq
f180: 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29  , 0, 0, (char *)
f190: 70 43 6f 6c 6c 2c 20 50 33 5f 43 4f 4c 4c 53 45  pColl, P3_COLLSE
f1a0: 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Q);.      }.    
f1b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
f1c0: 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c  (v, OP_Function,
f1d0: 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 6e 45 78 70   constMask, nExp
f1e0: 72 2c 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20  r, (char*)pDef, 
f1f0: 50 33 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P3_FUNCDEF);.   
f200: 20 20 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 31     stackChng = 1
f210: 2d 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 62 72  -nExpr;.      br
f220: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
f230: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
f240: 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
f250: 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20   TK_EXISTS:.    
f260: 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20  case TK_SELECT: 
f270: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  {.      if( pExp
f280: 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b  r->iColumn==0 ){
f290: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f2a0: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
f2b0: 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
f2c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
f2d0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
f2e0: 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 45 78 70  OP_MemLoad, pExp
f2f0: 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  r->iColumn, 0);.
f300: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
f310: 74 28 28 76 2c 20 22 23 20 6c 6f 61 64 20 73 75  t((v, "# load su
f320: 62 71 75 65 72 79 20 72 65 73 75 6c 74 22 29 29  bquery result"))
f330: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
f340: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
f350: 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _IN: {.      int
f360: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 63 68 61   addr;.      cha
f370: 72 20 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20  r affinity;.    
f380: 20 20 69 6e 74 20 63 6b 4f 66 66 73 65 74 20 3d    int ckOffset =
f390: 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65   pParse->ckOffse
f3a0: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
f3b0: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
f3c0: 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 0a 20  arse, pExpr);.. 
f3d0: 20 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f       /* Figure o
f3e0: 75 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  ut the affinity 
f3f0: 74 6f 20 75 73 65 20 74 6f 20 63 72 65 61 74 65  to use to create
f400: 20 61 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20   a key from the 
f410: 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a  results.      **
f420: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
f430: 6f 6e 2e 20 61 66 66 69 6e 69 74 79 53 74 72 20  on. affinityStr 
f440: 73 74 6f 72 65 73 20 61 20 73 74 61 74 69 63 20  stores a static 
f450: 73 74 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20  string suitable 
f460: 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 50 33 20  for.      ** P3 
f470: 6f 66 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  of OP_MakeRecord
f480: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
f490: 20 61 66 66 69 6e 69 74 79 20 3d 20 63 6f 6d 70   affinity = comp
f4a0: 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70  arisonAffinity(p
f4b0: 45 78 70 72 29 3b 0a 0a 20 20 20 20 20 20 73 71  Expr);..      sq
f4c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
f4d0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
f4e0: 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73   0);.      pPars
f4f0: 65 2d 3e 63 6b 4f 66 66 73 65 74 20 3d 20 28 63  e->ckOffset = (c
f500: 6b 4f 66 66 73 65 74 20 3f 20 28 63 6b 4f 66 66  kOffset ? (ckOff
f510: 73 65 74 2b 31 29 20 3a 20 30 29 3b 0a 0a 20 20  set+1) : 0);..  
f520: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
f530: 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78  <expr> from "<ex
f540: 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 20 54  pr> IN (...)". T
f550: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
f560: 6c 65 0a 20 20 20 20 20 20 2a 2a 20 70 45 78 70  le.      ** pExp
f570: 72 2d 3e 69 54 61 62 6c 65 20 63 6f 6e 74 61 69  r->iTable contai
f580: 6e 73 20 74 68 65 20 76 61 6c 75 65 73 20 74 68  ns the values th
f590: 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 28  at make up the (
f5a0: 2e 2e 2e 29 20 73 65 74 2e 0a 20 20 20 20 20 20  ...) set..      
f5b0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
f5c0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
f5d0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
f5e0: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
f5f0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
f600: 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
f610: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
f620: 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31  , OP_NotNull, -1
f630: 2c 20 61 64 64 72 2b 34 29 3b 20 20 20 20 20 20  , addr+4);      
f640: 20 20 20 20 20 20 2f 2a 20 61 64 64 72 20 2b 20        /* addr + 
f650: 30 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  0 */.      sqlit
f660: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
f670: 50 5f 50 6f 70 2c 20 32 2c 20 30 29 3b 0a 20 20  P_Pop, 2, 0);.  
f680: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f690: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  ddOp(v, OP_Null,
f6a0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
f6b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
f6c0: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
f6d0: 64 72 2b 37 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr+7);.      sql
f6e0: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
f6f0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c  P_MakeRecord, 1,
f700: 20 30 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31   0, &affinity, 1
f710: 29 3b 20 20 20 2f 2a 20 61 64 64 72 20 2b 20 34  );   /* addr + 4
f720: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
f730: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
f740: 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69  _Found, pExpr->i
f750: 54 61 62 6c 65 2c 20 61 64 64 72 2b 37 29 3b 0a  Table, addr+7);.
f760: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f770: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64  eAddOp(v, OP_Add
f780: 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b 20 20 20 20  Imm, -1, 0);    
f790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f7a0: 20 61 64 64 72 20 2b 20 36 20 2a 2f 0a 0a 20 20   addr + 6 */..  
f7b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f7c0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
f7d0: 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
f7e0: 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
f7f0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
f800: 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
f810: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 49  prList_item *pLI
f820: 74 65 6d 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  tem = pExpr->pLi
f830: 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 45 78 70  st->a;.      Exp
f840: 72 20 2a 70 52 69 67 68 74 20 3d 20 70 4c 49 74  r *pRight = pLIt
f850: 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  em->pExpr;.     
f860: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
f870: 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b  (pParse, pLeft);
f880: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f890: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75  beAddOp(v, OP_Du
f8a0: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
f8b0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
f8c0: 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b  pParse, pRight);
f8d0: 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
f8e0: 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  re(pParse, pLeft
f8f0: 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c  , pRight, OP_Ge,
f900: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
f910: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
f920: 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29  , OP_Pull, 1, 0)
f930: 3b 0a 20 20 20 20 20 20 70 4c 49 74 65 6d 2b 2b  ;.      pLItem++
f940: 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d  ;.      pRight =
f950: 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a   pLItem->pExpr;.
f960: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
f970: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52  rCode(pParse, pR
f980: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64  ight);.      cod
f990: 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
f9a0: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
f9b0: 4f 50 5f 4c 65 2c 20 30 2c 20 30 29 3b 0a 20 20  OP_Le, 0, 0);.  
f9c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f9d0: 64 64 4f 70 28 76 2c 20 4f 50 5f 41 6e 64 2c 20  ddOp(v, OP_And, 
f9e0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  0, 0);.      bre
f9f0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
fa00: 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20  se TK_UPLUS: {. 
fa10: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
fa20: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
fa30: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
fa40: 20 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 30 3b    stackChng = 0;
fa50: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
fa60: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
fa70: 43 41 53 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e  CASE: {.      in
fa80: 74 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c  t expr_end_label
fa90: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 75 6d 70  ;.      int jump
faa0: 49 6e 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  Inst;.      int 
fab0: 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74  nExpr;.      int
fac0: 20 69 3b 0a 20 20 20 20 20 20 45 78 70 72 4c 69   i;.      ExprLi
fad0: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20  st *pEList;.    
fae0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
faf0: 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65  t_item *aListele
fb00: 6d 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  m;..      assert
fb10: 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 29 3b 0a  (pExpr->pList);.
fb20: 20 20 20 20 20 20 61 73 73 65 72 74 28 28 70 45        assert((pE
fb30: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  xpr->pList->nExp
fb40: 72 20 25 20 32 29 20 3d 3d 20 30 29 3b 0a 20 20  r % 2) == 0);.  
fb50: 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70 72      assert(pExpr
fb60: 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e  ->pList->nExpr >
fb70: 20 30 29 3b 0a 20 20 20 20 20 20 70 45 4c 69 73   0);.      pELis
fb80: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
fb90: 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65 6c 65  ;.      aListele
fba0: 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20  m = pEList->a;. 
fbb0: 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45 4c       nExpr = pEL
fbc0: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
fbd0: 20 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c    expr_end_label
fbe0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
fbf0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
fc00: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65    if( pExpr->pLe
fc10: 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ft ){.        sq
fc20: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
fc30: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
fc40: 66 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ft);.      }.   
fc50: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45     for(i=0; i<nE
fc60: 78 70 72 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20  xpr; i=i+2){.   
fc70: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
fc80: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69  Code(pParse, aLi
fc90: 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 29  stelem[i].pExpr)
fca0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  ;.        if( pE
fcb0: 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20  xpr->pLeft ){.  
fcc0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
fcd0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
fce0: 75 70 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20  up, 1, 1);.     
fcf0: 20 20 20 20 20 6a 75 6d 70 49 6e 73 74 20 3d 20       jumpInst = 
fd00: 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
fd10: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
fd20: 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70  , aListelem[i].p
fd30: 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
fd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd50: 20 20 20 20 20 20 20 4f 50 5f 4e 65 2c 20 30 2c         OP_Ne, 0,
fd60: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   1);.          s
fd70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
fd80: 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29  v, OP_Pop, 1, 0)
fd90: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
fda0: 0a 20 20 20 20 20 20 20 20 20 20 6a 75 6d 70 49  .          jumpI
fdb0: 6e 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nst = sqlite3Vdb
fdc0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4e  eAddOp(v, OP_IfN
fdd0: 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  ot, 1, 0);.     
fde0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
fdf0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
fe00: 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69  rse, aListelem[i
fe10: 2b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  +1].pExpr);.    
fe20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fe30: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
fe40: 20 30 2c 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62   0, expr_end_lab
fe50: 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  el);.        sql
fe60: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
fe70: 28 76 2c 20 6a 75 6d 70 49 6e 73 74 29 3b 0a 20  (v, jumpInst);. 
fe80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
fe90: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b   pExpr->pLeft ){
fea0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
feb0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
fec0: 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  Pop, 1, 0);.    
fed0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
fee0: 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20  xpr->pRight ){. 
fef0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
ff00: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
ff10: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
ff20: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ff30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ff40: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  ddOp(v, OP_Null,
ff50: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
ff60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ff70: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
ff80: 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 29   expr_end_label)
ff90: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
ffa0: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
ffb0: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
ffc0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49  .    case TK_RAI
ffd0: 53 45 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  SE: {.      if( 
ffe0: 21 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61  !pParse->trigSta
fff0: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ck ){.        sq
10000 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
10010 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
10020 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52 41               "RA
10030 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62  ISE() may only b
10040 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20  e used within a 
10050 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22  trigger-program"
10060 29 3b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20  );..return;.    
10070 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
10080 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 4f 45  xpr->iColumn!=OE
10090 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20  _Ignore ){.     
100a0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
100b0 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 4f 45 5f 52  r->iColumn==OE_R
100c0 6f 6c 6c 62 61 63 6b 20 7c 7c 0a 20 20 20 20 20  ollback ||.     
100d0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
100e0 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45  r->iColumn == OE
100f0 5f 41 62 6f 72 74 20 7c 7c 0a 20 20 20 20 20 20  _Abort ||.      
10100 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
10110 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f  ->iColumn == OE_
10120 46 61 69 6c 20 29 3b 0a 20 20 20 20 20 20 20 20  Fail );.        
10130 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 45   sqlite3DequoteE
10140 78 70 72 28 70 45 78 70 72 29 3b 0a 20 20 20 20  xpr(pExpr);.    
10150 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10160 4f 70 33 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20  Op3(v, OP_Halt, 
10170 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
10180 54 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  T, pExpr->iColum
10190 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
101a0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
101b0 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  *)pExpr->token.z
101c0 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  , pExpr->token.n
101d0 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  );.      } else 
101e0 7b 0a 20 20 20 20 20 20 20 20 20 61 73 73 65 72  {.         asser
101f0 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  t( pExpr->iColum
10200 6e 20 3d 3d 20 4f 45 5f 49 67 6e 6f 72 65 20 29  n == OE_Ignore )
10210 3b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  ;.         sqlit
10220 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10230 50 5f 43 6f 6e 74 65 78 74 50 6f 70 2c 20 30 2c  P_ContextPop, 0,
10240 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71   0);.         sq
10250 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
10260 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 50  , OP_Goto, 0, pP
10270 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 2d  arse->trigStack-
10280 3e 69 67 6e 6f 72 65 4a 75 6d 70 29 3b 0a 20 20  >ignoreJump);.  
10290 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
102a0 6e 74 28 28 76 2c 20 22 23 20 72 61 69 73 65 28  nt((v, "# raise(
102b0 49 47 4e 4f 52 45 29 22 29 29 3b 0a 20 20 20 20  IGNORE)"));.    
102c0 20 20 7d 0a 20 20 20 20 20 20 73 74 61 63 6b 43    }.      stackC
102d0 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  hng = 0;.      b
102e0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
102f0 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  if.  }..  if( pP
10300 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74 20 29  arse->ckOffset )
10310 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6b  {.    pParse->ck
10320 4f 66 66 73 65 74 20 2b 3d 20 73 74 61 63 6b 43  Offset += stackC
10330 68 6e 67 3b 0a 20 20 20 20 61 73 73 65 72 74 28  hng;.    assert(
10340 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65   pParse->ckOffse
10350 74 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e  t );.  }.}..#ifn
10360 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10370 54 52 49 47 47 45 52 0a 2f 2a 0a 2a 2a 20 47 65  TRIGGER./*.** Ge
10380 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
10390 20 65 76 61 6c 75 74 65 73 20 74 68 65 20 67 69   evalutes the gi
103a0 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61  ven expression a
103b0 6e 64 20 6c 65 61 76 65 73 20 74 68 65 20 72 65  nd leaves the re
103c0 73 75 6c 74 0a 2a 2a 20 6f 6e 20 74 68 65 20 73  sult.** on the s
103d0 74 61 63 6b 2e 20 20 53 65 65 20 61 6c 73 6f 20  tack.  See also 
103e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
103f0 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  )..**.** This ro
10400 75 74 69 6e 65 20 6d 69 67 68 74 20 61 6c 73 6f  utine might also
10410 20 63 61 63 68 65 20 74 68 65 20 72 65 73 75 6c   cache the resul
10420 74 20 61 6e 64 20 6d 6f 64 69 66 79 20 74 68 65  t and modify the
10430 20 70 45 78 70 72 20 74 72 65 65 0a 2a 2a 20 73   pExpr tree.** s
10440 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 6d  o that it will m
10450 61 6b 65 20 75 73 65 20 6f 66 20 74 68 65 20 63  ake use of the c
10460 61 63 68 65 64 20 72 65 73 75 6c 74 20 6f 6e 20  ached result on 
10470 73 75 62 73 65 71 75 65 6e 74 20 65 76 61 6c 75  subsequent evalu
10480 61 74 69 6f 6e 73 0a 2a 2a 20 72 61 74 68 65 72  ations.** rather
10490 20 74 68 61 6e 20 65 76 61 6c 75 61 74 65 20 74   than evaluate t
104a0 68 65 20 77 68 6f 6c 65 20 65 78 70 72 65 73 73  he whole express
104b0 69 6f 6e 20 61 67 61 69 6e 2e 20 20 54 72 69 76  ion again.  Triv
104c0 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ial expressions 
104d0 61 72 65 0a 2a 2a 20 6e 6f 74 20 63 61 63 68 65  are.** not cache
104e0 64 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65  d.  If the expre
104f0 73 73 69 6f 6e 20 69 73 20 63 61 63 68 65 64 2c  ssion is cached,
10500 20 69 74 73 20 72 65 73 75 6c 74 20 69 73 20 73   its result is s
10510 74 6f 72 65 64 20 69 6e 20 61 20 0a 2a 2a 20 6d  tored in a .** m
10520 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a  emory location..
10530 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
10540 78 70 72 43 6f 64 65 41 6e 64 43 61 63 68 65 28  xprCodeAndCache(
10550 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
10560 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 56  xpr *pExpr){.  V
10570 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
10580 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 4d  >pVdbe;.  int iM
10590 65 6d 3b 0a 20 20 69 6e 74 20 61 64 64 72 31 2c  em;.  int addr1,
105a0 20 61 64 64 72 32 3b 0a 20 20 69 66 28 20 76 3d   addr2;.  if( v=
105b0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  =0 ) return;.  a
105c0 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
105d0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
105e0 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
105f0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
10600 72 29 3b 0a 20 20 61 64 64 72 32 20 3d 20 73 71  r);.  addr2 = sq
10610 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
10620 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 61  Addr(v);.  if( a
10630 64 64 72 32 3e 61 64 64 72 31 2b 31 20 7c 7c 20  ddr2>addr1+1 || 
10640 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
10650 28 76 2c 20 61 64 64 72 31 29 2d 3e 6f 70 63 6f  (v, addr1)->opco
10660 64 65 3d 3d 4f 50 5f 46 75 6e 63 74 69 6f 6e 20  de==OP_Function 
10670 29 7b 0a 20 20 20 20 69 4d 65 6d 20 3d 20 70 45  ){.    iMem = pE
10680 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50  xpr->iTable = pP
10690 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20  arse->nMem++;.  
106a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
106b0 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
106c0 65 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20  e, iMem, 0);.   
106d0 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
106e0 52 45 47 49 53 54 45 52 3b 0a 20 20 7d 0a 7d 0a  REGISTER;.  }.}.
106f0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65  #endif../*.** Ge
10700 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
10710 20 70 75 73 68 65 73 20 74 68 65 20 76 61 6c 75   pushes the valu
10720 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65  e of every eleme
10730 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a  nt of the given.
10740 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
10750 73 74 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63  st onto the stac
10760 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  k..**.** Return 
10770 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
10780 65 6d 65 6e 74 73 20 70 75 73 68 65 64 20 6f 6e  ements pushed on
10790 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2f  to the stack..*/
107a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
107b0 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20  CodeExprList(.  
107c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
107d0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
107e0 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
107f0 69 73 74 20 2a 70 4c 69 73 74 20 20 20 20 2f 2a  ist *pList    /*
10800 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
10810 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64  list to be coded
10820 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
10830 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
10840 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6e  Item;.  int i, n
10850 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
10860 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
10870 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
10880 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69  .  for(pItem=pLi
10890 73 74 2d 3e 61 2c 20 69 3d 6e 3b 20 69 3e 30 3b  st->a, i=n; i>0;
108a0 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i--, pItem++){.
108b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
108c0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 49 74 65  ode(pParse, pIte
108d0 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20  m->pExpr);.  }. 
108e0 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
108f0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
10900 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20  e for a boolean 
10910 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20  expression such 
10920 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d  that a jump is m
10930 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61  ade.** to the la
10940 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68  bel "dest" if th
10950 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
10960 74 72 75 65 20 62 75 74 20 65 78 65 63 75 74 69  true but executi
10970 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20  on.** continues 
10980 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66  straight thru if
10990 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
109a0 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20  is false..**.** 
109b0 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
109c0 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e  n evaluates to N
109d0 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75  ULL (neither tru
109e0 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68  e nor false), th
109f0 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a  en.** take the j
10a00 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49  ump if the jumpI
10a10 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 74 72  fNull flag is tr
10a20 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  ue..**.** This c
10a30 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  ode depends on t
10a40 68 65 20 66 61 63 74 20 74 68 61 74 20 63 65 72  he fact that cer
10a50 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65  tain token value
10a60 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a  s (ex: TK_EQ).**
10a70 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73   are the same as
10a80 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20 28   opcode values (
10a90 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74 20  ex: OP_Eq) that 
10aa0 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f  implement the co
10ab0 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f  rresponding.** o
10ac0 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63 69  peration.  Speci
10ad0 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76  al comments in v
10ae0 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b  dbe.c and the mk
10af0 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69  opcodeh.awk scri
10b00 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b  pt in.** the mak
10b10 65 20 70 72 6f 63 65 73 73 20 63 61 75 73 65 20  e process cause 
10b20 74 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f 20  these values to 
10b30 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28 29  align.  Assert()
10b40 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a  s in the code.**
10b50 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74 68   below verify th
10b60 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20 61  at the numbers a
10b70 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72 65  re aligned corre
10b80 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ctly..*/.void sq
10b90 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
10ba0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
10bb0 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
10bc0 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66  dest, int jumpIf
10bd0 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76  Null){.  Vdbe *v
10be0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
10bf0 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a  ;.  int op = 0;.
10c00 20 20 69 6e 74 20 63 6b 4f 66 66 73 65 74 20 3d    int ckOffset =
10c10 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65   pParse->ckOffse
10c20 74 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c  t;.  if( v==0 ||
10c30 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
10c40 72 6e 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70 72  rn;.  op = pExpr
10c50 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20  ->op;.  switch( 
10c60 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
10c70 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69  K_AND: {.      i
10c80 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56  nt d2 = sqlite3V
10c90 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
10ca0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
10cb0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
10cc0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
10cd0 64 32 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29  d2, !jumpIfNull)
10ce0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
10cf0 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
10d00 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
10d10 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
10d20 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
10d30 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
10d40 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20  l(v, d2);.      
10d50 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
10d60 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20   case TK_OR: {. 
10d70 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
10d80 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
10d90 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
10da0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
10db0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
10dc0 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
10dd0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
10de0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
10df0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
10e00 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
10e10 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  _NOT: {.      sq
10e20 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
10e30 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
10e40 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
10e50 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
10e60 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
10e70 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
10e80 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
10e90 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
10ea0 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
10eb0 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
10ec0 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
10ed0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
10ee0 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20  LT==OP_Lt );.   
10ef0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45     assert( TK_LE
10f00 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20  ==OP_Le );.     
10f10 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d   assert( TK_GT==
10f20 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20 20 20 61  OP_Gt );.      a
10f30 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50  ssert( TK_GE==OP
10f40 5f 47 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Ge );.      ass
10f50 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45  ert( TK_EQ==OP_E
10f60 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  q );.      asser
10f70 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20  t( TK_NE==OP_Ne 
10f80 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10f90 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
10fa0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
10fb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
10fc0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
10fd0 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
10fe0 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
10ff0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
11000 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  Left, pExpr->pRi
11010 67 68 74 2c 20 6f 70 2c 20 64 65 73 74 2c 20 6a  ght, op, dest, j
11020 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
11030 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
11040 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
11050 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
11060 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
11070 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c  assert( TK_ISNUL
11080 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a  L==OP_IsNull );.
11090 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
110a0 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74  _NOTNULL==OP_Not
110b0 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 73 71  Null );.      sq
110c0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
110d0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
110e0 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
110f0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f  e3VdbeAddOp(v, o
11100 70 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20 20 20  p, 1, dest);.   
11110 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
11120 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
11130 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  EEN: {.      /* 
11140 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22  The expression "
11150 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20  x BETWEEN y AND 
11160 7a 22 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  z" is implemente
11170 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  d as:.      **. 
11180 20 20 20 20 20 2a 2a 20 31 20 49 46 20 28 78 20       ** 1 IF (x 
11190 3c 20 79 29 20 47 4f 54 4f 20 33 0a 20 20 20 20  < y) GOTO 3.    
111a0 20 20 2a 2a 20 32 20 49 46 20 28 78 20 3c 3d 20    ** 2 IF (x <= 
111b0 7a 29 20 47 4f 54 4f 20 3c 64 65 73 74 3e 0a 20  z) GOTO <dest>. 
111c0 20 20 20 20 20 2a 2a 20 33 20 2e 2e 2e 0a 20 20       ** 3 ....  
111d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
111e0 20 61 64 64 72 3b 0a 20 20 20 20 20 20 45 78 70   addr;.      Exp
111f0 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
11200 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 45  ->pLeft;.      E
11210 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 45  xpr *pRight = pE
11220 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d  xpr->pList->a[0]
11230 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  .pExpr;.      sq
11240 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
11250 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
11260 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11270 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
11280 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
11290 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
112a0 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  rse, pRight);.  
112b0 20 20 20 20 61 64 64 72 20 3d 20 63 6f 64 65 43      addr = codeC
112c0 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
112d0 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50  Left, pRight, OP
112e0 5f 4c 74 2c 20 30 2c 20 21 6a 75 6d 70 49 66 4e  _Lt, 0, !jumpIfN
112f0 75 6c 6c 29 3b 0a 0a 20 20 20 20 20 20 70 52 69  ull);..      pRi
11300 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  ght = pExpr->pLi
11310 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a  st->a[1].pExpr;.
11320 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
11330 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52  rCode(pParse, pR
11340 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64  ight);.      cod
11350 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
11360 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
11370 4f 50 5f 4c 65 2c 20 64 65 73 74 2c 20 6a 75 6d  OP_Le, dest, jum
11380 70 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20 20  pIfNull);..     
11390 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
113a0 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
113b0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
113c0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
113d0 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
113e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
113f0 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c  Op(v, OP_Pop, 1,
11400 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
11410 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
11420 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ult: {.      sql
11430 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
11440 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  rse, pExpr);.   
11450 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11460 64 4f 70 28 76 2c 20 4f 50 5f 49 66 2c 20 6a 75  dOp(v, OP_If, ju
11470 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73 74 29 3b  mpIfNull, dest);
11480 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11490 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72 73 65    }.  }.  pParse
114a0 2d 3e 63 6b 4f 66 66 73 65 74 20 3d 20 63 6b 4f  ->ckOffset = ckO
114b0 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ffset;.}../*.** 
114c0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
114d0 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72  r a boolean expr
114e0 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74  ession such that
114f0 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a   a jump is made.
11500 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20  ** to the label 
11510 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78  "dest" if the ex
11520 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73  pression is fals
11530 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a  e but execution.
11540 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72  ** continues str
11550 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68  aight thru if th
11560 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
11570 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  true..**.** If t
11580 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76  he expression ev
11590 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20  aluates to NULL 
115a0 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f  (neither true no
115b0 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a  r false) then.**
115c0 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e   jump if jumpIfN
115d0 75 6c 6c 20 69 73 20 74 72 75 65 20 6f 72 20 66  ull is true or f
115e0 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a  all through if j
115f0 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 66 61 6c  umpIfNull is fal
11600 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  se..*/.void sqli
11610 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 50  te3ExprIfFalse(P
11620 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
11630 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64  pr *pExpr, int d
11640 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e  est, int jumpIfN
11650 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ull){.  Vdbe *v 
11660 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
11670 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20  .  int op = 0;. 
11680 20 69 6e 74 20 63 6b 4f 66 66 73 65 74 20 3d 20   int ckOffset = 
11690 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74  pParse->ckOffset
116a0 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20  ;.  if( v==0 || 
116b0 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
116c0 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c  n;..  /* The val
116d0 75 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20  ue of pExpr->op 
116e0 61 6e 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74  and op are relat
116f0 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  ed as follows:. 
11700 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70   **.  **       p
11710 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20  Expr->op        
11720 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20      op.  **     
11730 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20    ---------     
11740 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a       ----------.
11750 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53    **       TK_IS
11760 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50  NULL          OP
11770 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20  _NotNull.  **   
11780 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20      TK_NOTNULL  
11790 20 20 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c         OP_IsNull
117a0 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e  .  **       TK_N
117b0 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  E              O
117c0 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Eq.  **       
117d0 54 4b 5f 45 51 20 20 20 20 20 20 20 20 20 20 20  TK_EQ           
117e0 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20     OP_Ne.  **   
117f0 20 20 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20      TK_GT       
11800 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a         OP_Le.  *
11810 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20  *       TK_LE   
11820 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74             OP_Gt
11830 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47  .  **       TK_G
11840 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  E              O
11850 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Lt.  **       
11860 54 4b 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20  TK_LT           
11870 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20     OP_Ge.  **.  
11880 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c  ** For other val
11890 75 65 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70  ues of pExpr->op
118a0 2c 20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65  , op is undefine
118b0 64 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20  d and unused..  
118c0 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  ** The value of 
118d0 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73  TK_ and OP_ cons
118e0 74 61 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67  tants are arrang
118f0 65 64 20 73 75 63 68 20 74 68 61 74 20 77 65 0a  ed such that we.
11900 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65    ** can compute
11910 20 74 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f   the mapping abo
11920 76 65 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c  ve using the fol
11930 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f  lowing expressio
11940 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29  n..  ** Assert()
11950 73 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  s verify that th
11960 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73  e computation is
11970 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20   correct..  */. 
11980 20 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f   op = ((pExpr->o
11990 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29  p+(TK_ISNULL&1))
119a0 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31  ^1)-(TK_ISNULL&1
119b0 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20  );..  /* Verify 
119c0 63 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e  correct alignmen
119d0 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f  t of TK_ and OP_
119e0 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a   constants.  */.
119f0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
11a00 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c  >op!=TK_ISNULL |
11a10 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c  | op==OP_NotNull
11a20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
11a30 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e  xpr->op!=TK_NOTN
11a40 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73  ULL || op==OP_Is
11a50 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Null );.  assert
11a60 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
11a70 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20  NE || op==OP_Eq 
11a80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
11a90 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c  pr->op!=TK_EQ ||
11aa0 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20   op==OP_Ne );.  
11ab0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
11ac0 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d  p!=TK_LT || op==
11ad0 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Ge );.  asser
11ae0 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
11af0 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74  _LE || op==OP_Gt
11b00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
11b10 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c  xpr->op!=TK_GT |
11b20 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20  | op==OP_Le );. 
11b30 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
11b40 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d  op!=TK_GE || op=
11b50 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69  =OP_Lt );..  swi
11b60 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
11b70 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  {.    case TK_AN
11b80 44 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  D: {.      sqlit
11b90 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
11ba0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
11bb0 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
11bc0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
11bd0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
11be0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
11bf0 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
11c00 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
11c10 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
11c20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20   case TK_OR: {. 
11c30 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71       int d2 = sq
11c40 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
11c50 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  el(v);.      sql
11c60 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
11c70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
11c80 65 66 74 2c 20 64 32 2c 20 21 6a 75 6d 70 49 66  eft, d2, !jumpIf
11c90 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
11ca0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
11cb0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
11cc0 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
11cd0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
11ce0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
11cf0 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a  veLabel(v, d2);.
11d00 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11d10 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
11d20 4f 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  OT: {.      sqli
11d30 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
11d40 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
11d50 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
11d60 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
11d70 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
11d80 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
11d90 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
11da0 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
11db0 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61  se TK_GE:.    ca
11dc0 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
11dd0 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20  se TK_EQ: {.    
11de0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
11df0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
11e00 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
11e10 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
11e20 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
11e30 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64  ight);.      cod
11e40 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
11e50 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
11e60 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
11e70 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
11e80 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
11e90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
11ea0 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
11eb0 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
11ec0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
11ed0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
11ee0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
11ef0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11f00 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c  eAddOp(v, op, 1,
11f10 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72   dest);.      br
11f20 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
11f30 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
11f40 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65  {.      /* The e
11f50 78 70 72 65 73 73 69 6f 6e 20 69 73 20 22 78 20  xpression is "x 
11f60 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 22  BETWEEN y AND z"
11f70 2e 20 49 74 20 69 73 20 69 6d 70 6c 65 6d 65 6e  . It is implemen
11f80 74 65 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a  ted as:.      **
11f90 0a 20 20 20 20 20 20 2a 2a 20 31 20 49 46 20 28  .      ** 1 IF (
11fa0 78 20 3e 3d 20 79 29 20 47 4f 54 4f 20 33 0a 20  x >= y) GOTO 3. 
11fb0 20 20 20 20 20 2a 2a 20 32 20 47 4f 54 4f 20 3c       ** 2 GOTO <
11fc0 64 65 73 74 3e 0a 20 20 20 20 20 20 2a 2a 20 33  dest>.      ** 3
11fd0 20 49 46 20 28 78 20 3e 20 7a 29 20 47 4f 54 4f   IF (x > z) GOTO
11fe0 20 3c 64 65 73 74 3e 0a 20 20 20 20 20 20 2a 2f   <dest>.      */
11ff0 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
12000 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
12010 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
12020 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  t;.      Expr *p
12030 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70  Right = pExpr->p
12040 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
12050 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
12060 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
12070 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
12080 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
12090 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b  , OP_Dup, 0, 0);
120a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
120b0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
120c0 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 61 64  Right);.      ad
120d0 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
120e0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
120f0 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
12100 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  e(pParse, pLeft,
12110 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c 20   pRight, OP_Ge, 
12120 61 64 64 72 2b 33 2c 20 21 6a 75 6d 70 49 66 4e  addr+3, !jumpIfN
12130 75 6c 6c 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  ull);..      sql
12140 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
12150 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a   OP_Pop, 1, 0);.
12160 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12170 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
12180 6f 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20 20  o, 0, dest);.   
12190 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70     pRight = pExp
121a0 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  r->pList->a[1].p
121b0 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
121c0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
121d0 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  se, pRight);.   
121e0 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
121f0 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52  Parse, pLeft, pR
12200 69 67 68 74 2c 20 4f 50 5f 47 74 2c 20 64 65 73  ight, OP_Gt, des
12210 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
12220 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12230 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
12240 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
12250 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
12260 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71  pExpr);.      sq
12270 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
12280 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 6a 75 6d 70  , OP_IfNot, jump
12290 49 66 4e 75 6c 6c 2c 20 64 65 73 74 29 3b 0a 20  IfNull, dest);. 
122a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
122b0 7d 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e  }.  }.  pParse->
122c0 63 6b 4f 66 66 73 65 74 20 3d 20 63 6b 4f 66 66  ckOffset = ckOff
122d0 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f  set;.}../*.** Do
122e0 20 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73   a deep comparis
122f0 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73  on of two expres
12300 73 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74  sion trees.  Ret
12310 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65  urn TRUE (non-ze
12320 72 6f 29 0a 2a 2a 20 69 66 20 74 68 65 79 20 61  ro).** if they a
12330 72 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e 64  re identical and
12340 20 72 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66   return FALSE if
12350 20 74 68 65 79 20 64 69 66 66 65 72 20 69 6e 20   they differ in 
12360 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 53  any way..**.** S
12370 6f 6d 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f  ometimes this ro
12380 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
12390 6e 20 46 41 4c 53 45 20 65 76 65 6e 20 69 66 20  n FALSE even if 
123a0 74 68 65 20 74 77 6f 20 65 78 70 72 65 73 73 69  the two expressi
123b0 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72  ons.** really ar
123c0 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 49  e equivalent.  I
123d0 66 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76  f we cannot prov
123e0 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65  e that the expre
123f0 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64  ssions are.** id
12400 65 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74 75  entical, we retu
12410 72 6e 20 46 41 4c 53 45 20 6a 75 73 74 20 74 6f  rn FALSE just to
12420 20 62 65 20 73 61 66 65 2e 20 20 53 6f 20 69 66   be safe.  So if
12430 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
12440 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 2c 20   returns false, 
12450 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f 74 20  then you do not 
12460 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72 20  really know for 
12470 63 65 72 74 61 69 6e 20 69 66 20 74 68 65 20 74  certain if the t
12480 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  wo.** expression
12490 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20  s are the same. 
124a0 20 42 75 74 20 69 66 20 79 6f 75 20 67 65 74 20   But if you get 
124b0 61 20 54 52 55 45 20 72 65 74 75 72 6e 2c 20 74  a TRUE return, t
124c0 68 65 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20 62  hen you.** can b
124d0 65 20 73 75 72 65 20 74 68 65 20 65 78 70 72 65  e sure the expre
124e0 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73  ssions are the s
124f0 61 6d 65 2e 20 20 49 6e 20 74 68 65 20 70 6c 61  ame.  In the pla
12500 63 65 73 20 77 68 65 72 65 0a 2a 2a 20 74 68 69  ces where.** thi
12510 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
12520 64 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 68  d, it does not h
12530 75 72 74 20 74 6f 20 67 65 74 20 61 6e 20 65 78  urt to get an ex
12540 74 72 61 20 46 41 4c 53 45 20 2d 20 74 68 61 74  tra FALSE - that
12550 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20 72  .** just might r
12560 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73 6c  esult in some sl
12570 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63 6f  ightly slower co
12580 64 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e 69  de.  But returni
12590 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72 65  ng.** an incorre
125a0 63 74 20 54 52 55 45 20 63 6f 75 6c 64 20 6c 65  ct TRUE could le
125b0 61 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e 63 74  ad to a malfunct
125c0 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
125d0 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 45  te3ExprCompare(E
125e0 78 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70  xpr *pA, Expr *p
125f0 42 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  B){.  int i;.  i
12600 66 28 20 70 41 3d 3d 30 7c 7c 70 42 3d 3d 30 20  f( pA==0||pB==0 
12610 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42  ){.    return pB
12620 3d 3d 70 41 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ==pA;.  }.  if( 
12630 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29  pA->op!=pB->op )
12640 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
12650 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50   (pA->flags & EP
12660 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70 42 2d  _Distinct)!=(pB-
12670 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74  >flags & EP_Dist
12680 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e 20 30  inct) ) return 0
12690 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
126a0 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e  ExprCompare(pA->
126b0 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74  pLeft, pB->pLeft
126c0 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
126d0 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72  if( !sqlite3Expr
126e0 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69 67  Compare(pA->pRig
126f0 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 29 20  ht, pB->pRight) 
12700 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
12710 28 20 70 41 2d 3e 70 4c 69 73 74 20 29 7b 0a 20  ( pA->pList ){. 
12720 20 20 20 69 66 28 20 70 42 2d 3e 70 4c 69 73 74     if( pB->pList
12730 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
12740 20 20 20 20 69 66 28 20 70 41 2d 3e 70 4c 69 73      if( pA->pLis
12750 74 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 70 4c  t->nExpr!=pB->pL
12760 69 73 74 2d 3e 6e 45 78 70 72 20 29 20 72 65 74  ist->nExpr ) ret
12770 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  urn 0;.    for(i
12780 3d 30 3b 20 69 3c 70 41 2d 3e 70 4c 69 73 74 2d  =0; i<pA->pList-
12790 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
127a0 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
127b0 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e  ExprCompare(pA->
127c0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
127d0 72 2c 20 70 42 2d 3e 70 4c 69 73 74 2d 3e 61 5b  r, pB->pList->a[
127e0 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
127f0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
12800 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
12810 65 6c 73 65 20 69 66 28 20 70 42 2d 3e 70 4c 69  else if( pB->pLi
12820 73 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  st ){.    return
12830 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41   0;.  }.  if( pA
12840 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 70 42 2d  ->pSelect || pB-
12850 3e 70 53 65 6c 65 63 74 20 29 20 72 65 74 75 72  >pSelect ) retur
12860 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 69  n 0;.  if( pA->i
12870 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c  Table!=pB->iTabl
12880 65 20 7c 7c 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e  e || pA->iColumn
12890 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20  !=pB->iColumn ) 
128a0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
128b0 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pA->op!=TK_COLUM
128c0 4e 20 26 26 20 70 41 2d 3e 74 6f 6b 65 6e 2e 7a  N && pA->token.z
128d0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 2d 3e   ){.    if( pB->
128e0 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 20 72 65 74  token.z==0 ) ret
128f0 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70  urn 0;.    if( p
12900 42 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 70 41 2d 3e  B->token.n!=pA->
12910 74 6f 6b 65 6e 2e 6e 20 29 20 72 65 74 75 72 6e  token.n ) return
12920 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
12930 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61  te3StrNICmp((cha
12940 72 2a 29 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 2c 28  r*)pA->token.z,(
12950 63 68 61 72 2a 29 70 42 2d 3e 74 6f 6b 65 6e 2e  char*)pB->token.
12960 7a 2c 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 29 21 3d  z,pB->token.n)!=
12970 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
12980 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 0;.    }.  }. 
12990 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 0a 2f   return 1;.}.../
129a0 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65  *.** Add a new e
129b0 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41  lement to the pA
129c0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61  ggInfo->aCol[] a
129d0 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68  rray.  Return th
129e0 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68  e index of.** th
129f0 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20  e new element.  
12a00 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76  Return a negativ
12a10 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c  e number if mall
12a20 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  oc fails..*/.sta
12a30 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e  tic int addAggIn
12a40 66 6f 43 6f 6c 75 6d 6e 28 41 67 67 49 6e 66 6f  foColumn(AggInfo
12a50 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20   *pInfo){.  int 
12a60 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c  i;.  pInfo->aCol
12a70 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41   = sqlite3ArrayA
12a80 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20  llocate(.       
12a90 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20  pInfo->aCol,.   
12aa0 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f      sizeof(pInfo
12ab0 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20  ->aCol[0]),.    
12ac0 20 20 20 33 2c 0a 20 20 20 20 20 20 20 26 70 49     3,.       &pI
12ad0 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20  nfo->nColumn,.  
12ae0 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f       &pInfo->nCo
12af0 6c 75 6d 6e 41 6c 6c 6f 63 2c 0a 20 20 20 20 20  lumnAlloc,.     
12b00 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75    &i.  );.  retu
12b10 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a  rn i;.}    ../*.
12b20 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65  ** Add a new ele
12b30 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67  ment to the pAgg
12b40 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72  Info->aFunc[] ar
12b50 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ray.  Return the
12b60 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65   index of.** the
12b70 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52   new element.  R
12b80 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
12b90 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f   number if mallo
12ba0 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  c fails..*/.stat
12bb0 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66  ic int addAggInf
12bc0 6f 46 75 6e 63 28 41 67 67 49 6e 66 6f 20 2a 70  oFunc(AggInfo *p
12bd0 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Info){.  int i;.
12be0 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d    pInfo->aFunc =
12bf0 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c   sqlite3ArrayAll
12c00 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 70 49  ocate(.       pI
12c10 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20  nfo->aFunc,.    
12c20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d     sizeof(pInfo-
12c30 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20  >aFunc[0]),.    
12c40 20 20 20 33 2c 0a 20 20 20 20 20 20 20 26 70 49     3,.       &pI
12c50 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20  nfo->nFunc,.    
12c60 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63     &pInfo->nFunc
12c70 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 20 26 69  Alloc,.       &i
12c80 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  .  );.  return i
12c90 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54  ;.}    ../*.** T
12ca0 68 69 73 20 69 73 20 61 6e 20 78 46 75 6e 63 20  his is an xFunc 
12cb0 66 6f 72 20 77 61 6c 6b 45 78 70 72 54 72 65 65  for walkExprTree
12cc0 28 29 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  () used to imple
12cd0 6d 65 6e 74 20 0a 2a 2a 20 73 71 6c 69 74 65 33  ment .** sqlite3
12ce0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
12cf0 67 61 74 65 73 28 29 2e 20 20 53 65 65 20 73 71  gates().  See sq
12d00 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
12d10 41 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f  Aggregates.** fo
12d20 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
12d30 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  ormation..**.** 
12d40 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 61  This routine ana
12d50 6c 79 7a 65 73 20 74 68 65 20 61 67 67 72 65 67  lyzes the aggreg
12d60 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 61 74 20  ate function at 
12d70 70 45 78 70 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  pExpr..*/.static
12d80 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72   int analyzeAggr
12d90 65 67 61 74 65 28 76 6f 69 64 20 2a 70 41 72 67  egate(void *pArg
12da0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
12db0 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43    int i;.  NameC
12dc0 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 28 4e  ontext *pNC = (N
12dd0 61 6d 65 43 6f 6e 74 65 78 74 20 2a 29 70 41 72  ameContext *)pAr
12de0 67 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  g;.  Parse *pPar
12df0 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
12e00 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  ;.  SrcList *pSr
12e10 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72  cList = pNC->pSr
12e20 63 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e 66 6f  cList;.  AggInfo
12e30 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e 43   *pAggInfo = pNC
12e40 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 0a 0a  ->pAggInfo;.  ..
12e50 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
12e60 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
12e70 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20  TK_AGG_COLUMN:. 
12e80 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
12e90 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 43 68  N: {.      /* Ch
12ea0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
12eb0 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f  e column is in o
12ec0 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73  ne of the tables
12ed0 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 20   in the FROM.   
12ee0 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20     ** clause of 
12ef0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75  the aggregate qu
12f00 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ery */.      if(
12f10 20 70 53 72 63 4c 69 73 74 20 29 7b 0a 20 20 20   pSrcList ){.   
12f20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
12f30 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
12f40 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20  = pSrcList->a;. 
12f50 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
12f60 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63  i<pSrcList->nSrc
12f70 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
12f80 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  .          struc
12f90 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
12fa0 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Col;.          i
12fb0 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  f( pExpr->iTable
12fc0 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ==pItem->iCursor
12fd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
12fe0 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
12ff0 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65  his point, it me
13000 61 6e 73 20 74 68 61 74 20 70 45 78 70 72 20 72  ans that pExpr r
13010 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
13020 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
13030 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 46  that is in the F
13040 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
13050 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  e aggregate quer
13060 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  y.  .           
13070 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20   **.            
13080 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79  ** Make an entry
13090 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20   for the column 
130a0 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  in pAggInfo->aCo
130b0 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20 20 20  l[] if there.   
130c0 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e           ** is n
130d0 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68 65 72  ot an entry ther
130e0 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 20  e already..     
130f0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
13100 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
13110 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20           pCol = 
13120 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a  pAggInfo->aCol;.
13130 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
13140 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d  k=0; k<pAggInfo-
13150 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70  >nColumn; k++, p
13160 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
13170 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
13180 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69  iTable==pExpr->i
13190 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20  Table &&.       
131a0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
131b0 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d  >iColumn==pExpr-
131c0 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
131d0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
131e0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
131f0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
13200 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
13210 20 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43   k>=pAggInfo->nC
13220 6f 6c 75 6d 6e 20 26 26 20 28 6b 20 3d 20 61 64  olumn && (k = ad
13230 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70  dAggInfoColumn(p
13240 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20 29 7b 0a  AggInfo))>=0 ){.
13250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
13260 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e  ol = &pAggInfo->
13270 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20  aCol[k];.       
13280 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61         pCol->pTa
13290 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b  b = pExpr->pTab;
132a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
132b0 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45  Col->iTable = pE
132c0 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  xpr->iTable;.   
132d0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
132e0 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72  >iColumn = pExpr
132f0 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
13300 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
13310 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
13320 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  em++;.          
13330 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65      pCol->iSorte
13340 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20  rColumn = -1;.  
13350 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
13360 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ->pExpr = pExpr;
13370 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
13380 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72  f( pAggInfo->pGr
13390 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20  oupBy ){.       
133a0 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 2c 20           int j, 
133b0 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n;.             
133c0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 42     ExprList *pGB
133d0 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72   = pAggInfo->pGr
133e0 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 20  oupBy;.         
133f0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78         struct Ex
13400 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 65  prList_item *pTe
13410 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20 20 20  rm = pGB->a;.   
13420 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d               n =
13430 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20 20 20   pGB->nExpr;.   
13440 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
13450 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20  (j=0; j<n; j++, 
13460 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
13470 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
13480 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45   *pE = pTerm->pE
13490 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
134a0 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f         if( pE->o
134b0 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
134c0 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70  pE->iTable==pExp
134d0 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20  r->iTable &&.   
134e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134f0 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d     pE->iColumn==
13500 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29  pExpr->iColumn )
13510 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
13520 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
13530 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20  terColumn = j;. 
13540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13550 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
13560 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
13570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
13580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
13590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
135a0 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43  ( pCol->iSorterC
135b0 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20  olumn<0 ){.     
135c0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
135d0 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d  >iSorterColumn =
135e0 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74   pAggInfo->nSort
135f0 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20  ingColumn++;.   
13600 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
13610 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
13620 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20         /* There 
13630 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72 79 20  is now an entry 
13640 66 6f 72 20 70 45 78 70 72 20 69 6e 20 70 41 67  for pExpr in pAg
13650 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65  gInfo->aCol[] (e
13660 69 74 68 65 72 0a 20 20 20 20 20 20 20 20 20 20  ither.          
13670 20 20 2a 2a 20 62 65 63 61 75 73 65 20 69 74 20    ** because it 
13680 77 61 73 20 74 68 65 72 65 20 62 65 66 6f 72 65  was there before
13690 20 6f 72 20 62 65 63 61 75 73 65 20 77 65 20 6a   or because we j
136a0 75 73 74 20 63 72 65 61 74 65 64 20 69 74 29 2e  ust created it).
136b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
136c0 43 6f 6e 76 65 72 74 20 74 68 65 20 70 45 78 70  Convert the pExp
136d0 72 20 74 6f 20 62 65 20 61 20 54 4b 5f 41 47 47  r to be a TK_AGG
136e0 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72 69 6e  _COLUMN referrin
136f0 67 20 74 6f 20 74 68 61 74 0a 20 20 20 20 20 20  g to that.      
13700 20 20 20 20 20 20 2a 2a 20 70 41 67 67 49 6e 66        ** pAggInf
13710 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e  o->aCol[] entry.
13720 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
13730 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
13740 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41  r->pAggInfo = pA
13750 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  ggInfo;.        
13760 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
13770 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20  TK_AGG_COLUMN;. 
13780 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
13790 2d 3e 69 41 67 67 20 3d 20 6b 3b 0a 20 20 20 20  ->iAgg = k;.    
137a0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
137b0 20 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e           } /* en
137c0 64 69 66 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  dif pExpr->iTabl
137d0 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  e==pItem->iCurso
137e0 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f  r */.        } /
137f0 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20  * end loop over 
13800 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20  pSrcList */.    
13810 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
13820 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   1;.    }.    ca
13830 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
13840 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  ON: {.      /* T
13850 68 65 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d  he pNC->nDepth==
13860 30 20 74 65 73 74 20 63 61 75 73 65 73 20 61 67  0 test causes ag
13870 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
13880 73 20 69 6e 20 73 75 62 71 75 65 72 69 65 73 0a  s in subqueries.
13890 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69        ** to be i
138a0 67 6e 6f 72 65 64 20 2a 2f 0a 20 20 20 20 20 20  gnored */.      
138b0 69 66 28 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d  if( pNC->nDepth=
138c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
138d0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
138e0 20 70 45 78 70 72 20 69 73 20 61 20 64 75 70 6c   pExpr is a dupl
138f0 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65 72  icate of another
13900 20 61 67 67 72 65 67 61 74 65 20 0a 20 20 20 20   aggregate .    
13910 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20      ** function 
13920 74 68 61 74 20 69 73 20 61 6c 72 65 61 64 79 20  that is already 
13930 69 6e 20 74 68 65 20 70 41 67 67 49 6e 66 6f 20  in the pAggInfo 
13940 73 74 72 75 63 74 75 72 65 0a 20 20 20 20 20 20  structure.      
13950 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74 72    */.        str
13960 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
13970 20 2a 70 49 74 65 6d 20 3d 20 70 41 67 67 49 6e   *pItem = pAggIn
13980 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20 20 20  fo->aFunc;.     
13990 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41     for(i=0; i<pA
139a0 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
139b0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
139c0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
139d0 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
139e0 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78  Item->pExpr, pEx
139f0 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pr) ){.         
13a00 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
13a10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
13a20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70          if( i>=p
13a30 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29  AggInfo->nFunc )
13a40 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70  {.          /* p
13a50 45 78 70 72 20 69 73 20 6f 72 69 67 69 6e 61 6c  Expr is original
13a60 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e  .  Make a new en
13a70 74 72 79 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  try in pAggInfo-
13a80 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20  >aFunc[].       
13a90 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
13aa0 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61  u8 enc = ENC(pPa
13ab0 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20  rse->db);.      
13ac0 20 20 20 20 69 20 3d 20 61 64 64 41 67 67 49 6e      i = addAggIn
13ad0 66 6f 46 75 6e 63 28 70 41 67 67 49 6e 66 6f 29  foFunc(pAggInfo)
13ae0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
13af0 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  i>=0 ){.        
13b00 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 41 67      pItem = &pAg
13b10 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b  gInfo->aFunc[i];
13b20 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
13b30 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70  em->pExpr = pExp
13b40 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  r;.            p
13b50 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 70 50 61  Item->iMem = pPa
13b60 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20  rse->nMem++;.   
13b70 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
13b80 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46  pFunc = sqlite3F
13b90 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  indFunction(pPar
13ba0 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20  se->db,.        
13bb0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
13bc0 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  *)pExpr->token.z
13bd0 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  , pExpr->token.n
13be0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13bf0 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 69 73       pExpr->pLis
13c00 74 20 3f 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t ? pExpr->pList
13c10 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e 63  ->nExpr : 0, enc
13c20 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
13c30 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61    if( pExpr->fla
13c40 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74  gs & EP_Distinct
13c50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
13c60 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e    pItem->iDistin
13c70 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ct = pParse->nTa
13c80 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  b++;.           
13c90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13ca0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69        pItem->iDi
13cb0 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20  stinct = -1;.   
13cc0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
13cd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
13ce0 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65  .        /* Make
13cf0 20 70 45 78 70 72 20 70 6f 69 6e 74 20 74 6f 20   pExpr point to 
13d00 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
13d10 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
13d20 5d 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20 20  ] entry.        
13d30 2a 2f 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  */.        pExpr
13d40 2d 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20 20  ->iAgg = i;.    
13d50 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49      pExpr->pAggI
13d60 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a  nfo = pAggInfo;.
13d70 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
13d80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
13d90 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 75 72 73    }..  /* Recurs
13da0 69 76 65 6c 79 20 77 61 6c 6b 20 73 75 62 71 75  ively walk subqu
13db0 65 72 69 65 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f  eries looking fo
13dc0 72 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  r TK_COLUMN node
13dd0 73 20 74 68 61 74 20 6e 65 65 64 0a 20 20 2a 2a  s that need.  **
13de0 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 20 74   to be changed t
13df0 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e  o TK_AGG_COLUMN.
13e00 20 20 42 75 74 20 69 6e 63 72 65 6d 65 6e 74 20    But increment 
13e10 6e 44 65 70 74 68 20 73 6f 20 74 68 61 74 0a 20  nDepth so that. 
13e20 20 2a 2a 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54   ** TK_AGG_FUNCT
13e30 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 73 75 62  ION nodes in sub
13e40 71 75 65 72 69 65 73 20 77 69 6c 6c 20 62 65 20  queries will be 
13e50 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a  unchanged..  */.
13e60 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65    if( pExpr->pSe
13e70 6c 65 63 74 20 29 7b 0a 20 20 20 20 70 4e 43 2d  lect ){.    pNC-
13e80 3e 6e 44 65 70 74 68 2b 2b 3b 0a 20 20 20 20 77  >nDepth++;.    w
13e90 61 6c 6b 53 65 6c 65 63 74 45 78 70 72 28 70 45  alkSelectExpr(pE
13ea0 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 61 6e  xpr->pSelect, an
13eb0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 2c 20  alyzeAggregate, 
13ec0 70 4e 43 29 3b 0a 20 20 20 20 70 4e 43 2d 3e 6e  pNC);.    pNC->n
13ed0 44 65 70 74 68 2d 2d 3b 0a 20 20 7d 0a 20 20 72  Depth--;.  }.  r
13ee0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
13ef0 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 67 69  * Analyze the gi
13f00 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  ven expression l
13f10 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67 72 65  ooking for aggre
13f20 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  gate functions a
13f30 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61 62  nd.** for variab
13f40 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  les that need to
13f50 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
13f60 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20   pParse->aAgg[] 
13f70 61 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b 65 20 61  array..** Make a
13f80 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65  dditional entrie
13f90 73 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d  s to the pParse-
13fa0 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 20 61 73  >aAgg[] array as
13fb0 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a   necessary..**.*
13fc0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
13fd0 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61  hould only be ca
13fe0 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 65  lled after the e
13ff0 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65  xpression has be
14000 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62  en.** analyzed b
14010 79 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73  y sqlite3ExprRes
14020 6f 6c 76 65 4e 61 6d 65 73 28 29 2e 0a 2a 2a 0a  olveNames()..**.
14030 2a 2a 20 49 66 20 65 72 72 6f 72 73 20 61 72 65  ** If errors are
14040 20 73 65 65 6e 2c 20 6c 65 61 76 65 20 61 6e 20   seen, leave an 
14050 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
14060 20 7a 45 72 72 4d 73 67 20 61 6e 64 20 72 65 74   zErrMsg and ret
14070 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65  urn.** the numbe
14080 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a  r of errors..*/.
14090 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 41  int sqlite3ExprA
140a0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
140b0 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e  (NameContext *pN
140c0 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  C, Expr *pExpr){
140d0 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 70 4e  .  int nErr = pN
140e0 43 2d 3e 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b  C->pParse->nErr;
140f0 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  .  walkExprTree(
14100 70 45 78 70 72 2c 20 61 6e 61 6c 79 7a 65 41 67  pExpr, analyzeAg
14110 67 72 65 67 61 74 65 2c 20 70 4e 43 29 3b 0a 20  gregate, pNC);. 
14120 20 72 65 74 75 72 6e 20 70 4e 43 2d 3e 70 50 61   return pNC->pPa
14130 72 73 65 2d 3e 6e 45 72 72 20 2d 20 6e 45 72 72  rse->nErr - nErr
14140 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20  ;.}../*.** Call 
14150 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
14160 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 20 66  zeAggregates() f
14170 6f 72 20 65 76 65 72 79 20 65 78 70 72 65 73 73  or every express
14180 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70  ion in an.** exp
14190 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52  ression list.  R
141a0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
141b0 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a   of errors..**.*
141c0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73  * If an error is
141d0 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c   found, the anal
141e0 79 73 69 73 20 69 73 20 63 75 74 20 73 68 6f 72  ysis is cut shor
141f0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
14200 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
14210 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ist(NameContext 
14220 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73 74 20 2a  *pNC, ExprList *
14230 70 4c 69 73 74 29 7b 0a 20 20 73 74 72 75 63 74  pList){.  struct
14240 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
14250 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  pItem;.  int i;.
14260 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a    int nErr = 0;.
14270 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
14280 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69     for(pItem=pLi
14290 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 6e 45 72 72  st->a, i=0; nErr
142a0 3d 3d 30 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e  ==0 && i<pList->
142b0 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
142c0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 45 72 72  m++){.      nErr
142d0 20 2b 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41   += sqlite3ExprA
142e0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
142f0 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78  (pNC, pItem->pEx
14300 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  pr);.    }.  }. 
14310 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 7d 0a   return nErr;.}.