/ Hex Artifact Content
Login

Artifact 97819d6a4f2863dd5b04ad1ccd41a1d6bf043a01:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2a 0a 2a 2a  in SQLite..**.**
0200: 20 24 49 64 3a 20 65 78 70 72 2e 63 2c 76 20 31   $Id: expr.c,v 1
0210: 2e 32 39 37 20 32 30 30 37 2f 30 36 2f 30 38 20  .297 2007/06/08 
0220: 30 30 3a 32 30 3a 34 38 20 64 72 68 20 45 78 70  00:20:48 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: 70 43 6f 6c 6c 20 3d 20 70 45 78 70 72 2d 3e 70  pColl = pExpr->p
08e0: 43 6f 6c 6c 3b 0a 20 20 20 20 69 66 28 20 70 45  Coll;.    if( pE
08f0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 41 53 54  xpr->op==TK_CAST
0900: 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20   && !pColl ){.  
0910: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
0920: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
0930: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
0940: 66 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ft);.    }.  }. 
0950: 20 69 66 28 20 73 71 6c 69 74 65 33 43 68 65 63   if( sqlite3Chec
0960: 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  kCollSeq(pParse,
0970: 20 70 43 6f 6c 6c 29 20 29 7b 20 0a 20 20 20 20   pColl) ){ .    
0980: 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20  pColl = 0;.  }. 
0990: 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d   return pColl;.}
09a0: 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73  ../*.** pExpr is
09b0: 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66 20 61   an operand of a
09c0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
09d0: 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73 20 74  ator.  aff2 is t
09e0: 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66 69 6e  he.** type affin
09f0: 69 74 79 20 6f 66 20 74 68 65 20 6f 74 68 65 72  ity of the other
0a00: 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73 20   operand.  This 
0a10: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
0a20: 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66 69  the.** type affi
0a30: 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64  nity that should
0a40: 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65   be used for the
0a50: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
0a60: 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20 73 71  ator..*/.char sq
0a70: 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
0a80: 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78 70 72  nity(Expr *pExpr
0a90: 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a 20 20  , char aff2){.  
0aa0: 63 68 61 72 20 61 66 66 31 20 3d 20 73 71 6c 69  char aff1 = sqli
0ab0: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
0ac0: 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 61 66  pExpr);.  if( af
0ad0: 66 31 20 26 26 20 61 66 66 32 20 29 7b 0a 20 20  f1 && aff2 ){.  
0ae0: 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65 73 20    /* Both sides 
0af0: 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  of the compariso
0b00: 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e 20 49  n are columns. I
0b10: 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65 72 69  f one has numeri
0b20: 63 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e 69 74  c.    ** affinit
0b30: 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f 74 68  y, use that. Oth
0b40: 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20 61 66  erwise use no af
0b50: 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f 0a 20  finity..    */. 
0b60: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73     if( sqlite3Is
0b70: 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28  NumericAffinity(
0b80: 61 66 66 31 29 20 7c 7c 20 73 71 6c 69 74 65 33  aff1) || sqlite3
0b90: 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
0ba0: 79 28 61 66 66 32 29 20 29 7b 0a 20 20 20 20 20  y(aff2) ){.     
0bb0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
0bc0: 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20  FF_NUMERIC;.    
0bd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
0be0: 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  urn SQLITE_AFF_N
0bf0: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ONE;.    }.  }el
0c00: 73 65 20 69 66 28 20 21 61 66 66 31 20 26 26 20  se if( !aff1 && 
0c10: 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20  !aff2 ){.    /* 
0c20: 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20  Neither side of 
0c30: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  the comparison i
0c40: 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f 6d  s a column.  Com
0c50: 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  pare the.    ** 
0c60: 72 65 73 75 6c 74 73 20 64 69 72 65 63 74 6c 79  results directly
0c70: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74  ..    */.    ret
0c80: 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  urn SQLITE_AFF_N
0c90: 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ONE;.  }else{.  
0ca0: 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20 69 73    /* One side is
0cb0: 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 6f   a column, the o
0cc0: 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55 73 65  ther is not. Use
0cd0: 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61 66 66   the columns aff
0ce0: 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 61 73  inity. */.    as
0cf0: 73 65 72 74 28 20 61 66 66 31 3d 3d 30 20 7c 7c  sert( aff1==0 ||
0d00: 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20 20 20   aff2==0 );.    
0d10: 72 65 74 75 72 6e 20 28 61 66 66 31 20 2b 20 61  return (aff1 + a
0d20: 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ff2);.  }.}../*.
0d30: 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63 6f  ** pExpr is a co
0d40: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
0d50: 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 74  r.  Return the t
0d60: 79 70 65 20 61 66 66 69 6e 69 74 79 20 74 68 61  ype affinity tha
0d70: 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 61  t should.** be a
0d80: 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68 20 6f  pplied to both o
0d90: 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20 74 6f  perands prior to
0da0: 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70 61   doing the compa
0db0: 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  rison..*/.static
0dc0: 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73 6f 6e   char comparison
0dd0: 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70  Affinity(Expr *p
0de0: 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20 61 66  Expr){.  char af
0df0: 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  f;.  assert( pEx
0e00: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c  pr->op==TK_EQ ||
0e10: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
0e20: 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  N || pExpr->op==
0e30: 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20 20  TK_LT ||.       
0e40: 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b     pExpr->op==TK
0e50: 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _GT || pExpr->op
0e60: 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70 72  ==TK_GE || pExpr
0e70: 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a 20  ->op==TK_LE ||. 
0e80: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
0e90: 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 61  op==TK_NE );.  a
0ea0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
0eb0: 65 66 74 20 29 3b 0a 20 20 61 66 66 20 3d 20 73  eft );.  aff = s
0ec0: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
0ed0: 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  ty(pExpr->pLeft)
0ee0: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70  ;.  if( pExpr->p
0ef0: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 61 66 66  Right ){.    aff
0f00: 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72   = sqlite3Compar
0f10: 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d  eAffinity(pExpr-
0f20: 3e 70 52 69 67 68 74 2c 20 61 66 66 29 3b 0a 20  >pRight, aff);. 
0f30: 20 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45   }.  else if( pE
0f40: 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  xpr->pSelect ){.
0f50: 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65      aff = sqlite
0f60: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
0f70: 28 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2d  (pExpr->pSelect-
0f80: 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
0f90: 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d 0a 20  xpr, aff);.  }. 
0fa0: 20 65 6c 73 65 20 69 66 28 20 21 61 66 66 20 29   else if( !aff )
0fb0: 7b 0a 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49  {.    aff = SQLI
0fc0: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d  TE_AFF_NONE;.  }
0fd0: 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d  .  return aff;.}
0fe0: 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73  ../*.** pExpr is
0ff0: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65 78   a comparison ex
1000: 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e 20 27 3d  pression, eg. '=
1010: 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e 29 20  ', '<', IN(...) 
1020: 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61 66 66 69  etc..** idx_affi
1030: 6e 69 74 79 20 69 73 20 74 68 65 20 61 66 66 69  nity is the affi
1040: 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e 64 65 78  nity of an index
1050: 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65 74 75 72  ed column. Retur
1060: 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 74 68 65  n true.** if the
1070: 20 69 6e 64 65 78 20 77 69 74 68 20 61 66 66 69   index with affi
1080: 6e 69 74 79 20 69 64 78 5f 61 66 66 69 6e 69 74  nity idx_affinit
1090: 79 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f  y may be used to
10a0: 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68   implement.** th
10b0: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20  e comparison in 
10c0: 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pExpr..*/.int sq
10d0: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
10e0: 74 79 4f 6b 28 45 78 70 72 20 2a 70 45 78 70 72  tyOk(Expr *pExpr
10f0: 2c 20 63 68 61 72 20 69 64 78 5f 61 66 66 69 6e  , char idx_affin
1100: 69 74 79 29 7b 0a 20 20 63 68 61 72 20 61 66 66  ity){.  char aff
1110: 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66   = comparisonAff
1120: 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20  inity(pExpr);.  
1130: 73 77 69 74 63 68 28 20 61 66 66 20 29 7b 0a 20  switch( aff ){. 
1140: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
1150: 46 46 5f 4e 4f 4e 45 3a 0a 20 20 20 20 20 20 72  FF_NONE:.      r
1160: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 63 61 73  eturn 1;.    cas
1170: 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  e SQLITE_AFF_TEX
1180: 54 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  T:.      return 
1190: 69 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d 53 51  idx_affinity==SQ
11a0: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
11b0: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
11c0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
11d0: 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
11e0: 79 28 69 64 78 5f 61 66 66 69 6e 69 74 79 29 3b  y(idx_affinity);
11f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
1200: 74 75 72 6e 20 74 68 65 20 50 31 20 76 61 6c 75  turn the P1 valu
1210: 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
1220: 20 75 73 65 64 20 66 6f 72 20 61 20 62 69 6e 61   used for a bina
1230: 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a  ry comparison.**
1240: 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45 71 2c 20   opcode (OP_Eq, 
1250: 4f 50 5f 47 65 20 65 74 63 2e 29 20 75 73 65 64  OP_Ge etc.) used
1260: 20 74 6f 20 63 6f 6d 70 61 72 65 20 70 45 78 70   to compare pExp
1270: 72 31 20 61 6e 64 20 70 45 78 70 72 32 2e 0a 2a  r1 and pExpr2..*
1280: 2a 20 49 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20  * If jumpIfNull 
1290: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 73 65  is true, then se
12a0: 74 20 74 68 65 20 6c 6f 77 20 62 79 74 65 20 6f  t the low byte o
12b0: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a  f the returned.*
12c0: 2a 20 50 31 20 76 61 6c 75 65 20 74 6f 20 74 65  * P1 value to te
12d0: 6c 6c 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f  ll the opcode to
12e0: 20 6a 75 6d 70 20 69 66 20 65 69 74 68 65 72 20   jump if either 
12f0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 76  expression.** ev
1300: 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e  aluates to NULL.
1310: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
1320: 69 6e 61 72 79 43 6f 6d 70 61 72 65 50 31 28 45  inaryCompareP1(E
1330: 78 70 72 20 2a 70 45 78 70 72 31 2c 20 45 78 70  xpr *pExpr1, Exp
1340: 72 20 2a 70 45 78 70 72 32 2c 20 69 6e 74 20 6a  r *pExpr2, int j
1350: 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 63 68  umpIfNull){.  ch
1360: 61 72 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33  ar aff = sqlite3
1370: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78  ExprAffinity(pEx
1380: 70 72 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  pr2);.  return (
1390: 28 69 6e 74 29 73 71 6c 69 74 65 33 43 6f 6d 70  (int)sqlite3Comp
13a0: 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70  areAffinity(pExp
13b0: 72 31 2c 20 61 66 66 29 29 2b 28 6a 75 6d 70 49  r1, aff))+(jumpI
13c0: 66 4e 75 6c 6c 3f 30 78 31 30 30 3a 30 29 3b 0a  fNull?0x100:0);.
13d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
13e0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
13f0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1400: 6e 63 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  nce that should 
1410: 62 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 61 20  be used by.** a 
1420: 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f  binary compariso
1430: 6e 20 6f 70 65 72 61 74 6f 72 20 63 6f 6d 70 61  n operator compa
1440: 72 69 6e 67 20 70 4c 65 66 74 20 61 6e 64 20 70  ring pLeft and p
1450: 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Right..**.** If 
1460: 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 65 78  the left hand ex
1470: 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63  pression has a c
1480: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1490: 65 20 74 79 70 65 2c 20 74 68 65 6e 20 69 74 20  e type, then it 
14a0: 69 73 0a 2a 2a 20 75 73 65 64 2e 20 4f 74 68 65  is.** used. Othe
14b0: 72 77 69 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  rwise the collat
14c0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ion sequence for
14d0: 20 74 68 65 20 72 69 67 68 74 20 68 61 6e 64 20   the right hand 
14e0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
14f0: 20 75 73 65 64 2c 20 6f 72 20 74 68 65 20 64 65   used, or the de
1500: 66 61 75 6c 74 20 28 42 49 4e 41 52 59 29 20 69  fault (BINARY) i
1510: 66 20 6e 65 69 74 68 65 72 20 65 78 70 72 65 73  f neither expres
1520: 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61  sion has a colla
1530: 74 69 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a 2a 2a  ting.** type..**
1540: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 52 69  .** Argument pRi
1550: 67 68 74 20 28 62 75 74 20 6e 6f 74 20 70 4c 65  ght (but not pLe
1560: 66 74 29 20 6d 61 79 20 62 65 20 61 20 6e 75 6c  ft) may be a nul
1570: 6c 20 70 6f 69 6e 74 65 72 2e 20 49 6e 20 74 68  l pointer. In th
1580: 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 74 20 69  is case,.** it i
1590: 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64  s not considered
15a0: 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 2a 20 73 71  ..*/.CollSeq* sq
15b0: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
15c0: 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 50 61 72  reCollSeq(.  Par
15d0: 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45  se *pParse, .  E
15e0: 78 70 72 20 2a 70 4c 65 66 74 2c 20 0a 20 20 45  xpr *pLeft, .  E
15f0: 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20  xpr *pRight.){. 
1600: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
1610: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74  .  assert( pLeft
1620: 20 29 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d   );.  if( pLeft-
1630: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
1640: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 61 73  ollate ){.    as
1650: 73 65 72 74 28 20 70 4c 65 66 74 2d 3e 70 43 6f  sert( pLeft->pCo
1660: 6c 6c 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20  ll );.    pColl 
1670: 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a  = pLeft->pColl;.
1680: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67    }else if( pRig
1690: 68 74 20 26 26 20 70 52 69 67 68 74 2d 3e 66 6c  ht && pRight->fl
16a0: 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c  ags & EP_ExpColl
16b0: 61 74 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ate ){.    asser
16c0: 74 28 20 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c  t( pRight->pColl
16d0: 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20   );.    pColl = 
16e0: 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 3b 0a 20  pRight->pColl;. 
16f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f 6c   }else{.    pCol
1700: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
1710: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
1720: 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 21  Left);.    if( !
1730: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  pColl ){.      p
1740: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
1750: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
1760: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d  , pRight);.    }
1770: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43  .  }.  return pC
1780: 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  oll;.}../*.** Ge
1790: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
17a0: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
17b0: 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rator..*/.static
17c0: 20 69 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72 65   int codeCompare
17d0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
17e0: 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72  e,    /* The par
17f0: 73 69 6e 67 20 28 61 6e 64 20 63 6f 64 65 20 67  sing (and code g
1800: 65 6e 65 72 61 74 69 6e 67 29 20 63 6f 6e 74 65  enerating) conte
1810: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  xt */.  Expr *pL
1820: 65 66 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  eft,      /* The
1830: 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   left operand */
1840: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
1850: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
1860: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  t operand */.  i
1870: 6e 74 20 6f 70 63 6f 64 65 2c 20 20 20 20 20 20  nt opcode,      
1880: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73   /* The comparis
1890: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69  on opcode */.  i
18a0: 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20 20 20  nt dest,        
18b0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
18c0: 20 74 72 75 65 2e 20 20 2a 2f 0a 20 20 69 6e 74   true.  */.  int
18d0: 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f   jumpIfNull    /
18e0: 2a 20 49 66 20 74 72 75 65 2c 20 6a 75 6d 70 20  * If true, jump 
18f0: 69 66 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e  if either operan
1900: 64 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  d is NULL */.){.
1910: 20 20 69 6e 74 20 70 31 20 3d 20 62 69 6e 61 72    int p1 = binar
1920: 79 43 6f 6d 70 61 72 65 50 31 28 70 4c 65 66 74  yCompareP1(pLeft
1930: 2c 20 70 52 69 67 68 74 2c 20 6a 75 6d 70 49 66  , pRight, jumpIf
1940: 4e 75 6c 6c 29 3b 0a 20 20 43 6f 6c 6c 53 65 71  Null);.  CollSeq
1950: 20 2a 70 33 20 3d 20 73 71 6c 69 74 65 33 42 69   *p3 = sqlite3Bi
1960: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
1970: 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  eq(pParse, pLeft
1980: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 72 65 74  , pRight);.  ret
1990: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 4f  urn sqlite3VdbeO
19a0: 70 33 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p3(pParse->pVdbe
19b0: 2c 20 6f 70 63 6f 64 65 2c 20 70 31 2c 20 64 65  , opcode, p1, de
19c0: 73 74 2c 20 28 76 6f 69 64 2a 29 70 33 2c 20 50  st, (void*)p3, P
19d0: 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a 7d 0a 0a 2f  3_COLLSEQ);.}../
19e0: 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61  *.** Construct a
19f0: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
1a00: 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e 20  node and return 
1a10: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e  a pointer to it.
1a20: 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20    Memory.** for 
1a30: 74 68 69 73 20 6e 6f 64 65 20 69 73 20 6f 62 74  this node is obt
1a40: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
1a50: 65 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20  eMalloc().  The 
1a60: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
1a70: 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62  .** is responsib
1a80: 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75  le for making su
1a90: 72 65 20 74 68 65 20 6e 6f 64 65 20 65 76 65 6e  re the node even
1aa0: 74 75 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65  tually gets free
1ab0: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
1ac0: 74 65 33 45 78 70 72 28 69 6e 74 20 6f 70 2c 20  te3Expr(int op, 
1ad0: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70  Expr *pLeft, Exp
1ae0: 72 20 2a 70 52 69 67 68 74 2c 20 63 6f 6e 73 74  r *pRight, const
1af0: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
1b00: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20  .  Expr *pNew;. 
1b10: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61   pNew = sqliteMa
1b20: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 45 78 70  lloc( sizeof(Exp
1b30: 72 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  r) );.  if( pNew
1b40: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 68  ==0 ){.    /* Wh
1b50: 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2c  en malloc fails,
1b60: 20 64 65 6c 65 74 65 20 70 4c 65 66 74 20 61 6e   delete pLeft an
1b70: 64 20 70 52 69 67 68 74 2e 20 45 78 70 72 65 73  d pRight. Expres
1b80: 73 69 6f 6e 73 20 70 61 73 73 65 64 20 74 6f 20  sions passed to 
1b90: 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e  .    ** this fun
1ba0: 63 74 69 6f 6e 20 6d 75 73 74 20 61 6c 77 61 79  ction must alway
1bb0: 73 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 77  s be allocated w
1bc0: 69 74 68 20 73 71 6c 69 74 65 33 45 78 70 72 28  ith sqlite3Expr(
1bd0: 29 20 66 6f 72 20 74 68 69 73 20 0a 20 20 20 20  ) for this .    
1be0: 2a 2a 20 72 65 61 73 6f 6e 2e 20 0a 20 20 20 20  ** reason. .    
1bf0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  */.    sqlite3Ex
1c00: 70 72 44 65 6c 65 74 65 28 70 4c 65 66 74 29 3b  prDelete(pLeft);
1c10: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1c20: 44 65 6c 65 74 65 28 70 52 69 67 68 74 29 3b 0a  Delete(pRight);.
1c30: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1c40: 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 6f  }.  pNew->op = o
1c50: 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74  p;.  pNew->pLeft
1c60: 20 3d 20 70 4c 65 66 74 3b 0a 20 20 70 4e 65 77   = pLeft;.  pNew
1c70: 2d 3e 70 52 69 67 68 74 20 3d 20 70 52 69 67 68  ->pRight = pRigh
1c80: 74 3b 0a 20 20 70 4e 65 77 2d 3e 69 41 67 67 20  t;.  pNew->iAgg 
1c90: 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 54 6f 6b  = -1;.  if( pTok
1ca0: 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  en ){.    assert
1cb0: 28 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e 3d 3d 30  ( pToken->dyn==0
1cc0: 20 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 73 70   );.    pNew->sp
1cd0: 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e  an = pNew->token
1ce0: 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 7d 65   = *pToken;.  }e
1cf0: 6c 73 65 20 69 66 28 20 70 4c 65 66 74 20 29 7b  lse if( pLeft ){
1d00: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 20  .    if( pRight 
1d10: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1d20: 45 78 70 72 53 70 61 6e 28 70 4e 65 77 2c 20 26  ExprSpan(pNew, &
1d30: 70 4c 65 66 74 2d 3e 73 70 61 6e 2c 20 26 70 52  pLeft->span, &pR
1d40: 69 67 68 74 2d 3e 73 70 61 6e 29 3b 0a 20 20 20  ight->span);.   
1d50: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 66     if( pRight->f
1d60: 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c  lags & EP_ExpCol
1d70: 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  late ){.        
1d80: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  pNew->flags |= E
1d90: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20  P_ExpCollate;.  
1da0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 43 6f 6c        pNew->pCol
1db0: 6c 20 3d 20 70 52 69 67 68 74 2d 3e 70 43 6f 6c  l = pRight->pCol
1dc0: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  l;.      }.    }
1dd0: 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e  .    if( pLeft->
1de0: 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f  flags & EP_ExpCo
1df0: 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20 70  llate ){.      p
1e00: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
1e10: 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20  _ExpCollate;.   
1e20: 20 20 20 70 4e 65 77 2d 3e 70 43 6f 6c 6c 20 3d     pNew->pColl =
1e30: 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 20   pLeft->pColl;. 
1e40: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69     }.  }..  sqli
1e50: 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74  te3ExprSetHeight
1e60: 28 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e  (pNew);.  return
1e70: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
1e80: 57 6f 72 6b 73 20 6c 69 6b 65 20 73 71 6c 69 74  Works like sqlit
1e90: 65 33 45 78 70 72 28 29 20 62 75 74 20 66 72 65  e3Expr() but fre
1ea0: 65 73 20 69 74 73 20 70 4c 65 66 74 20 61 6e 64  es its pLeft and
1eb0: 20 70 52 69 67 68 74 20 61 72 67 75 6d 65 6e 74   pRight argument
1ec0: 73 0a 2a 2a 20 69 66 20 69 74 20 66 61 69 6c 73  s.** if it fails
1ed0: 20 64 75 65 20 74 6f 20 61 20 6d 61 6c 6c 6f 63   due to a malloc
1ee0: 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 45 78 70   problem..*/.Exp
1ef0: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4f 72  r *sqlite3ExprOr
1f00: 46 72 65 65 28 69 6e 74 20 6f 70 2c 20 45 78 70  Free(int op, Exp
1f10: 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72 20 2a  r *pLeft, Expr *
1f20: 70 52 69 67 68 74 2c 20 63 6f 6e 73 74 20 54 6f  pRight, const To
1f30: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
1f40: 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c  Expr *pNew = sql
1f50: 69 74 65 33 45 78 70 72 28 6f 70 2c 20 70 4c 65  ite3Expr(op, pLe
1f60: 66 74 2c 20 70 52 69 67 68 74 2c 20 70 54 6f 6b  ft, pRight, pTok
1f70: 65 6e 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  en);.  if( pNew=
1f80: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
1f90: 33 45 78 70 72 44 65 6c 65 74 65 28 70 4c 65 66  3ExprDelete(pLef
1fa0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
1fb0: 78 70 72 44 65 6c 65 74 65 28 70 52 69 67 68 74  xprDelete(pRight
1fc0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1fd0: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  pNew;.}../*.** W
1fe0: 68 65 6e 20 64 6f 69 6e 67 20 61 20 6e 65 73 74  hen doing a nest
1ff0: 65 64 20 70 61 72 73 65 2c 20 79 6f 75 20 63 61  ed parse, you ca
2000: 6e 20 69 6e 63 6c 75 64 65 20 74 65 72 6d 73 20  n include terms 
2010: 69 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  in an expression
2020: 0a 2a 2a 20 74 68 61 74 20 6c 6f 6f 6b 20 6c 69  .** that look li
2030: 6b 65 20 74 68 69 73 3a 20 20 20 23 30 20 23 31  ke this:   #0 #1
2040: 20 23 32 20 2e 2e 2e 20 20 54 68 65 73 65 20 74   #2 ...  These t
2050: 65 72 6d 73 20 72 65 66 65 72 20 74 6f 20 65 6c  erms refer to el
2060: 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 20 74 68 65  ements.** on the
2070: 20 73 74 61 63 6b 2e 20 20 22 23 30 22 20 6d 65   stack.  "#0" me
2080: 61 6e 73 20 74 68 65 20 74 6f 70 20 6f 66 20 74  ans the top of t
2090: 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 20 22 23 31  he stack..** "#1
20a0: 22 20 6d 65 61 6e 73 20 74 68 65 20 6e 65 78 74  " means the next
20b0: 20 64 6f 77 6e 20 6f 6e 20 74 68 65 20 73 74 61   down on the sta
20c0: 63 6b 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74  ck.  And so fort
20d0: 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  h..**.** This ro
20e0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
20f0: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 74 6f  by the parser to
2100: 20 64 65 61 6c 20 77 69 74 68 20 6f 6e 20 6f 66   deal with on of
2110: 20 74 68 6f 73 65 20 74 65 72 6d 73 2e 0a 2a 2a   those terms..**
2120: 20 49 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   It immediately 
2130: 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74  generates code t
2140: 6f 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75  o store the valu
2150: 65 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20 6c 6f  e in a memory lo
2160: 63 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 72  cation..** The r
2170: 65 74 75 72 6e 73 20 61 6e 20 65 78 70 72 65 73  eturns an expres
2180: 73 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 63  sion that will c
2190: 6f 64 65 20 74 6f 20 65 78 74 72 61 63 74 20 74  ode to extract t
21a0: 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 0a 2a 2a  he value from.**
21b0: 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 6c 6f 63   that memory loc
21c0: 61 74 69 6f 6e 20 61 73 20 6e 65 65 64 65 64 2e  ation as needed.
21d0: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
21e0: 33 52 65 67 69 73 74 65 72 45 78 70 72 28 50 61  3RegisterExpr(Pa
21f0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
2200: 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 56  en *pToken){.  V
2210: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
2220: 3e 70 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a  >pVdbe;.  Expr *
2230: 70 3b 0a 20 20 69 6e 74 20 64 65 70 74 68 3b 0a  p;.  int depth;.
2240: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 65    if( pParse->ne
2250: 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73  sted==0 ){.    s
2260: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
2270: 50 61 72 73 65 2c 20 22 6e 65 61 72 20 5c 22 25  Parse, "near \"%
2280: 54 5c 22 3a 20 73 79 6e 74 61 78 20 65 72 72 6f  T\": syntax erro
2290: 72 22 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 20  r", pToken);.   
22a0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
22b0: 78 70 72 28 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20  xpr(TK_NULL, 0, 
22c0: 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  0, 0);.  }.  if(
22d0: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   v==0 ) return 0
22e0: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45  ;.  p = sqlite3E
22f0: 78 70 72 28 54 4b 5f 52 45 47 49 53 54 45 52 2c  xpr(TK_REGISTER,
2300: 20 30 2c 20 30 2c 20 70 54 6f 6b 65 6e 29 3b 0a   0, 0, pToken);.
2310: 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
2320: 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20    return 0;  /* 
2330: 4d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f  Malloc failed */
2340: 0a 20 20 7d 0a 20 20 64 65 70 74 68 20 3d 20 61  .  }.  depth = a
2350: 74 6f 69 28 28 63 68 61 72 2a 29 26 70 54 6f 6b  toi((char*)&pTok
2360: 65 6e 2d 3e 7a 5b 31 5d 29 3b 0a 20 20 70 2d 3e  en->z[1]);.  p->
2370: 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d  iTable = pParse-
2380: 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 73 71 6c 69 74  >nMem++;.  sqlit
2390: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
23a0: 50 5f 44 75 70 2c 20 64 65 70 74 68 2c 20 30 29  P_Dup, depth, 0)
23b0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
23c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
23d0: 6f 72 65 2c 20 70 2d 3e 69 54 61 62 6c 65 2c 20  ore, p->iTable, 
23e0: 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  1);.  return p;.
23f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77  }../*.** Join tw
2400: 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73  o expressions us
2410: 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61  ing an AND opera
2420: 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65 72 20  tor.  If either 
2430: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a  expression is.**
2440: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74   NULL, then just
2450: 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65   return the othe
2460: 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f  r expression..*/
2470: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
2480: 70 72 41 6e 64 28 45 78 70 72 20 2a 70 4c 65 66  prAnd(Expr *pLef
2490: 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74 29  t, Expr *pRight)
24a0: 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30  {.  if( pLeft==0
24b0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
24c0: 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69  Right;.  }else i
24d0: 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a  f( pRight==0 ){.
24e0: 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74      return pLeft
24f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
2500: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
2510: 72 28 54 4b 5f 41 4e 44 2c 20 70 4c 65 66 74 2c  r(TK_AND, pLeft,
2520: 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 7d   pRight, 0);.  }
2530: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
2540: 65 20 45 78 70 72 2e 73 70 61 6e 20 66 69 65 6c  e Expr.span fiel
2550: 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65  d of the given e
2560: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 73 70 61  xpression to spa
2570: 6e 20 61 6c 6c 0a 2a 2a 20 74 65 78 74 20 62 65  n all.** text be
2580: 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20 67 69  tween the two gi
2590: 76 65 6e 20 74 6f 6b 65 6e 73 2e 0a 2a 2f 0a 76  ven tokens..*/.v
25a0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53  oid sqlite3ExprS
25b0: 70 61 6e 28 45 78 70 72 20 2a 70 45 78 70 72 2c  pan(Expr *pExpr,
25c0: 20 54 6f 6b 65 6e 20 2a 70 4c 65 66 74 2c 20 54   Token *pLeft, T
25d0: 6f 6b 65 6e 20 2a 70 52 69 67 68 74 29 7b 0a 20  oken *pRight){. 
25e0: 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74 21   assert( pRight!
25f0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2600: 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 69 66  pLeft!=0 );.  if
2610: 28 20 21 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  ( !sqlite3Malloc
2620: 46 61 69 6c 65 64 28 29 20 26 26 20 70 52 69 67  Failed() && pRig
2630: 68 74 2d 3e 7a 20 26 26 20 70 4c 65 66 74 2d 3e  ht->z && pLeft->
2640: 7a 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  z ){.    assert(
2650: 20 70 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30 20 7c   pLeft->dyn==0 |
2660: 7c 20 70 4c 65 66 74 2d 3e 7a 5b 70 4c 65 66 74  | pLeft->z[pLeft
2670: 2d 3e 6e 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 69  ->n]==0 );.    i
2680: 66 28 20 70 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30  f( pLeft->dyn==0
2690: 20 26 26 20 70 52 69 67 68 74 2d 3e 64 79 6e 3d   && pRight->dyn=
26a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70  =0 ){.      pExp
26b0: 72 2d 3e 73 70 61 6e 2e 7a 20 3d 20 70 4c 65 66  r->span.z = pLef
26c0: 74 2d 3e 7a 3b 0a 20 20 20 20 20 20 70 45 78 70  t->z;.      pExp
26d0: 72 2d 3e 73 70 61 6e 2e 6e 20 3d 20 70 52 69 67  r->span.n = pRig
26e0: 68 74 2d 3e 6e 20 2b 20 28 70 52 69 67 68 74 2d  ht->n + (pRight-
26f0: 3e 7a 20 2d 20 70 4c 65 66 74 2d 3e 7a 29 3b 0a  >z - pLeft->z);.
2700: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2710: 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 20 3d   pExpr->span.z =
2720: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
2730: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74  ./*.** Construct
2740: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
2750: 6e 20 6e 6f 64 65 20 66 6f 72 20 61 20 66 75 6e  n node for a fun
2760: 63 74 69 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69  ction with multi
2770: 70 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73  ple.** arguments
2780: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
2790: 65 33 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 45  e3ExprFunction(E
27a0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
27b0: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
27c0: 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
27d0: 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 20 29  assert( pToken )
27e0: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
27f0: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
2800: 45 78 70 72 29 20 29 3b 0a 20 20 69 66 28 20 70  Expr) );.  if( p
2810: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  New==0 ){.    sq
2820: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
2830: 65 74 65 28 70 4c 69 73 74 29 3b 20 2f 2a 20 41  ete(pList); /* A
2840: 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d  void leaking mem
2850: 6f 72 79 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20  ory when malloc 
2860: 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74  fails */.    ret
2870: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65  urn 0;.  }.  pNe
2880: 77 2d 3e 6f 70 20 3d 20 54 4b 5f 46 55 4e 43 54  w->op = TK_FUNCT
2890: 49 4f 4e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  ION;.  pNew->pLi
28a0: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73  st = pList;.  as
28b0: 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79  sert( pToken->dy
28c0: 6e 3d 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e  n==0 );.  pNew->
28d0: 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b  token = *pToken;
28e0: 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20  .  pNew->span = 
28f0: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 3b 0a 0a 20 20  pNew->token;..  
2900: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65  sqlite3ExprSetHe
2910: 69 67 68 74 28 70 4e 65 77 29 3b 0a 20 20 72 65  ight(pNew);.  re
2920: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
2930: 0a 2a 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72  .** Assign a var
2940: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20  iable number to 
2950: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  an expression th
2960: 61 74 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c  at encodes a wil
2970: 64 63 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20  dcard.** in the 
2980: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61  original SQL sta
2990: 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20  tement.  .**.** 
29a0: 57 69 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73  Wildcards consis
29b0: 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65  ting of a single
29c0: 20 22 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65   "?" are assigne
29d0: 64 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65  d the next seque
29e0: 6e 74 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c  ntial.** variabl
29f0: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
2a00: 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65  Wildcards of the
2a10: 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65   form "?nnn" are
2a20: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75   assigned the nu
2a30: 6d 62 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20  mber "nnn".  We 
2a40: 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e  make.** sure "nn
2a50: 6e 22 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65  n" is not too be
2a60: 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69   to avoid a deni
2a70: 61 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61 74  al of service at
2a80: 74 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65  tack when.** the
2a90: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63   SQL statement c
2aa0: 6f 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74  omes from an ext
2ab0: 65 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a  ernal source..**
2ac0: 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66  .** Wildcards of
2ad0: 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22   the form ":aaa"
2ae0: 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20 61   or "$aaa" are a
2af0: 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d 65  ssigned the same
2b00: 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68   number.** as th
2b10: 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61  e previous insta
2b20: 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  nce of the same 
2b30: 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69 66  wildcard.  Or if
2b40: 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
2b50: 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f  st.** instance o
2b60: 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c 20  f the wildcard, 
2b70: 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 69  the next sequeni
2b80: 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  al variable numb
2b90: 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65  er is.** assigne
2ba0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
2bb0: 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72 4e  e3ExprAssignVarN
2bc0: 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50 61  umber(Parse *pPa
2bd0: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
2be0: 29 7b 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ){.  Token *pTok
2bf0: 65 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d  en;.  if( pExpr=
2c00: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  =0 ) return;.  p
2c10: 54 6f 6b 65 6e 20 3d 20 26 70 45 78 70 72 2d 3e  Token = &pExpr->
2c20: 74 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28  token;.  assert(
2c30: 20 70 54 6f 6b 65 6e 2d 3e 6e 3e 3d 31 20 29 3b   pToken->n>=1 );
2c40: 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65  .  assert( pToke
2c50: 6e 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 61 73 73  n->z!=0 );.  ass
2c60: 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30  ert( pToken->z[0
2c70: 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 54  ]!=0 );.  if( pT
2c80: 6f 6b 65 6e 2d 3e 6e 3d 3d 31 20 29 7b 0a 20 20  oken->n==1 ){.  
2c90: 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66    /* Wildcard of
2ca0: 20 74 68 65 20 66 6f 72 6d 20 22 3f 22 2e 20 20   the form "?".  
2cb0: 41 73 73 69 67 6e 20 74 68 65 20 6e 65 78 74 20  Assign the next 
2cc0: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20  variable number 
2cd0: 2a 2f 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54  */.    pExpr->iT
2ce0: 61 62 6c 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d  able = ++pParse-
2cf0: 3e 6e 56 61 72 3b 0a 20 20 7d 65 6c 73 65 20 69  >nVar;.  }else i
2d00: 66 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d  f( pToken->z[0]=
2d10: 3d 27 3f 27 20 29 7b 0a 20 20 20 20 2f 2a 20 57  ='?' ){.    /* W
2d20: 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66  ildcard of the f
2d30: 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e  orm "?nnn".  Con
2d40: 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e  vert "nnn" to an
2d50: 20 69 6e 74 65 67 65 72 20 61 6e 64 0a 20 20 20   integer and.   
2d60: 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20 74 68   ** use it as th
2d70: 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  e variable numbe
2d80: 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a  r */.    int i;.
2d90: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
2da0: 65 20 3d 20 69 20 3d 20 61 74 6f 69 28 28 63 68  e = i = atoi((ch
2db0: 61 72 2a 29 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31  ar*)&pToken->z[1
2dc0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 69 3c 31 20  ]);.    if( i<1 
2dd0: 7c 7c 20 69 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  || i>SQLITE_MAX_
2de0: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 20  VARIABLE_NUMBER 
2df0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2e00: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2e10: 20 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65   "variable numbe
2e20: 72 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65  r must be betwee
2e30: 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a 20  n ?1 and ?%d",. 
2e40: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
2e50: 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MAX_VARIABLE_NUM
2e60: 42 45 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BER);.    }.    
2e70: 69 66 28 20 69 3e 70 50 61 72 73 65 2d 3e 6e 56  if( i>pParse->nV
2e80: 61 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  ar ){.      pPar
2e90: 73 65 2d 3e 6e 56 61 72 20 3d 20 69 3b 0a 20 20  se->nVar = i;.  
2ea0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
2eb0: 20 2f 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66   /* Wildcards of
2ec0: 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22   the form ":aaa"
2ed0: 20 6f 72 20 22 24 61 61 61 22 2e 20 20 52 65 75   or "$aaa".  Reu
2ee0: 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72 69  se the same vari
2ef0: 61 62 6c 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62  able.    ** numb
2f00: 65 72 20 61 73 20 74 68 65 20 70 72 69 6f 72 20  er as the prior 
2f10: 61 70 70 65 61 72 61 6e 63 65 20 6f 66 20 74 68  appearance of th
2f20: 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20  e same name, or 
2f30: 69 66 20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20  if the name.    
2f40: 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70 70  ** has never app
2f50: 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72 65  eared before, re
2f60: 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72  use the same var
2f70: 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20  iable number.   
2f80: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e   */.    int i, n
2f90: 3b 0a 20 20 20 20 6e 20 3d 20 70 54 6f 6b 65 6e  ;.    n = pToken
2fa0: 2d 3e 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ->n;.    for(i=0
2fb0: 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 61 72  ; i<pParse->nVar
2fc0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
2fd0: 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20    Expr *pE;.    
2fe0: 20 20 69 66 28 20 28 70 45 20 3d 20 70 50 61 72    if( (pE = pPar
2ff0: 73 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 69 5d  se->apVarExpr[i]
3000: 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26  )!=0.          &
3010: 26 20 70 45 2d 3e 74 6f 6b 65 6e 2e 6e 3d 3d 6e  & pE->token.n==n
3020: 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 6d 65  .          && me
3030: 6d 63 6d 70 28 70 45 2d 3e 74 6f 6b 65 6e 2e 7a  mcmp(pE->token.z
3040: 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 6e 29 3d  , pToken->z, n)=
3050: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45  =0 ){.        pE
3060: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45  xpr->iTable = pE
3070: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
3080: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
3090: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
30a0: 3e 3d 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78  >=pParse->nVarEx
30b0: 70 72 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70  pr ){.      pExp
30c0: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2b 2b 70 50  r->iTable = ++pP
30d0: 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 20 20  arse->nVar;.    
30e0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 56    if( pParse->nV
30f0: 61 72 45 78 70 72 3e 3d 70 50 61 72 73 65 2d 3e  arExpr>=pParse->
3100: 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 2d 31 20  nVarExprAlloc-1 
3110: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  ){.        pPars
3120: 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63  e->nVarExprAlloc
3130: 20 2b 3d 20 70 50 61 72 73 65 2d 3e 6e 56 61 72   += pParse->nVar
3140: 45 78 70 72 41 6c 6c 6f 63 20 2b 20 31 30 3b 0a  ExprAlloc + 10;.
3150: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
3160: 61 70 56 61 72 45 78 70 72 20 3d 20 73 71 6c 69  apVarExpr = sqli
3170: 74 65 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  teReallocOrFree(
3180: 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70  pParse->apVarExp
3190: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
31a0: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
31b0: 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 2a  ->nVarExprAlloc*
31c0: 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61  sizeof(pParse->a
31d0: 70 56 61 72 45 78 70 72 5b 30 5d 29 20 29 3b 0a  pVarExpr[0]) );.
31e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
31f0: 28 20 21 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  ( !sqlite3Malloc
3200: 46 61 69 6c 65 64 28 29 20 29 7b 0a 20 20 20 20  Failed() ){.    
3210: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
3220: 73 65 2d 3e 61 70 56 61 72 45 78 70 72 21 3d 30  se->apVarExpr!=0
3230: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72   );.        pPar
3240: 73 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 70 50  se->apVarExpr[pP
3250: 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 2b 2b  arse->nVarExpr++
3260: 5d 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  ] = pExpr;.     
3270: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 0a 20 20   }.    }.  } .  
3280: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 45 72  if( !pParse->nEr
3290: 72 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 56 61  r && pParse->nVa
32a0: 72 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52  r>SQLITE_MAX_VAR
32b0: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 20 29 7b 0a  IABLE_NUMBER ){.
32c0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
32d0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
32e0: 20 6d 61 6e 79 20 53 51 4c 20 76 61 72 69 61 62   many SQL variab
32f0: 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  les");.  }.}../*
3300: 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20  .** Recursively 
3310: 64 65 6c 65 74 65 20 61 6e 20 65 78 70 72 65 73  delete an expres
3320: 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f  sion tree..*/.vo
3330: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  id sqlite3ExprDe
3340: 6c 65 74 65 28 45 78 70 72 20 2a 70 29 7b 0a 20  lete(Expr *p){. 
3350: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
3360: 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 73 70 61  rn;.  if( p->spa
3370: 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74 65 46 72  n.dyn ) sqliteFr
3380: 65 65 28 28 63 68 61 72 2a 29 70 2d 3e 73 70 61  ee((char*)p->spa
3390: 6e 2e 7a 29 3b 0a 20 20 69 66 28 20 70 2d 3e 74  n.z);.  if( p->t
33a0: 6f 6b 65 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74  oken.dyn ) sqlit
33b0: 65 46 72 65 65 28 28 63 68 61 72 2a 29 70 2d 3e  eFree((char*)p->
33c0: 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 73 71 6c 69  token.z);.  sqli
33d0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d  te3ExprDelete(p-
33e0: 3e 70 4c 65 66 74 29 3b 0a 20 20 73 71 6c 69 74  >pLeft);.  sqlit
33f0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e  e3ExprDelete(p->
3400: 70 52 69 67 68 74 29 3b 0a 20 20 73 71 6c 69 74  pRight);.  sqlit
3410: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
3420: 28 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 73 71  (p->pList);.  sq
3430: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
3440: 65 28 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  e(p->pSelect);. 
3450: 20 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a   sqliteFree(p);.
3460: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 45 78 70  }../*.** The Exp
3470: 72 2e 74 6f 6b 65 6e 20 66 69 65 6c 64 20 6d 69  r.token field mi
3480: 67 68 74 20 62 65 20 61 20 73 74 72 69 6e 67 20  ght be a string 
3490: 6c 69 74 65 72 61 6c 20 74 68 61 74 20 69 73 20  literal that is 
34a0: 71 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 73 6f  quoted..** If so
34b0: 2c 20 72 65 6d 6f 76 65 20 74 68 65 20 71 75 6f  , remove the quo
34c0: 74 61 74 69 6f 6e 20 6d 61 72 6b 73 2e 0a 2a 2f  tation marks..*/
34d0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 71  .void sqlite3Deq
34e0: 75 6f 74 65 45 78 70 72 28 45 78 70 72 20 2a 70  uoteExpr(Expr *p
34f0: 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  ){.  if( ExprHas
3500: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45  AnyProperty(p, E
3510: 50 5f 44 65 71 75 6f 74 65 64 29 20 29 7b 0a 20  P_Dequoted) ){. 
3520: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
3530: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
3540: 28 70 2c 20 45 50 5f 44 65 71 75 6f 74 65 64 29  (p, EP_Dequoted)
3550: 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e  ;.  if( p->token
3560: 2e 64 79 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 73  .dyn==0 ){.    s
3570: 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28  qlite3TokenCopy(
3580: 26 70 2d 3e 74 6f 6b 65 6e 2c 20 26 70 2d 3e 74  &p->token, &p->t
3590: 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  oken);.  }.  sql
35a0: 69 74 65 33 44 65 71 75 6f 74 65 28 28 63 68 61  ite3Dequote((cha
35b0: 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a  r*)p->token.z);.
35c0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  }.../*.** The fo
35d0: 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66  llowing group of
35e0: 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64   routines make d
35f0: 65 65 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78  eep copies of ex
3600: 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78  pressions,.** ex
3610: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20  pression lists, 
3620: 49 44 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65  ID lists, and se
3630: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e  lect statements.
3640: 20 20 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e    The copies can
3650: 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28  .** be deleted (
3660: 62 79 20 62 65 69 6e 67 20 70 61 73 73 65 64 20  by being passed 
3670: 74 6f 20 74 68 65 69 72 20 72 65 73 70 65 63 74  to their respect
3680: 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20  ive ...Delete() 
3690: 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74  routines).** wit
36a0: 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74  hout effecting t
36b0: 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a  he originals..**
36c0: 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69  .** The expressi
36d0: 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64  on list, ID, and
36e0: 20 73 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65   source lists re
36f0: 74 75 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45  turn by sqlite3E
3700: 78 70 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a  xprListDup(),.**
3710: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75   sqlite3IdListDu
3720: 70 28 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33  p(), and sqlite3
3730: 53 72 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e  SrcListDup() can
3740: 20 6e 6f 74 20 62 65 20 66 75 72 74 68 65 72 20   not be further 
3750: 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20  expanded .** by 
3760: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
3770: 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41   to sqlite*ListA
3780: 70 70 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73  ppend() routines
3790: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c  ..**.** Any tabl
37a0: 65 73 20 74 68 61 74 20 74 68 65 20 53 72 63 4c  es that the SrcL
37b0: 69 73 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  ist might point 
37c0: 74 6f 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69  to are not dupli
37d0: 63 61 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a  cated..*/.Expr *
37e0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 45  sqlite3ExprDup(E
37f0: 78 70 72 20 2a 70 29 7b 0a 20 20 45 78 70 72 20  xpr *p){.  Expr 
3800: 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d 3d  *pNew;.  if( p==
3810: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
3820: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c  pNew = sqliteMal
3830: 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a  locRaw( sizeof(*
3840: 70 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  p) );.  if( pNew
3850: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
3860: 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2c 20 70    memcpy(pNew, p
3870: 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29  , sizeof(*pNew))
3880: 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e  ;.  if( p->token
3890: 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65  .z!=0 ){.    pNe
38a0: 77 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 28 75 38  w->token.z = (u8
38b0: 2a 29 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28  *)sqliteStrNDup(
38c0: 28 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e  (char*)p->token.
38d0: 7a 2c 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a  z, p->token.n);.
38e0: 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e      pNew->token.
38f0: 64 79 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  dyn = 1;.  }else
3900: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  {.    assert( pN
3910: 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29  ew->token.z==0 )
3920: 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 73 70  ;.  }.  pNew->sp
3930: 61 6e 2e 7a 20 3d 20 30 3b 0a 20 20 70 4e 65 77  an.z = 0;.  pNew
3940: 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  ->pLeft = sqlite
3950: 33 45 78 70 72 44 75 70 28 70 2d 3e 70 4c 65 66  3ExprDup(p->pLef
3960: 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67  t);.  pNew->pRig
3970: 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ht = sqlite3Expr
3980: 44 75 70 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a  Dup(p->pRight);.
3990: 20 20 70 4e 65 77 2d 3e 70 4c 69 73 74 20 3d 20    pNew->pList = 
39a0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
39b0: 75 70 28 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20  up(p->pList);.  
39c0: 70 4e 65 77 2d 3e 70 53 65 6c 65 63 74 20 3d 20  pNew->pSelect = 
39d0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
39e0: 28 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  (p->pSelect);.  
39f0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 76  return pNew;.}.v
3a00: 6f 69 64 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e  oid sqlite3Token
3a10: 43 6f 70 79 28 54 6f 6b 65 6e 20 2a 70 54 6f 2c  Copy(Token *pTo,
3a20: 20 54 6f 6b 65 6e 20 2a 70 46 72 6f 6d 29 7b 0a   Token *pFrom){.
3a30: 20 20 69 66 28 20 70 54 6f 2d 3e 64 79 6e 20 29    if( pTo->dyn )
3a40: 20 73 71 6c 69 74 65 46 72 65 65 28 28 63 68 61   sqliteFree((cha
3a50: 72 2a 29 70 54 6f 2d 3e 7a 29 3b 0a 20 20 69 66  r*)pTo->z);.  if
3a60: 28 20 70 46 72 6f 6d 2d 3e 7a 20 29 7b 0a 20 20  ( pFrom->z ){.  
3a70: 20 20 70 54 6f 2d 3e 6e 20 3d 20 70 46 72 6f 6d    pTo->n = pFrom
3a80: 2d 3e 6e 3b 0a 20 20 20 20 70 54 6f 2d 3e 7a 20  ->n;.    pTo->z 
3a90: 3d 20 28 75 38 2a 29 73 71 6c 69 74 65 53 74 72  = (u8*)sqliteStr
3aa0: 4e 44 75 70 28 28 63 68 61 72 2a 29 70 46 72 6f  NDup((char*)pFro
3ab0: 6d 2d 3e 7a 2c 20 70 46 72 6f 6d 2d 3e 6e 29 3b  m->z, pFrom->n);
3ac0: 0a 20 20 20 20 70 54 6f 2d 3e 64 79 6e 20 3d 20  .    pTo->dyn = 
3ad0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
3ae0: 70 54 6f 2d 3e 7a 20 3d 20 30 3b 0a 20 20 7d 0a  pTo->z = 0;.  }.
3af0: 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69  }.ExprList *sqli
3b00: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 45  te3ExprListDup(E
3b10: 78 70 72 4c 69 73 74 20 2a 70 29 7b 0a 20 20 45  xprList *p){.  E
3b20: 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  xprList *pNew;. 
3b30: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
3b40: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70  _item *pItem, *p
3b50: 4f 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69  OldItem;.  int i
3b60: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
3b70: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20  eturn 0;.  pNew 
3b80: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
3b90: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b  sizeof(*pNew) );
3ba0: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
3bb0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
3bc0: 77 2d 3e 6e 45 78 70 72 20 3d 20 70 4e 65 77 2d  w->nExpr = pNew-
3bd0: 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 45 78  >nAlloc = p->nEx
3be0: 70 72 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20  pr;.  pNew->a = 
3bf0: 70 49 74 65 6d 20 3d 20 73 71 6c 69 74 65 4d 61  pItem = sqliteMa
3c00: 6c 6c 6f 63 28 20 70 2d 3e 6e 45 78 70 72 2a 73  lloc( p->nExpr*s
3c10: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29  izeof(p->a[0]) )
3c20: 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 3d 3d 30  ;.  if( pItem==0
3c30: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
3c40: 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 72 65  ee(pNew);.    re
3c50: 74 75 72 6e 20 30 3b 0a 20 20 7d 20 0a 20 20 70  turn 0;.  } .  p
3c60: 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a  OldItem = p->a;.
3c70: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
3c80: 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
3c90: 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29  m++, pOldItem++)
3ca0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  {.    Expr *pNew
3cb0: 45 78 70 72 2c 20 2a 70 4f 6c 64 45 78 70 72 3b  Expr, *pOldExpr;
3cc0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70  .    pItem->pExp
3cd0: 72 20 3d 20 70 4e 65 77 45 78 70 72 20 3d 20 73  r = pNewExpr = s
3ce0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 4f  qlite3ExprDup(pO
3cf0: 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64 49 74 65  ldExpr = pOldIte
3d00: 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 69  m->pExpr);.    i
3d10: 66 28 20 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61  f( pOldExpr->spa
3d20: 6e 2e 7a 21 3d 30 20 26 26 20 70 4e 65 77 45 78  n.z!=0 && pNewEx
3d30: 70 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  pr ){.      /* A
3d40: 6c 77 61 79 73 20 6d 61 6b 65 20 61 20 63 6f 70  lways make a cop
3d50: 79 20 6f 66 20 74 68 65 20 73 70 61 6e 20 66 6f  y of the span fo
3d60: 72 20 74 6f 70 2d 6c 65 76 65 6c 20 65 78 70 72  r top-level expr
3d70: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 0a 20  essions in the. 
3d80: 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69       ** expressi
3d90: 6f 6e 20 6c 69 73 74 2e 20 20 54 68 65 20 6c 6f  on list.  The lo
3da0: 67 69 63 20 69 6e 20 53 45 4c 45 43 54 20 70 72  gic in SELECT pr
3db0: 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20 64 65  ocessing that de
3dc0: 74 65 72 6d 69 6e 65 73 0a 20 20 20 20 20 20 2a  termines.      *
3dd0: 2a 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63  * the names of c
3de0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
3df0: 73 75 6c 74 20 73 65 74 20 6e 65 65 64 73 20 74  sult set needs t
3e00: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
3e10: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
3e20: 54 6f 6b 65 6e 43 6f 70 79 28 26 70 4e 65 77 45  TokenCopy(&pNewE
3e30: 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4f 6c 64  xpr->span, &pOld
3e40: 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20  Expr->span);.   
3e50: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
3e60: 4e 65 77 45 78 70 72 3d 3d 30 20 7c 7c 20 70 4e  NewExpr==0 || pN
3e70: 65 77 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 21 3d  ewExpr->span.z!=
3e80: 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  0 .            |
3e90: 7c 20 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e  | pOldExpr->span
3ea0: 2e 7a 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  .z==0.          
3eb0: 20 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c    || sqlite3Mall
3ec0: 6f 63 46 61 69 6c 65 64 28 29 20 29 3b 0a 20 20  ocFailed() );.  
3ed0: 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
3ee0: 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 70 4f   sqliteStrDup(pO
3ef0: 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ldItem->zName);.
3f00: 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f      pItem->sortO
3f10: 72 64 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  rder = pOldItem-
3f20: 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  >sortOrder;.    
3f30: 70 49 74 65 6d 2d 3e 69 73 41 67 67 20 3d 20 70  pItem->isAgg = p
3f40: 4f 6c 64 49 74 65 6d 2d 3e 69 73 41 67 67 3b 0a  OldItem->isAgg;.
3f50: 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20      pItem->done 
3f60: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
3f70: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
3f80: 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72 69   If cursors, tri
3f90: 67 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e 64  ggers, views and
3fa0: 20 73 75 62 71 75 65 72 69 65 73 20 61 72 65 20   subqueries are 
3fb0: 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d  all omitted from
3fc0: 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20 74  .** the build, t
3fd0: 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  hen none of the 
3fe0: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
3ff0: 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20 0a  es, except for .
4000: 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  ** sqlite3Select
4010: 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63 61  Dup(), can be ca
4020: 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65 6c  lled. sqlite3Sel
4030: 65 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d 65  ectDup() is some
4040: 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20  times.** called 
4050: 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67 75  with a NULL argu
4060: 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  ment..*/.#if !de
4070: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
4080: 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
4090: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
40a0: 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21  TRIGGER) \. || !
40b0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
40c0: 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53 72  MIT_SUBQUERY).Sr
40d0: 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
40e0: 63 4c 69 73 74 44 75 70 28 53 72 63 4c 69 73 74  cListDup(SrcList
40f0: 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20   *p){.  SrcList 
4100: 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pNew;.  int i;.
4110: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69    int nByte;.  i
4120: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
4130: 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69   0;.  nByte = si
4140: 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e  zeof(*p) + (p->n
4150: 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70  Src>0 ? sizeof(p
4160: 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53  ->a[0]) * (p->nS
4170: 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e  rc-1) : 0);.  pN
4180: 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ew = sqliteMallo
4190: 63 52 61 77 28 20 6e 42 79 74 65 20 29 3b 0a 20  cRaw( nByte );. 
41a0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
41b0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
41c0: 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41  >nSrc = pNew->nA
41d0: 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a  lloc = p->nSrc;.
41e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
41f0: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
4200: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
4210: 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20  tem *pNewItem = 
4220: 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20  &pNew->a[i];.   
4230: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
4240: 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d  item *pOldItem =
4250: 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54   &p->a[i];.    T
4260: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
4270: 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62  pNewItem->zDatab
4280: 61 73 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44  ase = sqliteStrD
4290: 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61  up(pOldItem->zDa
42a0: 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65  tabase);.    pNe
42b0: 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  wItem->zName = s
42c0: 71 6c 69 74 65 53 74 72 44 75 70 28 70 4f 6c 64  qliteStrDup(pOld
42d0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
42e0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69    pNewItem->zAli
42f0: 61 73 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75  as = sqliteStrDu
4300: 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69  p(pOldItem->zAli
4310: 61 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  as);.    pNewIte
4320: 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 4f  m->jointype = pO
4330: 6c 64 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ldItem->jointype
4340: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
4350: 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74  iCursor = pOldIt
4360: 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
4370: 20 70 4e 65 77 49 74 65 6d 2d 3e 69 73 50 6f 70   pNewItem->isPop
4380: 75 6c 61 74 65 64 20 3d 20 70 4f 6c 64 49 74 65  ulated = pOldIte
4390: 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 3b 0a  m->isPopulated;.
43a0: 20 20 20 20 70 54 61 62 20 3d 20 70 4e 65 77 49      pTab = pNewI
43b0: 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64  tem->pTab = pOld
43c0: 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
43d0: 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20  if( pTab ){.    
43e0: 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a    pTab->nRef++;.
43f0: 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74      }.    pNewIt
4400: 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  em->pSelect = sq
4410: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70  lite3SelectDup(p
4420: 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  OldItem->pSelect
4430: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
4440: 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78  >pOn = sqlite3Ex
4450: 70 72 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e  prDup(pOldItem->
4460: 70 4f 6e 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  pOn);.    pNewIt
4470: 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c  em->pUsing = sql
4480: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 70 4f  ite3IdListDup(pO
4490: 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b  ldItem->pUsing);
44a0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63  .    pNewItem->c
44b0: 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49 74 65  olUsed = pOldIte
44c0: 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a  m->colUsed;.  }.
44d0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
44e0: 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  .IdList *sqlite3
44f0: 49 64 4c 69 73 74 44 75 70 28 49 64 4c 69 73 74  IdListDup(IdList
4500: 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a   *p){.  IdList *
4510: 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pNew;.  int i;. 
4520: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
4530: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
4540: 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
4550: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b  sizeof(*pNew) );
4560: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
4570: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
4580: 77 2d 3e 6e 49 64 20 3d 20 70 4e 65 77 2d 3e 6e  w->nId = pNew->n
4590: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 49 64 3b 0a  Alloc = p->nId;.
45a0: 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69    pNew->a = sqli
45b0: 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 2d 3e  teMallocRaw( p->
45c0: 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  nId*sizeof(p->a[
45d0: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  0]) );.  if( pNe
45e0: 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73  w->a==0 ){.    s
45f0: 71 6c 69 74 65 46 72 65 65 28 70 4e 65 77 29 3b  qliteFree(pNew);
4600: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
4610: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
4620: 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  p->nId; i++){.  
4630: 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f    struct IdList_
4640: 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d  item *pNewItem =
4650: 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20   &pNew->a[i];.  
4660: 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f    struct IdList_
4670: 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d  item *pOldItem =
4680: 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70   &p->a[i];.    p
4690: 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d  NewItem->zName =
46a0: 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 70 4f   sqliteStrDup(pO
46b0: 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ldItem->zName);.
46c0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64      pNewItem->id
46d0: 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64  x = pOldItem->id
46e0: 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  x;.  }.  return 
46f0: 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a  pNew;.}.Select *
4700: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
4710: 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53  (Select *p){.  S
4720: 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 69  elect *pNew;.  i
4730: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
4740: 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   0;.  pNew = sql
4750: 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69  iteMallocRaw( si
4760: 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66  zeof(*p) );.  if
4770: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
4780: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 73  rn 0;.  pNew->is
4790: 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73  Distinct = p->is
47a0: 44 69 73 74 69 6e 63 74 3b 0a 20 20 70 4e 65 77  Distinct;.  pNew
47b0: 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74  ->pEList = sqlit
47c0: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 2d  e3ExprListDup(p-
47d0: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70 4e 65 77  >pEList);.  pNew
47e0: 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  ->pSrc = sqlite3
47f0: 53 72 63 4c 69 73 74 44 75 70 28 70 2d 3e 70 53  SrcListDup(p->pS
4800: 72 63 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68  rc);.  pNew->pWh
4810: 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
4820: 72 44 75 70 28 70 2d 3e 70 57 68 65 72 65 29 3b  rDup(p->pWhere);
4830: 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42  .  pNew->pGroupB
4840: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
4850: 69 73 74 44 75 70 28 70 2d 3e 70 47 72 6f 75 70  istDup(p->pGroup
4860: 42 79 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61  By);.  pNew->pHa
4870: 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78  ving = sqlite3Ex
4880: 70 72 44 75 70 28 70 2d 3e 70 48 61 76 69 6e 67  prDup(p->pHaving
4890: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  );.  pNew->pOrde
48a0: 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
48b0: 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 4f 72 64  rListDup(p->pOrd
48c0: 65 72 42 79 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f  erBy);.  pNew->o
48d0: 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e 65  p = p->op;.  pNe
48e0: 77 2d 3e 70 50 72 69 6f 72 20 3d 20 73 71 6c 69  w->pPrior = sqli
48f0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 70 2d 3e  te3SelectDup(p->
4900: 70 50 72 69 6f 72 29 3b 0a 20 20 70 4e 65 77 2d  pPrior);.  pNew-
4910: 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65  >pLimit = sqlite
4920: 33 45 78 70 72 44 75 70 28 70 2d 3e 70 4c 69 6d  3ExprDup(p->pLim
4930: 69 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66  it);.  pNew->pOf
4940: 66 73 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78  fset = sqlite3Ex
4950: 70 72 44 75 70 28 70 2d 3e 70 4f 66 66 73 65 74  prDup(p->pOffset
4960: 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69  );.  pNew->iLimi
4970: 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  t = -1;.  pNew->
4980: 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b 0a 20 20  iOffset = -1;.  
4990: 70 4e 65 77 2d 3e 69 73 52 65 73 6f 6c 76 65 64  pNew->isResolved
49a0: 20 3d 20 70 2d 3e 69 73 52 65 73 6f 6c 76 65 64   = p->isResolved
49b0: 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 41 67 67 20  ;.  pNew->isAgg 
49c0: 3d 20 70 2d 3e 69 73 41 67 67 3b 0a 20 20 70 4e  = p->isAgg;.  pN
49d0: 65 77 2d 3e 75 73 65 73 45 70 68 6d 20 3d 20 30  ew->usesEphm = 0
49e0: 3b 0a 20 20 70 4e 65 77 2d 3e 64 69 73 61 6c 6c  ;.  pNew->disall
49f0: 6f 77 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  owOrderBy = 0;. 
4a00: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 6d 6f 73   pNew->pRightmos
4a10: 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 61  t = 0;.  pNew->a
4a20: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
4a30: 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64   -1;.  pNew->add
4a40: 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d  rOpenEphm[1] = -
4a50: 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f  1;.  pNew->addrO
4a60: 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b  penEphm[2] = -1;
4a70: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
4a80: 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74 20 2a  }.#else.Select *
4a90: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
4aa0: 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 61  (Select *p){.  a
4ab0: 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20  ssert( p==0 );. 
4ac0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
4ad0: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  dif.../*.** Add 
4ae0: 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
4af0: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20 65   the end of an e
4b00: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20  xpression list. 
4b10: 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20   If pList is.** 
4b20: 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20  initially NULL, 
4b30: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65  then create a ne
4b40: 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  w expression lis
4b50: 74 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a  t..*/.ExprList *
4b60: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
4b70: 70 70 65 6e 64 28 45 78 70 72 4c 69 73 74 20 2a  ppend(ExprList *
4b80: 70 4c 69 73 74 2c 20 45 78 70 72 20 2a 70 45 78  pList, Expr *pEx
4b90: 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  pr, Token *pName
4ba0: 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  ){.  if( pList==
4bb0: 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
4bc0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
4bd0: 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20  izeof(ExprList) 
4be0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
4bf0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
4c00: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a  o no_mem;.    }.
4c10: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
4c20: 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a  t->nAlloc==0 );.
4c30: 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d    }.  if( pList-
4c40: 3e 6e 41 6c 6c 6f 63 3c 3d 70 4c 69 73 74 2d 3e  >nAlloc<=pList->
4c50: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 74 72  nExpr ){.    str
4c60: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
4c70: 6d 20 2a 61 3b 0a 20 20 20 20 69 6e 74 20 6e 20  m *a;.    int n 
4c80: 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a  = pList->nAlloc*
4c90: 32 20 2b 20 34 3b 0a 20 20 20 20 61 20 3d 20 73  2 + 4;.    a = s
4ca0: 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69  qliteRealloc(pLi
4cb0: 73 74 2d 3e 61 2c 20 6e 2a 73 69 7a 65 6f 66 28  st->a, n*sizeof(
4cc0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
4cd0: 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20     if( a==0 ){. 
4ce0: 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d       goto no_mem
4cf0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73  ;.    }.    pLis
4d00: 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 20 20 70 4c  t->a = a;.    pL
4d10: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 3b  ist->nAlloc = n;
4d20: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
4d30: 4c 69 73 74 2d 3e 61 21 3d 30 20 29 3b 0a 20 20  List->a!=0 );.  
4d40: 69 66 28 20 70 45 78 70 72 20 7c 7c 20 70 4e 61  if( pExpr || pNa
4d50: 6d 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  me ){.    struct
4d60: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
4d70: 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e  pItem = &pList->
4d80: 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b  a[pList->nExpr++
4d90: 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49  ];.    memset(pI
4da0: 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  tem, 0, sizeof(*
4db0: 70 49 74 65 6d 29 29 3b 0a 20 20 20 20 70 49 74  pItem));.    pIt
4dc0: 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
4dd0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
4de0: 28 70 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74  (pName);.    pIt
4df0: 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70  em->pExpr = pExp
4e00: 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  r;.  }.  return 
4e10: 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20  pList;..no_mem: 
4e20: 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20      .  /* Avoid 
4e30: 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69  leaking memory i
4e40: 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69  f malloc has fai
4e50: 6c 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  led. */.  sqlite
4e60: 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 78 70  3ExprDelete(pExp
4e70: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  r);.  sqlite3Exp
4e80: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  rListDelete(pLis
4e90: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  t);.  return 0;.
4ea0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
4eb0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
4ec0: 70 45 4c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20  pEList contains 
4ed0: 6d 6f 72 65 20 74 68 61 6e 20 69 4c 69 6d 69 74  more than iLimit
4ee0: 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65   elements,.** le
4ef0: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
4f00: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a  sage in pParse..
4f10: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
4f20: 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67  xprListCheckLeng
4f30: 74 68 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  th(.  Parse *pPa
4f40: 72 73 65 2c 0a 20 20 45 78 70 72 4c 69 73 74 20  rse,.  ExprList 
4f50: 2a 70 45 4c 69 73 74 2c 0a 20 20 69 6e 74 20 69  *pEList,.  int i
4f60: 4c 69 6d 69 74 2c 0a 20 20 63 6f 6e 73 74 20 63  Limit,.  const c
4f70: 68 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a  har *zObject.){.
4f80: 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20    if( pEList && 
4f90: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 69 4c  pEList->nExpr>iL
4fa0: 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
4fb0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
4fc0: 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f  se, "too many co
4fd0: 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c 20 7a 4f  lumns in %s", zO
4fe0: 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  bject);.  }.}...
4ff0: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45  #if SQLITE_MAX_E
5000: 58 50 52 5f 44 45 50 54 48 3e 30 0a 2f 2a 20 54  XPR_DEPTH>0./* T
5010: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72  he following thr
5020: 65 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65  ee functions, he
5030: 69 67 68 74 4f 66 45 78 70 72 28 29 2c 20 68 65  ightOfExpr(), he
5040: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 29  ightOfExprList()
5050: 0a 2a 2a 20 61 6e 64 20 68 65 69 67 68 74 4f 66  .** and heightOf
5060: 53 65 6c 65 63 74 28 29 2c 20 61 72 65 20 75 73  Select(), are us
5070: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
5080: 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67  the maximum heig
5090: 68 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70  ht.** of any exp
50a0: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66  ression tree ref
50b0: 65 72 65 6e 63 65 64 20 62 79 20 74 68 65 20 73  erenced by the s
50c0: 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
50d0: 61 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  as the.** first 
50e0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
50f0: 49 66 20 74 68 69 73 20 6d 61 78 69 6d 75 6d 20  If this maximum 
5100: 68 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65  height is greate
5110: 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
5120: 6e 74 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64  nt value pointed
5130: 0a 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65 69 67  .** to by pnHeig
5140: 68 74 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 70  ht, the second p
5150: 61 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20 73  arameter, then s
5160: 65 74 20 2a 70 6e 48 65 69 67 68 74 20 74 6f 20  et *pnHeight to 
5170: 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a  that.** value..*
5180: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65  /.static void he
5190: 69 67 68 74 4f 66 45 78 70 72 28 45 78 70 72 20  ightOfExpr(Expr 
51a0: 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68  *p, int *pnHeigh
51b0: 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  t){.  if( p ){. 
51c0: 20 20 20 69 66 28 20 70 2d 3e 6e 48 65 69 67 68     if( p->nHeigh
51d0: 74 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a 20  t>*pnHeight ){. 
51e0: 20 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d       *pnHeight =
51f0: 20 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20   p->nHeight;.   
5200: 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20   }.  }.}.static 
5210: 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78 70  void heightOfExp
5220: 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a  rList(ExprList *
5230: 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74  p, int *pnHeight
5240: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
5250: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
5260: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72  (i=0; i<p->nExpr
5270: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65  ; i++){.      he
5280: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b  ightOfExpr(p->a[
5290: 69 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65 69 67  i].pExpr, pnHeig
52a0: 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ht);.    }.  }.}
52b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
52c0: 67 68 74 4f 66 53 65 6c 65 63 74 28 53 65 6c 65  ghtOfSelect(Sele
52d0: 63 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65  ct *p, int *pnHe
52e0: 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29  ight){.  if( p )
52f0: 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  {.    heightOfEx
5300: 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 6e  pr(p->pWhere, pn
5310: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
5320: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 48 61  ghtOfExpr(p->pHa
5330: 76 69 6e 67 2c 20 70 6e 48 65 69 67 68 74 29 3b  ving, pnHeight);
5340: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
5350: 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e 48  r(p->pLimit, pnH
5360: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
5370: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4f 66 66  htOfExpr(p->pOff
5380: 73 65 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  set, pnHeight);.
5390: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
53a0: 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20  List(p->pEList, 
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 47 72 6f 75 70 42 79 2c 20 70 6e 48  p->pGroupBy, pnH
53e0: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
53f0: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e  htOfExprList(p->
5400: 70 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69 67  pOrderBy, pnHeig
5410: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
5420: 66 53 65 6c 65 63 74 28 70 2d 3e 70 50 72 69 6f  fSelect(p->pPrio
5430: 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  r, pnHeight);.  
5440: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
5450: 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20  he Expr.nHeight 
5460: 76 61 72 69 61 62 6c 65 20 69 6e 20 74 68 65 20  variable in the 
5470: 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
5480: 20 61 73 20 61 6e 20 0a 2a 2a 20 61 72 67 75 6d   as an .** argum
5490: 65 6e 74 2e 20 41 6e 20 65 78 70 72 65 73 73 69  ent. An expressi
54a0: 6f 6e 20 77 69 74 68 20 6e 6f 20 63 68 69 6c 64  on with no child
54b0: 72 65 6e 2c 20 45 78 70 72 2e 70 4c 69 73 74 20  ren, Expr.pList 
54c0: 6f 72 20 0a 2a 2a 20 45 78 70 72 2e 70 53 65 6c  or .** Expr.pSel
54d0: 65 63 74 20 6d 65 6d 62 65 72 20 68 61 73 20 61  ect member has a
54e0: 20 68 65 69 67 68 74 20 6f 66 20 31 2e 20 41 6e   height of 1. An
54f0: 79 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69  y other expressi
5500: 6f 6e 0a 2a 2a 20 68 61 73 20 61 20 68 65 69 67  on.** has a heig
5510: 68 74 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  ht equal to the 
5520: 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f  maximum height o
5530: 66 20 61 6e 79 20 6f 74 68 65 72 20 0a 2a 2a 20  f any other .** 
5540: 72 65 66 65 72 65 6e 63 65 64 20 45 78 70 72 20  referenced Expr 
5550: 70 6c 75 73 20 6f 6e 65 2e 0a 2a 2f 0a 76 6f 69  plus one..*/.voi
5560: 64 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74  d sqlite3ExprSet
5570: 48 65 69 67 68 74 28 45 78 70 72 20 2a 70 29 7b  Height(Expr *p){
5580: 0a 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d  .  int nHeight =
5590: 20 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78   0;.  heightOfEx
55a0: 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 6e 48  pr(p->pLeft, &nH
55b0: 65 69 67 68 74 29 3b 0a 20 20 68 65 69 67 68 74  eight);.  height
55c0: 4f 66 45 78 70 72 28 70 2d 3e 70 52 69 67 68 74  OfExpr(p->pRight
55d0: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 68  , &nHeight);.  h
55e0: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
55f0: 70 2d 3e 70 4c 69 73 74 2c 20 26 6e 48 65 69 67  p->pList, &nHeig
5600: 68 74 29 3b 0a 20 20 68 65 69 67 68 74 4f 66 53  ht);.  heightOfS
5610: 65 6c 65 63 74 28 70 2d 3e 70 53 65 6c 65 63 74  elect(p->pSelect
5620: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 70  , &nHeight);.  p
5630: 2d 3e 6e 48 65 69 67 68 74 20 3d 20 6e 48 65 69  ->nHeight = nHei
5640: 67 68 74 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  ght + 1;.}../*.*
5650: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 61 78  * Return the max
5660: 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61  imum height of a
5670: 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  ny expression tr
5680: 65 65 20 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a  ee referenced.**
5690: 20 62 79 20 74 68 65 20 73 65 6c 65 63 74 20 73   by the select s
56a0: 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20  tatement passed 
56b0: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a  as an argument..
56c0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
56d0: 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28 53  lectExprHeight(S
56e0: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74  elect *p){.  int
56f0: 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20   nHeight = 0;.  
5700: 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70  heightOfSelect(p
5710: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 72  , &nHeight);.  r
5720: 65 74 75 72 6e 20 6e 48 65 69 67 68 74 3b 0a 7d  eturn nHeight;.}
5730: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
5740: 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
5750: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
5760: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5770: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 45  ExprListDelete(E
5780: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
5790: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
57a0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
57b0: 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70   *pItem;.  if( p
57c0: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
57d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
57e0: 74 2d 3e 61 21 3d 30 20 7c 7c 20 28 70 4c 69 73  t->a!=0 || (pLis
57f0: 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 26 26 20 70  t->nExpr==0 && p
5800: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 29  List->nAlloc==0)
5810: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c   );.  assert( pL
5820: 69 73 74 2d 3e 6e 45 78 70 72 3c 3d 70 4c 69 73  ist->nExpr<=pLis
5830: 74 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 20 20 66  t->nAlloc );.  f
5840: 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
5850: 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  a, i=0; i<pList-
5860: 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
5870: 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  em++){.    sqlit
5880: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 49 74  e3ExprDelete(pIt
5890: 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
58a0: 73 71 6c 69 74 65 46 72 65 65 28 70 49 74 65 6d  sqliteFree(pItem
58b0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ->zName);.  }.  
58c0: 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
58d0: 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ->a);.  sqliteFr
58e0: 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  ee(pList);.}../*
58f0: 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
5900: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 43 61  ession tree.  Ca
5910: 6c 6c 20 78 46 75 6e 63 20 66 6f 72 20 65 61 63  ll xFunc for eac
5920: 68 20 6e 6f 64 65 20 76 69 73 69 74 65 64 2e 0a  h node visited..
5930: 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
5940: 20 76 61 6c 75 65 20 66 72 6f 6d 20 78 46 75 6e   value from xFun
5950: 63 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65  c determines whe
5960: 74 68 65 72 20 74 68 65 20 74 72 65 65 20 77 61  ther the tree wa
5970: 6c 6b 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 2a 2a  lk continues..**
5980: 20 30 20 6d 65 61 6e 73 20 63 6f 6e 74 69 6e 75   0 means continu
5990: 65 20 77 61 6c 6b 69 6e 67 20 74 68 65 20 74 72  e walking the tr
59a0: 65 65 2e 20 20 31 20 6d 65 61 6e 73 20 64 6f 20  ee.  1 means do 
59b0: 6e 6f 74 20 77 61 6c 6b 20 63 68 69 6c 64 72 65  not walk childre
59c0: 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 63 75 72 72  n.** of the curr
59d0: 65 6e 74 20 6e 6f 64 65 20 62 75 74 20 63 6f 6e  ent node but con
59e0: 74 69 6e 75 65 20 77 69 74 68 20 73 69 62 6c 69  tinue with sibli
59f0: 6e 67 73 2e 20 20 32 20 6d 65 61 6e 73 20 61 62  ngs.  2 means ab
5a00: 61 6e 64 6f 6e 0a 2a 2a 20 74 68 65 20 74 72 65  andon.** the tre
5a10: 65 20 77 61 6c 6b 20 63 6f 6d 70 6c 65 74 65 6c  e walk completel
5a20: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  y..**.** The ret
5a30: 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  urn value from t
5a40: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 31  his routine is 1
5a50: 20 74 6f 20 61 62 61 6e 64 6f 6e 20 74 68 65 20   to abandon the 
5a60: 74 72 65 65 20 77 61 6c 6b 0a 2a 2a 20 61 6e 64  tree walk.** and
5a70: 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a   0 to continue..
5a80: 2a 2a 0a 2a 2a 20 4e 4f 54 49 43 45 3a 20 20 54  **.** NOTICE:  T
5a90: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
5aa0: 20 2a 6e 6f 74 2a 20 64 65 73 63 65 6e 64 20 69   *not* descend i
5ab0: 6e 74 6f 20 73 75 62 71 75 65 72 69 65 73 2e 0a  nto subqueries..
5ac0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61  */.static int wa
5ad0: 6c 6b 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c  lkExprList(ExprL
5ae0: 69 73 74 20 2a 2c 20 69 6e 74 20 28 2a 29 28 76  ist *, int (*)(v
5af0: 6f 69 64 20 2a 2c 20 45 78 70 72 2a 29 2c 20 76  oid *, Expr*), v
5b00: 6f 69 64 20 2a 29 3b 0a 73 74 61 74 69 63 20 69  oid *);.static i
5b10: 6e 74 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  nt walkExprTree(
5b20: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
5b30: 20 28 2a 78 46 75 6e 63 29 28 76 6f 69 64 2a 2c   (*xFunc)(void*,
5b40: 45 78 70 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41  Expr*), void *pA
5b50: 72 67 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  rg){.  int rc;. 
5b60: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
5b70: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d  return 0;.  rc =
5b80: 20 28 2a 78 46 75 6e 63 29 28 70 41 72 67 2c 20   (*xFunc)(pArg, 
5b90: 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 72 63  pExpr);.  if( rc
5ba0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 77  ==0 ){.    if( w
5bb0: 61 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78 70  alkExprTree(pExp
5bc0: 72 2d 3e 70 4c 65 66 74 2c 20 78 46 75 6e 63 2c  r->pLeft, xFunc,
5bd0: 20 70 41 72 67 29 20 29 20 72 65 74 75 72 6e 20   pArg) ) return 
5be0: 31 3b 0a 20 20 20 20 69 66 28 20 77 61 6c 6b 45  1;.    if( walkE
5bf0: 78 70 72 54 72 65 65 28 70 45 78 70 72 2d 3e 70  xprTree(pExpr->p
5c00: 52 69 67 68 74 2c 20 78 46 75 6e 63 2c 20 70 41  Right, xFunc, pA
5c10: 72 67 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  rg) ) return 1;.
5c20: 20 20 20 20 69 66 28 20 77 61 6c 6b 45 78 70 72      if( walkExpr
5c30: 4c 69 73 74 28 70 45 78 70 72 2d 3e 70 4c 69 73  List(pExpr->pLis
5c40: 74 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 20  t, xFunc, pArg) 
5c50: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
5c60: 20 20 72 65 74 75 72 6e 20 72 63 3e 31 3b 0a 7d    return rc>1;.}
5c70: 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 77 61 6c  ../*.** Call wal
5c80: 6b 45 78 70 72 54 72 65 65 28 29 20 66 6f 72 20  kExprTree() for 
5c90: 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  every expression
5ca0: 20 69 6e 20 6c 69 73 74 20 70 2e 0a 2a 2f 0a 73   in list p..*/.s
5cb0: 74 61 74 69 63 20 69 6e 74 20 77 61 6c 6b 45 78  tatic int walkEx
5cc0: 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20  prList(ExprList 
5cd0: 2a 70 2c 20 69 6e 74 20 28 2a 78 46 75 6e 63 29  *p, int (*xFunc)
5ce0: 28 76 6f 69 64 20 2a 2c 20 45 78 70 72 2a 29 2c  (void *, Expr*),
5cf0: 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20   void *pArg){.  
5d00: 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
5d10: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
5d20: 49 74 65 6d 3b 0a 20 20 69 66 28 20 21 70 20 29  Item;.  if( !p )
5d30: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72   return 0;.  for
5d40: 28 69 3d 70 2d 3e 6e 45 78 70 72 2c 20 70 49 74  (i=p->nExpr, pIt
5d50: 65 6d 3d 70 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d  em=p->a; i>0; i-
5d60: 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
5d70: 20 69 66 28 20 77 61 6c 6b 45 78 70 72 54 72 65   if( walkExprTre
5d80: 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20  e(pItem->pExpr, 
5d90: 78 46 75 6e 63 2c 20 70 41 72 67 29 20 29 20 72  xFunc, pArg) ) r
5da0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
5db0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
5dc0: 2a 20 43 61 6c 6c 20 77 61 6c 6b 45 78 70 72 54  * Call walkExprT
5dd0: 72 65 65 28 29 20 66 6f 72 20 65 76 65 72 79 20  ree() for every 
5de0: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 53 65  expression in Se
5df0: 6c 65 63 74 20 70 2c 20 6e 6f 74 20 69 6e 63 6c  lect p, not incl
5e00: 75 64 69 6e 67 0a 2a 2a 20 65 78 70 72 65 73 73  uding.** express
5e10: 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 70 61  ions that are pa
5e20: 72 74 20 6f 66 20 73 75 62 2d 73 65 6c 65 63 74  rt of sub-select
5e30: 73 20 69 6e 20 61 6e 79 20 46 52 4f 4d 20 63 6c  s in any FROM cl
5e40: 61 75 73 65 20 6f 72 20 74 68 65 20 4c 49 4d 49  ause or the LIMI
5e50: 54 0a 2a 2a 20 6f 72 20 4f 46 46 53 45 54 20 65  T.** or OFFSET e
5e60: 78 70 72 65 73 73 69 6f 6e 73 2e 2e 0a 2a 2f 0a  xpressions...*/.
5e70: 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c 6b 53  static int walkS
5e80: 65 6c 65 63 74 45 78 70 72 28 53 65 6c 65 63 74  electExpr(Select
5e90: 20 2a 70 2c 20 69 6e 74 20 28 2a 78 46 75 6e 63   *p, int (*xFunc
5ea0: 29 28 76 6f 69 64 20 2a 2c 20 45 78 70 72 2a 29  )(void *, Expr*)
5eb0: 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
5ec0: 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 2d   walkExprList(p-
5ed0: 3e 70 45 4c 69 73 74 2c 20 78 46 75 6e 63 2c 20  >pEList, xFunc, 
5ee0: 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70  pArg);.  walkExp
5ef0: 72 54 72 65 65 28 70 2d 3e 70 57 68 65 72 65 2c  rTree(p->pWhere,
5f00: 20 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20   xFunc, pArg);. 
5f10: 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 2d   walkExprList(p-
5f20: 3e 70 47 72 6f 75 70 42 79 2c 20 78 46 75 6e 63  >pGroupBy, xFunc
5f30: 2c 20 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b 45  , pArg);.  walkE
5f40: 78 70 72 54 72 65 65 28 70 2d 3e 70 48 61 76 69  xprTree(p->pHavi
5f50: 6e 67 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29  ng, xFunc, pArg)
5f60: 3b 0a 20 20 77 61 6c 6b 45 78 70 72 4c 69 73 74  ;.  walkExprList
5f70: 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 78 46  (p->pOrderBy, xF
5f80: 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 69 66  unc, pArg);.  if
5f90: 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
5fa0: 20 20 20 77 61 6c 6b 53 65 6c 65 63 74 45 78 70     walkSelectExp
5fb0: 72 28 70 2d 3e 70 50 72 69 6f 72 2c 20 78 46 75  r(p->pPrior, xFu
5fc0: 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 7d 0a 20  nc, pArg);.  }. 
5fd0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f   return 0;.}.../
5fe0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
5ff0: 65 20 69 73 20 64 65 73 69 67 6e 65 64 20 61 73  e is designed as
6000: 20 61 6e 20 78 46 75 6e 63 20 66 6f 72 20 77 61   an xFunc for wa
6010: 6c 6b 45 78 70 72 54 72 65 65 28 29 2e 0a 2a 2a  lkExprTree()..**
6020: 0a 2a 2a 20 70 41 72 67 20 69 73 20 72 65 61 6c  .** pArg is real
6030: 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ly a pointer to 
6040: 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 49 66 20  an integer.  If 
6050: 77 65 20 63 61 6e 20 74 65 6c 6c 20 62 79 20 6c  we can tell by l
6060: 6f 6f 6b 69 6e 67 0a 2a 2a 20 61 74 20 70 45 78  ooking.** at pEx
6070: 70 72 20 74 68 61 74 20 74 68 65 20 65 78 70 72  pr that the expr
6080: 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74  ession that cont
6090: 61 69 6e 73 20 70 45 78 70 72 20 69 73 20 6e 6f  ains pExpr is no
60a0: 74 20 61 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20  t a constant.** 
60b0: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e  expression, then
60c0: 20 73 65 74 20 2a 70 41 72 67 20 74 6f 20 30 20   set *pArg to 0 
60d0: 61 6e 64 20 72 65 74 75 72 6e 20 32 20 74 6f 20  and return 2 to 
60e0: 61 62 61 6e 64 6f 6e 20 74 68 65 20 74 72 65 65  abandon the tree
60f0: 20 77 61 6c 6b 2e 0a 2a 2a 20 49 66 20 70 45 78   walk..** If pEx
6100: 70 72 20 64 6f 65 73 20 64 6f 65 73 20 6e 6f 74  pr does does not
6110: 20 64 69 73 71 75 61 6c 69 66 79 20 74 68 65 20   disqualify the 
6120: 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20  expression from 
6130: 62 65 69 6e 67 20 61 20 63 6f 6e 73 74 61 6e 74  being a constant
6140: 0a 2a 2a 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68  .** then do noth
6150: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72  ing..**.** After
6160: 20 77 61 6c 6b 69 6e 67 20 74 68 65 20 77 68 6f   walking the who
6170: 6c 65 20 74 72 65 65 2c 20 69 66 20 6e 6f 20 6e  le tree, if no n
6180: 6f 64 65 73 20 61 72 65 20 66 6f 75 6e 64 20 74  odes are found t
6190: 68 61 74 20 64 69 73 71 75 61 6c 69 66 79 0a 2a  hat disqualify.*
61a0: 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * the expression
61b0: 20 61 73 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68   as constant, th
61c0: 65 6e 20 77 65 20 61 73 73 75 6d 65 20 74 68 65  en we assume the
61d0: 20 77 68 6f 6c 65 20 65 78 70 72 65 73 73 69 6f   whole expressio
61e0: 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 74 61 6e 74  n.** is constant
61f0: 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 45 78  .  See sqlite3Ex
6200: 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 29 20 66  prIsConstant() f
6210: 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
6220: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  formation..*/.st
6230: 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64  atic int exprNod
6240: 65 49 73 43 6f 6e 73 74 61 6e 74 28 76 6f 69 64  eIsConstant(void
6250: 20 2a 70 41 72 67 2c 20 45 78 70 72 20 2a 70 45   *pArg, Expr *pE
6260: 78 70 72 29 7b 0a 20 20 69 6e 74 20 2a 70 4e 20  xpr){.  int *pN 
6270: 3d 20 28 69 6e 74 2a 29 70 41 72 67 3b 0a 0a 20  = (int*)pArg;.. 
6280: 20 2f 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20   /* If *pArg is 
6290: 33 20 74 68 65 6e 20 61 6e 79 20 74 65 72 6d 20  3 then any term 
62a0: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
62b0: 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66 72 6f  n that comes fro
62c0: 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f 72  m.  ** the ON or
62d0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f   USING clauses o
62e0: 66 20 61 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c  f a join disqual
62f0: 69 66 69 65 73 20 74 68 65 20 65 78 70 72 65 73  ifies the expres
6300: 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62  sion.  ** from b
6310: 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20  eing considered 
6320: 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69  constant. */.  i
6330: 66 28 20 28 2a 70 4e 29 3d 3d 33 20 26 26 20 45  f( (*pN)==3 && E
6340: 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74  xprHasAnyPropert
6350: 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
6360: 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 2a 70 4e  Join) ){.    *pN
6370: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
6380: 20 32 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63   2;.  }..  switc
6390: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
63a0: 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20      /* Consider 
63b0: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65 20  functions to be 
63c0: 63 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c 20  constant if all 
63d0: 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20  their arguments 
63e0: 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20  are constant.   
63f0: 20 2a 2a 20 61 6e 64 20 2a 70 41 72 67 3d 3d 32   ** and *pArg==2
6400: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
6410: 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20  FUNCTION:.      
6420: 69 66 28 20 28 2a 70 4e 29 3d 3d 32 20 29 20 72  if( (*pN)==2 ) r
6430: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 2f  eturn 0;.      /
6440: 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a  * Fall through *
6450: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44  /.    case TK_ID
6460: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
6470: 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  LUMN:.    case T
6480: 4b 5f 44 4f 54 3a 0a 20 20 20 20 63 61 73 65 20  K_DOT:.    case 
6490: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
64a0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
64b0: 5f 43 4f 4c 55 4d 4e 3a 0a 23 69 66 6e 64 65 66  _COLUMN:.#ifndef
64c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
64d0: 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
64e0: 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 63 61  K_SELECT:.    ca
64f0: 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 23 65  se TK_EXISTS:.#e
6500: 6e 64 69 66 0a 20 20 20 20 20 20 2a 70 4e 20 3d  ndif.      *pN =
6510: 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
6520: 20 32 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   2;.    case TK_
6530: 49 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70 45  IN:.      if( pE
6540: 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  xpr->pSelect ){.
6550: 20 20 20 20 20 20 20 20 2a 70 4e 20 3d 20 30 3b          *pN = 0;
6560: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
6570: 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 64  2;.      }.    d
6580: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65  efault:.      re
6590: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  turn 0;.  }.}../
65a0: 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
65b0: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
65c0: 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65  eturn 1 if the e
65d0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
65e0: 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69  stant.** and 0 i
65f0: 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61  f it involves va
6600: 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74  riables or funct
6610: 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a  ion calls..**.**
6620: 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   For the purpose
6630: 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
6640: 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f  on, a double-quo
6650: 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20  ted string (ex: 
6660: 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e  "abc").** is con
6670: 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62  sidered a variab
6680: 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d  le but a single-
6690: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
66a0: 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20  x: 'abc') is.** 
66b0: 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69  a constant..*/.i
66c0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
66d0: 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70  Constant(Expr *p
66e0: 29 7b 0a 20 20 69 6e 74 20 69 73 43 6f 6e 73 74  ){.  int isConst
66f0: 20 3d 20 31 3b 0a 20 20 77 61 6c 6b 45 78 70 72   = 1;.  walkExpr
6700: 54 72 65 65 28 70 2c 20 65 78 70 72 4e 6f 64 65  Tree(p, exprNode
6710: 49 73 43 6f 6e 73 74 61 6e 74 2c 20 26 69 73 43  IsConstant, &isC
6720: 6f 6e 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  onst);.  return 
6730: 69 73 43 6f 6e 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  isConst;.}../*.*
6740: 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
6750: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
6760: 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72  rn 1 if the expr
6770: 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61  ession is consta
6780: 6e 74 0a 2a 2a 20 74 68 61 74 20 64 6f 65 73 20  nt.** that does 
6790: 6e 6f 20 6f 72 69 67 69 6e 61 74 65 20 66 72 6f  no originate fro
67a0: 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  m the ON or USIN
67b0: 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a  G clauses of a j
67c0: 6f 69 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30  oin..** Return 0
67d0: 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20   if it involves 
67e0: 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e  variables or fun
67f0: 63 74 69 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74  ction calls or t
6800: 65 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20  erms from.** an 
6810: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
6820: 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
6830: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
6840: 4e 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29  NotJoin(Expr *p)
6850: 7b 0a 20 20 69 6e 74 20 69 73 43 6f 6e 73 74 20  {.  int isConst 
6860: 3d 20 33 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54  = 3;.  walkExprT
6870: 72 65 65 28 70 2c 20 65 78 70 72 4e 6f 64 65 49  ree(p, exprNodeI
6880: 73 43 6f 6e 73 74 61 6e 74 2c 20 26 69 73 43 6f  sConstant, &isCo
6890: 6e 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  nst);.  return i
68a0: 73 43 6f 6e 73 74 21 3d 30 3b 0a 7d 0a 0a 2f 2a  sConst!=0;.}../*
68b0: 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
68c0: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
68d0: 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78  turn 1 if the ex
68e0: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
68f0: 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e  tant.** or a fun
6900: 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20  ction call with 
6910: 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e  constant argumen
6920: 74 73 2e 20 20 52 65 74 75 72 6e 20 61 6e 64 20  ts.  Return and 
6930: 30 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72  0 if there.** ar
6940: 65 20 61 6e 79 20 76 61 72 69 61 62 6c 65 73 2e  e any variables.
6950: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70  .**.** For the p
6960: 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20  urposes of this 
6970: 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62  function, a doub
6980: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
6990: 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20   (ex: "abc").** 
69a0: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
69b0: 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73  variable but a s
69c0: 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ingle-quoted str
69d0: 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20  ing (ex: 'abc') 
69e0: 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74  is.** a constant
69f0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
6a00: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
6a10: 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a 70  Function(Expr *p
6a20: 29 7b 0a 20 20 69 6e 74 20 69 73 43 6f 6e 73 74  ){.  int isConst
6a30: 20 3d 20 32 3b 0a 20 20 77 61 6c 6b 45 78 70 72   = 2;.  walkExpr
6a40: 54 72 65 65 28 70 2c 20 65 78 70 72 4e 6f 64 65  Tree(p, exprNode
6a50: 49 73 43 6f 6e 73 74 61 6e 74 2c 20 26 69 73 43  IsConstant, &isC
6a60: 6f 6e 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  onst);.  return 
6a70: 69 73 43 6f 6e 73 74 21 3d 30 3b 0a 7d 0a 0a 2f  isConst!=0;.}../
6a80: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
6a90: 65 73 73 69 6f 6e 20 70 20 63 6f 64 65 73 20 61  ession p codes a
6aa0: 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65   constant intege
6ab0: 72 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20  r that is small 
6ac0: 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74  enough.** to fit
6ad0: 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74   in a 32-bit int
6ae0: 65 67 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61  eger, return 1 a
6af0: 6e 64 20 70 75 74 20 74 68 65 20 76 61 6c 75 65  nd put the value
6b00: 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a   of the integer.
6b10: 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20  ** in *pValue.  
6b20: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
6b30: 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65  n is not an inte
6b40: 67 65 72 20 6f 72 20 69 66 20 69 74 20 69 73 20  ger or if it is 
6b50: 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69  too big.** to fi
6b60: 74 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32  t in a signed 32
6b70: 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65  -bit integer, re
6b80: 74 75 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65  turn 0 and leave
6b90: 20 2a 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67   *pValue unchang
6ba0: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
6bb0: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
6bc0: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56  Expr *p, int *pV
6bd0: 61 6c 75 65 29 7b 0a 20 20 73 77 69 74 63 68 28  alue){.  switch(
6be0: 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61   p->op ){.    ca
6bf0: 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b  se TK_INTEGER: {
6c00: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
6c10: 65 33 47 65 74 49 6e 74 33 32 28 28 63 68 61 72  e3GetInt32((char
6c20: 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 56  *)p->token.z, pV
6c30: 61 6c 75 65 29 20 29 7b 0a 20 20 20 20 20 20 20  alue) ){.       
6c40: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
6c50: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
6c60: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
6c70: 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20  K_UPLUS: {.     
6c80: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
6c90: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e  xprIsInteger(p->
6ca0: 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a  pLeft, pValue);.
6cb0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
6cc0: 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20  K_UMINUS: {.    
6cd0: 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69    int v;.      i
6ce0: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
6cf0: 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74  Integer(p->pLeft
6d00: 2c 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20  , &v) ){.       
6d10: 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20   *pValue = -v;. 
6d20: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
6d30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
6d40: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
6d50: 64 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a  default: break;.
6d60: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
6d70: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
6d80: 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65  TRUE if the give
6d90: 6e 20 73 74 72 69 6e 67 20 69 73 20 61 20 72 6f  n string is a ro
6da0: 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  w-id column name
6db0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
6dc0: 49 73 52 6f 77 69 64 28 63 6f 6e 73 74 20 63 68  IsRowid(const ch
6dd0: 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71  ar *z){.  if( sq
6de0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
6df0: 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20  "_ROWID_")==0 ) 
6e00: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
6e10: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
6e20: 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30 20 29 20  , "ROWID")==0 ) 
6e30: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
6e40: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
6e50: 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29 20 72 65  , "OID")==0 ) re
6e60: 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e  turn 1;.  return
6e70: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76   0;.}../*.** Giv
6e80: 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  en the name of a
6e90: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66   column of the f
6ea0: 6f 72 6d 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a  orm X.Y.Z or Y.Z
6eb0: 20 6f 72 20 6a 75 73 74 20 5a 2c 20 6c 6f 6f 6b   or just Z, look
6ec0: 20 75 70 0a 2a 2a 20 74 68 61 74 20 6e 61 6d 65   up.** that name
6ed0: 20 69 6e 20 74 68 65 20 73 65 74 20 6f 66 20 73   in the set of s
6ee0: 6f 75 72 63 65 20 74 61 62 6c 65 73 20 69 6e 20  ource tables in 
6ef0: 70 53 72 63 4c 69 73 74 20 61 6e 64 20 6d 61 6b  pSrcList and mak
6f00: 65 20 74 68 65 20 70 45 78 70 72 20 0a 2a 2a 20  e the pExpr .** 
6f10: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
6f20: 72 65 66 65 72 20 62 61 63 6b 20 74 6f 20 74 68  refer back to th
6f30: 61 74 20 73 6f 75 72 63 65 20 63 6f 6c 75 6d 6e  at source column
6f40: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
6f50: 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20   changes.** are 
6f60: 6d 61 64 65 20 74 6f 20 70 45 78 70 72 3a 0a 2a  made to pExpr:.*
6f70: 2a 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 69  *.**    pExpr->i
6f80: 44 62 20 20 20 20 20 20 20 20 20 20 20 53 65 74  Db           Set
6f90: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 64 62   the index in db
6fa0: 2d 3e 61 44 62 5b 5d 20 6f 66 20 74 68 65 20 64  ->aDb[] of the d
6fb0: 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 0a  atabase holding.
6fc0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
6fd0: 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20 74             the t
6fe0: 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 70 45 78 70  able..**    pExp
6ff0: 72 2d 3e 69 54 61 62 6c 65 20 20 20 20 20 20 20  r->iTable       
7000: 20 53 65 74 20 74 6f 20 74 68 65 20 63 75 72 73   Set to the curs
7010: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  or number for th
7020: 65 20 74 61 62 6c 65 20 6f 62 74 61 69 6e 65 64  e table obtained
7030: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
7040: 20 20 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d              from
7050: 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2a 20 20 20   pSrcList..**   
7060: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
7070: 20 20 20 20 20 20 53 65 74 20 74 6f 20 74 68 65        Set to the
7080: 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77   column number w
7090: 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ithin the table.
70a0: 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  .**    pExpr->op
70b0: 20 20 20 20 20 20 20 20 20 20 20 20 53 65 74 20              Set 
70c0: 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 0a 2a 2a  to TK_COLUMN..**
70d0: 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
70e0: 20 20 20 20 20 20 20 20 20 41 6e 79 20 65 78 70           Any exp
70f0: 72 65 73 73 69 6f 6e 20 74 68 69 73 20 70 6f 69  ression this poi
7100: 6e 74 73 20 74 6f 20 69 73 20 64 65 6c 65 74 65  nts to is delete
7110: 64 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 70  d.**    pExpr->p
7120: 52 69 67 68 74 20 20 20 20 20 20 20 20 41 6e 79  Right        Any
7130: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 69 73   expression this
7140: 20 70 6f 69 6e 74 73 20 74 6f 20 69 73 20 64 65   points to is de
7150: 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  leted..**.** The
7160: 20 70 44 62 54 6f 6b 65 6e 20 69 73 20 74 68 65   pDbToken is the
7170: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
7180: 61 62 61 73 65 20 28 74 68 65 20 22 58 22 29 2e  abase (the "X").
7190: 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79    This value may
71a0: 20 62 65 0a 2a 2a 20 4e 55 4c 4c 20 6d 65 61 6e   be.** NULL mean
71b0: 69 6e 67 20 74 68 61 74 20 6e 61 6d 65 20 69 73  ing that name is
71c0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 59 2e 5a   of the form Y.Z
71d0: 20 6f 72 20 5a 2e 20 20 41 6e 79 20 61 76 61 69   or Z.  Any avai
71e0: 6c 61 62 6c 65 20 64 61 74 61 62 61 73 65 0a 2a  lable database.*
71f0: 2a 20 63 61 6e 20 62 65 20 75 73 65 64 2e 20 20  * can be used.  
7200: 54 68 65 20 70 54 61 62 6c 65 54 6f 6b 65 6e 20  The pTableToken 
7210: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
7220: 68 65 20 74 61 62 6c 65 20 28 74 68 65 20 22 59  he table (the "Y
7230: 22 29 2e 20 20 54 68 69 73 0a 2a 2a 20 76 61 6c  ").  This.** val
7240: 75 65 20 63 61 6e 20 62 65 20 4e 55 4c 4c 20 69  ue can be NULL i
7250: 66 20 70 44 62 54 6f 6b 65 6e 20 69 73 20 61 6c  f pDbToken is al
7260: 73 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 70 54 61  so NULL.  If pTa
7270: 62 6c 65 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c  bleToken is NULL
7280: 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61   it.** means tha
7290: 74 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 74 68  t the form of th
72a0: 65 20 6e 61 6d 65 20 69 73 20 5a 20 61 6e 64 20  e name is Z and 
72b0: 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f  that columns fro
72c0: 6d 20 61 6e 79 20 74 61 62 6c 65 0a 2a 2a 20 63  m any table.** c
72d0: 61 6e 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a  an be used..**.*
72e0: 2a 20 49 66 20 74 68 65 20 6e 61 6d 65 20 63 61  * If the name ca
72f0: 6e 6e 6f 74 20 62 65 20 72 65 73 6f 6c 76 65 64  nnot be resolved
7300: 20 75 6e 61 6d 62 69 67 75 6f 75 73 6c 79 2c 20   unambiguously, 
7310: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
7320: 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61  essage.** in pPa
7330: 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6e  rse and return n
7340: 6f 6e 2d 7a 65 72 6f 2e 20 20 52 65 74 75 72 6e  on-zero.  Return
7350: 20 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73   zero on success
7360: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7370: 6c 6f 6f 6b 75 70 4e 61 6d 65 28 0a 20 20 50 61  lookupName(.  Pa
7380: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
7390: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
73a0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
73b0: 6f 6b 65 6e 20 2a 70 44 62 54 6f 6b 65 6e 2c 20  oken *pDbToken, 
73c0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
73d0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  he database cont
73e0: 61 69 6e 69 6e 67 20 74 61 62 6c 65 2c 20 6f 72  aining table, or
73f0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e   NULL */.  Token
7400: 20 2a 70 54 61 62 6c 65 54 6f 6b 65 6e 2c 20 20   *pTableToken,  
7410: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65  /* Name of table
7420: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75   containing colu
7430: 6d 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  mn, or NULL */. 
7440: 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e 54   Token *pColumnT
7450: 6f 6b 65 6e 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66  oken, /* Name of
7460: 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a   the column. */.
7470: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
7480: 4e 43 2c 20 20 20 20 2f 2a 20 54 68 65 20 6e 61  NC,    /* The na
7490: 6d 65 20 63 6f 6e 74 65 78 74 20 75 73 65 64 20  me context used 
74a0: 74 6f 20 72 65 73 6f 6c 76 65 20 74 68 65 20 6e  to resolve the n
74b0: 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ame */.  Expr *p
74c0: 45 78 70 72 20 20 20 20 20 20 20 20 20 20 2f 2a  Expr          /*
74d0: 20 4d 61 6b 65 20 74 68 69 73 20 45 58 50 52 20   Make this EXPR 
74e0: 6e 6f 64 65 20 70 6f 69 6e 74 20 74 6f 20 74 68  node point to th
74f0: 65 20 73 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d  e selected colum
7500: 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  n */.){.  char *
7510: 7a 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  zDb = 0;       /
7520: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
7530: 74 61 62 61 73 65 2e 20 20 54 68 65 20 22 58 22  tabase.  The "X"
7540: 20 69 6e 20 58 2e 59 2e 5a 20 2a 2f 0a 20 20 63   in X.Y.Z */.  c
7550: 68 61 72 20 2a 7a 54 61 62 20 3d 20 30 3b 20 20  har *zTab = 0;  
7560: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
7570: 68 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 22  he table.  The "
7580: 59 22 20 69 6e 20 58 2e 59 2e 5a 20 6f 72 20 59  Y" in X.Y.Z or Y
7590: 2e 5a 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43  .Z */.  char *zC
75a0: 6f 6c 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  ol = 0;      /* 
75b0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75  Name of the colu
75c0: 6d 6e 2e 20 20 54 68 65 20 22 5a 22 20 2a 2f 0a  mn.  The "Z" */.
75d0: 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
75e0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
75f0: 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
7600: 20 63 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20   cnt = 0;       
7610: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d    /* Number of m
7620: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e  atching column n
7630: 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  ames */.  int cn
7640: 74 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 2f  tTab = 0;      /
7650: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63  * Number of matc
7660: 68 69 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65 73  hing table names
7670: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
7680: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
7690: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
76a0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
76b0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
76c0: 3b 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 66  ;       /* Use f
76d0: 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
76e0: 70 53 72 63 4c 69 73 74 20 69 74 65 6d 73 20 2a  pSrcList items *
76f0: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
7700: 73 74 5f 69 74 65 6d 20 2a 70 4d 61 74 63 68 20  st_item *pMatch 
7710: 3d 20 30 3b 20 20 2f 2a 20 54 68 65 20 6d 61 74  = 0;  /* The mat
7720: 63 68 69 6e 67 20 70 53 72 63 4c 69 73 74 20 69  ching pSrcList i
7730: 74 65 6d 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e  tem */.  NameCon
7740: 74 65 78 74 20 2a 70 54 6f 70 4e 43 20 3d 20 70  text *pTopNC = p
7750: 4e 43 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69  NC;        /* Fi
7760: 72 73 74 20 6e 61 6d 65 63 6f 6e 74 65 78 74 20  rst namecontext 
7770: 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 0a  in the list */..
7780: 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 75 6d    assert( pColum
7790: 6e 54 6f 6b 65 6e 20 26 26 20 70 43 6f 6c 75 6d  nToken && pColum
77a0: 6e 54 6f 6b 65 6e 2d 3e 7a 20 29 3b 20 2f 2a 20  nToken->z ); /* 
77b0: 54 68 65 20 5a 20 69 6e 20 58 2e 59 2e 5a 20 63  The Z in X.Y.Z c
77c0: 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  annot be NULL */
77d0: 0a 20 20 7a 44 62 20 3d 20 73 71 6c 69 74 65 33  .  zDb = sqlite3
77e0: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 44  NameFromToken(pD
77f0: 62 54 6f 6b 65 6e 29 3b 0a 20 20 7a 54 61 62 20  bToken);.  zTab 
7800: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
7810: 6d 54 6f 6b 65 6e 28 70 54 61 62 6c 65 54 6f 6b  mToken(pTableTok
7820: 65 6e 29 3b 0a 20 20 7a 43 6f 6c 20 3d 20 73 71  en);.  zCol = sq
7830: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
7840: 65 6e 28 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 29  en(pColumnToken)
7850: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d  ;.  if( sqlite3M
7860: 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b  allocFailed() ){
7870: 0a 20 20 20 20 67 6f 74 6f 20 6c 6f 6f 6b 75 70  .    goto lookup
7880: 6e 61 6d 65 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20  name_end;.  }.. 
7890: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
78a0: 20 2d 31 3b 0a 20 20 77 68 69 6c 65 28 20 70 4e   -1;.  while( pN
78b0: 43 20 26 26 20 63 6e 74 3d 3d 30 20 29 7b 0a 20  C && cnt==0 ){. 
78c0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
78d0: 69 73 74 3b 0a 20 20 20 20 53 72 63 4c 69 73 74  ist;.    SrcList
78e0: 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43   *pSrcList = pNC
78f0: 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 0a 20 20 20  ->pSrcList;..   
7900: 20 69 66 28 20 70 53 72 63 4c 69 73 74 20 29 7b   if( pSrcList ){
7910: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  .      for(i=0, 
7920: 70 49 74 65 6d 3d 70 53 72 63 4c 69 73 74 2d 3e  pItem=pSrcList->
7930: 61 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e  a; i<pSrcList->n
7940: 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  Src; i++, pItem+
7950: 2b 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c  +){.        Tabl
7960: 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 20  e *pTab;.       
7970: 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20   int iDb;.      
7980: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
7990: 20 20 0a 20 20 20 20 20 20 20 20 70 54 61 62 20    .        pTab 
79a0: 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  = pItem->pTab;. 
79b0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
79c0: 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab!=0 );.      
79d0: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
79e0: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
79f0: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
7a00: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7a10: 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b   pTab->nCol>0 );
7a20: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61  .        if( zTa
7a30: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  b ){.          i
7a40: 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  f( pItem->zAlias
7a50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
7a60: 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d  char *zTabName =
7a70: 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a   pItem->zAlias;.
7a80: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
7a90: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
7aa0: 54 61 62 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d  TabName, zTab)!=
7ab0: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
7ac0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
7ad0: 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
7ae0: 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62  *zTabName = pTab
7af0: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
7b00: 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d       if( zTabNam
7b10: 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53  e==0 || sqlite3S
7b20: 74 72 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65 2c  trICmp(zTabName,
7b30: 20 7a 54 61 62 29 21 3d 30 20 29 20 63 6f 6e 74   zTab)!=0 ) cont
7b40: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
7b50: 20 20 69 66 28 20 7a 44 62 21 3d 30 20 26 26 20    if( zDb!=0 && 
7b60: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 64  sqlite3StrICmp(d
7b70: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
7b80: 65 2c 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20  e, zDb)!=0 ){.  
7b90: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
7ba0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
7bb0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
7bc0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7bd0: 20 20 69 66 28 20 30 3d 3d 28 63 6e 74 54 61 62    if( 0==(cntTab
7be0: 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ++) ){.         
7bf0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
7c00: 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b   pItem->iCursor;
7c10: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
7c20: 2d 3e 70 53 63 68 65 6d 61 20 3d 20 70 54 61 62  ->pSchema = pTab
7c30: 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20  ->pSchema;.     
7c40: 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70 49       pMatch = pI
7c50: 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  tem;.        }. 
7c60: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20         for(j=0, 
7c70: 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b  pCol=pTab->aCol;
7c80: 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
7c90: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
7ca0: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
7cb0: 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e  e3StrICmp(pCol->
7cc0: 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20  zName, zCol)==0 
7cd0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
7ce0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
7cf0: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d   = pTab->aCol[j]
7d00: 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  .zColl;.        
7d10: 20 20 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69      IdList *pUsi
7d20: 6e 67 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ng;.            
7d30: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  cnt++;.         
7d40: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
7d50: 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f   = pItem->iCurso
7d60: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  r;.            p
7d70: 4d 61 74 63 68 20 3d 20 70 49 74 65 6d 3b 0a 20  Match = pItem;. 
7d80: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
7d90: 2d 3e 70 53 63 68 65 6d 61 20 3d 20 70 54 61 62  ->pSchema = pTab
7da0: 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20  ->pSchema;.     
7db0: 20 20 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69         /* Substi
7dc0: 74 75 74 65 20 74 68 65 20 72 6f 77 69 64 20 28  tute the rowid (
7dd0: 63 6f 6c 75 6d 6e 20 2d 31 29 20 66 6f 72 20 74  column -1) for t
7de0: 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  he INTEGER PRIMA
7df0: 52 59 20 4b 45 59 20 2a 2f 0a 20 20 20 20 20 20  RY KEY */.      
7e00: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
7e10: 6c 75 6d 6e 20 3d 20 6a 3d 3d 70 54 61 62 2d 3e  lumn = j==pTab->
7e20: 69 50 4b 65 79 20 3f 20 2d 31 20 3a 20 6a 3b 0a  iPKey ? -1 : j;.
7e30: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
7e40: 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 70 54  r->affinity = pT
7e50: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66 69  ab->aCol[j].affi
7e60: 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20 20 20  nity;.          
7e70: 20 20 69 66 28 20 28 70 45 78 70 72 2d 3e 66 6c    if( (pExpr->fl
7e80: 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c  ags & EP_ExpColl
7e90: 61 74 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ate)==0 ){.     
7ea0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
7eb0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
7ec0: 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45  indCollSeq(db, E
7ed0: 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 2d 31  NC(db), zColl,-1
7ee0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
7ef0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
7f00: 69 66 28 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e  if( i<pSrcList->
7f10: 6e 53 72 63 2d 31 20 29 7b 0a 20 20 20 20 20 20  nSrc-1 ){.      
7f20: 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
7f30: 6d 5b 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20  m[1].jointype & 
7f40: 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20  JT_NATURAL ){.  
7f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7f60: 20 49 66 20 74 68 69 73 20 6d 61 74 63 68 20 6f   If this match o
7f70: 63 63 75 72 72 65 64 20 69 6e 20 74 68 65 20 6c  ccurred in the l
7f80: 65 66 74 20 74 61 62 6c 65 20 6f 66 20 61 20 6e  eft table of a n
7f90: 61 74 75 72 61 6c 20 6a 6f 69 6e 2c 0a 20 20 20  atural join,.   
7fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
7fb0: 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 72 69  then skip the ri
7fc0: 67 68 74 20 74 61 62 6c 65 20 74 6f 20 61 76 6f  ght table to avo
7fd0: 69 64 20 61 20 64 75 70 6c 69 63 61 74 65 20 6d  id a duplicate m
7fe0: 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20  atch */.        
7ff0: 20 20 20 20 20 20 20 20 70 49 74 65 6d 2b 2b 3b          pItem++;
8000: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8010: 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   i++;.          
8020: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
8030: 55 73 69 6e 67 20 3d 20 70 49 74 65 6d 5b 31 5d  Using = pItem[1]
8040: 2e 70 55 73 69 6e 67 29 21 3d 30 20 29 7b 0a 20  .pUsing)!=0 ){. 
8050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8060: 2a 20 49 66 20 74 68 69 73 20 6d 61 74 63 68 20  * If this match 
8070: 6f 63 63 75 72 73 20 6f 6e 20 61 20 63 6f 6c 75  occurs on a colu
8080: 6d 6e 20 74 68 61 74 20 69 73 20 69 6e 20 74 68  mn that is in th
8090: 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 0a 20  e USING clause. 
80a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
80b0: 2a 20 6f 66 20 61 20 6a 6f 69 6e 2c 20 73 6b 69  * of a join, ski
80c0: 70 20 74 68 65 20 73 65 61 72 63 68 20 6f 66 20  p the search of 
80d0: 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20  the right table 
80e0: 6f 66 20 74 68 65 20 6a 6f 69 6e 0a 20 20 20 20  of the join.    
80f0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
8100: 6f 20 61 76 6f 69 64 20 61 20 64 75 70 6c 69 63  o avoid a duplic
8110: 61 74 65 20 6d 61 74 63 68 20 74 68 65 72 65 2e  ate match there.
8120: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
8130: 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20      int k;.     
8140: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b             for(k
8150: 3d 30 3b 20 6b 3c 70 55 73 69 6e 67 2d 3e 6e 49  =0; k<pUsing->nI
8160: 64 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; k++){.       
8170: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
8180: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 55  qlite3StrICmp(pU
8190: 73 69 6e 67 2d 3e 61 5b 6b 5d 2e 7a 4e 61 6d 65  sing->a[k].zName
81a0: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20  , zCol)==0 ){.  
81b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81c0: 20 20 70 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20    pItem++;.     
81d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
81e0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
81f0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8210: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
8220: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
8230: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
8240: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62   }.            b
8250: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
8260: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
8270: 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64    }.    }..#ifnd
8280: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
8290: 52 49 47 47 45 52 0a 20 20 20 20 2f 2a 20 49 66  RIGGER.    /* If
82a0: 20 77 65 20 68 61 76 65 20 6e 6f 74 20 61 6c 72   we have not alr
82b0: 65 61 64 79 20 72 65 73 6f 6c 76 65 64 20 74 68  eady resolved th
82c0: 65 20 6e 61 6d 65 2c 20 74 68 65 6e 20 6d 61 79  e name, then may
82d0: 62 65 20 0a 20 20 20 20 2a 2a 20 69 74 20 69 73  be .    ** it is
82e0: 20 61 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e   a new.* or old.
82f0: 2a 20 74 72 69 67 67 65 72 20 61 72 67 75 6d 65  * trigger argume
8300: 6e 74 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20  nt reference.   
8310: 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44 62 3d   */.    if( zDb=
8320: 3d 30 20 26 26 20 7a 54 61 62 21 3d 30 20 26 26  =0 && zTab!=0 &&
8330: 20 63 6e 74 3d 3d 30 20 26 26 20 70 50 61 72 73   cnt==0 && pPars
8340: 65 2d 3e 74 72 69 67 53 74 61 63 6b 21 3d 30 20  e->trigStack!=0 
8350: 29 7b 0a 20 20 20 20 20 20 54 72 69 67 67 65 72  ){.      Trigger
8360: 53 74 61 63 6b 20 2a 70 54 72 69 67 67 65 72 53  Stack *pTriggerS
8370: 74 61 63 6b 20 3d 20 70 50 61 72 73 65 2d 3e 74  tack = pParse->t
8380: 72 69 67 53 74 61 63 6b 3b 0a 20 20 20 20 20 20  rigStack;.      
8390: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
83a0: 0a 20 20 20 20 20 20 69 66 28 20 70 54 72 69 67  .      if( pTrig
83b0: 67 65 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64 78  gerStack->newIdx
83c0: 20 21 3d 20 2d 31 20 26 26 20 73 71 6c 69 74 65   != -1 && sqlite
83d0: 33 53 74 72 49 43 6d 70 28 22 6e 65 77 22 2c 20  3StrICmp("new", 
83e0: 7a 54 61 62 29 20 3d 3d 20 30 20 29 7b 0a 20 20  zTab) == 0 ){.  
83f0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
8400: 62 6c 65 20 3d 20 70 54 72 69 67 67 65 72 53 74  ble = pTriggerSt
8410: 61 63 6b 2d 3e 6e 65 77 49 64 78 3b 0a 20 20 20  ack->newIdx;.   
8420: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72       assert( pTr
8430: 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62  iggerStack->pTab
8440: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62   );.        pTab
8450: 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63 6b   = pTriggerStack
8460: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 7d 65  ->pTab;.      }e
8470: 6c 73 65 20 69 66 28 20 70 54 72 69 67 67 65 72  lse if( pTrigger
8480: 53 74 61 63 6b 2d 3e 6f 6c 64 49 64 78 20 21 3d  Stack->oldIdx !=
8490: 20 2d 31 20 26 26 20 73 71 6c 69 74 65 33 53 74   -1 && sqlite3St
84a0: 72 49 43 6d 70 28 22 6f 6c 64 22 2c 20 7a 54 61  rICmp("old", zTa
84b0: 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  b)==0 ){.       
84c0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
84d0: 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e   pTriggerStack->
84e0: 6f 6c 64 49 64 78 3b 0a 20 20 20 20 20 20 20 20  oldIdx;.        
84f0: 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72  assert( pTrigger
8500: 53 74 61 63 6b 2d 3e 70 54 61 62 20 29 3b 0a 20  Stack->pTab );. 
8510: 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54         pTab = pT
8520: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61  riggerStack->pTa
8530: 62 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  b;.      }..    
8540: 20 20 69 66 28 20 70 54 61 62 20 29 7b 20 0a 20    if( pTab ){ . 
8550: 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b         int iCol;
8560: 0a 20 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20  .        Column 
8570: 2a 70 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43  *pCol = pTab->aC
8580: 6f 6c 3b 0a 0a 20 20 20 20 20 20 20 20 70 45 78  ol;..        pEx
8590: 70 72 2d 3e 70 53 63 68 65 6d 61 20 3d 20 70 54  pr->pSchema = pT
85a0: 61 62 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20  ab->pSchema;.   
85b0: 20 20 20 20 20 63 6e 74 54 61 62 2b 2b 3b 0a 20       cntTab++;. 
85c0: 20 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d         for(iCol=
85d0: 30 3b 20 69 43 6f 6c 20 3c 20 70 54 61 62 2d 3e  0; iCol < pTab->
85e0: 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 2c 20 70 43  nCol; iCol++, pC
85f0: 6f 6c 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20 20  ol++) {.        
8600: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
8610: 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  ICmp(pCol->zName
8620: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20  , zCol)==0 ){.  
8630: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
8640: 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 54  char *zColl = pT
8650: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
8660: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  Coll;.          
8670: 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20    cnt++;.       
8680: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
8690: 75 6d 6e 20 3d 20 69 43 6f 6c 3d 3d 70 54 61 62  umn = iCol==pTab
86a0: 2d 3e 69 50 4b 65 79 20 3f 20 2d 31 20 3a 20 69  ->iPKey ? -1 : i
86b0: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Col;.           
86c0: 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
86d0: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
86e0: 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  ol].affinity;.  
86f0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
8700: 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
8710: 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3d 3d 30 20  _ExpCollate)==0 
8720: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
8730: 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20   pExpr->pColl = 
8740: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
8750: 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20  eq(db, ENC(db), 
8760: 7a 43 6f 6c 6c 2c 2d 31 2c 20 30 29 3b 0a 20 20  zColl,-1, 0);.  
8770: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8780: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
8790: 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20  Tab = pTab;.    
87a0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
87b0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
87c0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
87d0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65   }.#endif /* !de
87e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
87f0: 54 5f 54 52 49 47 47 45 52 29 20 2a 2f 0a 0a 20  T_TRIGGER) */.. 
8800: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 50 65 72     /*.    ** Per
8810: 68 61 70 73 20 74 68 65 20 6e 61 6d 65 20 69 73  haps the name is
8820: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
8830: 74 68 65 20 52 4f 57 49 44 0a 20 20 20 20 2a 2f  the ROWID.    */
8840: 0a 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20  .    if( cnt==0 
8850: 26 26 20 63 6e 74 54 61 62 3d 3d 31 20 26 26 20  && cntTab==1 && 
8860: 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a  sqlite3IsRowid(z
8870: 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 63 6e  Col) ){.      cn
8880: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 45 78  t = 1;.      pEx
8890: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31  pr->iColumn = -1
88a0: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61  ;.      pExpr->a
88b0: 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
88c0: 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20  _AFF_INTEGER;.  
88d0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
88e0: 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20  ** If the input 
88f0: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 5a  is of the form Z
8900: 20 28 6e 6f 74 20 59 2e 5a 20 6f 72 20 58 2e 59   (not Y.Z or X.Y
8910: 2e 5a 29 20 74 68 65 6e 20 74 68 65 20 6e 61 6d  .Z) then the nam
8920: 65 20 5a 0a 20 20 20 20 2a 2a 20 6d 69 67 68 74  e Z.    ** might
8930: 20 72 65 66 65 72 20 74 6f 20 61 6e 20 72 65 73   refer to an res
8940: 75 6c 74 2d 73 65 74 20 61 6c 69 61 73 2e 20 20  ult-set alias.  
8950: 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20 66 6f  This happens, fo
8960: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a  r example, when.
8970: 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20 72 65      ** we are re
8980: 73 6f 6c 76 69 6e 67 20 6e 61 6d 65 73 20 69 6e  solving names in
8990: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
89a0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
89b0: 6e 67 20 63 6f 6d 6d 61 6e 64 3a 0a 20 20 20 20  ng command:.    
89c0: 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 45  **.    **     SE
89d0: 4c 45 43 54 20 61 2b 62 20 41 53 20 78 20 46 52  LECT a+b AS x FR
89e0: 4f 4d 20 74 61 62 6c 65 20 57 48 45 52 45 20 78  OM table WHERE x
89f0: 3c 31 30 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  <10;.    **.    
8a00: 2a 2a 20 49 6e 20 63 61 73 65 73 20 6c 69 6b 65  ** In cases like
8a10: 20 74 68 69 73 2c 20 72 65 70 6c 61 63 65 20 70   this, replace p
8a20: 45 78 70 72 20 77 69 74 68 20 61 20 63 6f 70 79  Expr with a copy
8a30: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
8a40: 6f 6e 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 66  on that.    ** f
8a50: 6f 72 6d 73 20 74 68 65 20 72 65 73 75 6c 74 20  orms the result 
8a60: 73 65 74 20 65 6e 74 72 79 20 28 22 61 2b 62 22  set entry ("a+b"
8a70: 20 69 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 29   in the example)
8a80: 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d 65   and return imme
8a90: 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20  diately..    ** 
8aa0: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 65 78  Note that the ex
8ab0: 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20  pression in the 
8ac0: 72 65 73 75 6c 74 20 73 65 74 20 73 68 6f 75 6c  result set shoul
8ad0: 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  d have already b
8ae0: 65 65 6e 0a 20 20 20 20 2a 2a 20 72 65 73 6f 6c  een.    ** resol
8af0: 76 65 64 20 62 79 20 74 68 65 20 74 69 6d 65 20  ved by the time 
8b00: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
8b10: 20 69 73 20 72 65 73 6f 6c 76 65 64 2e 0a 20 20   is resolved..  
8b20: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e 74    */.    if( cnt
8b30: 3d 3d 30 20 26 26 20 28 70 45 4c 69 73 74 20 3d  ==0 && (pEList =
8b40: 20 70 4e 43 2d 3e 70 45 4c 69 73 74 29 21 3d 30   pNC->pEList)!=0
8b50: 20 26 26 20 7a 54 61 62 3d 3d 30 20 29 7b 0a 20   && zTab==0 ){. 
8b60: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
8b70: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a  pEList->nExpr; j
8b80: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
8b90: 72 20 2a 7a 41 73 20 3d 20 70 45 4c 69 73 74 2d  r *zAs = pEList-
8ba0: 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >a[j].zName;.   
8bb0: 20 20 20 20 20 69 66 28 20 7a 41 73 21 3d 30 20       if( zAs!=0 
8bc0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
8bd0: 70 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d 3d 30 20  p(zAs, zCol)==0 
8be0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
8bf0: 72 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 20  r *pDup;.       
8c00: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
8c10: 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45  ->pLeft==0 && pE
8c20: 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  xpr->pRight==0 )
8c30: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
8c40: 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  rt( pExpr->pList
8c50: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
8c60: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
8c70: 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20  pSelect==0 );.  
8c80: 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 73          pDup = s
8c90: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 45  qlite3ExprDup(pE
8ca0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72  List->a[j].pExpr
8cb0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
8cc0: 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20   pExpr->flags & 
8cd0: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b  EP_ExpCollate ){
8ce0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 44 75  .            pDu
8cf0: 70 2d 3e 70 43 6f 6c 6c 20 3d 20 70 45 78 70 72  p->pColl = pExpr
8d00: 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  ->pColl;.       
8d10: 20 20 20 20 20 70 44 75 70 2d 3e 66 6c 61 67 73       pDup->flags
8d20: 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74   |= EP_ExpCollat
8d30: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
8d40: 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
8d50: 70 45 78 70 72 2c 20 70 44 75 70 2c 20 73 69 7a  pExpr, pDup, siz
8d60: 65 6f 66 28 2a 70 45 78 70 72 29 29 3b 0a 20 20  eof(*pExpr));.  
8d70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
8d80: 65 65 28 70 44 75 70 29 3b 0a 20 20 20 20 20 20  ee(pDup);.      
8d90: 20 20 20 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20      cnt = 1;.   
8da0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a         assert( z
8db0: 54 61 62 3d 3d 30 20 26 26 20 7a 44 62 3d 3d 30  Tab==0 && zDb==0
8dc0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   );.          go
8dd0: 74 6f 20 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e  to lookupname_en
8de0: 64 5f 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  d_2;.        }. 
8df0: 20 20 20 20 20 7d 20 0a 20 20 20 20 7d 0a 0a 20       } .    }.. 
8e00: 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 74 6f     /* Advance to
8e10: 20 74 68 65 20 6e 65 78 74 20 6e 61 6d 65 20 63   the next name c
8e20: 6f 6e 74 65 78 74 2e 20 20 54 68 65 20 6c 6f 6f  ontext.  The loo
8e30: 70 20 77 69 6c 6c 20 65 78 69 74 20 77 68 65 6e  p will exit when
8e40: 20 65 69 74 68 65 72 0a 20 20 20 20 2a 2a 20 77   either.    ** w
8e50: 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 20 28  e have a match (
8e60: 63 6e 74 3e 30 29 20 6f 72 20 77 68 65 6e 20 77  cnt>0) or when w
8e70: 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6e 61 6d  e run out of nam
8e80: 65 20 63 6f 6e 74 65 78 74 73 2e 0a 20 20 20 20  e contexts..    
8e90: 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e 74 3d 3d  */.    if( cnt==
8ea0: 30 20 29 7b 0a 20 20 20 20 20 20 70 4e 43 20 3d  0 ){.      pNC =
8eb0: 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pNC->pNext;.   
8ec0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a   }.  }..  /*.  *
8ed0: 2a 20 49 66 20 58 20 61 6e 64 20 59 20 61 72 65  * If X and Y are
8ee0: 20 4e 55 4c 4c 20 28 69 6e 20 6f 74 68 65 72 20   NULL (in other 
8ef0: 77 6f 72 64 73 20 69 66 20 6f 6e 6c 79 20 74 68  words if only th
8f00: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 5a 20  e column name Z 
8f10: 69 73 0a 20 20 2a 2a 20 73 75 70 70 6c 69 65 64  is.  ** supplied
8f20: 29 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20  ) and the value 
8f30: 6f 66 20 5a 20 69 73 20 65 6e 63 6c 6f 73 65 64  of Z is enclosed
8f40: 20 69 6e 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65   in double-quote
8f50: 73 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 5a 20 69  s, then.  ** Z i
8f60: 73 20 61 20 73 74 72 69 6e 67 20 6c 69 74 65 72  s a string liter
8f70: 61 6c 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74  al if it doesn't
8f80: 20 6d 61 74 63 68 20 61 6e 79 20 63 6f 6c 75 6d   match any colum
8f90: 6e 20 6e 61 6d 65 73 2e 20 20 49 6e 20 74 68 61  n names.  In tha
8fa0: 74 0a 20 20 2a 2a 20 63 61 73 65 2c 20 77 65 20  t.  ** case, we 
8fb0: 6e 65 65 64 20 74 6f 20 72 65 74 75 72 6e 20 72  need to return r
8fc0: 69 67 68 74 20 61 77 61 79 20 61 6e 64 20 6e 6f  ight away and no
8fd0: 74 20 6d 61 6b 65 20 61 6e 79 20 63 68 61 6e 67  t make any chang
8fe0: 65 73 20 74 6f 0a 20 20 2a 2a 20 70 45 78 70 72  es to.  ** pExpr
8ff0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 65 63 61  ..  **.  ** Beca
9000: 75 73 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65  use no reference
9010: 20 77 61 73 20 6d 61 64 65 20 74 6f 20 6f 75 74   was made to out
9020: 65 72 20 63 6f 6e 74 65 78 74 73 2c 20 74 68 65  er contexts, the
9030: 20 70 4e 43 2d 3e 6e 52 65 66 0a 20 20 2a 2a 20   pNC->nRef.  ** 
9040: 66 69 65 6c 64 73 20 61 72 65 20 6e 6f 74 20 63  fields are not c
9050: 68 61 6e 67 65 64 20 69 6e 20 61 6e 79 20 63 6f  hanged in any co
9060: 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  ntext..  */.  if
9070: 28 20 63 6e 74 3d 3d 30 20 26 26 20 7a 54 61 62  ( cnt==0 && zTab
9080: 3d 3d 30 20 26 26 20 70 43 6f 6c 75 6d 6e 54 6f  ==0 && pColumnTo
9090: 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 22 27 20 29  ken->z[0]=='"' )
90a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
90b0: 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 72 65 74 75  (zCol);.    retu
90c0: 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  rn 0;.  }..  /*.
90d0: 20 20 2a 2a 20 63 6e 74 3d 3d 30 20 6d 65 61 6e    ** cnt==0 mean
90e0: 73 20 74 68 65 72 65 20 77 61 73 20 6e 6f 74 20  s there was not 
90f0: 6d 61 74 63 68 2e 20 20 63 6e 74 3e 31 20 6d 65  match.  cnt>1 me
9100: 61 6e 73 20 74 68 65 72 65 20 77 65 72 65 20 74  ans there were t
9110: 77 6f 20 6f 72 0a 20 20 2a 2a 20 6d 6f 72 65 20  wo or.  ** more 
9120: 6d 61 74 63 68 65 73 2e 20 20 45 69 74 68 65 72  matches.  Either
9130: 20 77 61 79 2c 20 77 65 20 68 61 76 65 20 61 6e   way, we have an
9140: 20 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69   error..  */.  i
9150: 66 28 20 63 6e 74 21 3d 31 20 29 7b 0a 20 20 20  f( cnt!=1 ){.   
9160: 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20   char *z = 0;.  
9170: 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20    char *zErr;.  
9180: 20 20 7a 45 72 72 20 3d 20 63 6e 74 3d 3d 30 20    zErr = cnt==0 
9190: 3f 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d  ? "no such colum
91a0: 6e 3a 20 25 73 22 20 3a 20 22 61 6d 62 69 67 75  n: %s" : "ambigu
91b0: 6f 75 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a  ous column name:
91c0: 20 25 73 22 3b 0a 20 20 20 20 69 66 28 20 7a 44   %s";.    if( zD
91d0: 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  b ){.      sqlit
91e0: 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a 2c 20  e3SetString(&z, 
91f0: 7a 44 62 2c 20 22 2e 22 2c 20 7a 54 61 62 2c 20  zDb, ".", zTab, 
9200: 22 2e 22 2c 20 7a 43 6f 6c 2c 20 28 63 68 61 72  ".", zCol, (char
9210: 2a 29 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  *)0);.    }else 
9220: 69 66 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20  if( zTab ){.    
9230: 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
9240: 6e 67 28 26 7a 2c 20 7a 54 61 62 2c 20 22 2e 22  ng(&z, zTab, "."
9250: 2c 20 7a 43 6f 6c 2c 20 28 63 68 61 72 2a 29 30  , zCol, (char*)0
9260: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
9270: 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 53 74      z = sqliteSt
9280: 72 44 75 70 28 7a 43 6f 6c 29 3b 0a 20 20 20 20  rDup(zCol);.    
9290: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  }.    sqlite3Err
92a0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 7a 45  orMsg(pParse, zE
92b0: 72 72 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69  rr, z);.    sqli
92c0: 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 70  teFree(z);.    p
92d0: 54 6f 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  TopNC->nErr++;. 
92e0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 63 6f   }..  /* If a co
92f0: 6c 75 6d 6e 20 66 72 6f 6d 20 61 20 74 61 62 6c  lumn from a tabl
9300: 65 20 69 6e 20 70 53 72 63 4c 69 73 74 20 69 73  e in pSrcList is
9310: 20 72 65 66 65 72 65 6e 63 65 64 2c 20 74 68 65   referenced, the
9320: 6e 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 74 68  n record.  ** th
9330: 69 73 20 66 61 63 74 20 69 6e 20 74 68 65 20 70  is fact in the p
9340: 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 63 6f 6c 55  SrcList.a[].colU
9350: 73 65 64 20 62 69 74 6d 61 73 6b 2e 20 20 43 6f  sed bitmask.  Co
9360: 6c 75 6d 6e 20 30 20 63 61 75 73 65 73 0a 20 20  lumn 0 causes.  
9370: 2a 2a 20 62 69 74 20 30 20 74 6f 20 62 65 20 73  ** bit 0 to be s
9380: 65 74 2e 20 20 43 6f 6c 75 6d 6e 20 31 20 73 65  et.  Column 1 se
9390: 74 73 20 62 69 74 20 31 2e 20 20 41 6e 64 20 73  ts bit 1.  And s
93a0: 6f 20 66 6f 72 74 68 2e 20 20 49 66 20 74 68 65  o forth.  If the
93b0: 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 75 6d  .  ** column num
93c0: 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ber is greater t
93d0: 68 61 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  han the number o
93e0: 66 20 62 69 74 73 20 69 6e 20 74 68 65 20 62 69  f bits in the bi
93f0: 74 6d 61 73 6b 0a 20 20 2a 2a 20 74 68 65 6e 20  tmask.  ** then 
9400: 73 65 74 20 74 68 65 20 68 69 67 68 2d 6f 72 64  set the high-ord
9410: 65 72 20 62 69 74 20 6f 66 20 74 68 65 20 62 69  er bit of the bi
9420: 74 6d 61 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66  tmask..  */.  if
9430: 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
9440: 3e 3d 30 20 26 26 20 70 4d 61 74 63 68 21 3d 30  >=0 && pMatch!=0
9450: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20   ){.    int n = 
9460: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
9470: 20 20 20 20 69 66 28 20 6e 3e 3d 73 69 7a 65 6f      if( n>=sizeo
9480: 66 28 42 69 74 6d 61 73 6b 29 2a 38 20 29 7b 0a  f(Bitmask)*8 ){.
9490: 20 20 20 20 20 20 6e 20 3d 20 73 69 7a 65 6f 66        n = sizeof
94a0: 28 42 69 74 6d 61 73 6b 29 2a 38 2d 31 3b 0a 20  (Bitmask)*8-1;. 
94b0: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
94c0: 20 70 4d 61 74 63 68 2d 3e 69 43 75 72 73 6f 72   pMatch->iCursor
94d0: 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  ==pExpr->iTable 
94e0: 29 3b 0a 20 20 20 20 70 4d 61 74 63 68 2d 3e 63  );.    pMatch->c
94f0: 6f 6c 55 73 65 64 20 7c 3d 20 28 28 42 69 74 6d  olUsed |= ((Bitm
9500: 61 73 6b 29 31 29 3c 3c 6e 3b 0a 20 20 7d 0a 0a  ask)1)<<n;.  }..
9510: 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 3a 0a  lookupname_end:.
9520: 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e    /* Clean up an
9530: 64 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20  d return.  */.  
9540: 73 71 6c 69 74 65 46 72 65 65 28 7a 44 62 29 3b  sqliteFree(zDb);
9550: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 54  .  sqliteFree(zT
9560: 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ab);.  sqlite3Ex
9570: 70 72 44 65 6c 65 74 65 28 70 45 78 70 72 2d 3e  prDelete(pExpr->
9580: 70 4c 65 66 74 29 3b 0a 20 20 70 45 78 70 72 2d  pLeft);.  pExpr-
9590: 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 73 71  >pLeft = 0;.  sq
95a0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
95b0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
95c0: 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20    pExpr->pRight 
95d0: 3d 20 30 3b 0a 20 20 70 45 78 70 72 2d 3e 6f 70  = 0;.  pExpr->op
95e0: 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 6c 6f   = TK_COLUMN;.lo
95f0: 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 5f 32 3a 0a  okupname_end_2:.
9600: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 43 6f    sqliteFree(zCo
9610: 6c 29 3b 0a 20 20 69 66 28 20 63 6e 74 3d 3d 31  l);.  if( cnt==1
9620: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
9630: 70 4e 43 21 3d 30 20 29 3b 0a 20 20 20 20 73 71  pNC!=0 );.    sq
9640: 6c 69 74 65 33 41 75 74 68 52 65 61 64 28 70 50  lite3AuthRead(pP
9650: 61 72 73 65 2c 20 70 45 78 70 72 2c 20 70 4e 43  arse, pExpr, pNC
9660: 2d 3e 70 53 72 63 4c 69 73 74 29 3b 0a 20 20 20  ->pSrcList);.   
9670: 20 69 66 28 20 70 4d 61 74 63 68 20 26 26 20 21   if( pMatch && !
9680: 70 4d 61 74 63 68 2d 3e 70 53 65 6c 65 63 74 20  pMatch->pSelect 
9690: 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  ){.      pExpr->
96a0: 70 54 61 62 20 3d 20 70 4d 61 74 63 68 2d 3e 70  pTab = pMatch->p
96b0: 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  Tab;.    }.    /
96c0: 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
96d0: 6e 52 65 66 20 76 61 6c 75 65 20 6f 6e 20 61 6c  nRef value on al
96e0: 6c 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 73 20  l name contexts 
96f0: 66 72 6f 6d 20 54 6f 70 4e 43 20 75 70 20 74 6f  from TopNC up to
9700: 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e  .    ** the poin
9710: 74 20 77 68 65 72 65 20 74 68 65 20 6e 61 6d 65  t where the name
9720: 20 6d 61 74 63 68 65 64 2e 20 2a 2f 0a 20 20 20   matched. */.   
9730: 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
9740: 61 73 73 65 72 74 28 20 70 54 6f 70 4e 43 21 3d  assert( pTopNC!=
9750: 30 20 29 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e  0 );.      pTopN
9760: 43 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20  C->nRef++;.     
9770: 20 69 66 28 20 70 54 6f 70 4e 43 3d 3d 70 4e 43   if( pTopNC==pNC
9780: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
9790: 70 54 6f 70 4e 43 20 3d 20 70 54 6f 70 4e 43 2d  pTopNC = pTopNC-
97a0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
97b0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20    return 0;.  } 
97c0: 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72  else {.    retur
97d0: 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  n 1;.  }.}../*.*
97e0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
97f0: 73 20 64 65 73 69 67 6e 65 64 20 61 73 20 61 6e  s designed as an
9800: 20 78 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b 45   xFunc for walkE
9810: 78 70 72 54 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a  xprTree()..**.**
9820: 20 52 65 73 6f 6c 76 65 20 73 79 6d 62 6f 6c 69   Resolve symboli
9830: 63 20 6e 61 6d 65 73 20 69 6e 74 6f 20 54 4b 5f  c names into TK_
9840: 43 4f 4c 55 4d 4e 20 6f 70 65 72 61 74 6f 72 73  COLUMN operators
9850: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
9860: 0a 2a 2a 20 6e 6f 64 65 20 69 6e 20 74 68 65 20  .** node in the 
9870: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
9880: 20 20 52 65 74 75 72 6e 20 30 20 74 6f 20 63 6f    Return 0 to co
9890: 6e 74 69 6e 75 65 20 74 68 65 20 73 65 61 72 63  ntinue the searc
98a0: 68 20 64 6f 77 6e 0a 2a 2a 20 74 68 65 20 74 72  h down.** the tr
98b0: 65 65 20 6f 72 20 32 20 74 6f 20 61 62 6f 72 74  ee or 2 to abort
98c0: 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b 2e 0a   the tree walk..
98d0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
98e0: 6e 65 20 61 6c 73 6f 20 64 6f 65 73 20 65 72 72  ne also does err
98f0: 6f 72 20 63 68 65 63 6b 69 6e 67 20 61 6e 64 20  or checking and 
9900: 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20  name resolution 
9910: 66 6f 72 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  for.** function 
9920: 6e 61 6d 65 73 2e 20 20 54 68 65 20 6f 70 65 72  names.  The oper
9930: 61 74 6f 72 20 66 6f 72 20 61 67 67 72 65 67 61  ator for aggrega
9940: 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 73 20  te functions is 
9950: 63 68 61 6e 67 65 64 0a 2a 2a 20 74 6f 20 54 4b  changed.** to TK
9960: 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 2e 0a 2a  _AGG_FUNCTION..*
9970: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 61 6d  /.static int nam
9980: 65 52 65 73 6f 6c 76 65 72 53 74 65 70 28 76 6f  eResolverStep(vo
9990: 69 64 20 2a 70 41 72 67 2c 20 45 78 70 72 20 2a  id *pArg, Expr *
99a0: 70 45 78 70 72 29 7b 0a 20 20 4e 61 6d 65 43 6f  pExpr){.  NameCo
99b0: 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 28 4e 61  ntext *pNC = (Na
99c0: 6d 65 43 6f 6e 74 65 78 74 2a 29 70 41 72 67 3b  meContext*)pArg;
99d0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
99e0: 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ;..  if( pExpr==
99f0: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
9a00: 61 73 73 65 72 74 28 20 70 4e 43 21 3d 30 20 29  assert( pNC!=0 )
9a10: 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 4e 43  ;.  pParse = pNC
9a20: 2d 3e 70 50 61 72 73 65 3b 0a 0a 20 20 69 66 28  ->pParse;..  if(
9a30: 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65   ExprHasAnyPrope
9a40: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 52 65  rty(pExpr, EP_Re
9a50: 73 6f 6c 76 65 64 29 20 29 20 72 65 74 75 72 6e  solved) ) return
9a60: 20 31 3b 0a 20 20 45 78 70 72 53 65 74 50 72 6f   1;.  ExprSetPro
9a70: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
9a80: 52 65 73 6f 6c 76 65 64 29 3b 0a 23 69 66 6e 64  Resolved);.#ifnd
9a90: 65 66 20 4e 44 45 42 55 47 0a 20 20 69 66 28 20  ef NDEBUG.  if( 
9aa0: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 20 26 26  pNC->pSrcList &&
9ab0: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 2d 3e   pNC->pSrcList->
9ac0: 6e 41 6c 6c 6f 63 3e 30 20 29 7b 0a 20 20 20 20  nAlloc>0 ){.    
9ad0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73  SrcList *pSrcLis
9ae0: 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
9af0: 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  t;.    int i;.  
9b00: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 43    for(i=0; i<pNC
9b10: 2d 3e 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63  ->pSrcList->nSrc
9b20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; i++){.      as
9b30: 73 65 72 74 28 20 70 53 72 63 4c 69 73 74 2d 3e  sert( pSrcList->
9b40: 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3e 3d 30 20  a[i].iCursor>=0 
9b50: 26 26 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69  && pSrcList->a[i
9b60: 5d 2e 69 43 75 72 73 6f 72 3c 70 50 61 72 73 65  ].iCursor<pParse
9b70: 2d 3e 6e 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20  ->nTab);.    }. 
9b80: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 77 69 74   }.#endif.  swit
9b90: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
9ba0: 0a 20 20 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 71  .    /* Double-q
9bb0: 75 6f 74 65 64 20 73 74 72 69 6e 67 73 20 28 65  uoted strings (e
9bc0: 78 3a 20 22 61 62 63 22 29 20 61 72 65 20 75 73  x: "abc") are us
9bd0: 65 64 20 61 73 20 69 64 65 6e 74 69 66 69 65 72  ed as identifier
9be0: 73 20 69 66 0a 20 20 20 20 2a 2a 20 70 6f 73 73  s if.    ** poss
9bf0: 69 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65  ible.  Otherwise
9c00: 20 74 68 65 79 20 72 65 6d 61 69 6e 20 61 73 20   they remain as 
9c10: 73 74 72 69 6e 67 73 2e 20 20 53 69 6e 67 6c 65  strings.  Single
9c20: 2d 71 75 6f 74 65 64 0a 20 20 20 20 2a 2a 20 73  -quoted.    ** s
9c30: 74 72 69 6e 67 73 20 28 65 78 3a 20 27 61 62 63  trings (ex: 'abc
9c40: 27 29 20 61 72 65 20 61 6c 77 61 79 73 20 73 74  ') are always st
9c50: 72 69 6e 67 20 6c 69 74 65 72 61 6c 73 2e 0a 20  ring literals.. 
9c60: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54     */.    case T
9c70: 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20  K_STRING: {.    
9c80: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b    if( pExpr->tok
9c90: 65 6e 2e 7a 5b 30 5d 3d 3d 27 5c 27 27 20 29 20  en.z[0]=='\'' ) 
9ca0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 2f 2a 20  break;.      /* 
9cb0: 46 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74  Fall thru into t
9cc0: 68 65 20 54 4b 5f 49 44 20 63 61 73 65 20 69 66  he TK_ID case if
9cd0: 20 74 68 69 73 20 69 73 20 61 20 64 6f 75 62 6c   this is a doubl
9ce0: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
9cf0: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  */.    }.    /* 
9d00: 41 20 6c 6f 6e 65 20 69 64 65 6e 74 69 66 69 65  A lone identifie
9d10: 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  r is the name of
9d20: 20 61 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a   a column..    *
9d30: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44  /.    case TK_ID
9d40: 3a 20 7b 0a 20 20 20 20 20 20 6c 6f 6f 6b 75 70  : {.      lookup
9d50: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 30 2c 20  Name(pParse, 0, 
9d60: 30 2c 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  0, &pExpr->token
9d70: 2c 20 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20  , pNC, pExpr);. 
9d80: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
9d90: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 41     }.  .    /* A
9da0: 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
9db0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20 20 20  column name:    
9dc0: 20 49 44 2e 49 44 0a 20 20 20 20 2a 2a 20 4f 72   ID.ID.    ** Or
9dd0: 20 61 20 64 61 74 61 62 61 73 65 2c 20 74 61 62   a database, tab
9de0: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 3a 20 20  le and column:  
9df0: 49 44 2e 49 44 2e 49 44 0a 20 20 20 20 2a 2f 0a  ID.ID.ID.    */.
9e00: 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a      case TK_DOT:
9e10: 20 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a   {.      Token *
9e20: 70 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 54  pColumn;.      T
9e30: 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 3b 0a 20 20  oken *pTable;.  
9e40: 20 20 20 20 54 6f 6b 65 6e 20 2a 70 44 62 3b 0a      Token *pDb;.
9e50: 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
9e60: 68 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 69 66  ht;..      /* if
9e70: 28 20 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20  ( pSrcList==0 ) 
9e80: 62 72 65 61 6b 3b 20 2a 2f 0a 20 20 20 20 20 20  break; */.      
9e90: 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
9ea0: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66  pRight;.      if
9eb0: 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ( pRight->op==TK
9ec0: 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _ID ){.        p
9ed0: 44 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  Db = 0;.        
9ee0: 70 54 61 62 6c 65 20 3d 20 26 70 45 78 70 72 2d  pTable = &pExpr-
9ef0: 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20  >pLeft->token;. 
9f00: 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d         pColumn =
9f10: 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 3b   &pRight->token;
9f20: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9f30: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52        assert( pR
9f40: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  ight->op==TK_DOT
9f50: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62 20   );.        pDb 
9f60: 3d 20 26 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  = &pExpr->pLeft-
9f70: 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  >token;.        
9f80: 70 54 61 62 6c 65 20 3d 20 26 70 52 69 67 68 74  pTable = &pRight
9f90: 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a  ->pLeft->token;.
9fa0: 20 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20          pColumn 
9fb0: 3d 20 26 70 52 69 67 68 74 2d 3e 70 52 69 67 68  = &pRight->pRigh
9fc0: 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  t->token;.      
9fd0: 7d 0a 20 20 20 20 20 20 6c 6f 6f 6b 75 70 4e 61  }.      lookupNa
9fe0: 6d 65 28 70 50 61 72 73 65 2c 20 70 44 62 2c 20  me(pParse, pDb, 
9ff0: 70 54 61 62 6c 65 2c 20 70 43 6f 6c 75 6d 6e 2c  pTable, pColumn,
a000: 20 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20 20   pNC, pExpr);.  
a010: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
a020: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 6f    }..    /* Reso
a030: 6c 76 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  lve function nam
a040: 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  es.    */.    ca
a050: 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43  se TK_CONST_FUNC
a060: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  :.    case TK_FU
a070: 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
a080: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
a090: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 20  = pExpr->pList; 
a0a0: 20 20 20 2f 2a 20 54 68 65 20 61 72 67 75 6d 65     /* The argume
a0b0: 6e 74 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20  nt list */.     
a0c0: 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 20 3f   int n = pList ?
a0d0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20   pList->nExpr : 
a0e0: 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  0;  /* Number of
a0f0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
a100: 20 20 20 20 69 6e 74 20 6e 6f 5f 73 75 63 68 5f      int no_such_
a110: 66 75 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20  func = 0;       
a120: 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f 20 73 75  /* True if no su
a130: 63 68 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73  ch function exis
a140: 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
a150: 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d  wrong_num_args =
a160: 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20   0;     /* True 
a170: 69 66 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20  if wrong number 
a180: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
a190: 20 20 20 20 20 20 69 6e 74 20 69 73 5f 61 67 67        int is_agg
a1a0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
a1b0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 73 20    /* True if is 
a1c0: 61 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  an aggregate fun
a1d0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ction */.      i
a1e0: 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20  nt i;.      int 
a1f0: 61 75 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  auth;           
a200: 20 20 20 20 20 20 20 20 2f 2a 20 41 75 74 68 6f          /* Autho
a210: 72 69 7a 61 74 69 6f 6e 20 74 6f 20 75 73 65 20  rization to use 
a220: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  the function */.
a230: 20 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 20 20        int nId;  
a240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a250: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
a260: 68 61 72 61 63 74 65 72 73 20 69 6e 20 66 75 6e  haracters in fun
a270: 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
a280: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
a290: 7a 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  zId;            
a2a0: 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20  /* The function 
a2b0: 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 46  name. */.      F
a2c0: 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20  uncDef *pDef;   
a2d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
a2e0: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
a2f0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  the function */.
a300: 20 20 20 20 20 20 69 6e 74 20 65 6e 63 20 3d 20        int enc = 
a310: 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b  ENC(pParse->db);
a320: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
a330: 65 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 0a 20  e encoding */.. 
a340: 20 20 20 20 20 7a 49 64 20 3d 20 28 63 68 61 72       zId = (char
a350: 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  *)pExpr->token.z
a360: 3b 0a 20 20 20 20 20 20 6e 49 64 20 3d 20 70 45  ;.      nId = pE
a370: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20  xpr->token.n;.  
a380: 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
a390: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70  e3FindFunction(p
a3a0: 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20  Parse->db, zId, 
a3b0: 6e 49 64 2c 20 6e 2c 20 65 6e 63 2c 20 30 29 3b  nId, n, enc, 0);
a3c0: 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d  .      if( pDef=
a3d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  =0 ){.        pD
a3e0: 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ef = sqlite3Find
a3f0: 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d  Function(pParse-
a400: 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 2d  >db, zId, nId, -
a410: 31 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20  1, enc, 0);.    
a420: 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20      if( pDef==0 
a430: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 5f  ){.          no_
a440: 73 75 63 68 5f 66 75 6e 63 20 3d 20 31 3b 0a 20  such_func = 1;. 
a450: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
a460: 20 20 20 20 20 20 20 20 77 72 6f 6e 67 5f 6e 75          wrong_nu
a470: 6d 5f 61 72 67 73 20 3d 20 31 3b 0a 20 20 20 20  m_args = 1;.    
a480: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
a490: 65 7b 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67  e{.        is_ag
a4a0: 67 20 3d 20 70 44 65 66 2d 3e 78 46 75 6e 63 3d  g = pDef->xFunc=
a4b0: 3d 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e  =0;.      }.#ifn
a4c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a4d0: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
a4e0: 20 20 20 20 69 66 28 20 70 44 65 66 20 29 7b 0a      if( pDef ){.
a4f0: 20 20 20 20 20 20 20 20 61 75 74 68 20 3d 20 73          auth = s
a500: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
a510: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 46  pParse, SQLITE_F
a520: 55 4e 43 54 49 4f 4e 2c 20 30 2c 20 70 44 65 66  UNCTION, 0, pDef
a530: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
a540: 20 20 20 20 20 69 66 28 20 61 75 74 68 21 3d 53       if( auth!=S
a550: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
a560: 20 20 20 20 20 20 69 66 28 20 61 75 74 68 3d 3d        if( auth==
a570: 53 51 4c 49 54 45 5f 44 45 4e 59 20 29 7b 0a 20  SQLITE_DENY ){. 
a580: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
a590: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
a5a0: 65 2c 20 22 6e 6f 74 20 61 75 74 68 6f 72 69 7a  e, "not authoriz
a5b0: 65 64 20 74 6f 20 75 73 65 20 66 75 6e 63 74 69  ed to use functi
a5c0: 6f 6e 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20  on: %s",.       
a5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65               pDe
a5f0: 66 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  f->zName);.     
a600: 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72         pNC->nErr
a610: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
a620: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
a630: 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20  >op = TK_NULL;. 
a640: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
a650: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
a660: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
a670: 20 20 69 66 28 20 69 73 5f 61 67 67 20 26 26 20    if( is_agg && 
a680: 21 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 29  !pNC->allowAgg )
a690: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
a6a0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
a6b0: 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67  , "misuse of agg
a6c0: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20  regate function 
a6d0: 25 2e 2a 73 28 29 22 2c 20 6e 49 64 2c 7a 49 64  %.*s()", nId,zId
a6e0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e  );.        pNC->
a6f0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nErr++;.        
a700: 69 73 5f 61 67 67 20 3d 20 30 3b 0a 20 20 20 20  is_agg = 0;.    
a710: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 6f 5f 73    }else if( no_s
a720: 75 63 68 5f 66 75 6e 63 20 29 7b 0a 20 20 20 20  uch_func ){.    
a730: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
a740: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
a750: 73 75 63 68 20 66 75 6e 63 74 69 6f 6e 3a 20 25  such function: %
a760: 2e 2a 73 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b  .*s", nId, zId);
a770: 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45  .        pNC->nE
a780: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rr++;.      }els
a790: 65 20 69 66 28 20 77 72 6f 6e 67 5f 6e 75 6d 5f  e if( wrong_num_
a7a0: 61 72 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20  args ){.        
a7b0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
a7c0: 70 50 61 72 73 65 2c 22 77 72 6f 6e 67 20 6e 75  pParse,"wrong nu
a7d0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
a7e0: 73 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 25 2e  s to function %.
a7f0: 2a 73 28 29 22 2c 0a 20 20 20 20 20 20 20 20 20  *s()",.         
a800: 20 20 20 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20      nId, zId);. 
a810: 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72         pNC->nErr
a820: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
a830: 20 20 69 66 28 20 69 73 5f 61 67 67 20 29 7b 0a    if( is_agg ){.
a840: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
a850: 70 20 3d 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  p = TK_AGG_FUNCT
a860: 49 4f 4e 3b 0a 20 20 20 20 20 20 20 20 70 4e 43  ION;.        pNC
a870: 2d 3e 68 61 73 41 67 67 20 3d 20 31 3b 0a 20 20  ->hasAgg = 1;.  
a880: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
a890: 69 73 5f 61 67 67 20 29 20 70 4e 43 2d 3e 61 6c  is_agg ) pNC->al
a8a0: 6c 6f 77 41 67 67 20 3d 20 30 3b 0a 20 20 20 20  lowAgg = 0;.    
a8b0: 20 20 66 6f 72 28 69 3d 30 3b 20 70 4e 43 2d 3e    for(i=0; pNC->
a8c0: 6e 45 72 72 3d 3d 30 20 26 26 20 69 3c 6e 3b 20  nErr==0 && i<n; 
a8d0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 77 61  i++){.        wa
a8e0: 6c 6b 45 78 70 72 54 72 65 65 28 70 4c 69 73 74  lkExprTree(pList
a8f0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 6e 61  ->a[i].pExpr, na
a900: 6d 65 52 65 73 6f 6c 76 65 72 53 74 65 70 2c 20  meResolverStep, 
a910: 70 4e 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pNC);.      }.  
a920: 20 20 20 20 69 66 28 20 69 73 5f 61 67 67 20 29      if( is_agg )
a930: 20 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 3d   pNC->allowAgg =
a940: 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 46 49 58   1;.      /* FIX
a950: 20 4d 45 3a 20 20 43 6f 6d 70 75 74 65 20 70 45   ME:  Compute pE
a960: 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 62 61  xpr->affinity ba
a970: 73 65 64 20 6f 6e 20 74 68 65 20 65 78 70 65 63  sed on the expec
a980: 74 65 64 20 72 65 74 75 72 6e 0a 20 20 20 20 20  ted return.     
a990: 20 2a 2a 20 74 79 70 65 20 6f 66 20 74 68 65 20   ** type of the 
a9a0: 66 75 6e 63 74 69 6f 6e 20 0a 20 20 20 20 20 20  function .      
a9b0: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
a9c0: 69 73 5f 61 67 67 3b 0a 20 20 20 20 7d 0a 23 69  is_agg;.    }.#i
a9d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
a9e0: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
a9f0: 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20  ase TK_SELECT:. 
aa00: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54     case TK_EXIST
aa10: 53 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61  S:.#endif.    ca
aa20: 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
aa30: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65    if( pExpr->pSe
aa40: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
aa50: 69 6e 74 20 6e 52 65 66 20 3d 20 70 4e 43 2d 3e  int nRef = pNC->
aa60: 6e 52 65 66 3b 0a 23 69 66 6e 64 65 66 20 53 51  nRef;.#ifndef SQ
aa70: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a  LITE_OMIT_CHECK.
aa80: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d          if( pNC-
aa90: 3e 69 73 43 68 65 63 6b 20 29 7b 0a 20 20 20 20  >isCheck ){.    
aaa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
aab0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 73 75  orMsg(pParse,"su
aac0: 62 71 75 65 72 69 65 73 20 70 72 6f 68 69 62 69  bqueries prohibi
aad0: 74 65 64 20 69 6e 20 43 48 45 43 4b 20 63 6f 6e  ted in CHECK con
aae0: 73 74 72 61 69 6e 74 73 22 29 3b 0a 20 20 20 20  straints");.    
aaf0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
ab00: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
ab10: 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65  ctResolve(pParse
ab20: 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  , pExpr->pSelect
ab30: 2c 20 70 4e 43 29 3b 0a 20 20 20 20 20 20 20 20  , pNC);.        
ab40: 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 6e 52 65  assert( pNC->nRe
ab50: 66 3e 3d 6e 52 65 66 20 29 3b 0a 20 20 20 20 20  f>=nRef );.     
ab60: 20 20 20 69 66 28 20 6e 52 65 66 21 3d 70 4e 43     if( nRef!=pNC
ab70: 2d 3e 6e 52 65 66 20 29 7b 0a 20 20 20 20 20 20  ->nRef ){.      
ab80: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
ab90: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61  rty(pExpr, EP_Va
aba0: 72 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  rSelect);.      
abb0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
abc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
abd0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
abe0: 49 54 5f 43 48 45 43 4b 0a 20 20 20 20 63 61 73  IT_CHECK.    cas
abf0: 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b  e TK_VARIABLE: {
ac00: 0a 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e  .      if( pNC->
ac10: 69 73 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 20  isCheck ){.     
ac20: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
ac30: 73 67 28 70 50 61 72 73 65 2c 22 70 61 72 61 6d  sg(pParse,"param
ac40: 65 74 65 72 73 20 70 72 6f 68 69 62 69 74 65 64  eters prohibited
ac50: 20 69 6e 20 43 48 45 43 4b 20 63 6f 6e 73 74 72   in CHECK constr
ac60: 61 69 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 7d  aints");.      }
ac70: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ac80: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
ac90: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
aca0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
acb0: 20 77 61 6c 6b 73 20 61 6e 20 65 78 70 72 65 73   walks an expres
acc0: 73 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 72 65  sion tree and re
acd0: 73 6f 6c 76 65 73 20 72 65 66 65 72 65 6e 63 65  solves reference
ace0: 73 20 74 6f 0a 2a 2a 20 74 61 62 6c 65 20 63 6f  s to.** table co
acf0: 6c 75 6d 6e 73 2e 20 20 4e 6f 64 65 73 20 6f 66  lumns.  Nodes of
ad00: 20 74 68 65 20 66 6f 72 6d 20 49 44 2e 49 44 20   the form ID.ID 
ad10: 6f 72 20 49 44 20 72 65 73 6f 6c 76 65 20 69 6e  or ID resolve in
ad20: 74 6f 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 20 74  to an.** index t
ad30: 6f 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 74  o the table in t
ad40: 68 65 20 74 61 62 6c 65 20 6c 69 73 74 20 61 6e  he table list an
ad50: 64 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 66 73 65  d a column offse
ad60: 74 2e 20 20 54 68 65 20 0a 2a 2a 20 45 78 70 72  t.  The .** Expr
ad70: 2e 6f 70 63 6f 64 65 20 66 6f 72 20 73 75 63 68  .opcode for such
ad80: 20 6e 6f 64 65 73 20 69 73 20 63 68 61 6e 67 65   nodes is change
ad90: 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 20  d to TK_COLUMN. 
ada0: 20 54 68 65 20 45 78 70 72 2e 69 54 61 62 6c 65   The Expr.iTable
adb0: 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 63 68 61  .** value is cha
adc0: 6e 67 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65  nged to the inde
add0: 78 20 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e  x of the referen
ade0: 63 65 64 20 74 61 62 6c 65 20 69 6e 20 70 54 61  ced table in pTa
adf0: 62 4c 69 73 74 0a 2a 2a 20 70 6c 75 73 20 74 68  bList.** plus th
ae00: 65 20 22 62 61 73 65 22 20 76 61 6c 75 65 2e 20  e "base" value. 
ae10: 20 54 68 65 20 62 61 73 65 20 76 61 6c 75 65 20   The base value 
ae20: 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20  will ultimately 
ae30: 62 65 63 6f 6d 65 20 74 68 65 0a 2a 2a 20 56 44  become the.** VD
ae40: 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
ae50: 20 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68   for a cursor th
ae60: 61 74 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 69  at is pointing i
ae70: 6e 74 6f 20 74 68 65 20 72 65 66 65 72 65 6e 63  nto the referenc
ae80: 65 64 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 54 68  ed.** table.  Th
ae90: 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 76  e Expr.iColumn v
aea0: 61 6c 75 65 20 69 73 20 63 68 61 6e 67 65 64 20  alue is changed 
aeb0: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
aec0: 74 68 65 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 6f  the column .** o
aed0: 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64  f the referenced
aee0: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 45 78 70   table.  The Exp
aef0: 72 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  r.iColumn value 
af00: 66 6f 72 20 74 68 65 20 73 70 65 63 69 61 6c 0a  for the special.
af10: 2a 2a 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20  ** ROWID column 
af20: 69 73 20 2d 31 2e 20 20 41 6e 79 20 49 4e 54 45  is -1.  Any INTE
af30: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
af40: 63 6f 6c 75 6d 6e 20 69 73 20 74 72 69 65 64 20  column is tried 
af50: 61 73 20 61 6e 0a 2a 2a 20 61 6c 69 61 73 20 66  as an.** alias f
af60: 6f 72 20 52 4f 57 49 44 2e 0a 2a 2a 0a 2a 2a 20  or ROWID..**.** 
af70: 41 6c 73 6f 20 72 65 73 6f 6c 76 65 20 66 75 6e  Also resolve fun
af80: 63 74 69 6f 6e 20 6e 61 6d 65 73 20 61 6e 64 20  ction names and 
af90: 63 68 65 63 6b 20 74 68 65 20 66 75 6e 63 74 69  check the functi
afa0: 6f 6e 73 20 66 6f 72 20 70 72 6f 70 65 72 0a 2a  ons for proper.*
afb0: 2a 20 75 73 61 67 65 2e 20 20 4d 61 6b 65 20 73  * usage.  Make s
afc0: 75 72 65 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e  ure all function
afd0: 20 6e 61 6d 65 73 20 61 72 65 20 72 65 63 6f 67   names are recog
afe0: 6e 69 7a 65 64 20 61 6e 64 20 61 6c 6c 20 66 75  nized and all fu
aff0: 6e 63 74 69 6f 6e 73 0a 2a 2a 20 68 61 76 65 20  nctions.** have 
b000: 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62  the correct numb
b010: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e  er of arguments.
b020: 20 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72    Leave an error
b030: 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70   message.** in p
b040: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20 69  Parse->zErrMsg i
b050: 66 20 61 6e 79 74 68 69 6e 67 20 69 73 20 61 6d  f anything is am
b060: 69 73 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65  iss.  Return the
b070: 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
b080: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
b090: 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61  expression conta
b0a0: 69 6e 73 20 61 67 67 72 65 67 61 74 65 20 66 75  ins aggregate fu
b0b0: 6e 63 74 69 6f 6e 73 20 74 68 65 6e 20 73 65 74  nctions then set
b0c0: 20 74 68 65 20 45 50 5f 41 67 67 0a 2a 2a 20 70   the EP_Agg.** p
b0d0: 72 6f 70 65 72 74 79 20 6f 6e 20 74 68 65 20 65  roperty on the e
b0e0: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 69 6e  xpression..*/.in
b0f0: 74 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73  t sqlite3ExprRes
b100: 6f 6c 76 65 4e 61 6d 65 73 28 20 0a 20 20 4e 61  olveNames( .  Na
b110: 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
b120: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61        /* Namespa
b130: 63 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 65 78  ce to resolve ex
b140: 70 72 65 73 73 69 6f 6e 73 20 69 6e 2e 20 2a 2f  pressions in. */
b150: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20  .  Expr *pExpr  
b160: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
b170: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  e expression to 
b180: 62 65 20 61 6e 61 6c 79 7a 65 64 2e 20 2a 2f 0a  be analyzed. */.
b190: 29 7b 0a 20 20 69 6e 74 20 73 61 76 65 64 48 61  ){.  int savedHa
b1a0: 73 41 67 67 3b 0a 20 20 69 66 28 20 70 45 78 70  sAgg;.  if( pExp
b1b0: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  r==0 ) return 0;
b1c0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
b1d0: 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 69  EXPR_DEPTH>0.  i
b1e0: 66 28 20 28 70 45 78 70 72 2d 3e 6e 48 65 69 67  f( (pExpr->nHeig
b1f0: 68 74 2b 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e  ht+pNC->pParse->
b200: 6e 48 65 69 67 68 74 29 3e 53 51 4c 49 54 45 5f  nHeight)>SQLITE_
b210: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 20 29  MAX_EXPR_DEPTH )
b220: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
b230: 6f 72 4d 73 67 28 70 4e 43 2d 3e 70 50 61 72 73  orMsg(pNC->pPars
b240: 65 2c 20 0a 20 20 20 20 20 20 20 22 45 78 70 72  e, .       "Expr
b250: 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73 20 74  ession tree is t
b260: 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78 69 6d 75  oo large (maximu
b270: 6d 20 64 65 70 74 68 20 25 64 29 22 2c 0a 20 20  m depth %d)",.  
b280: 20 20 20 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f       SQLITE_MAX_
b290: 45 58 50 52 5f 44 45 50 54 48 0a 20 20 20 20 29  EXPR_DEPTH.    )
b2a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
b2b0: 20 20 7d 0a 20 20 70 4e 43 2d 3e 70 50 61 72 73    }.  pNC->pPars
b2c0: 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 70 45  e->nHeight += pE
b2d0: 78 70 72 2d 3e 6e 48 65 69 67 68 74 3b 0a 23 65  xpr->nHeight;.#e
b2e0: 6e 64 69 66 0a 20 20 73 61 76 65 64 48 61 73 41  ndif.  savedHasA
b2f0: 67 67 20 3d 20 70 4e 43 2d 3e 68 61 73 41 67 67  gg = pNC->hasAgg
b300: 3b 0a 20 20 70 4e 43 2d 3e 68 61 73 41 67 67 20  ;.  pNC->hasAgg 
b310: 3d 20 30 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54  = 0;.  walkExprT
b320: 72 65 65 28 70 45 78 70 72 2c 20 6e 61 6d 65 52  ree(pExpr, nameR
b330: 65 73 6f 6c 76 65 72 53 74 65 70 2c 20 70 4e 43  esolverStep, pNC
b340: 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  );.#if SQLITE_MA
b350: 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20  X_EXPR_DEPTH>0. 
b360: 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 6e 48   pNC->pParse->nH
b370: 65 69 67 68 74 20 2d 3d 20 70 45 78 70 72 2d 3e  eight -= pExpr->
b380: 6e 48 65 69 67 68 74 3b 0a 23 65 6e 64 69 66 0a  nHeight;.#endif.
b390: 20 20 69 66 28 20 70 4e 43 2d 3e 6e 45 72 72 3e    if( pNC->nErr>
b3a0: 30 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74  0 ){.    ExprSet
b3b0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
b3c0: 45 50 5f 45 72 72 6f 72 29 3b 0a 20 20 7d 0a 20  EP_Error);.  }. 
b3d0: 20 69 66 28 20 70 4e 43 2d 3e 68 61 73 41 67 67   if( pNC->hasAgg
b3e0: 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50   ){.    ExprSetP
b3f0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
b400: 50 5f 41 67 67 29 3b 0a 20 20 7d 65 6c 73 65 20  P_Agg);.  }else 
b410: 69 66 28 20 73 61 76 65 64 48 61 73 41 67 67 20  if( savedHasAgg 
b420: 29 7b 0a 20 20 20 20 70 4e 43 2d 3e 68 61 73 41  ){.    pNC->hasA
b430: 67 67 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  gg = 1;.  }.  re
b440: 74 75 72 6e 20 45 78 70 72 48 61 73 50 72 6f 70  turn ExprHasProp
b450: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 45  erty(pExpr, EP_E
b460: 72 72 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rror);.}../*.** 
b470: 41 20 70 6f 69 6e 74 65 72 20 69 6e 73 74 61 6e  A pointer instan
b480: 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
b490: 74 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20  ture is used to 
b4a0: 70 61 73 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  pass information
b4b0: 0a 2a 2a 20 74 68 72 6f 75 67 68 20 77 61 6c 6b  .** through walk
b4c0: 45 78 70 72 54 72 65 65 20 69 6e 74 6f 20 63 6f  ExprTree into co
b4d0: 64 65 53 75 62 71 75 65 72 79 53 74 65 70 28 29  deSubqueryStep()
b4e0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
b4f0: 75 63 74 20 51 75 65 72 79 43 6f 64 65 72 20 51  uct QueryCoder Q
b500: 75 65 72 79 43 6f 64 65 72 3b 0a 73 74 72 75 63  ueryCoder;.struc
b510: 74 20 51 75 65 72 79 43 6f 64 65 72 20 7b 0a 20  t QueryCoder {. 
b520: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
b530: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
b540: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
b550: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
b560: 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70  NC;    /* Namesp
b570: 61 63 65 20 6f 66 20 66 69 72 73 74 20 65 6e 63  ace of first enc
b580: 6c 6f 73 69 6e 67 20 71 75 65 72 79 20 2a 2f 0a  losing query */.
b590: 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  };.../*.** Gener
b5a0: 61 74 65 20 63 6f 64 65 20 66 6f 72 20 73 63 61  ate code for sca
b5b0: 6c 61 72 20 73 75 62 71 75 65 72 69 65 73 20 75  lar subqueries u
b5c0: 73 65 64 20 61 73 20 61 6e 20 65 78 70 72 65 73  sed as an expres
b5d0: 73 69 6f 6e 0a 2a 2a 20 61 6e 64 20 49 4e 20 6f  sion.** and IN o
b5e0: 70 65 72 61 74 6f 72 73 2e 20 20 45 78 61 6d 70  perators.  Examp
b5f0: 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  les:.**.**     (
b600: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29  SELECT a FROM b)
b610: 20 20 20 20 20 20 20 20 20 20 2d 2d 20 73 75 62            -- sub
b620: 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 45 58 49  query.**     EXI
b630: 53 54 53 20 28 53 45 4c 45 43 54 20 61 20 46 52  STS (SELECT a FR
b640: 4f 4d 20 62 29 20 20 20 2d 2d 20 45 58 49 53 54  OM b)   -- EXIST
b650: 53 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20  S subquery.**   
b660: 20 20 78 20 49 4e 20 28 34 2c 35 2c 31 31 29 20    x IN (4,5,11) 
b670: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
b680: 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68  IN operator with
b690: 20 6c 69 73 74 20 6f 6e 20 72 69 67 68 74 2d 68   list on right-h
b6a0: 61 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20 20 20  and side.**     
b6b0: 78 20 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46  x IN (SELECT a F
b6c0: 52 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20 49 4e  ROM b)     -- IN
b6d0: 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 73   operator with s
b6e0: 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20 72  ubquery on the r
b6f0: 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ight.**.** The p
b700: 45 78 70 72 20 70 61 72 61 6d 65 74 65 72 20 64  Expr parameter d
b710: 65 73 63 72 69 62 65 73 20 74 68 65 20 65 78 70  escribes the exp
b720: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e  ression that con
b730: 74 61 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20  tains the IN.** 
b740: 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 75 62 71  operator or subq
b750: 75 65 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  uery..*/.#ifndef
b760: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
b770: 51 55 45 52 59 0a 76 6f 69 64 20 73 71 6c 69 74  QUERY.void sqlit
b780: 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
b790: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
b7a0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69  xpr *pExpr){.  i
b7b0: 6e 74 20 74 65 73 74 41 64 64 72 20 3d 20 30 3b  nt testAddr = 0;
b7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7d0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69         /* One-ti
b7e0: 6d 65 20 74 65 73 74 20 61 64 64 72 65 73 73 20  me test address 
b7f0: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  */.  Vdbe *v = s
b800: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
b810: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
b820: 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 0a 20 20  0 ) return;...  
b830: 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 6d 75 73  /* This code mus
b840: 74 20 62 65 20 72 75 6e 20 69 6e 20 69 74 73 20  t be run in its 
b850: 65 6e 74 69 72 65 74 79 20 65 76 65 72 79 20 74  entirety every t
b860: 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e  ime it is encoun
b870: 74 65 72 65 64 0a 20 20 2a 2a 20 69 66 20 61 6e  tered.  ** if an
b880: 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
b890: 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a  ng is true:.  **
b8a0: 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20  .  **    *  The 
b8b0: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
b8c0: 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20  is a correlated 
b8d0: 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 20 20  subquery.  **   
b8e0: 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61   *  The right-ha
b8f0: 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20 65 78  nd side is an ex
b900: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f  pression list co
b910: 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61 62 6c  ntaining variabl
b920: 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57 65  es.  **    *  We
b930: 20 61 72 65 20 69 6e 73 69 64 65 20 61 20 74 72   are inside a tr
b940: 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20  igger.  **.  ** 
b950: 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62  If all of the ab
b960: 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c 20 74  ove are false, t
b970: 68 65 6e 20 77 65 20 63 61 6e 20 72 75 6e 20 74  hen we can run t
b980: 68 69 73 20 63 6f 64 65 20 6a 75 73 74 20 6f 6e  his code just on
b990: 63 65 0a 20 20 2a 2a 20 73 61 76 65 20 74 68 65  ce.  ** save the
b9a0: 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20 72 65   results, and re
b9b0: 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 65 73  use the same res
b9c0: 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75 65 6e  ult on subsequen
b9d0: 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a 20  t invocations.. 
b9e0: 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70 72 48   */.  if( !ExprH
b9f0: 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45  asAnyProperty(pE
ba00: 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63  xpr, EP_VarSelec
ba10: 74 29 20 26 26 20 21 70 50 61 72 73 65 2d 3e 74  t) && !pParse->t
ba20: 72 69 67 53 74 61 63 6b 20 29 7b 0a 20 20 20 20  rigStack ){.    
ba30: 69 6e 74 20 6d 65 6d 20 3d 20 70 50 61 72 73 65  int mem = pParse
ba40: 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 73 71  ->nMem++;.    sq
ba50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
ba60: 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 6d 65  , OP_MemLoad, me
ba70: 6d 2c 20 30 29 3b 0a 20 20 20 20 74 65 73 74 41  m, 0);.    testA
ba80: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
ba90: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 2c  eAddOp(v, OP_If,
baa0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65   0, 0);.    asse
bab0: 72 74 28 20 74 65 73 74 41 64 64 72 3e 30 20 7c  rt( testAddr>0 |
bac0: 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46  | sqlite3MallocF
bad0: 61 69 6c 65 64 28 29 20 29 3b 0a 20 20 20 20 73  ailed() );.    s
bae0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
baf0: 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 31 2c  v, OP_MemInt, 1,
bb00: 20 6d 65 6d 29 3b 0a 20 20 7d 0a 0a 20 20 73 77   mem);.  }..  sw
bb10: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
bb20: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  ){.    case TK_I
bb30: 4e 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20  N: {.      char 
bb40: 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20  affinity;.      
bb50: 4b 65 79 49 6e 66 6f 20 6b 65 79 49 6e 66 6f 3b  KeyInfo keyInfo;
bb60: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
bb70: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
bb80: 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68  ss of OP_OpenEph
bb90: 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69  emeral instructi
bba0: 6f 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 61 66 66  on */..      aff
bbb0: 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45  inity = sqlite3E
bbc0: 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70  xprAffinity(pExp
bbd0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 0a 20 20 20 20  r->pLeft);..    
bbe0: 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 69    /* Whether thi
bbf0: 73 20 69 73 20 61 6e 20 27 78 20 49 4e 28 53 45  s is an 'x IN(SE
bc00: 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20  LECT...)' or an 
bc10: 27 78 20 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e  'x IN(<exprlist>
bc20: 29 27 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72  )'.      ** expr
bc30: 65 73 73 69 6f 6e 20 69 74 20 69 73 20 68 61 6e  ession it is han
bc40: 64 6c 65 64 20 74 68 65 20 73 61 6d 65 20 77 61  dled the same wa
bc50: 79 2e 20 41 20 76 69 72 74 75 61 6c 20 74 61 62  y. A virtual tab
bc60: 6c 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20  le is .      ** 
bc70: 66 69 6c 6c 65 64 20 77 69 74 68 20 73 69 6e 67  filled with sing
bc80: 6c 65 2d 66 69 65 6c 64 20 69 6e 64 65 78 20 6b  le-field index k
bc90: 65 79 73 20 72 65 70 72 65 73 65 6e 74 69 6e 67  eys representing
bca0: 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20   the results.   
bcb0: 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 53     ** from the S
bcc0: 45 4c 45 43 54 20 6f 72 20 74 68 65 20 3c 65 78  ELECT or the <ex
bcd0: 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a  prlist>..      *
bce0: 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  *.      ** If th
bcf0: 65 20 27 78 27 20 65 78 70 72 65 73 73 69 6f 6e  e 'x' expression
bd00: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c   is a column val
bd10: 75 65 2c 20 6f 72 20 74 68 65 20 53 45 4c 45 43  ue, or the SELEC
bd20: 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74  T....      ** st
bd30: 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20  atement returns 
bd40: 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20  a column value, 
bd50: 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74  then the affinit
bd60: 79 20 6f 66 20 74 68 61 74 0a 20 20 20 20 20 20  y of that.      
bd70: 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65  ** column is use
bd80: 64 20 74 6f 20 62 75 69 6c 64 20 74 68 65 20 69  d to build the i
bd90: 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 62 6f  ndex keys. If bo
bda0: 74 68 20 27 78 27 20 61 6e 64 20 74 68 65 0a 20  th 'x' and the. 
bdb0: 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e       ** SELECT..
bdc0: 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20  . statement are 
bdd0: 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75  columns, then nu
bde0: 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 20 69  meric affinity i
bdf0: 73 20 75 73 65 64 0a 20 20 20 20 20 20 2a 2a 20  s used.      ** 
be00: 69 66 20 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e  if either column
be10: 20 68 61 73 20 4e 55 4d 45 52 49 43 20 6f 72 20   has NUMERIC or 
be20: 49 4e 54 45 47 45 52 20 61 66 66 69 6e 69 74 79  INTEGER affinity
be30: 2e 20 49 66 20 6e 65 69 74 68 65 72 0a 20 20 20  . If neither.   
be40: 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68     ** 'x' nor th
be50: 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74  e SELECT... stat
be60: 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e  ement are column
be70: 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20  s, then numeric 
be80: 61 66 66 69 6e 69 74 79 0a 20 20 20 20 20 20 2a  affinity.      *
be90: 2a 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20  * is used..     
bea0: 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d   */.      pExpr-
beb0: 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65  >iTable = pParse
bec0: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
bed0: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
bee0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
bef0: 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 45 78  enEphemeral, pEx
bf00: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a  pr->iTable, 0);.
bf10: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6b 65        memset(&ke
bf20: 79 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  yInfo, 0, sizeof
bf30: 28 6b 65 79 49 6e 66 6f 29 29 3b 0a 20 20 20 20  (keyInfo));.    
bf40: 20 20 6b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64    keyInfo.nField
bf50: 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 1;.      sqli
bf60: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
bf70: 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73  OP_SetNumColumns
bf80: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
bf90: 20 31 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20   1);..      if( 
bfa0: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29  pExpr->pSelect )
bfb0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73  {.        /* Cas
bfc0: 65 20 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e  e 1:     expr IN
bfd0: 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20   (SELECT ...).  
bfe0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
bff0: 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   ** Generate cod
c000: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 72  e to write the r
c010: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65  esults of the se
c020: 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74 65  lect into the te
c030: 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20  mporary.        
c040: 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74  ** table allocat
c050: 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62  ed and opened ab
c060: 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ove..        */.
c070: 20 20 20 20 20 20 20 20 69 6e 74 20 69 50 61 72          int iPar
c080: 6d 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  m = pExpr->iTabl
c090: 65 20 2b 20 20 28 28 28 69 6e 74 29 61 66 66 69  e +  (((int)affi
c0a0: 6e 69 74 79 29 3c 3c 31 36 29 3b 0a 20 20 20 20  nity)<<16);.    
c0b0: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
c0c0: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 61 73  List;.        as
c0d0: 73 65 72 74 28 20 28 70 45 78 70 72 2d 3e 69 54  sert( (pExpr->iT
c0e0: 61 62 6c 65 26 30 78 30 30 30 30 46 46 46 46 29  able&0x0000FFFF)
c0f0: 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  ==pExpr->iTable 
c100: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
c110: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
c120: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c  rse, pExpr->pSel
c130: 65 63 74 2c 20 53 52 54 5f 53 65 74 2c 20 69 50  ect, SRT_Set, iP
c140: 61 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29  arm, 0, 0, 0, 0)
c150: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
c160: 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  turn;.        }.
c170: 20 20 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d          pEList =
c180: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2d   pExpr->pSelect-
c190: 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  >pEList;.       
c1a0: 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70   if( pEList && p
c1b0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29  EList->nExpr>0 )
c1c0: 7b 20 0a 20 20 20 20 20 20 20 20 20 20 6b 65 79  { .          key
c1d0: 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20  Info.aColl[0] = 
c1e0: 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d  sqlite3BinaryCom
c1f0: 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  pareCollSeq(pPar
c200: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
c210: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
c220: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
c230: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  pr);.        }. 
c240: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
c250: 45 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20  Expr->pList ){. 
c260: 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 32         /* Case 2
c270: 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 65  :     expr IN (e
c280: 78 70 72 6c 69 73 74 29 0a 20 20 20 20 20 20 20  xprlist).       
c290: 20 2a 2a 0a 09 2a 2a 20 46 6f 72 20 65 61 63 68   **..** For each
c2a0: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 62 75 69   expression, bui
c2b0: 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20  ld an index key 
c2c0: 66 72 6f 6d 20 74 68 65 20 65 76 61 6c 75 61 74  from the evaluat
c2d0: 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ion and.        
c2e0: 2a 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74  ** store it in t
c2f0: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
c300: 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73  le. If <expr> is
c310: 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20   a column, then 
c320: 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  use.        ** t
c330: 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69  hat columns affi
c340: 6e 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64 69  nity when buildi
c350: 6e 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49  ng index keys. I
c360: 66 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a  f <expr> is not.
c370: 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c          ** a col
c380: 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69 63  umn, use numeric
c390: 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 20   affinity..     
c3a0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e     */.        in
c3b0: 74 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78 70  t i;.        Exp
c3c0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
c3d0: 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20  Expr->pList;.   
c3e0: 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
c3f0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
c400: 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  ;..        if( !
c410: 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20  affinity ){.    
c420: 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d        affinity =
c430: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
c440: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c450: 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c      keyInfo.aCol
c460: 6c 5b 30 5d 20 3d 20 70 45 78 70 72 2d 3e 70 4c  l[0] = pExpr->pL
c470: 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 0a 20 20 20  eft->pColl;..   
c480: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72       /* Loop thr
c490: 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73  ough each expres
c4a0: 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73  sion in <exprlis
c4b0: 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  t>. */.        f
c4c0: 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78 70  or(i=pList->nExp
c4d0: 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  r, pItem=pList->
c4e0: 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74  a; i>0; i--, pIt
c4f0: 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  em++){.         
c500: 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70 49 74   Expr *pE2 = pIt
c510: 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20 20 20  em->pExpr;..    
c520: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
c530: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f  expression is no
c540: 74 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20  t constant then 
c550: 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a  we will need to.
c560: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69 73            ** dis
c570: 61 62 6c 65 20 74 68 65 20 74 65 73 74 20 74 68  able the test th
c580: 61 74 20 77 61 73 20 67 65 6e 65 72 61 74 65 64  at was generated
c590: 20 61 62 6f 76 65 20 74 68 61 74 20 6d 61 6b 65   above that make
c5a0: 73 20 73 75 72 65 0a 20 20 20 20 20 20 20 20 20  s sure.         
c5b0: 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f 6e   ** this code on
c5c0: 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63 65  ly executes once
c5d0: 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72 20 61  .  Because for a
c5e0: 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20 20   non-constant.  
c5f0: 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65          ** expre
c600: 73 73 69 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f  ssion we need to
c610: 20 72 65 72 75 6e 20 74 68 69 73 20 63 6f 64 65   rerun this code
c620: 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20 20   each time..    
c630: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
c640: 20 20 20 69 66 28 20 74 65 73 74 41 64 64 72 3e     if( testAddr>
c650: 30 20 26 26 20 21 73 71 6c 69 74 65 33 45 78 70  0 && !sqlite3Exp
c660: 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32 29  rIsConstant(pE2)
c670: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
c680: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
c690: 65 54 6f 4e 6f 6f 70 28 76 2c 20 74 65 73 74 41  eToNoop(v, testA
c6a0: 64 64 72 2d 31 2c 20 33 29 3b 0a 20 20 20 20 20  ddr-1, 3);.     
c6b0: 20 20 20 20 20 20 20 74 65 73 74 41 64 64 72 20         testAddr 
c6c0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
c6d0: 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  ..          /* E
c6e0: 76 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72  valuate the expr
c6f0: 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72  ession and inser
c700: 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65  t it into the te
c710: 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  mp table */.    
c720: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
c730: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
c740: 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  2);.          sq
c750: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
c760: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31  OP_MakeRecord, 1
c770: 2c 20 30 2c 20 26 61 66 66 69 6e 69 74 79 2c 20  , 0, &affinity, 
c780: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  1);.          sq
c790: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c7a0: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
c7b0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30  pExpr->iTable, 0
c7c0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
c7d0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
c7e0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
c7f0: 2c 20 61 64 64 72 2c 20 28 76 6f 69 64 20 2a 29  , addr, (void *)
c800: 26 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59  &keyInfo, P3_KEY
c810: 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 62 72 65  INFO);.      bre
c820: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
c830: 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20  ase TK_EXISTS:. 
c840: 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43     case TK_SELEC
c850: 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  T: {.      /* Th
c860: 69 73 20 68 61 73 20 74 6f 20 62 65 20 61 20 73  is has to be a s
c870: 63 61 6c 61 72 20 53 45 4c 45 43 54 2e 20 20 47  calar SELECT.  G
c880: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
c890: 70 75 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  put the.      **
c8a0: 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 73   value of this s
c8b0: 65 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d 6f 72  elect in a memor
c8c0: 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 63 6f 72  y cell and recor
c8d0: 64 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20 20  d the number.   
c8e0: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 65 6d     ** of the mem
c8f0: 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c  ory cell in iCol
c900: 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  umn..      */.  
c910: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
c920: 20 54 6f 6b 65 6e 20 6f 6e 65 20 3d 20 7b 20 28   Token one = { (
c930: 75 38 2a 29 22 31 22 2c 20 30 2c 20 31 20 7d 3b  u8*)"1", 0, 1 };
c940: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
c950: 53 65 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Sel;.      int i
c960: 4d 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 73  Mem;.      int s
c970: 6f 70 3b 0a 0a 20 20 20 20 20 20 70 45 78 70 72  op;..      pExpr
c980: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 4d 65 6d  ->iColumn = iMem
c990: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
c9a0: 2b 3b 0a 20 20 20 20 20 20 70 53 65 6c 20 3d 20  +;.      pSel = 
c9b0: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 3b 0a  pExpr->pSelect;.
c9c0: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
c9d0: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
c9e0: 7b 0a 20 20 20 20 20 20 20 20 73 6f 70 20 3d 20  {.        sop = 
c9f0: 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20  SRT_Mem;.       
ca00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ca10: 70 28 76 2c 20 4f 50 5f 4d 65 6d 4e 75 6c 6c 2c  p(v, OP_MemNull,
ca20: 20 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20   iMem, 0);.     
ca30: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
ca40: 76 2c 20 22 23 20 49 6e 69 74 20 73 75 62 71 75  v, "# Init subqu
ca50: 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20  ery result"));. 
ca60: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ca70: 20 20 20 20 73 6f 70 20 3d 20 53 52 54 5f 45 78      sop = SRT_Ex
ca80: 69 73 74 73 3b 0a 20 20 20 20 20 20 20 20 73 71  ists;.        sq
ca90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
caa0: 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 30 2c 20  , OP_MemInt, 0, 
cab0: 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 56  iMem);.        V
cac0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
cad0: 23 20 49 6e 69 74 20 45 58 49 53 54 53 20 72 65  # Init EXISTS re
cae0: 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d  sult"));.      }
caf0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
cb00: 70 72 44 65 6c 65 74 65 28 70 53 65 6c 2d 3e 70  prDelete(pSel->p
cb10: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 53  Limit);.      pS
cb20: 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c  el->pLimit = sql
cb30: 69 74 65 33 45 78 70 72 28 54 4b 5f 49 4e 54 45  ite3Expr(TK_INTE
cb40: 47 45 52 2c 20 30 2c 20 30 2c 20 26 6f 6e 65 29  GER, 0, 0, &one)
cb50: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
cb60: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
cb70: 2c 20 70 53 65 6c 2c 20 73 6f 70 2c 20 69 4d 65  , pSel, sop, iMe
cb80: 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 20 29  m, 0, 0, 0, 0) )
cb90: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
cba0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
cbb0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
cbc0: 0a 0a 20 20 69 66 28 20 74 65 73 74 41 64 64 72  ..  if( testAddr
cbd0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
cbe0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 74  dbeJumpHere(v, t
cbf0: 65 73 74 41 64 64 72 29 3b 0a 20 20 7d 0a 0a 20  estAddr);.  }.. 
cc00: 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69   return;.}.#endi
cc10: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
cc20: 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a  _SUBQUERY */../*
cc30: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20  .** Generate an 
cc40: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74  instruction that
cc50: 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 69 6e   will put the in
cc60: 74 65 67 65 72 20 64 65 73 63 72 69 62 65 20 62  teger describe b
cc70: 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e  y.** text z[0..n
cc80: 2d 31 5d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  -1] on the stack
cc90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
cca0: 20 63 6f 64 65 49 6e 74 65 67 65 72 28 56 64 62   codeInteger(Vdb
ccb0: 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *v, const char
ccc0: 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 61   *z, int n){.  a
ccd0: 73 73 65 72 74 28 20 7a 20 7c 7c 20 73 71 6c 69  ssert( z || sqli
cce0: 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28  te3MallocFailed(
ccf0: 29 20 29 3b 0a 20 20 69 66 28 20 7a 20 29 7b 0a  ) );.  if( z ){.
cd00: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
cd10: 66 28 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74  f( sqlite3GetInt
cd20: 33 32 28 7a 2c 20 26 69 29 20 29 7b 0a 20 20 20  32(z, &i) ){.   
cd30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cd40: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
cd50: 72 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 7d 65  r, i, 0);.    }e
cd60: 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 46  lse if( sqlite3F
cd70: 69 74 73 49 6e 36 34 42 69 74 73 28 7a 29 20 29  itsIn64Bits(z) )
cd80: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
cd90: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 74  dbeOp3(v, OP_Int
cda0: 36 34 2c 20 30 2c 20 30 2c 20 7a 2c 20 6e 29 3b  64, 0, 0, z, n);
cdb0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
cdc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
cdd0: 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20  (v, OP_Real, 0, 
cde0: 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a  0, z, n);.    }.
cdf0: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65    }.}.../*.** Ge
ce00: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
ce10: 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20 74 68   will extract th
ce20: 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c  e iColumn-th col
ce30: 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c  umn from.** tabl
ce40: 65 20 70 54 61 62 20 61 6e 64 20 70 75 73 68 20  e pTab and push 
ce50: 74 68 61 74 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  that column valu
ce60: 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20  e on the stack. 
ce70: 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20   There.** is an 
ce80: 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 6f 20 70  open cursor to p
ce90: 54 61 62 20 69 6e 20 69 54 61 62 6c 65 2e 20 20  Tab in iTable.  
cea0: 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74 68 65  If iColumn<0 the
ceb0: 6e 0a 2a 2a 20 63 6f 64 65 20 69 73 20 67 65 6e  n.** code is gen
cec0: 65 72 61 74 65 64 20 74 68 61 74 20 65 78 74 72  erated that extr
ced0: 61 63 74 73 20 74 68 65 20 72 6f 77 69 64 2e 0a  acts the rowid..
cee0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
cef0: 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
cf00: 28 56 64 62 65 20 2a 76 2c 20 54 61 62 6c 65 20  (Vdbe *v, Table 
cf10: 2a 70 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c 75  *pTab, int iColu
cf20: 6d 6e 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b  mn, int iTable){
cf30: 0a 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30  .  if( iColumn<0
cf40: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d   ){.    int op =
cf50: 20 28 70 54 61 62 20 26 26 20 49 73 56 69 72 74   (pTab && IsVirt
cf60: 75 61 6c 28 70 54 61 62 29 29 20 3f 20 4f 50 5f  ual(pTab)) ? OP_
cf70: 56 52 6f 77 69 64 20 3a 20 4f 50 5f 52 6f 77 69  VRowid : OP_Rowi
cf80: 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  d;.    sqlite3Vd
cf90: 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 69  beAddOp(v, op, i
cfa0: 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 7d 65 6c  Table, 0);.  }el
cfb0: 73 65 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  se if( pTab==0 )
cfc0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
cfd0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c  eAddOp(v, OP_Col
cfe0: 75 6d 6e 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f  umn, iTable, iCo
cff0: 6c 75 6d 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  lumn);.  }else{.
d000: 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 49 73 56      int op = IsV
d010: 69 72 74 75 61 6c 28 70 54 61 62 29 20 3f 20 4f  irtual(pTab) ? O
d020: 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43  P_VColumn : OP_C
d030: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74  olumn;.    sqlit
d040: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f  e3VdbeAddOp(v, o
d050: 70 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75  p, iTable, iColu
d060: 6d 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  mn);.    sqlite3
d070: 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c  ColumnDefault(v,
d080: 20 70 54 61 62 2c 20 69 43 6f 6c 75 6d 6e 29 3b   pTab, iColumn);
d090: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d0a0: 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
d0b0: 49 4e 54 0a 20 20 20 20 69 66 28 20 70 54 61 62  INT.    if( pTab
d0c0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e  ->aCol[iColumn].
d0d0: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
d0e0: 5f 41 46 46 5f 52 45 41 4c 20 29 7b 0a 20 20 20  _AFF_REAL ){.   
d0f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d100: 64 4f 70 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66  dOp(v, OP_RealAf
d110: 66 69 6e 69 74 79 2c 20 30 2c 20 30 29 3b 0a 20  finity, 0, 0);. 
d120: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
d130: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
d140: 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20  e code into the 
d150: 63 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20  current Vdbe to 
d160: 65 76 61 6c 75 61 74 65 20 74 68 65 20 67 69 76  evaluate the giv
d170: 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  en.** expression
d180: 20 61 6e 64 20 6c 65 61 76 65 20 74 68 65 20 72   and leave the r
d190: 65 73 75 6c 74 20 6f 6e 20 74 68 65 20 74 6f 70  esult on the top
d1a0: 20 6f 66 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a   of stack..**.**
d1b0: 20 54 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e   This code depen
d1c0: 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74  ds on the fact t
d1d0: 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b 65  hat certain toke
d1e0: 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54 4b  n values (ex: TK
d1f0: 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65 20  _EQ).** are the 
d200: 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20 76  same as opcode v
d210: 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45 71  alues (ex: OP_Eq
d220: 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  ) that implement
d230: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
d240: 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e  ng.** operation.
d250: 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e    Special commen
d260: 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e 64  ts in vdbe.c and
d270: 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61   the mkopcodeh.a
d280: 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20  wk script in.** 
d290: 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73 73  the make process
d2a0: 20 63 61 75 73 65 20 74 68 65 73 65 20 76 61 6c   cause these val
d2b0: 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41  ues to align.  A
d2c0: 73 73 65 72 74 28 29 73 20 69 6e 20 74 68 65 20  ssert()s in the 
d2d0: 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65  code.** below ve
d2e0: 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e 75  rify that the nu
d2f0: 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e 65  mbers are aligne
d300: 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a  d correctly..*/.
d310: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
d320: 43 6f 64 65 28 50 61 72 73 65 20 2a 70 50 61 72  Code(Parse *pPar
d330: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
d340: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
d350: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
d360: 6e 74 20 6f 70 3b 0a 20 20 69 6e 74 20 73 74 61  nt op;.  int sta
d370: 63 6b 43 68 6e 67 20 3d 20 31 3b 20 20 20 20 2f  ckChng = 1;    /
d380: 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 63 68 61 6e  * Amount of chan
d390: 67 65 20 74 6f 20 73 74 61 63 6b 20 64 65 70 74  ge to stack dept
d3a0: 68 20 2a 2f 0a 0a 20 20 69 66 28 20 76 3d 3d 30  h */..  if( v==0
d3b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
d3c0: 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20   pExpr==0 ){.   
d3d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d3e0: 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  p(v, OP_Null, 0,
d3f0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   0);.    return;
d400: 0a 20 20 7d 0a 20 20 6f 70 20 3d 20 70 45 78 70  .  }.  op = pExp
d410: 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28  r->op;.  switch(
d420: 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
d430: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b  TK_AGG_COLUMN: {
d440: 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a  .      AggInfo *
d450: 70 41 67 67 49 6e 66 6f 20 3d 20 70 45 78 70 72  pAggInfo = pExpr
d460: 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20  ->pAggInfo;.    
d470: 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
d480: 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70 41  _col *pCol = &pA
d490: 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78  ggInfo->aCol[pEx
d4a0: 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20 20  pr->iAgg];.     
d4b0: 20 69 66 28 20 21 70 41 67 67 49 6e 66 6f 2d 3e   if( !pAggInfo->
d4c0: 64 69 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20 20  directMode ){.  
d4d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d4e0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
d4f0: 4c 6f 61 64 2c 20 70 43 6f 6c 2d 3e 69 4d 65 6d  Load, pCol->iMem
d500: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72  , 0);.        br
d510: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eak;.      }else
d520: 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75   if( pAggInfo->u
d530: 73 65 53 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a  seSortingIdx ){.
d540: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d550: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
d560: 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d  olumn, pAggInfo-
d570: 3e 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20 20  >sortingIdx,.   
d580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d590: 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
d5a0: 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 29 3b  >iSorterColumn);
d5b0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
d5c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
d5d0: 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c   Otherwise, fall
d5e0: 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54   thru into the T
d5f0: 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f  K_COLUMN case */
d600: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
d610: 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
d620: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
d630: 61 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20 20 20  able<0 ){.      
d640: 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68    /* This only h
d650: 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 64 69  appens when codi
d660: 6e 67 20 63 68 65 63 6b 20 63 6f 6e 73 74 72 61  ng check constra
d670: 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ints */.        
d680: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
d690: 63 6b 4f 66 66 73 65 74 3e 30 20 29 3b 0a 20 20  ckOffset>0 );.  
d6a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d6b0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70  eAddOp(v, OP_Dup
d6c0: 2c 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73  , pParse->ckOffs
d6d0: 65 74 2d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  et-pExpr->iColum
d6e0: 6e 2d 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  n-1, 1);.      }
d6f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
d700: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
d710: 43 6f 6c 75 6d 6e 28 76 2c 20 70 45 78 70 72 2d  Column(v, pExpr-
d720: 3e 70 54 61 62 2c 20 70 45 78 70 72 2d 3e 69 43  >pTab, pExpr->iC
d730: 6f 6c 75 6d 6e 2c 20 70 45 78 70 72 2d 3e 69 54  olumn, pExpr->iT
d740: 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  able);.      }. 
d750: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d760: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  }.    case TK_IN
d770: 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63  TEGER: {.      c
d780: 6f 64 65 49 6e 74 65 67 65 72 28 76 2c 20 28 63  odeInteger(v, (c
d790: 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65  har*)pExpr->toke
d7a0: 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  n.z, pExpr->toke
d7b0: 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  n.n);.      brea
d7c0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
d7d0: 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20  e TK_FLOAT:.    
d7e0: 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20  case TK_STRING: 
d7f0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
d800: 54 4b 5f 46 4c 4f 41 54 3d 3d 4f 50 5f 52 65 61  TK_FLOAT==OP_Rea
d810: 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  l );.      asser
d820: 74 28 20 54 4b 5f 53 54 52 49 4e 47 3d 3d 4f 50  t( TK_STRING==OP
d830: 5f 53 74 72 69 6e 67 38 20 29 3b 0a 20 20 20 20  _String8 );.    
d840: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
d850: 45 78 70 72 28 70 45 78 70 72 29 3b 0a 20 20 20  Expr(pExpr);.   
d860: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
d870: 33 28 76 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 28  3(v, op, 0, 0, (
d880: 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b  char*)pExpr->tok
d890: 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  en.z, pExpr->tok
d8a0: 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  en.n);.      bre
d8b0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
d8c0: 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20  se TK_NULL: {.  
d8d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d8e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  ddOp(v, OP_Null,
d8f0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72   0, 0);.      br
d900: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
d910: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  ef SQLITE_OMIT_B
d920: 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20  LOB_LITERAL.    
d930: 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a  case TK_BLOB: {.
d940: 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
d950: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
d960: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
d970: 54 4b 5f 42 4c 4f 42 3d 3d 4f 50 5f 48 65 78 42  TK_BLOB==OP_HexB
d980: 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d  lob );.      n =
d990: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20   pExpr->token.n 
d9a0: 2d 20 33 3b 0a 20 20 20 20 20 20 7a 20 3d 20 28  - 3;.      z = (
d9b0: 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b  char*)pExpr->tok
d9c0: 65 6e 2e 7a 20 2b 20 32 3b 0a 20 20 20 20 20 20  en.z + 2;.      
d9d0: 61 73 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a  assert( n>=0 );.
d9e0: 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29        if( n==0 )
d9f0: 7b 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 22 22  {.        z = ""
da00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
da10: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
da20: 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 7a 2c 20 6e  , op, 0, 0, z, n
da30: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
da40: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
da50: 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c   case TK_VARIABL
da60: 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
da70: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
da80: 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70  P_Variable, pExp
da90: 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20  r->iTable, 0);. 
daa0: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
dab0: 74 6f 6b 65 6e 2e 6e 3e 31 20 29 7b 0a 20 20 20  token.n>1 ){.   
dac0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dad0: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
dae0: 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f  (char*)pExpr->to
daf0: 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f  ken.z, pExpr->to
db00: 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  ken.n);.      }.
db10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
db20: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52   }.    case TK_R
db30: 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20  EGISTER: {.     
db40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
db50: 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c  p(v, OP_MemLoad,
db60: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
db70: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
db80: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
db90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a  QLITE_OMIT_CAST.
dba0: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54      case TK_CAST
dbb0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70  : {.      /* Exp
dbc0: 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  ressions of the 
dbd0: 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65  form:   CAST(pLe
dbe0: 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a  ft AS token) */.
dbf0: 20 20 20 20 20 20 69 6e 74 20 61 66 66 2c 20 74        int aff, t
dc00: 6f 5f 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69  o_op;.      sqli
dc10: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
dc20: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
dc30: 29 3b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 73  );.      aff = s
dc40: 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
dc50: 70 65 28 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  pe(&pExpr->token
dc60: 29 3b 0a 20 20 20 20 20 20 74 6f 5f 6f 70 20 3d  );.      to_op =
dc70: 20 61 66 66 20 2d 20 53 51 4c 49 54 45 5f 41 46   aff - SQLITE_AF
dc80: 46 5f 54 45 58 54 20 2b 20 4f 50 5f 54 6f 54 65  F_TEXT + OP_ToTe
dc90: 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  xt;.      assert
dca0: 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 54 65  ( to_op==OP_ToTe
dcb0: 78 74 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51  xt    || aff!=SQ
dcc0: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 20 20  LITE_AFF_TEXT   
dcd0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
dce0: 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c  ( to_op==OP_ToBl
dcf0: 6f 62 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51  ob    || aff!=SQ
dd00: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 20 20  LITE_AFF_NONE   
dd10: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
dd20: 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75  ( to_op==OP_ToNu
dd30: 6d 65 72 69 63 20 7c 7c 20 61 66 66 21 3d 53 51  meric || aff!=SQ
dd40: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
dd50: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
dd60: 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 49 6e  ( to_op==OP_ToIn
dd70: 74 20 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51  t     || aff!=SQ
dd80: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
dd90: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
dda0: 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 52 65  ( to_op==OP_ToRe
ddb0: 61 6c 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51  al    || aff!=SQ
ddc0: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 20 20  LITE_AFF_REAL   
ddd0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
dde0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 74 6f  3VdbeAddOp(v, to
ddf0: 5f 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  _op, 0, 0);.    
de00: 20 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 30 3b    stackChng = 0;
de10: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
de20: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
de30: 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a  LITE_OMIT_CAST *
de40: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  /.    case TK_LT
de50: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
de60: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
de70: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
de80: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
de90: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
dea0: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
deb0: 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29  ( TK_LT==OP_Lt )
dec0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
ded0: 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a  TK_LE==OP_Le );.
dee0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
def0: 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20  _GT==OP_Gt );.  
df00: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
df10: 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20  E==OP_Ge );.    
df20: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d    assert( TK_EQ=
df30: 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20  =OP_Eq );.      
df40: 61 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f  assert( TK_NE==O
df50: 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 73 71  P_Ne );.      sq
df60: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
df70: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
df80: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
df90: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
dfa0: 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
dfb0: 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
dfc0: 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
dfd0: 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
dfe0: 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 20 30 2c  ->pRight, op, 0,
dff0: 20 30 29 3b 0a 20 20 20 20 20 20 73 74 61 63 6b   0);.      stack
e000: 43 68 6e 67 20 3d 20 2d 31 3b 0a 20 20 20 20 20  Chng = -1;.     
e010: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
e020: 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20    case TK_AND:. 
e030: 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20     case TK_OR:. 
e040: 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a     case TK_PLUS:
e050: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41  .    case TK_STA
e060: 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d  R:.    case TK_M
e070: 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54  INUS:.    case T
e080: 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20  K_REM:.    case 
e090: 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63  TK_BITAND:.    c
e0a0: 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20  ase TK_BITOR:.  
e0b0: 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a    case TK_SLASH:
e0c0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48  .    case TK_LSH
e0d0: 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  IFT:.    case TK
e0e0: 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61  _RSHIFT: .    ca
e0f0: 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a  se TK_CONCAT: {.
e100: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
e110: 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 0a  _AND==OP_And );.
e120: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
e130: 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 0a 20 20  _OR==OP_Or );.  
e140: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 50      assert( TK_P
e150: 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 0a 20  LUS==OP_Add );. 
e160: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
e170: 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61  MINUS==OP_Subtra
e180: 63 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ct );.      asse
e190: 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52  rt( TK_REM==OP_R
e1a0: 65 6d 61 69 6e 64 65 72 20 29 3b 0a 20 20 20 20  emainder );.    
e1b0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54    assert( TK_BIT
e1c0: 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29  AND==OP_BitAnd )
e1d0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
e1e0: 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74  TK_BITOR==OP_Bit
e1f0: 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Or );.      asse
e200: 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50  rt( TK_SLASH==OP
e210: 5f 44 69 76 69 64 65 20 29 3b 0a 20 20 20 20 20  _Divide );.     
e220: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48 49   assert( TK_LSHI
e230: 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74  FT==OP_ShiftLeft
e240: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
e250: 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f  ( TK_RSHIFT==OP_
e260: 53 68 69 66 74 52 69 67 68 74 20 29 3b 0a 20 20  ShiftRight );.  
e270: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 43      assert( TK_C
e280: 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74  ONCAT==OP_Concat
e290: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
e2a0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
e2b0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
e2c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
e2d0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
e2e0: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
e2f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e300: 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20  AddOp(v, op, 0, 
e310: 30 29 3b 0a 20 20 20 20 20 20 73 74 61 63 6b 43  0);.      stackC
e320: 68 6e 67 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  hng = -1;.      
e330: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
e340: 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a   case TK_UMINUS:
e350: 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70   {.      Expr *p
e360: 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
e370: 65 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  eft;.      asser
e380: 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20 20  t( pLeft );.    
e390: 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d    if( pLeft->op=
e3a0: 3d 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20 70 4c 65  =TK_FLOAT || pLe
e3b0: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47  ft->op==TK_INTEG
e3c0: 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 54 6f  ER ){.        To
e3d0: 6b 65 6e 20 2a 70 20 3d 20 26 70 4c 65 66 74 2d  ken *p = &pLeft-
e3e0: 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  >token;.        
e3f0: 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65  char *z = sqlite
e400: 33 4d 50 72 69 6e 74 66 28 22 2d 25 2e 2a 73 22  3MPrintf("-%.*s"
e410: 2c 20 70 2d 3e 6e 2c 20 70 2d 3e 7a 29 3b 0a 20  , p->n, p->z);. 
e420: 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74         if( pLeft
e430: 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29  ->op==TK_FLOAT )
e440: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
e450: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
e460: 5f 52 65 61 6c 2c 20 30 2c 20 30 2c 20 7a 2c 20  _Real, 0, 0, z, 
e470: 70 2d 3e 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20  p->n+1);.       
e480: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e490: 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 76 2c    codeInteger(v,
e4a0: 20 7a 2c 20 70 2d 3e 6e 2b 31 29 3b 0a 20 20 20   z, p->n+1);.   
e4b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
e4c0: 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20  qliteFree(z);.  
e4d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e4e0: 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61     }.      /* Fa
e4f0: 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20  ll through into 
e500: 54 4b 5f 4e 4f 54 20 2a 2f 0a 20 20 20 20 7d 0a  TK_NOT */.    }.
e510: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e      case TK_BITN
e520: 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OT:.    case TK_
e530: 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  NOT: {.      ass
e540: 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d  ert( TK_BITNOT==
e550: 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 0a 20 20 20  OP_BitNot );.   
e560: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
e570: 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 0a 20 20 20  T==OP_Not );.   
e580: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
e590: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
e5a0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
e5b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e5c0: 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20  (v, op, 0, 0);. 
e5d0: 20 20 20 20 20 73 74 61 63 6b 43 68 6e 67 20 3d       stackChng =
e5e0: 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
e5f0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
e600: 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63  TK_ISNULL:.    c
e610: 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
e620: 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74  {.      int dest
e630: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
e640: 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73  TK_ISNULL==OP_Is
e650: 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61 73  Null );.      as
e660: 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c  sert( TK_NOTNULL
e670: 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a  ==OP_NotNull );.
e680: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e690: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
e6a0: 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a 20 20 20  eger, 1, 0);.   
e6b0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
e6c0: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
e6d0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
e6e0: 64 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  dest = sqlite3Vd
e6f0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
e700: 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69   + 2;.      sqli
e710: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
e720: 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20 20  op, 1, dest);.  
e730: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e740: 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d  ddOp(v, OP_AddIm
e750: 6d 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20  m, -1, 0);.     
e760: 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 30 3b 0a   stackChng = 0;.
e770: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e780: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
e790: 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  GG_FUNCTION: {. 
e7a0: 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 49       AggInfo *pI
e7b0: 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67  nfo = pExpr->pAg
e7c0: 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28  gInfo;.      if(
e7d0: 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20   pInfo==0 ){.   
e7e0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
e7f0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69  rMsg(pParse, "mi
e800: 73 75 73 65 20 6f 66 20 61 67 67 72 65 67 61 74  suse of aggregat
e810: 65 3a 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20  e: %T",.        
e820: 20 20 20 20 26 70 45 78 70 72 2d 3e 73 70 61 6e      &pExpr->span
e830: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
e840: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
e850: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
e860: 65 6d 4c 6f 61 64 2c 20 70 49 6e 66 6f 2d 3e 61  emLoad, pInfo->a
e870: 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41 67 67  Func[pExpr->iAgg
e880: 5d 2e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20  ].iMem, 0);.    
e890: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
e8a0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
e8b0: 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20  TK_CONST_FUNC:. 
e8c0: 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
e8d0: 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  ION: {.      Exp
e8e0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
e8f0: 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20  Expr->pList;.   
e900: 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70     int nExpr = p
e910: 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45  List ? pList->nE
e920: 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 46  xpr : 0;.      F
e930: 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a 20 20  uncDef *pDef;.  
e940: 20 20 20 20 69 6e 74 20 6e 49 64 3b 0a 20 20 20      int nId;.   
e950: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
e960: 49 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6f  Id;.      int co
e970: 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20  nstMask = 0;.   
e980: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
e990: 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61  u8 enc = ENC(pPa
e9a0: 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20  rse->db);.      
e9b0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
e9c0: 20 30 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d 20   0;.      zId = 
e9d0: 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f  (char*)pExpr->to
e9e0: 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 6e 49 64  ken.z;.      nId
e9f0: 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e   = pExpr->token.
ea00: 6e 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20  n;.      pDef = 
ea10: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
ea20: 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ion(pParse->db, 
ea30: 7a 49 64 2c 20 6e 49 64 2c 20 6e 45 78 70 72 2c  zId, nId, nExpr,
ea40: 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20   enc, 0);.      
ea50: 61 73 73 65 72 74 28 20 70 44 65 66 21 3d 30 20  assert( pDef!=0 
ea60: 29 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d  );.      nExpr =
ea70: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
ea80: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
ea90: 20 70 4c 69 73 74 29 3b 0a 23 69 66 6e 64 65 66   pList);.#ifndef
eaa0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
eab0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20  TUALTABLE.      
eac0: 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76 65 72  /* Possibly over
ead0: 6c 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69 6f  load the functio
eae0: 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 20 61  n if the first a
eaf0: 72 67 75 6d 65 6e 74 20 69 73 0a 20 20 20 20 20  rgument is.     
eb00: 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 74 61   ** a virtual ta
eb10: 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20  ble column..    
eb20: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f    **.      ** Fo
eb30: 72 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e  r infix function
eb40: 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52  s (LIKE, GLOB, R
eb50: 45 47 45 58 50 2c 20 61 6e 64 20 4d 41 54 43 48  EGEXP, and MATCH
eb60: 29 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20  ) use the.      
eb70: 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  ** second argume
eb80: 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66 69 72 73  nt, not the firs
eb90: 74 2c 20 61 73 20 74 68 65 20 61 72 67 75 6d 65  t, as the argume
eba0: 6e 74 20 74 6f 20 74 65 73 74 20 74 6f 0a 20 20  nt to test to.  
ebb0: 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74      ** see if it
ebc0: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   is a column in 
ebd0: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
ebe0: 20 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62    This is done b
ebf0: 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20  ecause.      ** 
ec00: 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64  the left operand
ec10: 20 6f 66 20 69 6e 66 69 78 20 66 75 6e 63 74 69   of infix functi
ec20: 6f 6e 73 20 28 74 68 65 20 6f 70 65 72 61 6e 64  ons (the operand
ec30: 20 77 65 20 77 61 6e 74 20 74 6f 0a 20 20 20 20   we want to.    
ec40: 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65    ** control ove
ec50: 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73 20 75  rloading) ends u
ec60: 70 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  p as the second 
ec70: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a  argument to the.
ec80: 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
ec90: 6e 2e 20 20 54 68 65 20 65 78 70 72 65 73 73 69  n.  The expressi
eca0: 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 69 73  on "A glob B" is
ecb0: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a   equivalent to .
ecc0: 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42        ** "glob(B
ecd0: 2c 41 29 2e 20 20 57 65 20 77 61 6e 74 20 74 6f  ,A).  We want to
ece0: 20 75 73 65 20 74 68 65 20 41 20 69 6e 20 22 41   use the A in "A
ecf0: 20 67 6c 6f 62 20 42 22 20 74 6f 20 74 65 73 74   glob B" to test
ed00: 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 66 75  .      ** for fu
ed10: 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69  nction overloadi
ed20: 6e 67 2e 20 20 42 75 74 20 77 65 20 75 73 65 20  ng.  But we use 
ed30: 74 68 65 20 42 20 74 65 72 6d 20 69 6e 20 22 67  the B term in "g
ed40: 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20 20 20  lob(B,A)"..     
ed50: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 45   */.      if( nE
ed60: 78 70 72 3e 3d 32 20 26 26 20 28 70 45 78 70 72  xpr>=2 && (pExpr
ed70: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 66  ->flags & EP_Inf
ed80: 69 78 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20  ixFunc) ){.     
ed90: 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
eda0: 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e  3VtabOverloadFun
edb0: 63 74 69 6f 6e 28 70 44 65 66 2c 20 6e 45 78 70  ction(pDef, nExp
edc0: 72 2c 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  r, pList->a[1].p
edd0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Expr);.      }el
ede0: 73 65 20 69 66 28 20 6e 45 78 70 72 3e 30 20 29  se if( nExpr>0 )
edf0: 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d  {.        pDef =
ee00: 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72   sqlite3VtabOver
ee10: 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 70 44 65  loadFunction(pDe
ee20: 66 2c 20 6e 45 78 70 72 2c 20 70 4c 69 73 74 2d  f, nExpr, pList-
ee30: 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[0].pExpr);.  
ee40: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
ee50: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45     for(i=0; i<nE
ee60: 78 70 72 20 26 26 20 69 3c 33 32 3b 20 69 2b 2b  xpr && i<32; i++
ee70: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
ee80: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
ee90: 74 61 6e 74 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  tant(pList->a[i]
eea0: 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
eeb0: 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c       constMask |
eec0: 3d 20 28 31 3c 3c 69 29 3b 0a 20 20 20 20 20 20  = (1<<i);.      
eed0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
eee0: 70 44 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65  pDef->needCollSe
eef0: 71 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20  q && !pColl ){. 
ef00: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d           pColl =
ef10: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
ef20: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 69 73  Seq(pParse, pLis
ef30: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
ef40: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ef50: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  }.      if( pDef
ef60: 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29 7b  ->needCollSeq ){
ef70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43  .        if( !pC
ef80: 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50  oll ) pColl = pP
ef90: 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
efa0: 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73 71  oll; .        sq
efb0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
efc0: 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30  OP_CollSeq, 0, 0
efd0: 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  , (char *)pColl,
efe0: 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P3_COLLSEQ);.  
eff0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
f000: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
f010: 5f 46 75 6e 63 74 69 6f 6e 2c 20 63 6f 6e 73 74  _Function, const
f020: 4d 61 73 6b 2c 20 6e 45 78 70 72 2c 20 28 63 68  Mask, nExpr, (ch
f030: 61 72 2a 29 70 44 65 66 2c 20 50 33 5f 46 55 4e  ar*)pDef, P3_FUN
f040: 43 44 45 46 29 3b 0a 20 20 20 20 20 20 73 74 61  CDEF);.      sta
f050: 63 6b 43 68 6e 67 20 3d 20 31 2d 6e 45 78 70 72  ckChng = 1-nExpr
f060: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
f070: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
f080: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
f090: 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  Y.    case TK_EX
f0a0: 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54  ISTS:.    case T
f0b0: 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20  K_SELECT: {.    
f0c0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
f0d0: 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lumn==0 ){.     
f0e0: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75     sqlite3CodeSu
f0f0: 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
f100: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
f110: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f120: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
f130: 4c 6f 61 64 2c 20 70 45 78 70 72 2d 3e 69 43 6f  Load, pExpr->iCo
f140: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
f150: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
f160: 22 23 20 6c 6f 61 64 20 73 75 62 71 75 65 72 79  "# load subquery
f170: 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20   result"));.    
f180: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
f190: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
f1a0: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
f1b0: 0a 20 20 20 20 20 20 63 68 61 72 20 61 66 66 69  .      char affi
f1c0: 6e 69 74 79 3b 0a 20 20 20 20 20 20 69 6e 74 20  nity;.      int 
f1d0: 63 6b 4f 66 66 73 65 74 20 3d 20 70 50 61 72 73  ckOffset = pPars
f1e0: 65 2d 3e 63 6b 4f 66 66 73 65 74 3b 0a 20 20 20  e->ckOffset;.   
f1f0: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75     sqlite3CodeSu
f200: 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
f210: 70 45 78 70 72 29 3b 0a 0a 20 20 20 20 20 20 2f  pExpr);..      /
f220: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  * Figure out the
f230: 20 61 66 66 69 6e 69 74 79 20 74 6f 20 75 73 65   affinity to use
f240: 20 74 6f 20 63 72 65 61 74 65 20 61 20 6b 65 79   to create a key
f250: 20 66 72 6f 6d 20 74 68 65 20 72 65 73 75 6c 74   from the result
f260: 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  s.      ** of th
f270: 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 61 66  e expression. af
f280: 66 69 6e 69 74 79 53 74 72 20 73 74 6f 72 65 73  finityStr stores
f290: 20 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67   a static string
f2a0: 20 73 75 69 74 61 62 6c 65 20 66 6f 72 0a 20 20   suitable for.  
f2b0: 20 20 20 20 2a 2a 20 50 33 20 6f 66 20 4f 50 5f      ** P3 of OP_
f2c0: 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 20 20 20 20  MakeRecord..    
f2d0: 20 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 69 6e    */.      affin
f2e0: 69 74 79 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e  ity = comparison
f2f0: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b  Affinity(pExpr);
f300: 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ..      sqlite3V
f310: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
f320: 6e 74 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a 20  nteger, 1, 0);. 
f330: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6b 4f       pParse->ckO
f340: 66 66 73 65 74 20 3d 20 28 63 6b 4f 66 66 73 65  ffset = (ckOffse
f350: 74 20 3f 20 28 63 6b 4f 66 66 73 65 74 2b 31 29  t ? (ckOffset+1)
f360: 20 3a 20 30 29 3b 0a 0a 20 20 20 20 20 20 2f 2a   : 0);..      /*
f370: 20 43 6f 64 65 20 74 68 65 20 3c 65 78 70 72 3e   Code the <expr>
f380: 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e   from "<expr> IN
f390: 20 28 2e 2e 2e 29 22 2e 20 54 68 65 20 74 65 6d   (...)". The tem
f3a0: 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 20 20 20  porary table.   
f3b0: 20 20 20 2a 2a 20 70 45 78 70 72 2d 3e 69 54 61     ** pExpr->iTa
f3c0: 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ble contains the
f3d0: 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61 6b   values that mak
f3e0: 65 20 75 70 20 74 68 65 20 28 2e 2e 2e 29 20 73  e up the (...) s
f3f0: 65 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  et..      */.   
f400: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
f410: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
f420: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
f430: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
f440: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
f450: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f460: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
f470: 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64 64 72  otNull, -1, addr
f480: 2b 34 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  +4);            
f490: 2f 2a 20 61 64 64 72 20 2b 20 30 20 2a 2f 0a 20  /* addr + 0 */. 
f4a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f4b0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
f4c0: 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   2, 0);.      sq
f4d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
f4e0: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29  , OP_Null, 0, 0)
f4f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f500: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
f510: 6f 74 6f 2c 20 30 2c 20 61 64 64 72 2b 37 29 3b  oto, 0, addr+7);
f520: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f530: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  beOp3(v, OP_Make
f540: 52 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20 26 61  Record, 1, 0, &a
f550: 66 66 69 6e 69 74 79 2c 20 31 29 3b 20 20 20 2f  ffinity, 1);   /
f560: 2a 20 61 64 64 72 20 2b 20 34 20 2a 2f 0a 20 20  * addr + 4 */.  
f570: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f580: 64 64 4f 70 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  ddOp(v, OP_Found
f590: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
f5a0: 20 61 64 64 72 2b 37 29 3b 0a 20 20 20 20 20 20   addr+7);.      
f5b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f5c0: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d  (v, OP_AddImm, -
f5d0: 31 2c 20 30 29 3b 20 20 20 20 20 20 20 20 20 20  1, 0);          
f5e0: 20 20 20 20 20 20 20 20 2f 2a 20 61 64 64 72 20          /* addr 
f5f0: 2b 20 36 20 2a 2f 0a 0a 20 20 20 20 20 20 62 72  + 6 */..      br
f600: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
f610: 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  f.    case TK_BE
f620: 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45  TWEEN: {.      E
f630: 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
f640: 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
f650: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
f660: 5f 69 74 65 6d 20 2a 70 4c 49 74 65 6d 20 3d 20  _item *pLItem = 
f670: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 3b  pExpr->pList->a;
f680: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69  .      Expr *pRi
f690: 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45  ght = pLItem->pE
f6a0: 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
f6b0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
f6c0: 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  e, pLeft);.     
f6d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f6e0: 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20  p(v, OP_Dup, 0, 
f6f0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
f700: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
f710: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  , pRight);.     
f720: 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
f730: 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
f740: 68 74 2c 20 4f 50 5f 47 65 2c 20 30 2c 20 30 29  ht, OP_Ge, 0, 0)
f750: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f760: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
f770: 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ull, 1, 0);.    
f780: 20 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20 20 20 20    pLItem++;.    
f790: 20 20 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65    pRight = pLIte
f7a0: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
f7b0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
f7c0: 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b  pParse, pRight);
f7d0: 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
f7e0: 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  re(pParse, pLeft
f7f0: 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c  , pRight, OP_Le,
f800: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
f810: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
f820: 2c 20 4f 50 5f 41 6e 64 2c 20 30 2c 20 30 29 3b  , OP_And, 0, 0);
f830: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f840: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
f850: 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 73  UPLUS: {.      s
f860: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
f870: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
f880: 65 66 74 29 3b 0a 20 20 20 20 20 20 73 74 61 63  eft);.      stac
f890: 6b 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20  kChng = 0;.     
f8a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
f8b0: 20 20 63 61 73 65 20 54 4b 5f 43 41 53 45 3a 20    case TK_CASE: 
f8c0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78 70 72  {.      int expr
f8d0: 5f 65 6e 64 5f 6c 61 62 65 6c 3b 0a 20 20 20 20  _end_label;.    
f8e0: 20 20 69 6e 74 20 6a 75 6d 70 49 6e 73 74 3b 0a    int jumpInst;.
f8f0: 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b        int nExpr;
f900: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
f910: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
f920: 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 74 72 75  List;.      stru
f930: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
f940: 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 0a 0a 20 20   *aListelem;..  
f950: 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70 72      assert(pExpr
f960: 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  ->pList);.      
f970: 61 73 73 65 72 74 28 28 70 45 78 70 72 2d 3e 70  assert((pExpr->p
f980: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 25 20 32 29  List->nExpr % 2)
f990: 20 3d 3d 20 30 29 3b 0a 20 20 20 20 20 20 61 73   == 0);.      as
f9a0: 73 65 72 74 28 70 45 78 70 72 2d 3e 70 4c 69 73  sert(pExpr->pLis
f9b0: 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20  t->nExpr > 0);. 
f9c0: 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45       pEList = pE
f9d0: 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20  xpr->pList;.    
f9e0: 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45    aListelem = pE
f9f0: 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e  List->a;.      n
fa00: 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  Expr = pEList->n
fa10: 45 78 70 72 3b 0a 20 20 20 20 20 20 65 78 70 72  Expr;.      expr
fa20: 5f 65 6e 64 5f 6c 61 62 65 6c 20 3d 20 73 71 6c  _end_label = sql
fa30: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
fa40: 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20  l(v);.      if( 
fa50: 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a  pExpr->pLeft ){.
fa60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
fa70: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
fa80: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
fa90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
faa0: 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69  (i=0; i<nExpr; i
fab0: 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20 20 20 73  =i+2){.        s
fac0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
fad0: 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d  Parse, aListelem
fae0: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
faf0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
fb00: 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Left ){.        
fb10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fb20: 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 31 2c  Op(v, OP_Dup, 1,
fb30: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a   1);.          j
fb40: 75 6d 70 49 6e 73 74 20 3d 20 63 6f 64 65 43 6f  umpInst = codeCo
fb50: 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
fb60: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 61 4c 69 73  xpr->pLeft, aLis
fb70: 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 2c 0a  telem[i].pExpr,.
fb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fba0: 20 4f 50 5f 4e 65 2c 20 30 2c 20 31 29 3b 0a 20   OP_Ne, 0, 1);. 
fbb0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
fbc0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
fbd0: 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  Pop, 1, 0);.    
fbe0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
fbf0: 20 20 20 20 20 6a 75 6d 70 49 6e 73 74 20 3d 20       jumpInst = 
fc00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fc10: 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 31 2c  (v, OP_IfNot, 1,
fc20: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
fc30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
fc40: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61  prCode(pParse, a
fc50: 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45  Listelem[i+1].pE
fc60: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  xpr);.        sq
fc70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
fc80: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 78  , OP_Goto, 0, ex
fc90: 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 29 3b 0a 20  pr_end_label);. 
fca0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
fcb0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 75  beJumpHere(v, ju
fcc0: 6d 70 49 6e 73 74 29 3b 0a 20 20 20 20 20 20 7d  mpInst);.      }
fcd0: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
fce0: 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20  ->pLeft ){.     
fcf0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fd00: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31  dOp(v, OP_Pop, 1
fd10: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
fd20: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
fd30: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20  Right ){.       
fd40: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
fd50: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
fd60: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 7d  pRight);.      }
fd70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
fd80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
fd90: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29  , OP_Null, 0, 0)
fda0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
fdb0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
fdc0: 76 65 4c 61 62 65 6c 28 76 2c 20 65 78 70 72 5f  veLabel(v, expr_
fdd0: 65 6e 64 5f 6c 61 62 65 6c 29 3b 0a 20 20 20 20  end_label);.    
fde0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
fdf0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
fe00: 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63  IT_TRIGGER.    c
fe10: 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a  ase TK_RAISE: {.
fe20: 20 20 20 20 20 20 69 66 28 20 21 70 50 61 72 73        if( !pPars
fe30: 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 29 7b 0a  e->trigStack ){.
fe40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
fe50: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a  rrorMsg(pParse,.
fe60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe70: 20 20 20 20 20 20 20 22 52 41 49 53 45 28 29 20         "RAISE() 
fe80: 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64  may only be used
fe90: 20 77 69 74 68 69 6e 20 61 20 74 72 69 67 67 65   within a trigge
fea0: 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 09 72 65  r-program");..re
feb0: 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
fec0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
fed0: 43 6f 6c 75 6d 6e 21 3d 4f 45 5f 49 67 6e 6f 72  Column!=OE_Ignor
fee0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 61 73  e ){.         as
fef0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f  sert( pExpr->iCo
ff00: 6c 75 6d 6e 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63  lumn==OE_Rollbac
ff10: 6b 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  k ||.           
ff20: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
ff30: 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 41 62 6f 72 74  lumn == OE_Abort
ff40: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
ff50: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
ff60: 75 6d 6e 20 3d 3d 20 4f 45 5f 46 61 69 6c 20 29  umn == OE_Fail )
ff70: 3b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  ;.         sqlit
ff80: 65 33 44 65 71 75 6f 74 65 45 78 70 72 28 70 45  e3DequoteExpr(pE
ff90: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 73  xpr);.         s
ffa0: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
ffb0: 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45   OP_Halt, SQLITE
ffc0: 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 70 45 78  _CONSTRAINT, pEx
ffd0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20  pr->iColumn,.   
ffe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fff0: 20 20 20 20 20 28 63 68 61 72 2a 29 70 45 78 70       (char*)pExp
10000 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70  r->token.z, pExp
10010 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20  r->token.n);.   
10020 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
10030 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
10040 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f  pr->iColumn == O
10050 45 5f 49 67 6e 6f 72 65 20 29 3b 0a 20 20 20 20  E_Ignore );.    
10060 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10070 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6e 74  AddOp(v, OP_Cont
10080 65 78 74 50 6f 70 2c 20 30 2c 20 30 29 3b 0a 20  extPop, 0, 0);. 
10090 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
100a0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
100b0 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e  oto, 0, pParse->
100c0 74 72 69 67 53 74 61 63 6b 2d 3e 69 67 6e 6f 72  trigStack->ignor
100d0 65 4a 75 6d 70 29 3b 0a 20 20 20 20 20 20 20 20  eJump);.        
100e0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
100f0 20 22 23 20 72 61 69 73 65 28 49 47 4e 4f 52 45   "# raise(IGNORE
10100 29 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  )"));.      }.  
10110 20 20 20 20 73 74 61 63 6b 43 68 6e 67 20 3d 20      stackChng = 
10120 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
10130 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
10140 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
10150 63 6b 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  ckOffset ){.    
10160 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74  pParse->ckOffset
10170 20 2b 3d 20 73 74 61 63 6b 43 68 6e 67 3b 0a 20   += stackChng;. 
10180 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
10190 65 2d 3e 63 6b 4f 66 66 73 65 74 20 29 3b 0a 20  e->ckOffset );. 
101a0 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
101b0 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
101c0 52 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  R./*.** Generate
101d0 20 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75   code that evalu
101e0 74 65 73 20 74 68 65 20 67 69 76 65 6e 20 65 78  tes the given ex
101f0 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 6c 65 61  pression and lea
10200 76 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  ves the result.*
10210 2a 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20  * on the stack. 
10220 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
10230 33 45 78 70 72 43 6f 64 65 28 29 2e 0a 2a 2a 0a  3ExprCode()..**.
10240 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
10250 6d 69 67 68 74 20 61 6c 73 6f 20 63 61 63 68 65  might also cache
10260 20 74 68 65 20 72 65 73 75 6c 74 20 61 6e 64 20   the result and 
10270 6d 6f 64 69 66 79 20 74 68 65 20 70 45 78 70 72  modify the pExpr
10280 20 74 72 65 65 0a 2a 2a 20 73 6f 20 74 68 61 74   tree.** so that
10290 20 69 74 20 77 69 6c 6c 20 6d 61 6b 65 20 75 73   it will make us
102a0 65 20 6f 66 20 74 68 65 20 63 61 63 68 65 64 20  e of the cached 
102b0 72 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71  result on subseq
102c0 75 65 6e 74 20 65 76 61 6c 75 61 74 69 6f 6e 73  uent evaluations
102d0 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20  .** rather than 
102e0 65 76 61 6c 75 61 74 65 20 74 68 65 20 77 68 6f  evaluate the who
102f0 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 67  le expression ag
10300 61 69 6e 2e 20 20 54 72 69 76 69 61 6c 20 65 78  ain.  Trivial ex
10310 70 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a  pressions are.**
10320 20 6e 6f 74 20 63 61 63 68 65 64 2e 20 20 49 66   not cached.  If
10330 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
10340 69 73 20 63 61 63 68 65 64 2c 20 69 74 73 20 72  is cached, its r
10350 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64 20  esult is stored 
10360 69 6e 20 61 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20  in a .** memory 
10370 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  location..*/.voi
10380 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
10390 65 41 6e 64 43 61 63 68 65 28 50 61 72 73 65 20  eAndCache(Parse 
103a0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
103b0 45 78 70 72 29 7b 0a 20 20 56 64 62 65 20 2a 76  Expr){.  Vdbe *v
103c0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
103d0 3b 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 20 20  ;.  int iMem;.  
103e0 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72 32  int addr1, addr2
103f0 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
10400 65 74 75 72 6e 3b 0a 20 20 61 64 64 72 31 20 3d  eturn;.  addr1 =
10410 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
10420 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 73 71  entAddr(v);.  sq
10430 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
10440 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
10450 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56  addr2 = sqlite3V
10460 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
10470 29 3b 0a 20 20 69 66 28 20 61 64 64 72 32 3e 61  );.  if( addr2>a
10480 64 64 72 31 2b 31 20 7c 7c 20 73 71 6c 69 74 65  ddr1+1 || sqlite
10490 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 61 64  3VdbeGetOp(v, ad
104a0 64 72 31 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50  dr1)->opcode==OP
104b0 5f 46 75 6e 63 74 69 6f 6e 20 29 7b 0a 20 20 20  _Function ){.   
104c0 20 69 4d 65 6d 20 3d 20 70 45 78 70 72 2d 3e 69   iMem = pExpr->i
104d0 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e  Table = pParse->
104e0 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 73 71 6c 69  nMem++;.    sqli
104f0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10500 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65  OP_MemStore, iMe
10510 6d 2c 20 30 29 3b 0a 20 20 20 20 70 45 78 70 72  m, 0);.    pExpr
10520 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54  ->op = TK_REGIST
10530 45 52 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  ER;.  }.}.#endif
10540 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
10550 20 63 6f 64 65 20 74 68 61 74 20 70 75 73 68 65   code that pushe
10560 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65  s the value of e
10570 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20  very element of 
10580 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70  the given.** exp
10590 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 6f 6e 74  ression list ont
105a0 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a  o the stack..**.
105b0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
105c0 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
105d0 20 70 75 73 68 65 64 20 6f 6e 74 6f 20 74 68 65   pushed onto the
105e0 20 73 74 61 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73   stack..*/.int s
105f0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
10600 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  prList(.  Parse 
10610 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20  *pParse,     /* 
10620 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
10630 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
10640 4c 69 73 74 20 20 20 20 2f 2a 20 54 68 65 20 65  List    /* The e
10650 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74  xpression list t
10660 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 29 7b  o be coded */.){
10670 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
10680 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
10690 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66    int i, n;.  if
106a0 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
106b0 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 70 4c 69  urn 0;.  n = pLi
106c0 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 66 6f 72  st->nExpr;.  for
106d0 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
106e0 20 69 3d 6e 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20   i=n; i>0; i--, 
106f0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71  pItem++){.    sq
10700 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
10710 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78  arse, pItem->pEx
10720 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  pr);.  }.  retur
10730 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  n n;.}../*.** Ge
10740 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
10750 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73  a boolean expres
10760 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  sion such that a
10770 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a   jump is made.**
10780 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64   to the label "d
10790 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72  est" if the expr
107a0 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62  ession is true b
107b0 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20  ut execution.** 
107c0 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67  continues straig
107d0 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65  ht thru if the e
107e0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c  xpression is fal
107f0 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
10800 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c   expression eval
10810 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e  uates to NULL (n
10820 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20  either true nor 
10830 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20  false), then.** 
10840 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66  take the jump if
10850 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   the jumpIfNull 
10860 66 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a  flag is true..**
10870 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65  .** This code de
10880 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63  pends on the fac
10890 74 20 74 68 61 74 20 63 65 72 74 61 69 6e 20 74  t that certain t
108a0 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a  oken values (ex:
108b0 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74   TK_EQ).** are t
108c0 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64  he same as opcod
108d0 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50  e values (ex: OP
108e0 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d  _Eq) that implem
108f0 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f  ent the correspo
10900 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69  nding.** operati
10910 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d  on.  Special com
10920 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20  ments in vdbe.c 
10930 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65  and the mkopcode
10940 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a  h.awk script in.
10950 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63  ** the make proc
10960 65 73 73 20 63 61 75 73 65 20 74 68 65 73 65 20  ess cause these 
10970 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e  values to align.
10980 20 20 41 73 73 65 72 74 28 29 73 20 69 6e 20 74    Assert()s in t
10990 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77  he code.** below
109a0 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
109b0 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69   numbers are ali
109c0 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a  gned correctly..
109d0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
109e0 78 70 72 49 66 54 72 75 65 28 50 61 72 73 65 20  xprIfTrue(Parse 
109f0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
10a00 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20  Expr, int dest, 
10a10 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b  int jumpIfNull){
10a20 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
10a30 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
10a40 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  t op = 0;.  int 
10a50 63 6b 4f 66 66 73 65 74 20 3d 20 70 50 61 72 73  ckOffset = pPars
10a60 65 2d 3e 63 6b 4f 66 66 73 65 74 3b 0a 20 20 69  e->ckOffset;.  i
10a70 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72  f( v==0 || pExpr
10a80 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
10a90 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
10aa0 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
10ab0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
10ac0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20   {.      int d2 
10ad0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
10ae0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
10af0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
10b00 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
10b10 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 21 6a  r->pLeft, d2, !j
10b20 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
10b30 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
10b40 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
10b50 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
10b60 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
10b70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
10b80 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
10b90 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  2);.      break;
10ba0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
10bb0 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 73  TK_OR: {.      s
10bc0 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
10bd0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
10be0 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
10bf0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
10c00 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
10c10 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
10c20 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
10c30 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
10c40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
10c50 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
10c60 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
10c70 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
10c80 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
10c90 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
10ca0 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
10cb0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
10cc0 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
10cd0 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
10ce0 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
10cf0 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
10d00 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
10d10 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 61  TK_EQ: {.      a
10d20 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50  ssert( TK_LT==OP
10d30 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Lt );.      ass
10d40 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c  ert( TK_LE==OP_L
10d50 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
10d60 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20  t( TK_GT==OP_Gt 
10d70 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
10d80 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b   TK_GE==OP_Ge );
10d90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
10da0 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20  K_EQ==OP_Eq );. 
10db0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
10dc0 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20  NE==OP_Ne );.   
10dd0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
10de0 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
10df0 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
10e00 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
10e10 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
10e20 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f  Right);.      co
10e30 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
10e40 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
10e50 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
10e60 70 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  p, dest, jumpIfN
10e70 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
10e80 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
10e90 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
10ea0 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
10eb0 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
10ec0 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f  ( TK_ISNULL==OP_
10ed0 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20  IsNull );.      
10ee0 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55  assert( TK_NOTNU
10ef0 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  LL==OP_NotNull )
10f00 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
10f10 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
10f20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
10f30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10f40 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20  AddOp(v, op, 1, 
10f50 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65  dest);.      bre
10f60 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
10f70 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
10f80 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78  .      /* The ex
10f90 70 72 65 73 73 69 6f 6e 20 22 78 20 42 45 54 57  pression "x BETW
10fa0 45 45 4e 20 79 20 41 4e 44 20 7a 22 20 69 73 20  EEN y AND z" is 
10fb0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 3a 0a  implemented as:.
10fc0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
10fd0 2a 20 31 20 49 46 20 28 78 20 3c 20 79 29 20 47  * 1 IF (x < y) G
10fe0 4f 54 4f 20 33 0a 20 20 20 20 20 20 2a 2a 20 32  OTO 3.      ** 2
10ff0 20 49 46 20 28 78 20 3c 3d 20 7a 29 20 47 4f 54   IF (x <= z) GOT
11000 4f 20 3c 64 65 73 74 3e 0a 20 20 20 20 20 20 2a  O <dest>.      *
11010 2a 20 33 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f  * 3 ....      */
11020 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
11030 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
11040 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
11050 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  t;.      Expr *p
11060 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70  Right = pExpr->p
11070 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
11080 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
11090 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
110a0 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
110b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
110c0 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b  , OP_Dup, 0, 0);
110d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
110e0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
110f0 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 61 64  Right);.      ad
11100 64 72 20 3d 20 63 6f 64 65 43 6f 6d 70 61 72 65  dr = codeCompare
11110 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
11120 70 52 69 67 68 74 2c 20 4f 50 5f 4c 74 2c 20 30  pRight, OP_Lt, 0
11130 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  , !jumpIfNull);.
11140 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20  .      pRight = 
11150 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
11160 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  1].pExpr;.      
11170 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
11180 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b  pParse, pRight);
11190 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
111a0 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  re(pParse, pLeft
111b0 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c  , pRight, OP_Le,
111c0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
111d0 6c 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  l);..      sqlit
111e0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
111f0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29  P_Integer, 0, 0)
11200 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
11210 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
11220 64 64 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ddr);.      sqli
11230 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
11240 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20  OP_Pop, 1, 0);. 
11250 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11260 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
11270 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
11280 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
11290 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  Expr);.      sql
112a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
112b0 20 4f 50 5f 49 66 2c 20 6a 75 6d 70 49 66 4e 75   OP_If, jumpIfNu
112c0 6c 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  ll, dest);.     
112d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
112e0 7d 0a 20 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66  }.  pParse->ckOf
112f0 66 73 65 74 20 3d 20 63 6b 4f 66 66 73 65 74 3b  fset = ckOffset;
11300 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
11310 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f  te code for a bo
11320 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  olean expression
11330 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d   such that a jum
11340 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  p is made.** to 
11350 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22  the label "dest"
11360 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
11370 6f 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74 20  on is false but 
11380 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e  execution.** con
11390 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20  tinues straight 
113a0 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72  thru if the expr
113b0 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a  ession is true..
113c0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
113d0 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65  ression evaluate
113e0 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68  s to NULL (neith
113f0 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73  er true nor fals
11400 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20  e) then.** jump 
11410 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73  if jumpIfNull is
11420 20 74 72 75 65 20 6f 72 20 66 61 6c 6c 20 74 68   true or fall th
11430 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e  rough if jumpIfN
11440 75 6c 6c 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2f  ull is false..*/
11450 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
11460 72 49 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a  rIfFalse(Parse *
11470 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
11480 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69  xpr, int dest, i
11490 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
114a0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
114b0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
114c0 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63   op = 0;.  int c
114d0 6b 4f 66 66 73 65 74 20 3d 20 70 50 61 72 73 65  kOffset = pParse
114e0 2d 3e 63 6b 4f 66 66 73 65 74 3b 0a 20 20 69 66  ->ckOffset;.  if
114f0 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d  ( v==0 || pExpr=
11500 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  =0 ) return;..  
11510 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  /* The value of 
11520 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70  pExpr->op and op
11530 20 61 72 65 20 72 65 6c 61 74 65 64 20 61 73 20   are related as 
11540 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20  follows:.  **.  
11550 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  **       pExpr->
11560 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 6f 70  op            op
11570 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d  .  **       ----
11580 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20 2d  -----          -
11590 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20  ---------.  **  
115a0 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20       TK_ISNULL  
115b0 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75          OP_NotNu
115c0 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  ll.  **       TK
115d0 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20 20  _NOTNULL        
115e0 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20   OP_IsNull.  ** 
115f0 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20 20        TK_NE     
11600 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a 20           OP_Eq. 
11610 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51 20   **       TK_EQ 
11620 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
11630 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Ne.  **       TK
11640 5f 47 54 20 20 20 20 20 20 20 20 20 20 20 20 20  _GT             
11650 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20   OP_Le.  **     
11660 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20 20    TK_LE         
11670 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20       OP_Gt.  ** 
11680 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20 20        TK_GE     
11690 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20           OP_Lt. 
116a0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54 20   **       TK_LT 
116b0 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
116c0 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72  Ge.  **.  ** For
116d0 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66   other values of
116e0 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69   pExpr->op, op i
116f0 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 20  s undefined and 
11700 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65  unused..  ** The
11710 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e   value of TK_ an
11720 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20  d OP_ constants 
11730 61 72 65 20 61 72 72 61 6e 67 65 64 20 73 75 63  are arranged suc
11740 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 63  h that we.  ** c
11750 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d  an compute the m
11760 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73 69  apping above usi
11770 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
11780 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a   expression..  *
11790 2a 20 41 73 73 65 72 74 28 29 73 20 76 65 72 69  * Assert()s veri
117a0 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d 70  fy that the comp
117b0 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72 65  utation is corre
117c0 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20  ct..  */.  op = 
117d0 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f  ((pExpr->op+(TK_
117e0 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54  ISNULL&1))^1)-(T
117f0 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20  K_ISNULL&1);..  
11800 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65 63  /* Verify correc
11810 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54  t alignment of T
11820 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74  K_ and OP_ const
11830 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ants.  */.  asse
11840 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
11850 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d  K_ISNULL || op==
11860 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20  OP_NotNull );.  
11870 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
11880 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c  p!=TK_NOTNULL ||
11890 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29   op==OP_IsNull )
118a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
118b0 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20  r->op!=TK_NE || 
118c0 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61  op==OP_Eq );.  a
118d0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
118e0 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_EQ || op==O
118f0 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Ne );.  assert
11900 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
11910 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20  LT || op==OP_Ge 
11920 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
11930 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c  pr->op!=TK_LE ||
11940 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20   op==OP_Gt );.  
11950 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
11960 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d  p!=TK_GT || op==
11970 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Le );.  asser
11980 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
11990 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74  _GE || op==OP_Lt
119a0 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70   );..  switch( p
119b0 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
119c0 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20  case TK_AND: {. 
119d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
119e0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
119f0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
11a00 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
11a10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
11a20 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
11a30 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
11a40 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
11a50 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
11a60 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
11a70 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69  TK_OR: {.      i
11a80 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56  nt d2 = sqlite3V
11a90 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
11aa0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
11ab0 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
11ac0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
11ad0 32 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  2, !jumpIfNull);
11ae0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
11af0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
11b00 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
11b10 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
11b20 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
11b30 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
11b40 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20  l(v, d2);.      
11b50 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
11b60 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a   case TK_NOT: {.
11b70 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
11b80 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
11b90 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
11ba0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
11bb0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11bc0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
11bd0 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
11be0 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
11bf0 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
11c00 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GE:.    case TK_
11c10 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
11c20 45 51 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  EQ: {.      sqli
11c30 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
11c40 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
11c50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11c60 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
11c70 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
11c80 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
11c90 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
11ca0 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
11cb0 70 52 69 67 68 74 2c 20 6f 70 2c 20 64 65 73 74  pRight, op, dest
11cc0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
11cd0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11ce0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
11cf0 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
11d00 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
11d10 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
11d20 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
11d30 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
11d40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11d50 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74 29  (v, op, 1, dest)
11d60 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
11d70 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
11d80 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
11d90 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
11da0 69 6f 6e 20 69 73 20 22 78 20 42 45 54 57 45 45  ion is "x BETWEE
11db0 4e 20 79 20 41 4e 44 20 7a 22 2e 20 49 74 20 69  N y AND z". It i
11dc0 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  s implemented as
11dd0 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
11de0 20 2a 2a 20 31 20 49 46 20 28 78 20 3e 3d 20 79   ** 1 IF (x >= y
11df0 29 20 47 4f 54 4f 20 33 0a 20 20 20 20 20 20 2a  ) GOTO 3.      *
11e00 2a 20 32 20 47 4f 54 4f 20 3c 64 65 73 74 3e 0a  * 2 GOTO <dest>.
11e10 20 20 20 20 20 20 2a 2a 20 33 20 49 46 20 28 78        ** 3 IF (x
11e20 20 3e 20 7a 29 20 47 4f 54 4f 20 3c 64 65 73 74   > z) GOTO <dest
11e30 3e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  >.      */.     
11e40 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
11e50 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
11e60 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
11e70 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
11e80 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  = pExpr->pList->
11e90 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[0].pExpr;.    
11ea0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
11eb0 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29  e(pParse, pLeft)
11ec0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
11ed0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
11ee0 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  up, 0, 0);.     
11ef0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
11f00 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
11f10 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
11f20 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
11f30 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
11f40 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
11f50 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  se, pLeft, pRigh
11f60 74 2c 20 4f 50 5f 47 65 2c 20 61 64 64 72 2b 33  t, OP_Ge, addr+3
11f70 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  , !jumpIfNull);.
11f80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11f90 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
11fa0 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 1, 0);.      
11fb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11fc0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
11fd0 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 52 69  dest);.      pRi
11fe0 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  ght = pExpr->pLi
11ff0 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a  st->a[1].pExpr;.
12000 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
12010 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52  rCode(pParse, pR
12020 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64  ight);.      cod
12030 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
12040 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
12050 4f 50 5f 47 74 2c 20 64 65 73 74 2c 20 6a 75 6d  OP_Gt, dest, jum
12060 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
12070 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
12080 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
12090 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
120a0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  e(pParse, pExpr)
120b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
120c0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
120d0 66 4e 6f 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  fNot, jumpIfNull
120e0 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62  , dest);.      b
120f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
12100 20 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73    pParse->ckOffs
12110 65 74 20 3d 20 63 6b 4f 66 66 73 65 74 3b 0a 7d  et = ckOffset;.}
12120 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65  ../*.** Do a dee
12130 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20  p comparison of 
12140 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74  two expression t
12150 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20 54 52  rees.  Return TR
12160 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a 2a  UE (non-zero).**
12170 20 69 66 20 74 68 65 79 20 61 72 65 20 69 64 65   if they are ide
12180 6e 74 69 63 61 6c 20 61 6e 64 20 72 65 74 75 72  ntical and retur
12190 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65 79 20  n FALSE if they 
121a0 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61  differ in any wa
121b0 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  y..**.** Sometim
121c0 65 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  es this routine 
121d0 77 69 6c 6c 20 72 65 74 75 72 6e 20 46 41 4c 53  will return FALS
121e0 45 20 65 76 65 6e 20 69 66 20 74 68 65 20 74 77  E even if the tw
121f0 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  o expressions.**
12200 20 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75 69   really are equi
12210 76 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20 63  valent.  If we c
12220 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61 74  annot prove that
12230 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
12240 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63 61   are.** identica
12250 6c 2c 20 77 65 20 72 65 74 75 72 6e 20 46 41 4c  l, we return FAL
12260 53 45 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61  SE just to be sa
12270 66 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20  fe.  So if this 
12280 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
12290 6e 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 79  ns false, then y
122a0 6f 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79  ou do not really
122b0 20 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74 61 69   know for certai
122c0 6e 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20  n if the two.** 
122d0 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20  expressions are 
122e0 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 69  the same.  But i
122f0 66 20 79 6f 75 20 67 65 74 20 61 20 54 52 55 45  f you get a TRUE
12300 20 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f   return, then yo
12310 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72 65  u.** can be sure
12320 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
12330 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20   are the same.  
12340 49 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77 68  In the places wh
12350 65 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ere.** this rout
12360 69 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74 20  ine is used, it 
12370 64 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74 6f  does not hurt to
12380 20 67 65 74 20 61 6e 20 65 78 74 72 61 20 46 41   get an extra FA
12390 4c 53 45 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75  LSE - that.** ju
123a0 73 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20  st might result 
123b0 69 6e 20 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79  in some slightly
123c0 20 73 6c 6f 77 65 72 20 63 6f 64 65 2e 20 20 42   slower code.  B
123d0 75 74 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20  ut returning.** 
123e0 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 54 52 55  an incorrect TRU
123f0 45 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  E could lead to 
12400 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a  a malfunction..*
12410 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
12420 72 43 6f 6d 70 61 72 65 28 45 78 70 72 20 2a 70  rCompare(Expr *p
12430 41 2c 20 45 78 70 72 20 2a 70 42 29 7b 0a 20 20  A, Expr *pB){.  
12440 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d  int i;.  if( pA=
12450 3d 30 7c 7c 70 42 3d 3d 30 20 29 7b 0a 20 20 20  =0||pB==0 ){.   
12460 20 72 65 74 75 72 6e 20 70 42 3d 3d 70 41 3b 0a   return pB==pA;.
12470 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70    }.  if( pA->op
12480 21 3d 70 42 2d 3e 6f 70 20 29 20 72 65 74 75 72  !=pB->op ) retur
12490 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 41 2d 3e  n 0;.  if( (pA->
124a0 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69  flags & EP_Disti
124b0 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73  nct)!=(pB->flags
124c0 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 20   & EP_Distinct) 
124d0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
124e0 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f  ( !sqlite3ExprCo
124f0 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c  mpare(pA->pLeft,
12500 20 70 42 2d 3e 70 4c 65 66 74 29 20 29 20 72 65   pB->pLeft) ) re
12510 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73  turn 0;.  if( !s
12520 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
12530 65 28 70 41 2d 3e 70 52 69 67 68 74 2c 20 70 42  e(pA->pRight, pB
12540 2d 3e 70 52 69 67 68 74 29 20 29 20 72 65 74 75  ->pRight) ) retu
12550 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e  rn 0;.  if( pA->
12560 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 69 66 28  pList ){.    if(
12570 20 70 42 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 20   pB->pList==0 ) 
12580 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66  return 0;.    if
12590 28 20 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  ( pA->pList->nEx
125a0 70 72 21 3d 70 42 2d 3e 70 4c 69 73 74 2d 3e 6e  pr!=pB->pList->n
125b0 45 78 70 72 20 29 20 72 65 74 75 72 6e 20 30 3b  Expr ) return 0;
125c0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
125d0 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pA->pList->nExpr
125e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
125f0 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f  ( !sqlite3ExprCo
12600 6d 70 61 72 65 28 70 41 2d 3e 70 4c 69 73 74 2d  mpare(pA->pList-
12610 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 42 2d  >a[i].pExpr, pB-
12620 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  >pList->a[i].pEx
12630 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pr) ){.        r
12640 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
12650 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
12660 66 28 20 70 42 2d 3e 70 4c 69 73 74 20 29 7b 0a  f( pB->pList ){.
12670 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
12680 7d 0a 20 20 69 66 28 20 70 41 2d 3e 70 53 65 6c  }.  if( pA->pSel
12690 65 63 74 20 7c 7c 20 70 42 2d 3e 70 53 65 6c 65  ect || pB->pSele
126a0 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ct ) return 0;. 
126b0 20 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65 21   if( pA->iTable!
126c0 3d 70 42 2d 3e 69 54 61 62 6c 65 20 7c 7c 20 70  =pB->iTable || p
126d0 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e  A->iColumn!=pB->
126e0 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e  iColumn ) return
126f0 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70   0;.  if( pA->op
12700 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  !=TK_COLUMN && p
12710 41 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 7b 0a 20 20  A->token.z ){.  
12720 20 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e    if( pB->token.
12730 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  z==0 ) return 0;
12740 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 74 6f 6b  .    if( pB->tok
12750 65 6e 2e 6e 21 3d 70 41 2d 3e 74 6f 6b 65 6e 2e  en.n!=pA->token.
12760 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  n ) return 0;.  
12770 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
12780 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 41 2d  NICmp((char*)pA-
12790 3e 74 6f 6b 65 6e 2e 7a 2c 28 63 68 61 72 2a 29  >token.z,(char*)
127a0 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 2c 70 42 2d 3e  pB->token.z,pB->
127b0 74 6f 6b 65 6e 2e 6e 29 21 3d 30 20 29 7b 0a 20  token.n)!=0 ){. 
127c0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
127d0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
127e0 6e 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  n 1;.}.../*.** A
127f0 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
12800 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f   to the pAggInfo
12810 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20  ->aCol[] array. 
12820 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
12830 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  x of.** the new 
12840 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  element.  Return
12850 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62   a negative numb
12860 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69  er if malloc fai
12870 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
12880 74 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75  t addAggInfoColu
12890 6d 6e 28 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66  mn(AggInfo *pInf
128a0 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70  o){.  int i;.  p
128b0 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c  Info->aCol = sql
128c0 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74  ite3ArrayAllocat
128d0 65 28 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d  e(.       pInfo-
128e0 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69  >aCol,.       si
128f0 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c  zeof(pInfo->aCol
12900 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 33 2c 0a  [0]),.       3,.
12910 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e         &pInfo->n
12920 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26  Column,.       &
12930 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 41 6c  pInfo->nColumnAl
12940 6c 6f 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20  loc,.       &i. 
12950 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a   );.  return i;.
12960 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  }    ../*.** Add
12970 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
12980 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e  o the pAggInfo->
12990 61 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20  aFunc[] array.  
129a0 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
129b0 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65   of.** the new e
129c0 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  lement.  Return 
129d0 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
129e0 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  r if malloc fail
129f0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
12a00 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28   addAggInfoFunc(
12a10 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b  AggInfo *pInfo){
12a20 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66  .  int i;.  pInf
12a30 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69 74  o->aFunc = sqlit
12a40 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28  e3ArrayAllocate(
12a50 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61  .       pInfo->a
12a60 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 73 69 7a  Func,.       siz
12a70 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63  eof(pInfo->aFunc
12a80 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 33 2c 0a  [0]),.       3,.
12a90 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e         &pInfo->n
12aa0 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 26 70 49  Func,.       &pI
12ab0 6e 66 6f 2d 3e 6e 46 75 6e 63 41 6c 6c 6f 63 2c  nfo->nFuncAlloc,
12ac0 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a  .       &i.  );.
12ad0 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20    return i;.}   
12ae0 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73   ../*.** This is
12af0 20 61 6e 20 78 46 75 6e 63 20 66 6f 72 20 77 61   an xFunc for wa
12b00 6c 6b 45 78 70 72 54 72 65 65 28 29 20 75 73 65  lkExprTree() use
12b10 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 0a  d to implement .
12b20 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  ** sqlite3ExprAn
12b30 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
12b40 29 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 45  ).  See sqlite3E
12b50 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
12b60 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69  ates.** for addi
12b70 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
12b80 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  on..**.** This r
12b90 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20  outine analyzes 
12ba0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 66 75  the aggregate fu
12bb0 6e 63 74 69 6f 6e 20 61 74 20 70 45 78 70 72 2e  nction at pExpr.
12bc0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
12bd0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 28  nalyzeAggregate(
12be0 76 6f 69 64 20 2a 70 41 72 67 2c 20 45 78 70 72  void *pArg, Expr
12bf0 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
12c00 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  i;.  NameContext
12c10 20 2a 70 4e 43 20 3d 20 28 4e 61 6d 65 43 6f 6e   *pNC = (NameCon
12c20 74 65 78 74 20 2a 29 70 41 72 67 3b 0a 20 20 50  text *)pArg;.  P
12c30 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
12c40 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53 72  NC->pParse;.  Sr
12c50 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20  cList *pSrcList 
12c60 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b  = pNC->pSrcList;
12c70 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  .  AggInfo *pAgg
12c80 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41 67 67  Info = pNC->pAgg
12c90 49 6e 66 6f 3b 0a 20 20 0a 0a 20 20 73 77 69 74  Info;.  ..  swit
12ca0 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
12cb0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
12cc0 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73  _COLUMN:.    cas
12cd0 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
12ce0 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
12cf0 20 73 65 65 20 69 66 20 74 68 65 20 63 6f 6c 75   see if the colu
12d00 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20  mn is in one of 
12d10 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68  the tables in th
12d20 65 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20  e FROM.      ** 
12d30 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67  clause of the ag
12d40 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f  gregate query */
12d50 0a 20 20 20 20 20 20 69 66 28 20 70 53 72 63 4c  .      if( pSrcL
12d60 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ist ){.        s
12d70 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
12d80 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72 63  em *pItem = pSrc
12d90 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20  List->a;.       
12da0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63   for(i=0; i<pSrc
12db0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
12dc0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
12dd0 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
12de0 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20  nfo_col *pCol;. 
12df0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
12e00 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65  pr->iTable==pIte
12e10 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  m->iCursor ){.  
12e20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
12e30 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
12e40 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  int, it means th
12e50 61 74 20 70 45 78 70 72 20 72 65 66 65 72 73 20  at pExpr refers 
12e60 74 6f 20 61 20 74 61 62 6c 65 0a 20 20 20 20 20  to a table.     
12e70 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69         ** that i
12e80 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
12e90 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72  ause of the aggr
12ea0 65 67 61 74 65 20 71 75 65 72 79 2e 20 20 0a 20  egate query.  . 
12eb0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20             **.  
12ec0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b            ** Mak
12ed0 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74  e an entry for t
12ee0 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67  he column in pAg
12ef0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66  gInfo->aCol[] if
12f00 20 74 68 65 72 65 0a 20 20 20 20 20 20 20 20 20   there.         
12f10 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20     ** is not an 
12f20 65 6e 74 72 79 20 74 68 65 72 65 20 61 6c 72 65  entry there alre
12f30 61 64 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ady..           
12f40 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
12f50 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20  int k;.         
12f60 20 20 20 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e     pCol = pAggIn
12f70 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20  fo->aCol;.      
12f80 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
12f90 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75  <pAggInfo->nColu
12fa0 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  mn; k++, pCol++)
12fb0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
12fc0 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65  if( pCol->iTable
12fd0 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  ==pExpr->iTable 
12fe0 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
12ff0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75       pCol->iColu
13000 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75  mn==pExpr->iColu
13010 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
13020 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13030 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
13040 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
13050 20 20 20 20 20 20 20 69 66 28 20 6b 3e 3d 70 41         if( k>=pA
13060 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 20  ggInfo->nColumn 
13070 26 26 20 28 6b 20 3d 20 61 64 64 41 67 67 49 6e  && (k = addAggIn
13080 66 6f 43 6f 6c 75 6d 6e 28 70 41 67 67 49 6e 66  foColumn(pAggInf
13090 6f 29 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  o))>=0 ){.      
130a0 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26          pCol = &
130b0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b  pAggInfo->aCol[k
130c0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
130d0 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45   pCol->pTab = pE
130e0 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  xpr->pTab;.     
130f0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
13100 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69  Table = pExpr->i
13110 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
13120 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75       pCol->iColu
13130 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  mn = pExpr->iCol
13140 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  umn;.           
13150 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20     pCol->iMem = 
13160 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a  pParse->nMem++;.
13170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
13180 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
13190 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  n = -1;.        
131a0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70        pCol->pExp
131b0 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  r = pExpr;.     
131c0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 41 67           if( pAg
131d0 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20  gInfo->pGroupBy 
131e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
131f0 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20     int j, n;.   
13200 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
13210 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67  rList *pGB = pAg
13220 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b  gInfo->pGroupBy;
13230 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13240 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
13250 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70  _item *pTerm = p
13260 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20  GB->a;.         
13270 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e         n = pGB->
13280 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  nExpr;.         
13290 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
132a0 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b  j<n; j++, pTerm+
132b0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
132c0 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
132d0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
132e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132f0 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
13300 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54  COLUMN && pE->iT
13310 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61  able==pExpr->iTa
13320 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20  ble &&.         
13330 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 2d               pE-
13340 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d  >iColumn==pExpr-
13350 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
13360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13370 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
13380 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  umn = j;.       
13390 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
133a0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
133b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
133c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
133d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
133e0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
133f0 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c  ->iSorterColumn<
13400 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
13410 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
13420 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49  erColumn = pAggI
13430 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c  nfo->nSortingCol
13440 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  umn++;.         
13450 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
13460 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
13470 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77   /* There is now
13480 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45   an entry for pE
13490 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  xpr in pAggInfo-
134a0 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a  >aCol[] (either.
134b0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62              ** b
134c0 65 63 61 75 73 65 20 69 74 20 77 61 73 20 74 68  ecause it was th
134d0 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65  ere before or be
134e0 63 61 75 73 65 20 77 65 20 6a 75 73 74 20 63 72  cause we just cr
134f0 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20  eated it)..     
13500 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72         ** Conver
13510 74 20 74 68 65 20 70 45 78 70 72 20 74 6f 20 62  t the pExpr to b
13520 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  e a TK_AGG_COLUM
13530 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74  N referring to t
13540 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  hat.            
13550 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  ** pAggInfo->aCo
13560 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20  l[] entry..     
13570 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
13580 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67        pExpr->pAg
13590 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f  gInfo = pAggInfo
135a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
135b0 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47  xpr->op = TK_AGG
135c0 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20  _COLUMN;.       
135d0 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67       pExpr->iAgg
135e0 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20   = k;.          
135f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
13600 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45     } /* endif pE
13610 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74  xpr->iTable==pIt
13620 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20  em->iCursor */. 
13630 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20         } /* end 
13640 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63 4c 69  loop over pSrcLi
13650 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  st */.      }.  
13660 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
13670 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
13680 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a  AGG_FUNCTION: {.
13690 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 4e 43        /* The pNC
136a0 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 74 65 73 74  ->nDepth==0 test
136b0 20 63 61 75 73 65 73 20 61 67 67 72 65 67 61 74   causes aggregat
136c0 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 73  e functions in s
136d0 75 62 71 75 65 72 69 65 73 0a 20 20 20 20 20 20  ubqueries.      
136e0 2a 2a 20 74 6f 20 62 65 20 69 67 6e 6f 72 65 64  ** to be ignored
136f0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4e   */.      if( pN
13700 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 29 7b 0a  C->nDepth==0 ){.
13710 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
13720 20 74 6f 20 73 65 65 20 69 66 20 70 45 78 70 72   to see if pExpr
13730 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20   is a duplicate 
13740 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65  of another aggre
13750 67 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  gate .        **
13760 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69   function that i
13770 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
13780 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74   pAggInfo struct
13790 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ure.        */. 
137a0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
137b0 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65  gInfo_func *pIte
137c0 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  m = pAggInfo->aF
137d0 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  unc;.        for
137e0 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f  (i=0; i<pAggInfo
137f0 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49  ->nFunc; i++, pI
13800 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
13810 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
13820 72 43 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e  rCompare(pItem->
13830 70 45 78 70 72 2c 20 70 45 78 70 72 29 20 29 7b  pExpr, pExpr) ){
13840 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
13850 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
13860 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13870 20 20 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66    if( i>=pAggInf
13880 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20  o->nFunc ){.    
13890 20 20 20 20 20 20 2f 2a 20 70 45 78 70 72 20 69        /* pExpr i
138a0 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b  s original.  Mak
138b0 65 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  e a new entry in
138c0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
138d0 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  [].          */.
138e0 20 20 20 20 20 20 20 20 20 20 75 38 20 65 6e 63            u8 enc
138f0 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64   = ENC(pParse->d
13900 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20  b);.          i 
13910 3d 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63  = addAggInfoFunc
13920 28 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  (pAggInfo);.    
13930 20 20 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29        if( i>=0 )
13940 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  {.            pI
13950 74 65 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d  tem = &pAggInfo-
13960 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20  >aFunc[i];.     
13970 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 45         pItem->pE
13980 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  xpr = pExpr;.   
13990 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
139a0 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iMem = pParse->n
139b0 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Mem++;.         
139c0 20 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20     pItem->pFunc 
139d0 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
139e0 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62  ction(pParse->db
139f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13a00 20 20 20 20 20 28 63 68 61 72 2a 29 70 45 78 70       (char*)pExp
13a10 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70  r->token.z, pExp
13a20 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 0a 20 20 20 20  r->token.n,.    
13a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
13a40 45 78 70 72 2d 3e 70 4c 69 73 74 20 3f 20 70 45  Expr->pList ? pE
13a50 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  xpr->pList->nExp
13a60 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a  r : 0, enc, 0);.
13a70 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
13a80 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
13a90 50 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  P_Distinct ){.  
13aa0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
13ab0 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 70  m->iDistinct = p
13ac0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
13ad0 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
13ae0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
13af0 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74  pItem->iDistinct
13b00 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
13b10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
13b20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13b30 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72     /* Make pExpr
13b40 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 70   point to the ap
13b50 70 72 6f 70 72 69 61 74 65 20 70 41 67 67 49 6e  propriate pAggIn
13b60 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72  fo->aFunc[] entr
13b70 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  y.        */.   
13b80 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67       pExpr->iAgg
13b90 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70 45   = i;.        pE
13ba0 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20  xpr->pAggInfo = 
13bb0 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
13bc0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
13bd0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
13be0 20 2f 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20   /* Recursively 
13bf0 77 61 6c 6b 20 73 75 62 71 75 65 72 69 65 73 20  walk subqueries 
13c00 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 54 4b 5f 43  looking for TK_C
13c10 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 74 68 61 74  OLUMN nodes that
13c20 20 6e 65 65 64 0a 20 20 2a 2a 20 74 6f 20 62 65   need.  ** to be
13c30 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f 41   changed to TK_A
13c40 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20 42 75 74 20  GG_COLUMN.  But 
13c50 69 6e 63 72 65 6d 65 6e 74 20 6e 44 65 70 74 68  increment nDepth
13c60 20 73 6f 20 74 68 61 74 0a 20 20 2a 2a 20 54 4b   so that.  ** TK
13c70 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f  _AGG_FUNCTION no
13c80 64 65 73 20 69 6e 20 73 75 62 71 75 65 72 69 65  des in subquerie
13c90 73 20 77 69 6c 6c 20 62 65 20 75 6e 63 68 61 6e  s will be unchan
13ca0 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ged..  */.  if( 
13cb0 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29  pExpr->pSelect )
13cc0 7b 0a 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74  {.    pNC->nDept
13cd0 68 2b 2b 3b 0a 20 20 20 20 77 61 6c 6b 53 65 6c  h++;.    walkSel
13ce0 65 63 74 45 78 70 72 28 70 45 78 70 72 2d 3e 70  ectExpr(pExpr->p
13cf0 53 65 6c 65 63 74 2c 20 61 6e 61 6c 79 7a 65 41  Select, analyzeA
13d00 67 67 72 65 67 61 74 65 2c 20 70 4e 43 29 3b 0a  ggregate, pNC);.
13d10 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2d      pNC->nDepth-
13d20 2d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  -;.  }.  return 
13d30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c  0;.}../*.** Anal
13d40 79 7a 65 20 74 68 65 20 67 69 76 65 6e 20 65 78  yze the given ex
13d50 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67  pression looking
13d60 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66   for aggregate f
13d70 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20  unctions and.** 
13d80 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74 68  for variables th
13d90 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64  at need to be ad
13da0 64 65 64 20 74 6f 20 74 68 65 20 70 50 61 72 73  ded to the pPars
13db0 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 2e  e->aAgg[] array.
13dc0 0a 2a 2a 20 4d 61 6b 65 20 61 64 64 69 74 69 6f  .** Make additio
13dd0 6e 61 6c 20 65 6e 74 72 69 65 73 20 74 6f 20 74  nal entries to t
13de0 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b  he pParse->aAgg[
13df0 5d 20 61 72 72 61 79 20 61 73 20 6e 65 63 65 73  ] array as neces
13e00 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  sary..**.** This
13e10 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
13e20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61  only be called a
13e30 66 74 65 72 20 74 68 65 20 65 78 70 72 65 73 73  fter the express
13e40 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  ion has been.** 
13e50 61 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69  analyzed by sqli
13e60 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  te3ExprResolveNa
13e70 6d 65 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  mes()..**.** If 
13e80 65 72 72 6f 72 73 20 61 72 65 20 73 65 65 6e 2c  errors are seen,
13e90 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
13ea0 6d 65 73 73 61 67 65 20 69 6e 20 7a 45 72 72 4d  message in zErrM
13eb0 73 67 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  sg and return.**
13ec0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
13ed0 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rrors..*/.int sq
13ee0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
13ef0 41 67 67 72 65 67 61 74 65 73 28 4e 61 6d 65 43  Aggregates(NameC
13f00 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70  ontext *pNC, Exp
13f10 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
13f20 20 6e 45 72 72 20 3d 20 70 4e 43 2d 3e 70 50 61   nErr = pNC->pPa
13f30 72 73 65 2d 3e 6e 45 72 72 3b 0a 20 20 77 61 6c  rse->nErr;.  wal
13f40 6b 45 78 70 72 54 72 65 65 28 70 45 78 70 72 2c  kExprTree(pExpr,
13f50 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
13f60 65 2c 20 70 4e 43 29 3b 0a 20 20 72 65 74 75 72  e, pNC);.  retur
13f70 6e 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 6e  n pNC->pParse->n
13f80 45 72 72 20 2d 20 6e 45 72 72 3b 0a 7d 0a 0a 2f  Err - nErr;.}../
13f90 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65  *.** Call sqlite
13fa0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
13fb0 65 67 61 74 65 73 28 29 20 66 6f 72 20 65 76 65  egates() for eve
13fc0 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ry expression in
13fd0 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f   an.** expressio
13fe0 6e 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 20  n list.  Return 
13ff0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
14000 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rors..**.** If a
14010 6e 20 65 72 72 6f 72 20 69 73 20 66 6f 75 6e 64  n error is found
14020 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20 69  , the analysis i
14030 73 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a  s cut short..*/.
14040 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 41  int sqlite3ExprA
14050 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e 61  nalyzeAggList(Na
14060 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
14070 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
14080 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  {.  struct ExprL
14090 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
140a0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
140b0 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  nErr = 0;.  if( 
140c0 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72  pList ){.    for
140d0 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
140e0 20 69 3d 30 3b 20 6e 45 72 72 3d 3d 30 20 26 26   i=0; nErr==0 &&
140f0 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
14100 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
14110 20 20 20 20 20 20 6e 45 72 72 20 2b 3d 20 73 71        nErr += sq
14120 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
14130 41 67 67 72 65 67 61 74 65 73 28 70 4e 43 2c 20  Aggregates(pNC, 
14140 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
14150 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
14160 6e 20 6e 45 72 72 3b 0a 7d 0a                    n nErr;.}.