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

Artifact 978afdceb2693ef58ec0040a43fe57afc6e4236c:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2a 0a 2a 2a  in SQLite..**.**
0200: 20 24 49 64 3a 20 65 78 70 72 2e 63 2c 76 20 31   $Id: expr.c,v 1
0210: 2e 33 30 38 20 32 30 30 37 2f 30 38 2f 32 32 20  .308 2007/08/22 
0220: 32 30 3a 31 38 3a 32 32 20 64 72 68 20 45 78 70  20:18:22 drh Exp
0230: 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22   $.*/.#include "
0240: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e  sqliteInt.h".#in
0250: 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a  clude <ctype.h>.
0260: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0270: 65 20 27 61 66 66 69 6e 69 74 79 27 20 6f 66 20  e 'affinity' of 
0280: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
0290: 45 78 70 72 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a  Expr if any..**.
02a0: 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61  ** If pExpr is a
02b0: 20 63 6f 6c 75 6d 6e 2c 20 61 20 72 65 66 65 72   column, a refer
02c0: 65 6e 63 65 20 74 6f 20 61 20 63 6f 6c 75 6d 6e  ence to a column
02d0: 20 76 69 61 20 61 6e 20 27 41 53 27 20 61 6c 69   via an 'AS' ali
02e0: 61 73 2c 0a 2a 2a 20 6f 72 20 61 20 73 75 62 2d  as,.** or a sub-
02f0: 73 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f  select with a co
0300: 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 65 74 75  lumn as the retu
0310: 72 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  rn value, then t
0320: 68 65 20 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20  he .** affinity 
0330: 6f 66 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69  of that column i
0340: 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
0350: 72 77 69 73 65 2c 20 30 78 30 30 20 69 73 20 72  rwise, 0x00 is r
0360: 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 69 6e 64 69  eturned,.** indi
0370: 63 61 74 69 6e 67 20 6e 6f 20 61 66 66 69 6e 69  cating no affini
0380: 74 79 20 66 6f 72 20 74 68 65 20 65 78 70 72 65  ty for the expre
0390: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65  ssion..**.** i.e
03a0: 2e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  . the WHERE clau
03b0: 73 65 20 65 78 70 72 65 73 73 73 69 6f 6e 73 20  se expresssions 
03c0: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
03d0: 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6c 6c 0a   statements all.
03e0: 2a 2a 20 68 61 76 65 20 61 6e 20 61 66 66 69 6e  ** have an affin
03f0: 69 74 79 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54  ity:.**.** CREAT
0400: 45 20 54 41 42 4c 45 20 74 31 28 61 29 3b 0a 2a  E TABLE t1(a);.*
0410: 2a 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  * SELECT * FROM 
0420: 74 31 20 57 48 45 52 45 20 61 3b 0a 2a 2a 20 53  t1 WHERE a;.** S
0430: 45 4c 45 43 54 20 61 20 41 53 20 62 20 46 52 4f  ELECT a AS b FRO
0440: 4d 20 74 31 20 57 48 45 52 45 20 62 3b 0a 2a 2a  M t1 WHERE b;.**
0450: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0460: 31 20 57 48 45 52 45 20 28 73 65 6c 65 63 74 20  1 WHERE (select 
0470: 61 20 66 72 6f 6d 20 74 31 29 3b 0a 2a 2f 0a 63  a from t1);.*/.c
0480: 68 61 72 20 73 71 6c 69 74 65 33 45 78 70 72 41  har sqlite3ExprA
0490: 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45  ffinity(Expr *pE
04a0: 78 70 72 29 7b 0a 20 20 69 6e 74 20 6f 70 20 3d  xpr){.  int op =
04b0: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
04c0: 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
04d0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  ){.    return sq
04e0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
04f0: 79 28 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  y(pExpr->pSelect
0500: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
0510: 45 78 70 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  Expr);.  }.#ifnd
0520: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
0530: 41 53 54 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  AST.  if( op==TK
0540: 5f 43 41 53 54 20 29 7b 0a 20 20 20 20 72 65 74  _CAST ){.    ret
0550: 75 72 6e 20 73 71 6c 69 74 65 33 41 66 66 69 6e  urn sqlite3Affin
0560: 69 74 79 54 79 70 65 28 26 70 45 78 70 72 2d 3e  ityType(&pExpr->
0570: 74 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64  token);.  }.#end
0580: 69 66 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70  if.  return pExp
0590: 72 2d 3e 61 66 66 69 6e 69 74 79 3b 0a 7d 0a 0a  r->affinity;.}..
05a0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f  /*.** Set the co
05b0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
05c0: 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20   for expression 
05d0: 70 45 78 70 72 20 74 6f 20 62 65 20 74 68 65 20  pExpr to be the 
05e0: 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71  collating.** seq
05f0: 75 65 6e 63 65 20 6e 61 6d 65 64 20 62 79 20 70  uence named by p
0600: 54 6f 6b 65 6e 2e 20 20 20 52 65 74 75 72 6e 20  Token.   Return 
0610: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
0620: 20 72 65 76 69 73 65 64 20 65 78 70 72 65 73 73   revised express
0630: 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c  ion..** The coll
0640: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  ating sequence i
0650: 73 20 6d 61 72 6b 65 64 20 61 73 20 22 65 78 70  s marked as "exp
0660: 6c 69 63 69 74 22 20 75 73 69 6e 67 20 74 68 65  licit" using the
0670: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 0a 2a   EP_ExpCollate.*
0680: 2a 20 66 6c 61 67 2e 20 20 41 6e 20 65 78 70 6c  * flag.  An expl
0690: 69 63 69 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73  icit collating s
06a0: 65 71 75 65 6e 63 65 20 77 69 6c 6c 20 6f 76 65  equence will ove
06b0: 72 72 69 64 65 20 69 6d 70 6c 69 63 69 74 0a 2a  rride implicit.*
06c0: 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * collating sequ
06d0: 65 6e 63 65 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a  ences..*/.Expr *
06e0: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 43 6f  sqlite3ExprSetCo
06f0: 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ll(Parse *pParse
0700: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 54  , Expr *pExpr, T
0710: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
0720: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
0730: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
0740: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 43 6f   return 0;.  pCo
0750: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ll = sqlite3Loca
0760: 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
0770: 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e  , (char*)pName->
0780: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  z, pName->n);.  
0790: 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  if( pColl ){.   
07a0: 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20   pExpr->pColl = 
07b0: 70 43 6f 6c 6c 3b 0a 20 20 20 20 70 45 78 70 72  pColl;.    pExpr
07c0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78  ->flags |= EP_Ex
07d0: 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 7d 0a 20 20  pCollate;.  }.  
07e0: 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a  return pExpr;.}.
07f0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0800: 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  e default collat
0810: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ion sequence for
0820: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
0830: 70 45 78 70 72 2e 20 49 66 0a 2a 2a 20 74 68 65  pExpr. If.** the
0840: 72 65 20 69 73 20 6e 6f 20 64 65 66 61 75 6c 74  re is no default
0850: 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 2c   collation type,
0860: 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 43 6f   return 0..*/.Co
0870: 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 45 78  llSeq *sqlite3Ex
0880: 70 72 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20  prCollSeq(Parse 
0890: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
08a0: 45 78 70 72 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  Expr){.  CollSeq
08b0: 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 69   *pColl = 0;.  i
08c0: 66 28 20 70 45 78 70 72 20 29 7b 0a 20 20 20 20  f( pExpr ){.    
08d0: 69 6e 74 20 6f 70 3b 0a 20 20 20 20 70 43 6f 6c  int op;.    pCol
08e0: 6c 20 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c  l = pExpr->pColl
08f0: 3b 0a 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72  ;.    op = pExpr
0900: 2d 3e 6f 70 3b 0a 20 20 20 20 69 66 28 20 28 6f  ->op;.    if( (o
0910: 70 3d 3d 54 4b 5f 43 41 53 54 20 7c 7c 20 6f 70  p==TK_CAST || op
0920: 3d 3d 54 4b 5f 55 50 4c 55 53 29 20 26 26 20 21  ==TK_UPLUS) && !
0930: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72  pColl ){.      r
0940: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
0950: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
0960: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
0970: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
0980: 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c  sqlite3CheckColl
0990: 53 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f 6c  Seq(pParse, pCol
09a0: 6c 29 20 29 7b 20 0a 20 20 20 20 70 43 6f 6c 6c  l) ){ .    pColl
09b0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
09c0: 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a  rn pColl;.}../*.
09d0: 2a 2a 20 70 45 78 70 72 20 69 73 20 61 6e 20 6f  ** pExpr is an o
09e0: 70 65 72 61 6e 64 20 6f 66 20 61 20 63 6f 6d 70  perand of a comp
09f0: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e  arison operator.
0a00: 20 20 61 66 66 32 20 69 73 20 74 68 65 0a 2a 2a    aff2 is the.**
0a10: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 6f   type affinity o
0a20: 66 20 74 68 65 20 6f 74 68 65 72 20 6f 70 65 72  f the other oper
0a30: 61 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  and.  This routi
0a40: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a  ne returns the.*
0a50: 2a 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20  * type affinity 
0a60: 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75  that should be u
0a70: 73 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6d 70  sed for the comp
0a80: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e  arison operator.
0a90: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
0aa0: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
0ab0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61  Expr *pExpr, cha
0ac0: 72 20 61 66 66 32 29 7b 0a 20 20 63 68 61 72 20  r aff2){.  char 
0ad0: 61 66 66 31 20 3d 20 73 71 6c 69 74 65 33 45 78  aff1 = sqlite3Ex
0ae0: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
0af0: 29 3b 0a 20 20 69 66 28 20 61 66 66 31 20 26 26  );.  if( aff1 &&
0b00: 20 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20   aff2 ){.    /* 
0b10: 42 6f 74 68 20 73 69 64 65 73 20 6f 66 20 74 68  Both sides of th
0b20: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65  e comparison are
0b30: 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e 65   columns. If one
0b40: 20 68 61 73 20 6e 75 6d 65 72 69 63 0a 20 20 20   has numeric.   
0b50: 20 2a 2a 20 61 66 66 69 6e 69 74 79 2c 20 75 73   ** affinity, us
0b60: 65 20 74 68 61 74 2e 20 4f 74 68 65 72 77 69 73  e that. Otherwis
0b70: 65 20 75 73 65 20 6e 6f 20 61 66 66 69 6e 69 74  e use no affinit
0b80: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
0b90: 28 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72  ( sqlite3IsNumer
0ba0: 69 63 41 66 66 69 6e 69 74 79 28 61 66 66 31 29  icAffinity(aff1)
0bb0: 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 4e 75 6d   || sqlite3IsNum
0bc0: 65 72 69 63 41 66 66 69 6e 69 74 79 28 61 66 66  ericAffinity(aff
0bd0: 32 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  2) ){.      retu
0be0: 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  rn SQLITE_AFF_NU
0bf0: 4d 45 52 49 43 3b 0a 20 20 20 20 7d 65 6c 73 65  MERIC;.    }else
0c00: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
0c10: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
0c20: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
0c30: 28 20 21 61 66 66 31 20 26 26 20 21 61 66 66 32  ( !aff1 && !aff2
0c40: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 69 74 68   ){.    /* Neith
0c50: 65 72 20 73 69 64 65 20 6f 66 20 74 68 65 20 63  er side of the c
0c60: 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20 63  omparison is a c
0c70: 6f 6c 75 6d 6e 2e 20 20 43 6f 6d 70 61 72 65 20  olumn.  Compare 
0c80: 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c  the.    ** resul
0c90: 74 73 20 64 69 72 65 63 74 6c 79 2e 0a 20 20 20  ts directly..   
0ca0: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
0cb0: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
0cc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
0cd0: 4f 6e 65 20 73 69 64 65 20 69 73 20 61 20 63 6f  One side is a co
0ce0: 6c 75 6d 6e 2c 20 74 68 65 20 6f 74 68 65 72 20  lumn, the other 
0cf0: 69 73 20 6e 6f 74 2e 20 55 73 65 20 74 68 65 20  is not. Use the 
0d00: 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79  columns affinity
0d10: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
0d20: 20 61 66 66 31 3d 3d 30 20 7c 7c 20 61 66 66 32   aff1==0 || aff2
0d30: 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ==0 );.    retur
0d40: 6e 20 28 61 66 66 31 20 2b 20 61 66 66 32 29 3b  n (aff1 + aff2);
0d50: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45  .  }.}../*.** pE
0d60: 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69  xpr is a compari
0d70: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 52  son operator.  R
0d80: 65 74 75 72 6e 20 74 68 65 20 74 79 70 65 20 61  eturn the type a
0d90: 66 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f  ffinity that sho
0da0: 75 6c 64 0a 2a 2a 20 62 65 20 61 70 70 6c 69 65  uld.** be applie
0db0: 64 20 74 6f 20 62 6f 74 68 20 6f 70 65 72 61 6e  d to both operan
0dc0: 64 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e  ds prior to doin
0dd0: 67 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  g the comparison
0de0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
0df0: 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e   comparisonAffin
0e00: 69 74 79 28 45 78 70 72 20 2a 70 45 78 70 72 29  ity(Expr *pExpr)
0e10: 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20  {.  char aff;.  
0e20: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
0e30: 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70  p==TK_EQ || pExp
0e40: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20  r->op==TK_IN || 
0e50: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54  pExpr->op==TK_LT
0e60: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45   ||.          pE
0e70: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 7c  xpr->op==TK_GT |
0e80: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
0e90: 47 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  GE || pExpr->op=
0ea0: 3d 54 4b 5f 4c 45 20 7c 7c 0a 20 20 20 20 20 20  =TK_LE ||.      
0eb0: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54      pExpr->op==T
0ec0: 4b 5f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74  K_NE );.  assert
0ed0: 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29  ( pExpr->pLeft )
0ee0: 3b 0a 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65  ;.  aff = sqlite
0ef0: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45  3ExprAffinity(pE
0f00: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69  xpr->pLeft);.  i
0f10: 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  f( pExpr->pRight
0f20: 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71   ){.    aff = sq
0f30: 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
0f40: 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 52 69 67  nity(pExpr->pRig
0f50: 68 74 2c 20 61 66 66 29 3b 0a 20 20 7d 0a 20 20  ht, aff);.  }.  
0f60: 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
0f70: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 61  pSelect ){.    a
0f80: 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  ff = sqlite3Comp
0f90: 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70  areAffinity(pExp
0fa0: 72 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  r->pSelect->pELi
0fb0: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  st->a[0].pExpr, 
0fc0: 61 66 66 29 3b 0a 20 20 7d 0a 20 20 65 6c 73 65  aff);.  }.  else
0fd0: 20 69 66 28 20 21 61 66 66 20 29 7b 0a 20 20 20   if( !aff ){.   
0fe0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
0ff0: 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 0a 20 20 72 65  F_NONE;.  }.  re
1000: 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a  turn aff;.}../*.
1010: 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63 6f  ** pExpr is a co
1020: 6d 70 61 72 69 73 6f 6e 20 65 78 70 72 65 73 73  mparison express
1030: 69 6f 6e 2c 20 65 67 2e 20 27 3d 27 2c 20 27 3c  ion, eg. '=', '<
1040: 27 2c 20 49 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a  ', IN(...) etc..
1050: 2a 2a 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20  ** idx_affinity 
1060: 69 73 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  is the affinity 
1070: 6f 66 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f  of an indexed co
1080: 6c 75 6d 6e 2e 20 52 65 74 75 72 6e 20 74 72 75  lumn. Return tru
1090: 65 0a 2a 2a 20 69 66 20 74 68 65 20 69 6e 64 65  e.** if the inde
10a0: 78 20 77 69 74 68 20 61 66 66 69 6e 69 74 79 20  x with affinity 
10b0: 69 64 78 5f 61 66 66 69 6e 69 74 79 20 6d 61 79  idx_affinity may
10c0: 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   be used to impl
10d0: 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 63 6f 6d  ement.** the com
10e0: 70 61 72 69 73 6f 6e 20 69 6e 20 70 45 78 70 72  parison in pExpr
10f0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1100: 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28  IndexAffinityOk(
1110: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61  Expr *pExpr, cha
1120: 72 20 69 64 78 5f 61 66 66 69 6e 69 74 79 29 7b  r idx_affinity){
1130: 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f  .  char aff = co
1140: 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79  mparisonAffinity
1150: 28 70 45 78 70 72 29 3b 0a 20 20 73 77 69 74 63  (pExpr);.  switc
1160: 68 28 20 61 66 66 20 29 7b 0a 20 20 20 20 63 61  h( aff ){.    ca
1170: 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  se SQLITE_AFF_NO
1180: 4e 45 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  NE:.      return
1190: 20 31 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   1;.    case SQL
11a0: 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20  ITE_AFF_TEXT:.  
11b0: 20 20 20 20 72 65 74 75 72 6e 20 69 64 78 5f 61      return idx_a
11c0: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
11d0: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 64 65  AFF_TEXT;.    de
11e0: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74  fault:.      ret
11f0: 75 72 6e 20 73 71 6c 69 74 65 33 49 73 4e 75 6d  urn sqlite3IsNum
1200: 65 72 69 63 41 66 66 69 6e 69 74 79 28 69 64 78  ericAffinity(idx
1210: 5f 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 7d 0a  _affinity);.  }.
1220: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1230: 74 68 65 20 50 31 20 76 61 6c 75 65 20 74 68 61  the P1 value tha
1240: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
1250: 20 66 6f 72 20 61 20 62 69 6e 61 72 79 20 63 6f   for a binary co
1260: 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f  mparison.** opco
1270: 64 65 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65  de (OP_Eq, OP_Ge
1280: 20 65 74 63 2e 29 20 75 73 65 64 20 74 6f 20 63   etc.) used to c
1290: 6f 6d 70 61 72 65 20 70 45 78 70 72 31 20 61 6e  ompare pExpr1 an
12a0: 64 20 70 45 78 70 72 32 2e 0a 2a 2a 20 49 66 20  d pExpr2..** If 
12b0: 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 74 72  jumpIfNull is tr
12c0: 75 65 2c 20 74 68 65 6e 20 73 65 74 20 74 68 65  ue, then set the
12d0: 20 6c 6f 77 20 62 79 74 65 20 6f 66 20 74 68 65   low byte of the
12e0: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 50 31 20   returned.** P1 
12f0: 76 61 6c 75 65 20 74 6f 20 74 65 6c 6c 20 74 68  value to tell th
1300: 65 20 6f 70 63 6f 64 65 20 74 6f 20 6a 75 6d 70  e opcode to jump
1310: 20 69 66 20 65 69 74 68 65 72 20 65 78 70 72 65   if either expre
1320: 73 73 69 6f 6e 0a 2a 2a 20 65 76 61 6c 75 61 74  ssion.** evaluat
1330: 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  es to NULL..*/.s
1340: 74 61 74 69 63 20 69 6e 74 20 62 69 6e 61 72 79  tatic int binary
1350: 43 6f 6d 70 61 72 65 50 31 28 45 78 70 72 20 2a  CompareP1(Expr *
1360: 70 45 78 70 72 31 2c 20 45 78 70 72 20 2a 70 45  pExpr1, Expr *pE
1370: 78 70 72 32 2c 20 69 6e 74 20 6a 75 6d 70 49 66  xpr2, int jumpIf
1380: 4e 75 6c 6c 29 7b 0a 20 20 63 68 61 72 20 61 66  Null){.  char af
1390: 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  f = sqlite3ExprA
13a0: 66 66 69 6e 69 74 79 28 70 45 78 70 72 32 29 3b  ffinity(pExpr2);
13b0: 0a 20 20 72 65 74 75 72 6e 20 28 28 69 6e 74 29  .  return ((int)
13c0: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
13d0: 66 69 6e 69 74 79 28 70 45 78 70 72 31 2c 20 61  finity(pExpr1, a
13e0: 66 66 29 29 2b 28 6a 75 6d 70 49 66 4e 75 6c 6c  ff))+(jumpIfNull
13f0: 3f 30 78 31 30 30 3a 30 29 3b 0a 7d 0a 0a 2f 2a  ?0x100:0);.}../*
1400: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
1410: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c  nter to the coll
1420: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74  ation sequence t
1430: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
1440: 65 64 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72  ed by.** a binar
1450: 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  y comparison ope
1460: 72 61 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20  rator comparing 
1470: 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74  pLeft and pRight
1480: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
1490: 65 66 74 20 68 61 6e 64 20 65 78 70 72 65 73 73  eft hand express
14a0: 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74  ion has a collat
14b0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 79 70  ing sequence typ
14c0: 65 2c 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a  e, then it is.**
14d0: 20 75 73 65 64 2e 20 4f 74 68 65 72 77 69 73 65   used. Otherwise
14e0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
14f0: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
1500: 72 69 67 68 74 20 68 61 6e 64 20 65 78 70 72 65  right hand expre
1510: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64  ssion.** is used
1520: 2c 20 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74  , or the default
1530: 20 28 42 49 4e 41 52 59 29 20 69 66 20 6e 65 69   (BINARY) if nei
1540: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ther expression 
1550: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a  has a collating.
1560: 2a 2a 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41  ** type..**.** A
1570: 72 67 75 6d 65 6e 74 20 70 52 69 67 68 74 20 28  rgument pRight (
1580: 62 75 74 20 6e 6f 74 20 70 4c 65 66 74 29 20 6d  but not pLeft) m
1590: 61 79 20 62 65 20 61 20 6e 75 6c 6c 20 70 6f 69  ay be a null poi
15a0: 6e 74 65 72 2e 20 49 6e 20 74 68 69 73 20 63 61  nter. In this ca
15b0: 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74  se,.** it is not
15c0: 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a   considered..*/.
15d0: 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33  CollSeq *sqlite3
15e0: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
15f0: 6c 53 65 71 28 0a 20 20 50 61 72 73 65 20 2a 70  lSeq(.  Parse *p
1600: 50 61 72 73 65 2c 20 0a 20 20 45 78 70 72 20 2a  Parse, .  Expr *
1610: 70 4c 65 66 74 2c 20 0a 20 20 45 78 70 72 20 2a  pLeft, .  Expr *
1620: 70 52 69 67 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c  pRight.){.  Coll
1630: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73  Seq *pColl;.  as
1640: 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20  sert( pLeft );. 
1650: 20 69 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67   if( pLeft->flag
1660: 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74  s & EP_ExpCollat
1670: 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
1680: 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 20 29 3b   pLeft->pColl );
1690: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 4c 65  .    pColl = pLe
16a0: 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 7d 65 6c  ft->pColl;.  }el
16b0: 73 65 20 69 66 28 20 70 52 69 67 68 74 20 26 26  se if( pRight &&
16c0: 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26   pRight->flags &
16d0: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29   EP_ExpCollate )
16e0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  {.    assert( pR
16f0: 69 67 68 74 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20  ight->pColl );. 
1700: 20 20 20 70 43 6f 6c 6c 20 3d 20 70 52 69 67 68     pColl = pRigh
1710: 74 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 7d 65 6c 73  t->pColl;.  }els
1720: 65 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  e{.    pColl = s
1730: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
1740: 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29  q(pParse, pLeft)
1750: 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c  ;.    if( !pColl
1760: 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20   ){.      pColl 
1770: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
1780: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 52 69  lSeq(pParse, pRi
1790: 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ght);.    }.  }.
17a0: 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a    return pColl;.
17b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
17c0: 65 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d  e code for a com
17d0: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
17e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17f0: 63 6f 64 65 43 6f 6d 70 61 72 65 28 0a 20 20 50  codeCompare(.  P
1800: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1810: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
1820: 28 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61  (and code genera
1830: 74 69 6e 67 29 20 63 6f 6e 74 65 78 74 20 2a 2f  ting) context */
1840: 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20  .  Expr *pLeft, 
1850: 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74       /* The left
1860: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78   operand */.  Ex
1870: 70 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20  pr *pRight,     
1880: 2f 2a 20 54 68 65 20 72 69 67 68 74 20 6f 70 65  /* The right ope
1890: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  rand */.  int op
18a0: 63 6f 64 65 2c 20 20 20 20 20 20 20 2f 2a 20 54  code,       /* T
18b0: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  he comparison op
18c0: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65  code */.  int de
18d0: 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  st,         /* J
18e0: 75 6d 70 20 68 65 72 65 20 69 66 20 74 72 75 65  ump here if true
18f0: 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70  .  */.  int jump
1900: 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66 20  IfNull    /* If 
1910: 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20 65 69  true, jump if ei
1920: 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20  ther operand is 
1930: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  NULL */.){.  int
1940: 20 70 31 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70   p1 = binaryComp
1950: 61 72 65 50 31 28 70 4c 65 66 74 2c 20 70 52 69  areP1(pLeft, pRi
1960: 67 68 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  ght, jumpIfNull)
1970: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 33 20  ;.  CollSeq *p3 
1980: 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
1990: 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
19a0: 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69  arse, pLeft, pRi
19b0: 67 68 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  ght);.  return s
19c0: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 70 50  qlite3VdbeOp3(pP
19d0: 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63  arse->pVdbe, opc
19e0: 6f 64 65 2c 20 70 31 2c 20 64 65 73 74 2c 20 28  ode, p1, dest, (
19f0: 76 6f 69 64 2a 29 70 33 2c 20 50 33 5f 43 4f 4c  void*)p3, P3_COL
1a00: 4c 53 45 51 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  LSEQ);.}../*.** 
1a10: 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20  Construct a new 
1a20: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
1a30: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
1a40: 6e 74 65 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d  nter to it.  Mem
1a50: 6f 72 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20  ory.** for this 
1a60: 6e 6f 64 65 20 69 73 20 6f 62 74 61 69 6e 65 64  node is obtained
1a70: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
1a80: 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63 61 6c  lloc().  The cal
1a90: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ling function.**
1aa0: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
1ab0: 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20  for making sure 
1ac0: 74 68 65 20 6e 6f 64 65 20 65 76 65 6e 74 75 61  the node eventua
1ad0: 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a  lly gets freed..
1ae0: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
1af0: 45 78 70 72 28 0a 20 20 69 6e 74 20 6f 70 2c 20  Expr(.  int op, 
1b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b10: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70  /* Expression op
1b20: 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  code */.  Expr *
1b30: 70 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20  pLeft,          
1b40: 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e    /* Left operan
1b50: 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69  d */.  Expr *pRi
1b60: 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ght,           /
1b70: 2a 20 52 69 67 68 74 20 6f 70 65 72 61 6e 64 20  * Right operand 
1b80: 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e  */.  const Token
1b90: 20 2a 70 54 6f 6b 65 6e 20 20 20 20 20 2f 2a 20   *pToken     /* 
1ba0: 41 72 67 75 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a  Argument token *
1bb0: 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  /.){.  Expr *pNe
1bc0: 77 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  w;.  pNew = sqli
1bd0: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73  te3MallocZero( s
1be0: 69 7a 65 6f 66 28 45 78 70 72 29 20 29 3b 0a 20  izeof(Expr) );. 
1bf0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
1c00: 20 20 20 20 2f 2a 20 57 68 65 6e 20 6d 61 6c 6c      /* When mall
1c10: 6f 63 20 66 61 69 6c 73 2c 20 64 65 6c 65 74 65  oc fails, delete
1c20: 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68   pLeft and pRigh
1c30: 74 2e 20 45 78 70 72 65 73 73 69 6f 6e 73 20 70  t. Expressions p
1c40: 61 73 73 65 64 20 74 6f 20 0a 20 20 20 20 2a 2a  assed to .    **
1c50: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   this function m
1c60: 75 73 74 20 61 6c 77 61 79 73 20 62 65 20 61 6c  ust always be al
1c70: 6c 6f 63 61 74 65 64 20 77 69 74 68 20 73 71 6c  located with sql
1c80: 69 74 65 33 45 78 70 72 28 29 20 66 6f 72 20 74  ite3Expr() for t
1c90: 68 69 73 20 0a 20 20 20 20 2a 2a 20 72 65 61 73  his .    ** reas
1ca0: 6f 6e 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  on. .    */.    
1cb0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1cc0: 65 28 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71  e(pLeft);.    sq
1cd0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
1ce0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74  pRight);.    ret
1cf0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65  urn 0;.  }.  pNe
1d00: 77 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20 70 4e  w->op = op;.  pN
1d10: 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66  ew->pLeft = pLef
1d20: 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67 68  t;.  pNew->pRigh
1d30: 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 70 4e  t = pRight;.  pN
1d40: 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20  ew->iAgg = -1;. 
1d50: 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20   if( pToken ){. 
1d60: 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65     assert( pToke
1d70: 6e 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20 20 20  n->dyn==0 );.   
1d80: 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20 70 4e   pNew->span = pN
1d90: 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f  ew->token = *pTo
1da0: 6b 65 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ken;.  }else if(
1db0: 20 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 69 66   pLeft ){.    if
1dc0: 28 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( pRight ){.    
1dd0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 70 61    sqlite3ExprSpa
1de0: 6e 28 70 4e 65 77 2c 20 26 70 4c 65 66 74 2d 3e  n(pNew, &pLeft->
1df0: 73 70 61 6e 2c 20 26 70 52 69 67 68 74 2d 3e 73  span, &pRight->s
1e00: 70 61 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pan);.      if( 
1e10: 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20  pRight->flags & 
1e20: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b  EP_ExpCollate ){
1e30: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  .        pNew->f
1e40: 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f  lags |= EP_ExpCo
1e50: 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 20 20 70  llate;.        p
1e60: 4e 65 77 2d 3e 70 43 6f 6c 6c 20 3d 20 70 52 69  New->pColl = pRi
1e70: 67 68 74 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20  ght->pColl;.    
1e80: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
1e90: 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26  ( pLeft->flags &
1ea0: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29   EP_ExpCollate )
1eb0: 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c  {.      pNew->fl
1ec0: 61 67 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c  ags |= EP_ExpCol
1ed0: 6c 61 74 65 3b 0a 20 20 20 20 20 20 70 4e 65 77  late;.      pNew
1ee0: 2d 3e 70 43 6f 6c 6c 20 3d 20 70 4c 65 66 74 2d  ->pColl = pLeft-
1ef0: 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20  >pColl;.    }.  
1f00: 7d 0a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  }..  sqlite3Expr
1f10: 53 65 74 48 65 69 67 68 74 28 70 4e 65 77 29 3b  SetHeight(pNew);
1f20: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
1f30: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 6f 72 6b 73 20 6c  }../*.** Works l
1f40: 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72 28  ike sqlite3Expr(
1f50: 29 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74  ) except that it
1f60: 20 74 61 6b 65 73 20 61 6e 20 65 78 74 72 61 20   takes an extra 
1f70: 50 61 72 73 65 2a 0a 2a 2a 20 61 72 67 75 6d 65  Parse*.** argume
1f80: 6e 74 20 61 6e 64 20 6e 6f 74 69 66 69 65 73 20  nt and notifies 
1f90: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 63  the associated c
1fa0: 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 6a 65 63 74  onnection object
1fb0: 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
1fc0: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
1fd0: 65 33 50 45 78 70 72 28 0a 20 20 50 61 72 73 65  e3PExpr(.  Parse
1fe0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1ff0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
2000: 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f  ntext */.  int o
2010: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
2020: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
2030: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70   opcode */.  Exp
2040: 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20  r *pLeft,       
2050: 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65       /* Left ope
2060: 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  rand */.  Expr *
2070: 70 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  pRight,         
2080: 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65 72 61    /* Right opera
2090: 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f  nd */.  const To
20a0: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 20 20 20 20  ken *pToken     
20b0: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 6b 65  /* Argument toke
20c0: 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  n */.){.  Expr *
20d0: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
20e0: 70 72 28 6f 70 2c 20 70 4c 65 66 74 2c 20 70 52  pr(op, pLeft, pR
20f0: 69 67 68 74 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20  ight, pToken);. 
2100: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
2110: 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
2120: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
2130: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
2140: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68  New;.}../*.** Wh
2150: 65 6e 20 64 6f 69 6e 67 20 61 20 6e 65 73 74 65  en doing a neste
2160: 64 20 70 61 72 73 65 2c 20 79 6f 75 20 63 61 6e  d parse, you can
2170: 20 69 6e 63 6c 75 64 65 20 74 65 72 6d 73 20 69   include terms i
2180: 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a  n an expression.
2190: 2a 2a 20 74 68 61 74 20 6c 6f 6f 6b 20 6c 69 6b  ** that look lik
21a0: 65 20 74 68 69 73 3a 20 20 20 23 30 20 23 31 20  e this:   #0 #1 
21b0: 23 32 20 2e 2e 2e 20 20 54 68 65 73 65 20 74 65  #2 ...  These te
21c0: 72 6d 73 20 72 65 66 65 72 20 74 6f 20 65 6c 65  rms refer to ele
21d0: 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 20 74 68 65 20  ments.** on the 
21e0: 73 74 61 63 6b 2e 20 20 22 23 30 22 20 6d 65 61  stack.  "#0" mea
21f0: 6e 73 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  ns the top of th
2200: 65 20 73 74 61 63 6b 2e 0a 2a 2a 20 22 23 31 22  e stack..** "#1"
2210: 20 6d 65 61 6e 73 20 74 68 65 20 6e 65 78 74 20   means the next 
2220: 64 6f 77 6e 20 6f 6e 20 74 68 65 20 73 74 61 63  down on the stac
2230: 6b 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68  k.  And so forth
2240: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2250: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
2260: 79 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20  y the parser to 
2270: 64 65 61 6c 20 77 69 74 68 20 6f 6e 20 6f 66 20  deal with on of 
2280: 74 68 6f 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20  those terms..** 
2290: 49 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 67  It immediately g
22a0: 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f  enerates code to
22b0: 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65   store the value
22c0: 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20 6c 6f 63   in a memory loc
22d0: 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 72 65  ation..** The re
22e0: 74 75 72 6e 73 20 61 6e 20 65 78 70 72 65 73 73  turns an express
22f0: 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 63 6f  ion that will co
2300: 64 65 20 74 6f 20 65 78 74 72 61 63 74 20 74 68  de to extract th
2310: 65 20 76 61 6c 75 65 20 66 72 6f 6d 0a 2a 2a 20  e value from.** 
2320: 74 68 61 74 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  that memory loca
2330: 74 69 6f 6e 20 61 73 20 6e 65 65 64 65 64 2e 0a  tion as needed..
2340: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
2350: 52 65 67 69 73 74 65 72 45 78 70 72 28 50 61 72  RegisterExpr(Par
2360: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
2370: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 56 64  n *pToken){.  Vd
2380: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
2390: 70 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70  pVdbe;.  Expr *p
23a0: 3b 0a 20 20 69 6e 74 20 64 65 70 74 68 3b 0a 20  ;.  int depth;. 
23b0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 65 73   if( pParse->nes
23c0: 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ted==0 ){.    sq
23d0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
23e0: 61 72 73 65 2c 20 22 6e 65 61 72 20 5c 22 25 54  arse, "near \"%T
23f0: 5c 22 3a 20 73 79 6e 74 61 78 20 65 72 72 6f 72  \": syntax error
2400: 22 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  ", pToken);.    
2410: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
2420: 70 72 28 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30  pr(TK_NULL, 0, 0
2430: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
2440: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  v==0 ) return 0;
2450: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78  .  p = sqlite3Ex
2460: 70 72 28 54 4b 5f 52 45 47 49 53 54 45 52 2c 20  pr(TK_REGISTER, 
2470: 30 2c 20 30 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20  0, 0, pToken);. 
2480: 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20   if( p==0 ){.   
2490: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
24a0: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
24b0: 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a     return 0;  /*
24c0: 20 4d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a   Malloc failed *
24d0: 2f 0a 20 20 7d 0a 20 20 64 65 70 74 68 20 3d 20  /.  }.  depth = 
24e0: 61 74 6f 69 28 28 63 68 61 72 2a 29 26 70 54 6f  atoi((char*)&pTo
24f0: 6b 65 6e 2d 3e 7a 5b 31 5d 29 3b 0a 20 20 70 2d  ken->z[1]);.  p-
2500: 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65  >iTable = pParse
2510: 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 73 71 6c 69  ->nMem++;.  sqli
2520: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
2530: 4f 50 5f 44 75 70 2c 20 64 65 70 74 68 2c 20 30  OP_Dup, depth, 0
2540: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
2550: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
2560: 74 6f 72 65 2c 20 70 2d 3e 69 54 61 62 6c 65 2c  tore, p->iTable,
2570: 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b   1);.  return p;
2580: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74  .}../*.** Join t
2590: 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75  wo expressions u
25a0: 73 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65 72  sing an AND oper
25b0: 61 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65 72  ator.  If either
25c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a   expression is.*
25d0: 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73  * NULL, then jus
25e0: 74 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74 68  t return the oth
25f0: 65 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  er expression..*
2600: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
2610: 78 70 72 41 6e 64 28 73 71 6c 69 74 65 33 20 2a  xprAnd(sqlite3 *
2620: 64 62 2c 20 45 78 70 72 20 2a 70 4c 65 66 74 2c  db, Expr *pLeft,
2630: 20 45 78 70 72 20 2a 70 52 69 67 68 74 29 7b 0a   Expr *pRight){.
2640: 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30 20 29    if( pLeft==0 )
2650: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 52 69  {.    return pRi
2660: 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ght;.  }else if(
2670: 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20   pRight==0 ){.  
2680: 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a    return pLeft;.
2690: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 45 78 70    }else{.    Exp
26a0: 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45 78  r *p = sqlite3Ex
26b0: 70 72 28 54 4b 5f 41 4e 44 2c 20 70 4c 65 66 74  pr(TK_AND, pLeft
26c0: 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20  , pRight, 0);.  
26d0: 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
26e0: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
26f0: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  iled = 1;.    }.
2700: 20 20 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20      return p;.  
2710: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
2720: 68 65 20 45 78 70 72 2e 73 70 61 6e 20 66 69 65  he Expr.span fie
2730: 6c 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  ld of the given 
2740: 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 73 70  expression to sp
2750: 61 6e 20 61 6c 6c 0a 2a 2a 20 74 65 78 74 20 62  an all.** text b
2760: 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20 67  etween the two g
2770: 69 76 65 6e 20 74 6f 6b 65 6e 73 2e 0a 2a 2f 0a  iven tokens..*/.
2780: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
2790: 53 70 61 6e 28 45 78 70 72 20 2a 70 45 78 70 72  Span(Expr *pExpr
27a0: 2c 20 54 6f 6b 65 6e 20 2a 70 4c 65 66 74 2c 20  , Token *pLeft, 
27b0: 54 6f 6b 65 6e 20 2a 70 52 69 67 68 74 29 7b 0a  Token *pRight){.
27c0: 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74    assert( pRight
27d0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
27e0: 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 69   pLeft!=0 );.  i
27f0: 66 28 20 70 45 78 70 72 20 26 26 20 70 52 69 67  f( pExpr && pRig
2800: 68 74 2d 3e 7a 20 26 26 20 70 4c 65 66 74 2d 3e  ht->z && pLeft->
2810: 7a 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  z ){.    assert(
2820: 20 70 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30 20 7c   pLeft->dyn==0 |
2830: 7c 20 70 4c 65 66 74 2d 3e 7a 5b 70 4c 65 66 74  | pLeft->z[pLeft
2840: 2d 3e 6e 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 69  ->n]==0 );.    i
2850: 66 28 20 70 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30  f( pLeft->dyn==0
2860: 20 26 26 20 70 52 69 67 68 74 2d 3e 64 79 6e 3d   && pRight->dyn=
2870: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70  =0 ){.      pExp
2880: 72 2d 3e 73 70 61 6e 2e 7a 20 3d 20 70 4c 65 66  r->span.z = pLef
2890: 74 2d 3e 7a 3b 0a 20 20 20 20 20 20 70 45 78 70  t->z;.      pExp
28a0: 72 2d 3e 73 70 61 6e 2e 6e 20 3d 20 70 52 69 67  r->span.n = pRig
28b0: 68 74 2d 3e 6e 20 2b 20 28 70 52 69 67 68 74 2d  ht->n + (pRight-
28c0: 3e 7a 20 2d 20 70 4c 65 66 74 2d 3e 7a 29 3b 0a  >z - pLeft->z);.
28d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28e0: 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 20 3d   pExpr->span.z =
28f0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
2900: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74  ./*.** Construct
2910: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
2920: 6e 20 6e 6f 64 65 20 66 6f 72 20 61 20 66 75 6e  n node for a fun
2930: 63 74 69 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69  ction with multi
2940: 70 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73  ple.** arguments
2950: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
2960: 65 33 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 50  e3ExprFunction(P
2970: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
2980: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54  prList *pList, T
2990: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
29a0: 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 61   Expr *pNew;.  a
29b0: 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b  ssert( pToken );
29c0: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
29d0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50  3DbMallocZero(pP
29e0: 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66  arse->db, sizeof
29f0: 28 45 78 70 72 29 20 29 3b 0a 20 20 69 66 28 20  (Expr) );.  if( 
2a00: 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pNew==0 ){.    s
2a10: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
2a20: 6c 65 74 65 28 70 4c 69 73 74 29 3b 20 2f 2a 20  lete(pList); /* 
2a30: 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65  Avoid leaking me
2a40: 6d 6f 72 79 20 77 68 65 6e 20 6d 61 6c 6c 6f 63  mory when malloc
2a50: 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65   fails */.    re
2a60: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e  turn 0;.  }.  pN
2a70: 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 46 55 4e 43  ew->op = TK_FUNC
2a80: 54 49 4f 4e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c  TION;.  pNew->pL
2a90: 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61  ist = pList;.  a
2aa0: 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 64  ssert( pToken->d
2ab0: 79 6e 3d 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d  yn==0 );.  pNew-
2ac0: 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e  >token = *pToken
2ad0: 3b 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d  ;.  pNew->span =
2ae0: 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 3b 0a 0a 20   pNew->token;.. 
2af0: 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48   sqlite3ExprSetH
2b00: 65 69 67 68 74 28 70 4e 65 77 29 3b 0a 20 20 72  eight(pNew);.  r
2b10: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
2b20: 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 61 20 76 61  *.** Assign a va
2b30: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f  riable number to
2b40: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
2b50: 68 61 74 20 65 6e 63 6f 64 65 73 20 61 20 77 69  hat encodes a wi
2b60: 6c 64 63 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65  ldcard.** in the
2b70: 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74   original SQL st
2b80: 61 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a  atement.  .**.**
2b90: 20 57 69 6c 64 63 61 72 64 73 20 63 6f 6e 73 69   Wildcards consi
2ba0: 73 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c  sting of a singl
2bb0: 65 20 22 3f 22 20 61 72 65 20 61 73 73 69 67 6e  e "?" are assign
2bc0: 65 64 20 74 68 65 20 6e 65 78 74 20 73 65 71 75  ed the next sequ
2bd0: 65 6e 74 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62  ential.** variab
2be0: 6c 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a  le number..**.**
2bf0: 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68   Wildcards of th
2c00: 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72  e form "?nnn" ar
2c10: 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e  e assigned the n
2c20: 75 6d 62 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65  umber "nnn".  We
2c30: 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e   make.** sure "n
2c40: 6e 6e 22 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62  nn" is not too b
2c50: 65 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e  e to avoid a den
2c60: 69 61 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61  ial of service a
2c70: 74 74 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68  ttack when.** th
2c80: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
2c90: 63 6f 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78  comes from an ex
2ca0: 74 65 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a  ternal source..*
2cb0: 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f  *.** Wildcards o
2cc0: 66 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61  f the form ":aaa
2cd0: 22 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20  " or "$aaa" are 
2ce0: 61 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d  assigned the sam
2cf0: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74  e number.** as t
2d00: 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74  he previous inst
2d10: 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65  ance of the same
2d20: 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69   wildcard.  Or i
2d30: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
2d40: 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20  rst.** instance 
2d50: 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c  of the wildcard,
2d60: 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e   the next sequen
2d70: 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  ial variable num
2d80: 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e  ber is.** assign
2d90: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
2da0: 74 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72  te3ExprAssignVar
2db0: 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50  Number(Parse *pP
2dc0: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
2dd0: 72 29 7b 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f  r){.  Token *pTo
2de0: 6b 65 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ken;.  sqlite3 *
2df0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
2e00: 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ..  if( pExpr==0
2e10: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 6f   ) return;.  pTo
2e20: 6b 65 6e 20 3d 20 26 70 45 78 70 72 2d 3e 74 6f  ken = &pExpr->to
2e30: 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ken;.  assert( p
2e40: 54 6f 6b 65 6e 2d 3e 6e 3e 3d 31 20 29 3b 0a 20  Token->n>=1 );. 
2e50: 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d   assert( pToken-
2e60: 3e 7a 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  >z!=0 );.  asser
2e70: 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 21  t( pToken->z[0]!
2e80: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b  =0 );.  if( pTok
2e90: 65 6e 2d 3e 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  en->n==1 ){.    
2ea0: 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74  /* Wildcard of t
2eb0: 68 65 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73  he form "?".  As
2ec0: 73 69 67 6e 20 74 68 65 20 6e 65 78 74 20 76 61  sign the next va
2ed0: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f  riable number */
2ee0: 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62  .    pExpr->iTab
2ef0: 6c 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  le = ++pParse->n
2f00: 56 61 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  Var;.  }else if(
2f10: 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27   pToken->z[0]=='
2f20: 3f 27 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c  ?' ){.    /* Wil
2f30: 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72  dcard of the for
2f40: 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65  m "?nnn".  Conve
2f50: 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69  rt "nnn" to an i
2f60: 6e 74 65 67 65 72 20 61 6e 64 0a 20 20 20 20 2a  nteger and.    *
2f70: 2a 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  * use it as the 
2f80: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20  variable number 
2f90: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  */.    int i;.  
2fa0: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
2fb0: 3d 20 69 20 3d 20 61 74 6f 69 28 28 63 68 61 72  = i = atoi((char
2fc0: 2a 29 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d 29  *)&pToken->z[1])
2fd0: 3b 0a 20 20 20 20 69 66 28 20 69 3c 31 20 7c 7c  ;.    if( i<1 ||
2fe0: 20 69 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41   i>SQLITE_MAX_VA
2ff0: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 20 29 7b  RIABLE_NUMBER ){
3000: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
3010: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3020: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20  variable number 
3030: 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20  must be between 
3040: 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20  ?1 and ?%d",.   
3050: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4d 41         SQLITE_MA
3060: 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  X_VARIABLE_NUMBE
3070: 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  R);.    }.    if
3080: 28 20 69 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72  ( i>pParse->nVar
3090: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
30a0: 2d 3e 6e 56 61 72 20 3d 20 69 3b 0a 20 20 20 20  ->nVar = i;.    
30b0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
30c0: 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74  * Wildcards of t
30d0: 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 20 6f  he form ":aaa" o
30e0: 72 20 22 24 61 61 61 22 2e 20 20 52 65 75 73 65  r "$aaa".  Reuse
30f0: 20 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62   the same variab
3100: 6c 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  le.    ** number
3110: 20 61 73 20 74 68 65 20 70 72 69 6f 72 20 61 70   as the prior ap
3120: 70 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65 20  pearance of the 
3130: 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66  same name, or if
3140: 20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 2a 2a   the name.    **
3150: 20 68 61 73 20 6e 65 76 65 72 20 61 70 70 65 61   has never appea
3160: 72 65 64 20 62 65 66 6f 72 65 2c 20 72 65 75 73  red before, reus
3170: 65 20 74 68 65 20 73 61 6d 65 20 76 61 72 69 61  e the same varia
3180: 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 2a  ble number.    *
3190: 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 3b 0a  /.    int i, n;.
31a0: 20 20 20 20 6e 20 3d 20 70 54 6f 6b 65 6e 2d 3e      n = pToken->
31b0: 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  n;.    for(i=0; 
31c0: 69 3c 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78  i<pParse->nVarEx
31d0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
31e0: 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 20 20  Expr *pE;.      
31f0: 69 66 28 20 28 70 45 20 3d 20 70 50 61 72 73 65  if( (pE = pParse
3200: 2d 3e 61 70 56 61 72 45 78 70 72 5b 69 5d 29 21  ->apVarExpr[i])!
3210: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  =0.          && 
3220: 70 45 2d 3e 74 6f 6b 65 6e 2e 6e 3d 3d 6e 0a 20  pE->token.n==n. 
3230: 20 20 20 20 20 20 20 20 20 26 26 20 6d 65 6d 63           && memc
3240: 6d 70 28 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  mp(pE->token.z, 
3250: 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 6e 29 3d 3d 30  pToken->z, n)==0
3260: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70   ){.        pExp
3270: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 2d 3e  r->iTable = pE->
3280: 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20  iTable;.        
3290: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
32a0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d     }.    if( i>=
32b0: 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72  pParse->nVarExpr
32c0: 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   ){.      pExpr-
32d0: 3e 69 54 61 62 6c 65 20 3d 20 2b 2b 70 50 61 72  >iTable = ++pPar
32e0: 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 20 20 20 20  se->nVar;.      
32f0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 56 61 72  if( pParse->nVar
3300: 45 78 70 72 3e 3d 70 50 61 72 73 65 2d 3e 6e 56  Expr>=pParse->nV
3310: 61 72 45 78 70 72 41 6c 6c 6f 63 2d 31 20 29 7b  arExprAlloc-1 ){
3320: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
3330: 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 20 2b  >nVarExprAlloc +
3340: 3d 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78  = pParse->nVarEx
3350: 70 72 41 6c 6c 6f 63 20 2b 20 31 30 3b 0a 20 20  prAlloc + 10;.  
3360: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 70        pParse->ap
3370: 56 61 72 45 78 70 72 20 3d 0a 20 20 20 20 20 20  VarExpr =.      
3380: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52        sqlite3DbR
3390: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 0a 20 20  eallocOrFree(.  
33a0: 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2c 0a              db,.
33b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
33c0: 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 2c  arse->apVarExpr,
33d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
33e0: 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41  Parse->nVarExprA
33f0: 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 50 61 72  lloc*sizeof(pPar
3400: 73 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 30 5d  se->apVarExpr[0]
3410: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b  ).            );
3420: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
3430: 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
3440: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
3450: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
3460: 61 70 56 61 72 45 78 70 72 21 3d 30 20 29 3b 0a  apVarExpr!=0 );.
3470: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
3480: 61 70 56 61 72 45 78 70 72 5b 70 50 61 72 73 65  apVarExpr[pParse
3490: 2d 3e 6e 56 61 72 45 78 70 72 2b 2b 5d 20 3d 20  ->nVarExpr++] = 
34a0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 7d 0a 20  pExpr;.      }. 
34b0: 20 20 20 7d 0a 20 20 7d 20 0a 20 20 69 66 28 20     }.  } .  if( 
34c0: 21 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 26 26  !pParse->nErr &&
34d0: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 53 51   pParse->nVar>SQ
34e0: 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c  LITE_MAX_VARIABL
34f0: 45 5f 4e 55 4d 42 45 52 20 29 7b 0a 20 20 20 20  E_NUMBER ){.    
3500: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
3510: 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
3520: 79 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73 22  y SQL variables"
3530: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
3540: 52 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65  Recursively dele
3550: 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  te an expression
3560: 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   tree..*/.void s
3570: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
3580: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28  (Expr *p){.  if(
3590: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
35a0: 20 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 64 79    if( p->span.dy
35b0: 6e 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  n ) sqlite3_free
35c0: 28 28 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e 2e  ((char*)p->span.
35d0: 7a 29 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b  z);.  if( p->tok
35e0: 65 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74 65 33  en.dyn ) sqlite3
35f0: 5f 66 72 65 65 28 28 63 68 61 72 2a 29 70 2d 3e  _free((char*)p->
3600: 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 73 71 6c 69  token.z);.  sqli
3610: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d  te3ExprDelete(p-
3620: 3e 70 4c 65 66 74 29 3b 0a 20 20 73 71 6c 69 74  >pLeft);.  sqlit
3630: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e  e3ExprDelete(p->
3640: 70 52 69 67 68 74 29 3b 0a 20 20 73 71 6c 69 74  pRight);.  sqlit
3650: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
3660: 28 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 73 71  (p->pList);.  sq
3670: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
3680: 65 28 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  e(p->pSelect);. 
3690: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
36a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 45  ;.}../*.** The E
36b0: 78 70 72 2e 74 6f 6b 65 6e 20 66 69 65 6c 64 20  xpr.token field 
36c0: 6d 69 67 68 74 20 62 65 20 61 20 73 74 72 69 6e  might be a strin
36d0: 67 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 69  g literal that i
36e0: 73 20 71 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20  s quoted..** If 
36f0: 73 6f 2c 20 72 65 6d 6f 76 65 20 74 68 65 20 71  so, remove the q
3700: 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b 73 2e 0a  uotation marks..
3710: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
3720: 65 71 75 6f 74 65 45 78 70 72 28 73 71 6c 69 74  equoteExpr(sqlit
3730: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29  e3 *db, Expr *p)
3740: 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 41  {.  if( ExprHasA
3750: 6e 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  nyProperty(p, EP
3760: 5f 44 65 71 75 6f 74 65 64 29 20 29 7b 0a 20 20  _Dequoted) ){.  
3770: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
3780: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
3790: 70 2c 20 45 50 5f 44 65 71 75 6f 74 65 64 29 3b  p, EP_Dequoted);
37a0: 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e  .  if( p->token.
37b0: 64 79 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  dyn==0 ){.    sq
37c0: 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 64  lite3TokenCopy(d
37d0: 62 2c 20 26 70 2d 3e 74 6f 6b 65 6e 2c 20 26 70  b, &p->token, &p
37e0: 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20  ->token);.  }.  
37f0: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 28  sqlite3Dequote((
3800: 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a  char*)p->token.z
3810: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  );.}.../*.** The
3820: 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70   following group
3830: 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b   of routines mak
3840: 65 20 64 65 65 70 20 63 6f 70 69 65 73 20 6f 66  e deep copies of
3850: 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a   expressions,.**
3860: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
3870: 73 2c 20 49 44 20 6c 69 73 74 73 2c 20 61 6e 64  s, ID lists, and
3880: 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
3890: 74 73 2e 20 20 54 68 65 20 63 6f 70 69 65 73 20  ts.  The copies 
38a0: 63 61 6e 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65  can.** be delete
38b0: 64 20 28 62 79 20 62 65 69 6e 67 20 70 61 73 73  d (by being pass
38c0: 65 64 20 74 6f 20 74 68 65 69 72 20 72 65 73 70  ed to their resp
38d0: 65 63 74 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65  ective ...Delete
38e0: 28 29 20 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20  () routines).** 
38f0: 77 69 74 68 6f 75 74 20 65 66 66 65 63 74 69 6e  without effectin
3900: 67 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e  g the originals.
3910: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65  .**.** The expre
3920: 73 73 69 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20  ssion list, ID, 
3930: 61 6e 64 20 73 6f 75 72 63 65 20 6c 69 73 74 73  and source lists
3940: 20 72 65 74 75 72 6e 20 62 79 20 73 71 6c 69 74   return by sqlit
3950: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 29 2c  e3ExprListDup(),
3960: 0a 2a 2a 20 73 71 6c 69 74 65 33 49 64 4c 69 73  .** sqlite3IdLis
3970: 74 44 75 70 28 29 2c 20 61 6e 64 20 73 71 6c 69  tDup(), and sqli
3980: 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 29 20  te3SrcListDup() 
3990: 63 61 6e 20 6e 6f 74 20 62 65 20 66 75 72 74 68  can not be furth
39a0: 65 72 20 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20  er expanded .** 
39b0: 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  by subsequent ca
39c0: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69  lls to sqlite*Li
39d0: 73 74 41 70 70 65 6e 64 28 29 20 72 6f 75 74 69  stAppend() routi
39e0: 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74  nes..**.** Any t
39f0: 61 62 6c 65 73 20 74 68 61 74 20 74 68 65 20 53  ables that the S
3a00: 72 63 4c 69 73 74 20 6d 69 67 68 74 20 70 6f 69  rcList might poi
3a10: 6e 74 20 74 6f 20 61 72 65 20 6e 6f 74 20 64 75  nt to are not du
3a20: 70 6c 69 63 61 74 65 64 2e 0a 2a 2f 0a 45 78 70  plicated..*/.Exp
3a30: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 44 75  r *sqlite3ExprDu
3a40: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  p(sqlite3 *db, E
3a50: 78 70 72 20 2a 70 29 7b 0a 20 20 45 78 70 72 20  xpr *p){.  Expr 
3a60: 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d 3d  *pNew;.  if( p==
3a70: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
3a80: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
3a90: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
3aa0: 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66  zeof(*p) );.  if
3ab0: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
3ac0: 72 6e 20 30 3b 0a 20 20 6d 65 6d 63 70 79 28 70  rn 0;.  memcpy(p
3ad0: 4e 65 77 2c 20 70 2c 20 73 69 7a 65 6f 66 28 2a  New, p, sizeof(*
3ae0: 70 4e 65 77 29 29 3b 0a 20 20 69 66 28 20 70 2d  pNew));.  if( p-
3af0: 3e 74 6f 6b 65 6e 2e 7a 21 3d 30 20 29 7b 0a 20  >token.z!=0 ){. 
3b00: 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a     pNew->token.z
3b10: 20 3d 20 28 75 38 2a 29 73 71 6c 69 74 65 33 44   = (u8*)sqlite3D
3b20: 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68  bStrNDup(db, (ch
3b30: 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  ar*)p->token.z, 
3b40: 70 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20  p->token.n);.   
3b50: 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 64 79 6e   pNew->token.dyn
3b60: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
3b70: 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
3b80: 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 3b 0a 20  >token.z==0 );. 
3b90: 20 7d 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e 2e   }.  pNew->span.
3ba0: 7a 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70  z = 0;.  pNew->p
3bb0: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
3bc0: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65  prDup(db, p->pLe
3bd0: 66 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69  ft);.  pNew->pRi
3be0: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
3bf0: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67  rDup(db, p->pRig
3c00: 68 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  ht);.  pNew->pLi
3c10: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
3c20: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
3c30: 4c 69 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  List);.  pNew->p
3c40: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
3c50: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d  SelectDup(db, p-
3c60: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 72 65 74  >pSelect);.  ret
3c70: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 76 6f 69 64  urn pNew;.}.void
3c80: 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70   sqlite3TokenCop
3c90: 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54  y(sqlite3 *db, T
3ca0: 6f 6b 65 6e 20 2a 70 54 6f 2c 20 54 6f 6b 65 6e  oken *pTo, Token
3cb0: 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20   *pFrom){.  if( 
3cc0: 70 54 6f 2d 3e 64 79 6e 20 29 20 73 71 6c 69 74  pTo->dyn ) sqlit
3cd0: 65 33 5f 66 72 65 65 28 28 63 68 61 72 2a 29 70  e3_free((char*)p
3ce0: 54 6f 2d 3e 7a 29 3b 0a 20 20 69 66 28 20 70 46  To->z);.  if( pF
3cf0: 72 6f 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 70 54  rom->z ){.    pT
3d00: 6f 2d 3e 6e 20 3d 20 70 46 72 6f 6d 2d 3e 6e 3b  o->n = pFrom->n;
3d10: 0a 20 20 20 20 70 54 6f 2d 3e 7a 20 3d 20 28 75  .    pTo->z = (u
3d20: 38 2a 29 73 71 6c 69 74 65 33 44 62 53 74 72 4e  8*)sqlite3DbStrN
3d30: 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70  Dup(db, (char*)p
3d40: 46 72 6f 6d 2d 3e 7a 2c 20 70 46 72 6f 6d 2d 3e  From->z, pFrom->
3d50: 6e 29 3b 0a 20 20 20 20 70 54 6f 2d 3e 64 79 6e  n);.    pTo->dyn
3d60: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
3d70: 20 20 20 70 54 6f 2d 3e 7a 20 3d 20 30 3b 0a 20     pTo->z = 0;. 
3d80: 20 7d 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73   }.}.ExprList *s
3d90: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
3da0: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  p(sqlite3 *db, E
3db0: 78 70 72 4c 69 73 74 20 2a 70 29 7b 0a 20 20 45  xprList *p){.  E
3dc0: 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  xprList *pNew;. 
3dd0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
3de0: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70  _item *pItem, *p
3df0: 4f 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69  OldItem;.  int i
3e00: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
3e10: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20  eturn 0;.  pNew 
3e20: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
3e30: 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
3e40: 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20  *pNew) );.  if( 
3e50: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
3e60: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 45 43 75   0;.  pNew->iECu
3e70: 72 73 6f 72 20 3d 20 30 3b 0a 20 20 70 4e 65 77  rsor = 0;.  pNew
3e80: 2d 3e 6e 45 78 70 72 20 3d 20 70 4e 65 77 2d 3e  ->nExpr = pNew->
3e90: 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 45 78 70  nAlloc = p->nExp
3ea0: 72 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 70  r;.  pNew->a = p
3eb0: 49 74 65 6d 20 3d 20 73 71 6c 69 74 65 33 44 62  Item = sqlite3Db
3ec0: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 20 70  MallocRaw(db,  p
3ed0: 2d 3e 6e 45 78 70 72 2a 73 69 7a 65 6f 66 28 70  ->nExpr*sizeof(p
3ee0: 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28  ->a[0]) );.  if(
3ef0: 20 70 49 74 65 6d 3d 3d 30 20 29 7b 0a 20 20 20   pItem==0 ){.   
3f00: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
3f10: 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ew);.    return 
3f20: 30 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49 74  0;.  } .  pOldIt
3f30: 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72  em = p->a;.  for
3f40: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72  (i=0; i<p->nExpr
3f50: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20  ; i++, pItem++, 
3f60: 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  pOldItem++){.   
3f70: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 2c   Expr *pNewExpr,
3f80: 20 2a 70 4f 6c 64 45 78 70 72 3b 0a 20 20 20 20   *pOldExpr;.    
3f90: 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70  pItem->pExpr = p
3fa0: 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65  NewExpr = sqlite
3fb0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c  3ExprDup(db, pOl
3fc0: 64 45 78 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d  dExpr = pOldItem
3fd0: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ->pExpr);.    if
3fe0: 28 20 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e  ( pOldExpr->span
3ff0: 2e 7a 21 3d 30 20 26 26 20 70 4e 65 77 45 78 70  .z!=0 && pNewExp
4000: 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c  r ){.      /* Al
4010: 77 61 79 73 20 6d 61 6b 65 20 61 20 63 6f 70 79  ways make a copy
4020: 20 6f 66 20 74 68 65 20 73 70 61 6e 20 66 6f 72   of the span for
4030: 20 74 6f 70 2d 6c 65 76 65 6c 20 65 78 70 72 65   top-level expre
4040: 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 0a 20 20  ssions in the.  
4050: 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
4060: 6e 20 6c 69 73 74 2e 20 20 54 68 65 20 6c 6f 67  n list.  The log
4070: 69 63 20 69 6e 20 53 45 4c 45 43 54 20 70 72 6f  ic in SELECT pro
4080: 63 65 73 73 69 6e 67 20 74 68 61 74 20 64 65 74  cessing that det
4090: 65 72 6d 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a  ermines.      **
40a0: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f   the names of co
40b0: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73  lumns in the res
40c0: 75 6c 74 20 73 65 74 20 6e 65 65 64 73 20 74 68  ult set needs th
40d0: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  is information *
40e0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  /.      sqlite3T
40f0: 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70 4e  okenCopy(db, &pN
4100: 65 77 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70  ewExpr->span, &p
4110: 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a  OldExpr->span);.
4120: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
4130: 28 20 70 4e 65 77 45 78 70 72 3d 3d 30 20 7c 7c  ( pNewExpr==0 ||
4140: 20 70 4e 65 77 45 78 70 72 2d 3e 73 70 61 6e 2e   pNewExpr->span.
4150: 7a 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  z!=0 .          
4160: 20 20 7c 7c 20 70 4f 6c 64 45 78 70 72 2d 3e 73    || pOldExpr->s
4170: 70 61 6e 2e 7a 3d 3d 30 0a 20 20 20 20 20 20 20  pan.z==0.       
4180: 20 20 20 20 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c       || db->mall
4190: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
41a0: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
41b0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
41c0: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  b, pOldItem->zNa
41d0: 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  me);.    pItem->
41e0: 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c 64  sortOrder = pOld
41f0: 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b  Item->sortOrder;
4200: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 69 73 41 67  .    pItem->isAg
4210: 67 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 73  g = pOldItem->is
4220: 41 67 67 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  Agg;.    pItem->
4230: 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  done = 0;.  }.  
4240: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
4250: 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 73  /*.** If cursors
4260: 2c 20 74 72 69 67 67 65 72 73 2c 20 76 69 65 77  , triggers, view
4270: 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73  s and subqueries
4280: 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65 64   are all omitted
4290: 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75 69   from.** the bui
42a0: 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f 66  ld, then none of
42b0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   the following r
42c0: 6f 75 74 69 6e 65 73 2c 20 65 78 63 65 70 74 20  outines, except 
42d0: 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33 53  for .** sqlite3S
42e0: 65 6c 65 63 74 44 75 70 28 29 2c 20 63 61 6e 20  electDup(), can 
42f0: 62 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69 74  be called. sqlit
4300: 65 33 53 65 6c 65 63 74 44 75 70 28 29 20 69 73  e3SelectDup() is
4310: 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63 61   sometimes.** ca
4320: 6c 6c 65 64 20 77 69 74 68 20 61 20 4e 55 4c 4c  lled with a NULL
4330: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69   argument..*/.#i
4340: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
4350: 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
4360: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
4370: 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 5c 0a  OMIT_TRIGGER) \.
4380: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
4390: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
43a0: 59 29 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  Y).SrcList *sqli
43b0: 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 73 71  te3SrcListDup(sq
43c0: 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c 69  lite3 *db, SrcLi
43d0: 73 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73  st *p){.  SrcLis
43e0: 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69  t *pNew;.  int i
43f0: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
4400: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
4410: 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20  rn 0;.  nByte = 
4420: 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d  sizeof(*p) + (p-
4430: 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66  >nSrc>0 ? sizeof
4440: 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e  (p->a[0]) * (p->
4450: 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20  nSrc-1) : 0);.  
4460: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
4470: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 6e 42  MallocRaw(db, nB
4480: 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  yte );.  if( pNe
4490: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
44a0: 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d 20  .  pNew->nSrc = 
44b0: 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70  pNew->nAlloc = p
44c0: 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d  ->nSrc;.  for(i=
44d0: 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b  0; i<p->nSrc; i+
44e0: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
44f0: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65  rcList_item *pNe
4500: 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61  wItem = &pNew->a
4510: 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20  [i];.    struct 
4520: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f  SrcList_item *pO
4530: 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69  ldItem = &p->a[i
4540: 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ];.    Table *pT
4550: 61 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  ab;.    pNewItem
4560: 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71  ->zDatabase = sq
4570: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
4580: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74  , pOldItem->zDat
4590: 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65 77  abase);.    pNew
45a0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
45b0: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
45c0: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d  , pOldItem->zNam
45d0: 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  e);.    pNewItem
45e0: 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74  ->zAlias = sqlit
45f0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
4600: 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  OldItem->zAlias)
4610: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
4620: 6a 6f 69 6e 74 79 70 65 20 3d 20 70 4f 6c 64 49  jointype = pOldI
4630: 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20  tem->jointype;. 
4640: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43 75     pNewItem->iCu
4650: 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  rsor = pOldItem-
4660: 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 4e  >iCursor;.    pN
4670: 65 77 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61  ewItem->isPopula
4680: 74 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  ted = pOldItem->
4690: 69 73 50 6f 70 75 6c 61 74 65 64 3b 0a 20 20 20  isPopulated;.   
46a0: 20 70 54 61 62 20 3d 20 70 4e 65 77 49 74 65 6d   pTab = pNewItem
46b0: 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49 74 65  ->pTab = pOldIte
46c0: 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28  m->pTab;.    if(
46d0: 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70   pTab ){.      p
46e0: 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  Tab->nRef++;.   
46f0: 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d   }.    pNewItem-
4700: 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
4710: 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
4720: 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63  pOldItem->pSelec
4730: 74 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  t);.    pNewItem
4740: 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45  ->pOn = sqlite3E
4750: 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  xprDup(db, pOldI
4760: 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 70  tem->pOn);.    p
4770: 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20  NewItem->pUsing 
4780: 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44  = sqlite3IdListD
4790: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
47a0: 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e  >pUsing);.    pN
47b0: 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20  ewItem->colUsed 
47c0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55  = pOldItem->colU
47d0: 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  sed;.  }.  retur
47e0: 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74  n pNew;.}.IdList
47f0: 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44   *sqlite3IdListD
4800: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
4810: 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64  IdList *p){.  Id
4820: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  List *pNew;.  in
4830: 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  t i;.  if( p==0 
4840: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
4850: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
4860: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
4870: 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69  of(*pNew) );.  i
4880: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
4890: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  urn 0;.  pNew->n
48a0: 49 64 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f  Id = pNew->nAllo
48b0: 63 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e  c = p->nId;.  pN
48c0: 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44  ew->a = sqlite3D
48d0: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 70  bMallocRaw(db, p
48e0: 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e  ->nId*sizeof(p->
48f0: 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70  a[0]) );.  if( p
4900: 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20  New->a==0 ){.   
4910: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
4920: 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ew);.    return 
4930: 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  0;.  }.  for(i=0
4940: 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29  ; i<p->nId; i++)
4950: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  {.    struct IdL
4960: 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74  ist_item *pNewIt
4970: 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d  em = &pNew->a[i]
4980: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  ;.    struct IdL
4990: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74  ist_item *pOldIt
49a0: 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  em = &p->a[i];. 
49b0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
49c0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
49d0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
49e0: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
49f0: 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70  NewItem->idx = p
4a00: 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20  OldItem->idx;.  
4a10: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
4a20: 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74  .}.Select *sqlit
4a30: 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69  e3SelectDup(sqli
4a40: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
4a50: 2a 70 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  *p){.  Select *p
4a60: 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  New;.  if( p==0 
4a70: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
4a80: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
4a90: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
4aa0: 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20  of(*p) );.  if( 
4ab0: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
4ac0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 44 69   0;.  pNew->isDi
4ad0: 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69  stinct = p->isDi
4ae0: 73 74 69 6e 63 74 3b 0a 20 20 70 4e 65 77 2d 3e  stinct;.  pNew->
4af0: 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  pEList = sqlite3
4b00: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
4b10: 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70 4e  p->pEList);.  pN
4b20: 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74  ew->pSrc = sqlit
4b30: 65 33 53 72 63 4c 69 73 74 44 75 70 28 64 62 2c  e3SrcListDup(db,
4b40: 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 70 4e 65   p->pSrc);.  pNe
4b50: 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  w->pWhere = sqli
4b60: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
4b70: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 70 4e 65  ->pWhere);.  pNe
4b80: 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  w->pGroupBy = sq
4b90: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
4ba0: 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  (db, p->pGroupBy
4bb0: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69  );.  pNew->pHavi
4bc0: 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ng = sqlite3Expr
4bd0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 48 61 76 69  Dup(db, p->pHavi
4be0: 6e 67 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72  ng);.  pNew->pOr
4bf0: 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45  derBy = sqlite3E
4c00: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
4c10: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 70  ->pOrderBy);.  p
4c20: 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b  New->op = p->op;
4c30: 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20  .  pNew->pPrior 
4c40: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
4c50: 75 70 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72  up(db, p->pPrior
4c60: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69  );.  pNew->pLimi
4c70: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
4c80: 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74  up(db, p->pLimit
4c90: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73  );.  pNew->pOffs
4ca0: 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  et = sqlite3Expr
4cb0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73  Dup(db, p->pOffs
4cc0: 65 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69  et);.  pNew->iLi
4cd0: 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  mit = -1;.  pNew
4ce0: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b 0a  ->iOffset = -1;.
4cf0: 20 20 70 4e 65 77 2d 3e 69 73 52 65 73 6f 6c 76    pNew->isResolv
4d00: 65 64 20 3d 20 70 2d 3e 69 73 52 65 73 6f 6c 76  ed = p->isResolv
4d10: 65 64 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 41 67  ed;.  pNew->isAg
4d20: 67 20 3d 20 70 2d 3e 69 73 41 67 67 3b 0a 20 20  g = p->isAgg;.  
4d30: 70 4e 65 77 2d 3e 75 73 65 73 45 70 68 6d 20 3d  pNew->usesEphm =
4d40: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 64 69 73 61   0;.  pNew->disa
4d50: 6c 6c 6f 77 4f 72 64 65 72 42 79 20 3d 20 30 3b  llowOrderBy = 0;
4d60: 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 6d  .  pNew->pRightm
4d70: 6f 73 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ost = 0;.  pNew-
4d80: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
4d90: 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61   = -1;.  pNew->a
4da0: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d  ddrOpenEphm[1] =
4db0: 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64   -1;.  pNew->add
4dc0: 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d  rOpenEphm[2] = -
4dd0: 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  1;.  return pNew
4de0: 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74  ;.}.#else.Select
4df0: 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44   *sqlite3SelectD
4e00: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
4e10: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 61 73  Select *p){.  as
4e20: 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20  sert( p==0 );.  
4e30: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
4e40: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  if.../*.** Add a
4e50: 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
4e60: 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20 65 78  the end of an ex
4e70: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20  pression list.  
4e80: 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69  If pList is.** i
4e90: 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74  nitially NULL, t
4ea0: 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77  hen create a new
4eb0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
4ec0: 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73  ..*/.ExprList *s
4ed0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
4ee0: 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a 70  pend(.  Parse *p
4ef0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
4f00: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
4f10: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
4f20: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
4f30: 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68  /* List to which
4f40: 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68   to append. Migh
4f50: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  t be NULL */.  E
4f60: 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
4f70: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
4f80: 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e  sion to be appen
4f90: 64 65 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ded */.  Token *
4fa0: 70 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20  pName           
4fb0: 20 2f 2a 20 41 53 20 6b 65 79 77 6f 72 64 20 66   /* AS keyword f
4fc0: 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  or the expressio
4fd0: 6e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  n */.){.  sqlite
4fe0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
4ff0: 64 62 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  db;.  if( pList=
5000: 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
5010: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
5020: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
5030: 28 45 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20  (ExprList) );.  
5040: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
5050: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f  {.      goto no_
5060: 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  mem;.    }.    a
5070: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 41  ssert( pList->nA
5080: 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20  lloc==0 );.  }. 
5090: 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c   if( pList->nAll
50a0: 6f 63 3c 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72  oc<=pList->nExpr
50b0: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
50c0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b  xprList_item *a;
50d0: 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c 69  .    int n = pLi
50e0: 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 34  st->nAlloc*2 + 4
50f0: 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65  ;.    a = sqlite
5100: 33 5f 72 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d  3_realloc(pList-
5110: 3e 61 2c 20 6e 2a 73 69 7a 65 6f 66 28 70 4c 69  >a, n*sizeof(pLi
5120: 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20  st->a[0]));.    
5130: 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20  if( a==0 ){.    
5140: 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20    goto no_mem;. 
5150: 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e     }.    pList->
5160: 61 20 3d 20 61 3b 0a 20 20 20 20 70 4c 69 73 74  a = a;.    pList
5170: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 3b 0a 20 20  ->nAlloc = n;.  
5180: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  }.  assert( pLis
5190: 74 2d 3e 61 21 3d 30 20 29 3b 0a 20 20 69 66 28  t->a!=0 );.  if(
51a0: 20 70 45 78 70 72 20 7c 7c 20 70 4e 61 6d 65 20   pExpr || pName 
51b0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
51c0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
51d0: 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
51e0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a  List->nExpr++];.
51f0: 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d      memset(pItem
5200: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74  , 0, sizeof(*pIt
5210: 65 6d 29 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  em));.    pItem-
5220: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
5230: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
5240: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49  , pName);.    pI
5250: 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78  tem->pExpr = pEx
5260: 70 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  pr;.  }.  return
5270: 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a   pList;..no_mem:
5280: 20 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64       .  /* Avoid
5290: 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20   leaking memory 
52a0: 69 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61  if malloc has fa
52b0: 69 6c 65 64 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6d  iled. */.  db->m
52c0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
52d0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
52e0: 6c 65 74 65 28 70 45 78 70 72 29 3b 0a 20 20 73  lete(pExpr);.  s
52f0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
5300: 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 72  lete(pList);.  r
5310: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
5320: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
5330: 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20  ion list pEList 
5340: 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68  contains more th
5350: 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e  an iLimit elemen
5360: 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20  ts,.** leave an 
5370: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
5380: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64   pParse..*/.void
5390: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
53a0: 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50  CheckLength(.  P
53b0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20  arse *pParse,.  
53c0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
53d0: 2c 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 2c 0a  ,.  int iLimit,.
53e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
53f0: 62 6a 65 63 74 0a 29 7b 0a 20 20 69 66 28 20 70  bject.){.  if( p
5400: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
5410: 3e 6e 45 78 70 72 3e 69 4c 69 6d 69 74 20 29 7b  >nExpr>iLimit ){
5420: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
5430: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
5440: 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69  o many columns i
5450: 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b  n %s", zObject);
5460: 0a 20 20 7d 0a 7d 0a 0a 0a 23 69 66 20 53 51 4c  .  }.}...#if SQL
5470: 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
5480: 54 48 3e 30 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c  TH>0./* The foll
5490: 6f 77 69 6e 67 20 74 68 72 65 65 20 66 75 6e 63  owing three func
54a0: 74 69 6f 6e 73 2c 20 68 65 69 67 68 74 4f 66 45  tions, heightOfE
54b0: 78 70 72 28 29 2c 20 68 65 69 67 68 74 4f 66 45  xpr(), heightOfE
54c0: 78 70 72 4c 69 73 74 28 29 0a 2a 2a 20 61 6e 64  xprList().** and
54d0: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
54e0: 29 2c 20 61 72 65 20 75 73 65 64 20 74 6f 20 64  ), are used to d
54f0: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 61 78  etermine the max
5500: 69 6d 75 6d 20 68 65 69 67 68 74 0a 2a 2a 20 6f  imum height.** o
5510: 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  f any expression
5520: 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65 64   tree referenced
5530: 20 62 79 20 74 68 65 20 73 74 72 75 63 74 75 72   by the structur
5540: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 0a  e passed as the.
5550: 2a 2a 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  ** first argumen
5560: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  t..**.** If this
5570: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20   maximum height 
5580: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
5590: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
55a0: 65 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20  e pointed.** to 
55b0: 62 79 20 70 6e 48 65 69 67 68 74 2c 20 74 68 65  by pnHeight, the
55c0: 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
55d0: 72 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 6e 48  r, then set *pnH
55e0: 65 69 67 68 74 20 74 6f 20 74 68 61 74 0a 2a 2a  eight to that.**
55f0: 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
5600: 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45  c void heightOfE
5610: 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  xpr(Expr *p, int
5620: 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69   *pnHeight){.  i
5630: 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  f( p ){.    if( 
5640: 70 2d 3e 6e 48 65 69 67 68 74 3e 2a 70 6e 48 65  p->nHeight>*pnHe
5650: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2a 70  ight ){.      *p
5660: 6e 48 65 69 67 68 74 20 3d 20 70 2d 3e 6e 48 65  nHeight = p->nHe
5670: 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ight;.    }.  }.
5680: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65  }.static void he
5690: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 45  ightOfExprList(E
56a0: 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20  xprList *p, int 
56b0: 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66  *pnHeight){.  if
56c0: 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ( p ){.    int i
56d0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
56e0: 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  <p->nExpr; i++){
56f0: 0a 20 20 20 20 20 20 68 65 69 67 68 74 4f 66 45  .      heightOfE
5700: 78 70 72 28 70 2d 3e 61 5b 69 5d 2e 70 45 78 70  xpr(p->a[i].pExp
5710: 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  r, pnHeight);.  
5720: 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63    }.  }.}.static
5730: 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 53 65   void heightOfSe
5740: 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20  lect(Select *p, 
5750: 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a  int *pnHeight){.
5760: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 68    if( p ){.    h
5770: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
5780: 57 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74 29  Where, pnHeight)
5790: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
57a0: 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70  pr(p->pHaving, p
57b0: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
57c0: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c  ightOfExpr(p->pL
57d0: 69 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29 3b  imit, pnHeight);
57e0: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
57f0: 72 28 70 2d 3e 70 4f 66 66 73 65 74 2c 20 70 6e  r(p->pOffset, pn
5800: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
5810: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
5820: 3e 70 45 4c 69 73 74 2c 20 70 6e 48 65 69 67 68  >pEList, pnHeigh
5830: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
5840: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f  ExprList(p->pGro
5850: 75 70 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b  upBy, pnHeight);
5860: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
5870: 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42  rList(p->pOrderB
5880: 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  y, pnHeight);.  
5890: 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74    heightOfSelect
58a0: 28 70 2d 3e 70 50 72 69 6f 72 2c 20 70 6e 48 65  (p->pPrior, pnHe
58b0: 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ight);.  }.}../*
58c0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72  .** Set the Expr
58d0: 2e 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c  .nHeight variabl
58e0: 65 20 69 6e 20 74 68 65 20 73 74 72 75 63 74 75  e in the structu
58f0: 72 65 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  re passed as an 
5900: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e  .** argument. An
5910: 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68   expression with
5920: 20 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78   no children, Ex
5930: 70 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20  pr.pList or .** 
5940: 45 78 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d  Expr.pSelect mem
5950: 62 65 72 20 68 61 73 20 61 20 68 65 69 67 68 74  ber has a height
5960: 20 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72   of 1. Any other
5970: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68   expression.** h
5980: 61 73 20 61 20 68 65 69 67 68 74 20 65 71 75 61  as a height equa
5990: 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  l to the maximum
59a0: 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f   height of any o
59b0: 74 68 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e  ther .** referen
59c0: 63 65 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e  ced Expr plus on
59d0: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
59e0: 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74 28  e3ExprSetHeight(
59f0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Expr *p){.  int 
5a00: 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68  nHeight = 0;.  h
5a10: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
5a20: 4c 65 66 74 2c 20 26 6e 48 65 69 67 68 74 29 3b  Left, &nHeight);
5a30: 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28  .  heightOfExpr(
5a40: 70 2d 3e 70 52 69 67 68 74 2c 20 26 6e 48 65 69  p->pRight, &nHei
5a50: 67 68 74 29 3b 0a 20 20 68 65 69 67 68 74 4f 66  ght);.  heightOf
5a60: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4c 69 73  ExprList(p->pLis
5a70: 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20  t, &nHeight);.  
5a80: 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70  heightOfSelect(p
5a90: 2d 3e 70 53 65 6c 65 63 74 2c 20 26 6e 48 65 69  ->pSelect, &nHei
5aa0: 67 68 74 29 3b 0a 20 20 70 2d 3e 6e 48 65 69 67  ght);.  p->nHeig
5ab0: 68 74 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31  ht = nHeight + 1
5ac0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
5ad0: 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65  n the maximum he
5ae0: 69 67 68 74 20 6f 66 20 61 6e 79 20 65 78 70 72  ight of any expr
5af0: 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65  ession tree refe
5b00: 72 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74 68 65  renced.** by the
5b10: 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
5b20: 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  t passed as an a
5b30: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  rgument..*/.int 
5b40: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
5b50: 72 48 65 69 67 68 74 28 53 65 6c 65 63 74 20 2a  rHeight(Select *
5b60: 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67 68  p){.  int nHeigh
5b70: 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74 4f  t = 0;.  heightO
5b80: 66 53 65 6c 65 63 74 28 70 2c 20 26 6e 48 65 69  fSelect(p, &nHei
5b90: 67 68 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  ght);.  return n
5ba0: 48 65 69 67 68 74 3b 0a 7d 0a 23 65 6e 64 69 66  Height;.}.#endif
5bb0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
5bc0: 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65 73 73  n entire express
5bd0: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  ion list..*/.voi
5be0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
5bf0: 74 44 65 6c 65 74 65 28 45 78 70 72 4c 69 73 74  tDelete(ExprList
5c00: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
5c10: 69 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  i;.  struct Expr
5c20: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
5c30: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
5c40: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
5c50: 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30  ert( pList->a!=0
5c60: 20 7c 7c 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70   || (pList->nExp
5c70: 72 3d 3d 30 20 26 26 20 70 4c 69 73 74 2d 3e 6e  r==0 && pList->n
5c80: 41 6c 6c 6f 63 3d 3d 30 29 20 29 3b 0a 20 20 61  Alloc==0) );.  a
5c90: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
5ca0: 78 70 72 3c 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c  xpr<=pList->nAll
5cb0: 6f 63 20 29 3b 0a 20 20 66 6f 72 28 70 49 74 65  oc );.  for(pIte
5cc0: 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b  m=pList->a, i=0;
5cd0: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
5ce0: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
5cf0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
5d00: 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 45 78  elete(pItem->pEx
5d10: 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pr);.    sqlite3
5d20: 5f 66 72 65 65 28 70 49 74 65 6d 2d 3e 7a 4e 61  _free(pItem->zNa
5d30: 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  me);.  }.  sqlit
5d40: 65 33 5f 66 72 65 65 28 70 4c 69 73 74 2d 3e 61  e3_free(pList->a
5d50: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
5d60: 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  e(pList);.}../*.
5d70: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
5d80: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 43 61 6c  ssion tree.  Cal
5d90: 6c 20 78 46 75 6e 63 20 66 6f 72 20 65 61 63 68  l xFunc for each
5da0: 20 6e 6f 64 65 20 76 69 73 69 74 65 64 2e 0a 2a   node visited..*
5db0: 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  *.** The return 
5dc0: 76 61 6c 75 65 20 66 72 6f 6d 20 78 46 75 6e 63  value from xFunc
5dd0: 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74   determines whet
5de0: 68 65 72 20 74 68 65 20 74 72 65 65 20 77 61 6c  her the tree wal
5df0: 6b 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 2a 2a 20  k continues..** 
5e00: 30 20 6d 65 61 6e 73 20 63 6f 6e 74 69 6e 75 65  0 means continue
5e10: 20 77 61 6c 6b 69 6e 67 20 74 68 65 20 74 72 65   walking the tre
5e20: 65 2e 20 20 31 20 6d 65 61 6e 73 20 64 6f 20 6e  e.  1 means do n
5e30: 6f 74 20 77 61 6c 6b 20 63 68 69 6c 64 72 65 6e  ot walk children
5e40: 0a 2a 2a 20 6f 66 20 74 68 65 20 63 75 72 72 65  .** of the curre
5e50: 6e 74 20 6e 6f 64 65 20 62 75 74 20 63 6f 6e 74  nt node but cont
5e60: 69 6e 75 65 20 77 69 74 68 20 73 69 62 6c 69 6e  inue with siblin
5e70: 67 73 2e 20 20 32 20 6d 65 61 6e 73 20 61 62 61  gs.  2 means aba
5e80: 6e 64 6f 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65  ndon.** the tree
5e90: 20 77 61 6c 6b 20 63 6f 6d 70 6c 65 74 65 6c 79   walk completely
5ea0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
5eb0: 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68  rn value from th
5ec0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 31 20  is routine is 1 
5ed0: 74 6f 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 74  to abandon the t
5ee0: 72 65 65 20 77 61 6c 6b 0a 2a 2a 20 61 6e 64 20  ree walk.** and 
5ef0: 30 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a  0 to continue..*
5f00: 2a 0a 2a 2a 20 4e 4f 54 49 43 45 3a 20 20 54 68  *.** NOTICE:  Th
5f10: 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
5f20: 2a 6e 6f 74 2a 20 64 65 73 63 65 6e 64 20 69 6e  *not* descend in
5f30: 74 6f 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a  to subqueries..*
5f40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c  /.static int wal
5f50: 6b 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69  kExprList(ExprLi
5f60: 73 74 20 2a 2c 20 69 6e 74 20 28 2a 29 28 76 6f  st *, int (*)(vo
5f70: 69 64 20 2a 2c 20 45 78 70 72 2a 29 2c 20 76 6f  id *, Expr*), vo
5f80: 69 64 20 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e  id *);.static in
5f90: 74 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 45  t walkExprTree(E
5fa0: 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
5fb0: 28 2a 78 46 75 6e 63 29 28 76 6f 69 64 2a 2c 45  (*xFunc)(void*,E
5fc0: 78 70 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72  xpr*), void *pAr
5fd0: 67 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  g){.  int rc;.  
5fe0: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
5ff0: 65 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20  eturn 0;.  rc = 
6000: 28 2a 78 46 75 6e 63 29 28 70 41 72 67 2c 20 70  (*xFunc)(pArg, p
6010: 45 78 70 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  Expr);.  if( rc=
6020: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 77 61  =0 ){.    if( wa
6030: 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78 70 72  lkExprTree(pExpr
6040: 2d 3e 70 4c 65 66 74 2c 20 78 46 75 6e 63 2c 20  ->pLeft, xFunc, 
6050: 70 41 72 67 29 20 29 20 72 65 74 75 72 6e 20 31  pArg) ) return 1
6060: 3b 0a 20 20 20 20 69 66 28 20 77 61 6c 6b 45 78  ;.    if( walkEx
6070: 70 72 54 72 65 65 28 70 45 78 70 72 2d 3e 70 52  prTree(pExpr->pR
6080: 69 67 68 74 2c 20 78 46 75 6e 63 2c 20 70 41 72  ight, xFunc, pAr
6090: 67 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  g) ) return 1;. 
60a0: 20 20 20 69 66 28 20 77 61 6c 6b 45 78 70 72 4c     if( walkExprL
60b0: 69 73 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74  ist(pExpr->pList
60c0: 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 20 29  , xFunc, pArg) )
60d0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
60e0: 20 72 65 74 75 72 6e 20 72 63 3e 31 3b 0a 7d 0a   return rc>1;.}.
60f0: 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 77 61 6c 6b  ./*.** Call walk
6100: 45 78 70 72 54 72 65 65 28 29 20 66 6f 72 20 65  ExprTree() for e
6110: 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  very expression 
6120: 69 6e 20 6c 69 73 74 20 70 2e 0a 2a 2f 0a 73 74  in list p..*/.st
6130: 61 74 69 63 20 69 6e 74 20 77 61 6c 6b 45 78 70  atic int walkExp
6140: 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a  rList(ExprList *
6150: 70 2c 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28  p, int (*xFunc)(
6160: 76 6f 69 64 20 2a 2c 20 45 78 70 72 2a 29 2c 20  void *, Expr*), 
6170: 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 69  void *pArg){.  i
6180: 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 45  nt i;.  struct E
6190: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
61a0: 74 65 6d 3b 0a 20 20 69 66 28 20 21 70 20 29 20  tem;.  if( !p ) 
61b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28  return 0;.  for(
61c0: 69 3d 70 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65  i=p->nExpr, pIte
61d0: 6d 3d 70 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d  m=p->a; i>0; i--
61e0: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
61f0: 69 66 28 20 77 61 6c 6b 45 78 70 72 54 72 65 65  if( walkExprTree
6200: 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 78  (pItem->pExpr, x
6210: 46 75 6e 63 2c 20 70 41 72 67 29 20 29 20 72 65  Func, pArg) ) re
6220: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
6230: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
6240: 20 43 61 6c 6c 20 77 61 6c 6b 45 78 70 72 54 72   Call walkExprTr
6250: 65 65 28 29 20 66 6f 72 20 65 76 65 72 79 20 65  ee() for every e
6260: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 53 65 6c  xpression in Sel
6270: 65 63 74 20 70 2c 20 6e 6f 74 20 69 6e 63 6c 75  ect p, not inclu
6280: 64 69 6e 67 0a 2a 2a 20 65 78 70 72 65 73 73 69  ding.** expressi
6290: 6f 6e 73 20 74 68 61 74 20 61 72 65 20 70 61 72  ons that are par
62a0: 74 20 6f 66 20 73 75 62 2d 73 65 6c 65 63 74 73  t of sub-selects
62b0: 20 69 6e 20 61 6e 79 20 46 52 4f 4d 20 63 6c 61   in any FROM cla
62c0: 75 73 65 20 6f 72 20 74 68 65 20 4c 49 4d 49 54  use or the LIMIT
62d0: 0a 2a 2a 20 6f 72 20 4f 46 46 53 45 54 20 65 78  .** or OFFSET ex
62e0: 70 72 65 73 73 69 6f 6e 73 2e 2e 0a 2a 2f 0a 73  pressions...*/.s
62f0: 74 61 74 69 63 20 69 6e 74 20 77 61 6c 6b 53 65  tatic int walkSe
6300: 6c 65 63 74 45 78 70 72 28 53 65 6c 65 63 74 20  lectExpr(Select 
6310: 2a 70 2c 20 69 6e 74 20 28 2a 78 46 75 6e 63 29  *p, int (*xFunc)
6320: 28 76 6f 69 64 20 2a 2c 20 45 78 70 72 2a 29 2c  (void *, Expr*),
6330: 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20   void *pArg){.  
6340: 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 2d 3e  walkExprList(p->
6350: 70 45 4c 69 73 74 2c 20 78 46 75 6e 63 2c 20 70  pEList, xFunc, p
6360: 41 72 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72  Arg);.  walkExpr
6370: 54 72 65 65 28 70 2d 3e 70 57 68 65 72 65 2c 20  Tree(p->pWhere, 
6380: 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20  xFunc, pArg);.  
6390: 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 2d 3e  walkExprList(p->
63a0: 70 47 72 6f 75 70 42 79 2c 20 78 46 75 6e 63 2c  pGroupBy, xFunc,
63b0: 20 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b 45 78   pArg);.  walkEx
63c0: 70 72 54 72 65 65 28 70 2d 3e 70 48 61 76 69 6e  prTree(p->pHavin
63d0: 67 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 3b  g, xFunc, pArg);
63e0: 0a 20 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28  .  walkExprList(
63f0: 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 78 46 75  p->pOrderBy, xFu
6400: 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 69 66 28  nc, pArg);.  if(
6410: 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
6420: 20 20 77 61 6c 6b 53 65 6c 65 63 74 45 78 70 72    walkSelectExpr
6430: 28 70 2d 3e 70 50 72 69 6f 72 2c 20 78 46 75 6e  (p->pPrior, xFun
6440: 63 2c 20 70 41 72 67 29 3b 0a 20 20 7d 0a 20 20  c, pArg);.  }.  
6450: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a  return 0;.}.../*
6460: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6470: 20 69 73 20 64 65 73 69 67 6e 65 64 20 61 73 20   is designed as 
6480: 61 6e 20 78 46 75 6e 63 20 66 6f 72 20 77 61 6c  an xFunc for wal
6490: 6b 45 78 70 72 54 72 65 65 28 29 2e 0a 2a 2a 0a  kExprTree()..**.
64a0: 2a 2a 20 70 41 72 67 20 69 73 20 72 65 61 6c 6c  ** pArg is reall
64b0: 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  y a pointer to a
64c0: 6e 20 69 6e 74 65 67 65 72 2e 20 20 49 66 20 77  n integer.  If w
64d0: 65 20 63 61 6e 20 74 65 6c 6c 20 62 79 20 6c 6f  e can tell by lo
64e0: 6f 6b 69 6e 67 0a 2a 2a 20 61 74 20 70 45 78 70  oking.** at pExp
64f0: 72 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65  r that the expre
6500: 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61  ssion that conta
6510: 69 6e 73 20 70 45 78 70 72 20 69 73 20 6e 6f 74  ins pExpr is not
6520: 20 61 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 65   a constant.** e
6530: 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20  xpression, then 
6540: 73 65 74 20 2a 70 41 72 67 20 74 6f 20 30 20 61  set *pArg to 0 a
6550: 6e 64 20 72 65 74 75 72 6e 20 32 20 74 6f 20 61  nd return 2 to a
6560: 62 61 6e 64 6f 6e 20 74 68 65 20 74 72 65 65 20  bandon the tree 
6570: 77 61 6c 6b 2e 0a 2a 2a 20 49 66 20 70 45 78 70  walk..** If pExp
6580: 72 20 64 6f 65 73 20 64 6f 65 73 20 6e 6f 74 20  r does does not 
6590: 64 69 73 71 75 61 6c 69 66 79 20 74 68 65 20 65  disqualify the e
65a0: 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 62  xpression from b
65b0: 65 69 6e 67 20 61 20 63 6f 6e 73 74 61 6e 74 0a  eing a constant.
65c0: 2a 2a 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69  ** then do nothi
65d0: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20  ng..**.** After 
65e0: 77 61 6c 6b 69 6e 67 20 74 68 65 20 77 68 6f 6c  walking the whol
65f0: 65 20 74 72 65 65 2c 20 69 66 20 6e 6f 20 6e 6f  e tree, if no no
6600: 64 65 73 20 61 72 65 20 66 6f 75 6e 64 20 74 68  des are found th
6610: 61 74 20 64 69 73 71 75 61 6c 69 66 79 0a 2a 2a  at disqualify.**
6620: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
6630: 61 73 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65  as constant, the
6640: 6e 20 77 65 20 61 73 73 75 6d 65 20 74 68 65 20  n we assume the 
6650: 77 68 6f 6c 65 20 65 78 70 72 65 73 73 69 6f 6e  whole expression
6660: 0a 2a 2a 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e  .** is constant.
6670: 20 20 53 65 65 20 73 71 6c 69 74 65 33 45 78 70    See sqlite3Exp
6680: 72 49 73 43 6f 6e 73 74 61 6e 74 28 29 20 66 6f  rIsConstant() fo
6690: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
66a0: 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ormation..*/.sta
66b0: 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65  tic int exprNode
66c0: 49 73 43 6f 6e 73 74 61 6e 74 28 76 6f 69 64 20  IsConstant(void 
66d0: 2a 70 41 72 67 2c 20 45 78 70 72 20 2a 70 45 78  *pArg, Expr *pEx
66e0: 70 72 29 7b 0a 20 20 69 6e 74 20 2a 70 4e 20 3d  pr){.  int *pN =
66f0: 20 28 69 6e 74 2a 29 70 41 72 67 3b 0a 0a 20 20   (int*)pArg;..  
6700: 2f 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 33  /* If *pArg is 3
6710: 20 74 68 65 6e 20 61 6e 79 20 74 65 72 6d 20 6f   then any term o
6720: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
6730: 20 74 68 61 74 20 63 6f 6d 65 73 20 66 72 6f 6d   that comes from
6740: 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20  .  ** the ON or 
6750: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66  USING clauses of
6760: 20 61 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c 69   a join disquali
6770: 66 69 65 73 20 74 68 65 20 65 78 70 72 65 73 73  fies the express
6780: 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62 65  ion.  ** from be
6790: 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20 63  ing considered c
67a0: 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69 66  onstant. */.  if
67b0: 28 20 28 2a 70 4e 29 3d 3d 33 20 26 26 20 45 78  ( (*pN)==3 && Ex
67c0: 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
67d0: 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
67e0: 6f 69 6e 29 20 29 7b 0a 20 20 20 20 2a 70 4e 20  oin) ){.    *pN 
67f0: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
6800: 32 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68  2;.  }..  switch
6810: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
6820: 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66     /* Consider f
6830: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65 20 63  unctions to be c
6840: 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c 20 74  onstant if all t
6850: 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20 61  heir arguments a
6860: 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20  re constant.    
6870: 2a 2a 20 61 6e 64 20 2a 70 41 72 67 3d 3d 32 20  ** and *pArg==2 
6880: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  */.    case TK_F
6890: 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69  UNCTION:.      i
68a0: 66 28 20 28 2a 70 4e 29 3d 3d 32 20 29 20 72 65  f( (*pN)==2 ) re
68b0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 2f 2a  turn 0;.      /*
68c0: 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f   Fall through */
68d0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a  .    case TK_ID:
68e0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
68f0: 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UMN:.    case TK
6900: 5f 44 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54  _DOT:.    case T
6910: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a  K_AGG_FUNCTION:.
6920: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
6930: 43 4f 4c 55 4d 4e 3a 0a 23 69 66 6e 64 65 66 20  COLUMN:.#ifndef 
6940: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
6950: 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
6960: 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 63 61 73  _SELECT:.    cas
6970: 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 23 65 6e  e TK_EXISTS:.#en
6980: 64 69 66 0a 20 20 20 20 20 20 2a 70 4e 20 3d 20  dif.      *pN = 
6990: 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
69a0: 32 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  2;.    case TK_I
69b0: 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  N:.      if( pEx
69c0: 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  pr->pSelect ){. 
69d0: 20 20 20 20 20 20 20 2a 70 4e 20 3d 20 30 3b 0a         *pN = 0;.
69e0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 32          return 2
69f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 64 65  ;.      }.    de
6a00: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74  fault:.      ret
6a10: 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  urn 0;.  }.}../*
6a20: 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
6a30: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
6a40: 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78  turn 1 if the ex
6a50: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
6a60: 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66  tant.** and 0 if
6a70: 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72   it involves var
6a80: 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69  iables or functi
6a90: 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20  on calls..**.** 
6aa0: 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  For the purposes
6ab0: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
6ac0: 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74  n, a double-quot
6ad0: 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22  ed string (ex: "
6ae0: 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73  abc").** is cons
6af0: 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c  idered a variabl
6b00: 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71  e but a single-q
6b10: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
6b20: 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61  : 'abc') is.** a
6b30: 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e   constant..*/.in
6b40: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
6b50: 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 29  onstant(Expr *p)
6b60: 7b 0a 20 20 69 6e 74 20 69 73 43 6f 6e 73 74 20  {.  int isConst 
6b70: 3d 20 31 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54  = 1;.  walkExprT
6b80: 72 65 65 28 70 2c 20 65 78 70 72 4e 6f 64 65 49  ree(p, exprNodeI
6b90: 73 43 6f 6e 73 74 61 6e 74 2c 20 26 69 73 43 6f  sConstant, &isCo
6ba0: 6e 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  nst);.  return i
6bb0: 73 43 6f 6e 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  sConst;.}../*.**
6bc0: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
6bd0: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
6be0: 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65  n 1 if the expre
6bf0: 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
6c00: 74 0a 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e  t.** that does n
6c10: 6f 20 6f 72 69 67 69 6e 61 74 65 20 66 72 6f 6d  o originate from
6c20: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
6c30: 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f   clauses of a jo
6c40: 69 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  in..** Return 0 
6c50: 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76  if it involves v
6c60: 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63  ariables or func
6c70: 74 69 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74 65  tion calls or te
6c80: 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f  rms from.** an O
6c90: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
6ca0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
6cb0: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e  3ExprIsConstantN
6cc0: 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b  otJoin(Expr *p){
6cd0: 0a 20 20 69 6e 74 20 69 73 43 6f 6e 73 74 20 3d  .  int isConst =
6ce0: 20 33 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72   3;.  walkExprTr
6cf0: 65 65 28 70 2c 20 65 78 70 72 4e 6f 64 65 49 73  ee(p, exprNodeIs
6d00: 43 6f 6e 73 74 61 6e 74 2c 20 26 69 73 43 6f 6e  Constant, &isCon
6d10: 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 73  st);.  return is
6d20: 43 6f 6e 73 74 21 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  Const!=0;.}../*.
6d30: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
6d40: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
6d50: 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70  urn 1 if the exp
6d60: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
6d70: 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63  ant.** or a func
6d80: 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20 63  tion call with c
6d90: 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74  onstant argument
6da0: 73 2e 20 20 52 65 74 75 72 6e 20 61 6e 64 20 30  s.  Return and 0
6db0: 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   if there.** are
6dc0: 20 61 6e 79 20 76 61 72 69 61 62 6c 65 73 2e 0a   any variables..
6dd0: 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75  **.** For the pu
6de0: 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66  rposes of this f
6df0: 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c  unction, a doubl
6e00: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
6e10: 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69  (ex: "abc").** i
6e20: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76  s considered a v
6e30: 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73 69  ariable but a si
6e40: 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  ngle-quoted stri
6e50: 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20 69  ng (ex: 'abc') i
6e60: 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e  s.** a constant.
6e70: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
6e80: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46  xprIsConstantOrF
6e90: 75 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a 70 29  unction(Expr *p)
6ea0: 7b 0a 20 20 69 6e 74 20 69 73 43 6f 6e 73 74 20  {.  int isConst 
6eb0: 3d 20 32 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54  = 2;.  walkExprT
6ec0: 72 65 65 28 70 2c 20 65 78 70 72 4e 6f 64 65 49  ree(p, exprNodeI
6ed0: 73 43 6f 6e 73 74 61 6e 74 2c 20 26 69 73 43 6f  sConstant, &isCo
6ee0: 6e 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  nst);.  return i
6ef0: 73 43 6f 6e 73 74 21 3d 30 3b 0a 7d 0a 0a 2f 2a  sConst!=0;.}../*
6f00: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
6f10: 73 73 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20  ssion p codes a 
6f20: 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72  constant integer
6f30: 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65   that is small e
6f40: 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20  nough.** to fit 
6f50: 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  in a 32-bit inte
6f60: 67 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e  ger, return 1 an
6f70: 64 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 20  d put the value 
6f80: 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a  of the integer.*
6f90: 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49  * in *pValue.  I
6fa0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
6fb0: 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67   is not an integ
6fc0: 65 72 20 6f 72 20 69 66 20 69 74 20 69 73 20 74  er or if it is t
6fd0: 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74  oo big.** to fit
6fe0: 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d   in a signed 32-
6ff0: 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74  bit integer, ret
7000: 75 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20  urn 0 and leave 
7010: 2a 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65  *pValue unchange
7020: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
7030: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 45  3ExprIsInteger(E
7040: 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61  xpr *p, int *pVa
7050: 6c 75 65 29 7b 0a 20 20 73 77 69 74 63 68 28 20  lue){.  switch( 
7060: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  p->op ){.    cas
7070: 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  e TK_INTEGER: {.
7080: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
7090: 33 47 65 74 49 6e 74 33 32 28 28 63 68 61 72 2a  3GetInt32((char*
70a0: 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 56 61  )p->token.z, pVa
70b0: 6c 75 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  lue) ){.        
70c0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
70d0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
70e0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
70f0: 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20  _UPLUS: {.      
7100: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
7110: 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70  prIsInteger(p->p
7120: 4c 65 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20  Left, pValue);. 
7130: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
7140: 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20  _UMINUS: {.     
7150: 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66   int v;.      if
7160: 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
7170: 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c  nteger(p->pLeft,
7180: 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20   &v) ){.        
7190: 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20  *pValue = -v;.  
71a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
71b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
71c0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
71d0: 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20  efault: break;. 
71e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
71f0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
7200: 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
7210: 20 73 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77   string is a row
7220: 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e  -id column name.
7230: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
7240: 73 52 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61  sRowid(const cha
7250: 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c  r *z){.  if( sql
7260: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
7270: 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72  _ROWID_")==0 ) r
7280: 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73  eturn 1;.  if( s
7290: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c  qlite3StrICmp(z,
72a0: 20 22 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72   "ROWID")==0 ) r
72b0: 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73  eturn 1;.  if( s
72c0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c  qlite3StrICmp(z,
72d0: 20 22 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74   "OID")==0 ) ret
72e0: 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  urn 1;.  return 
72f0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  0;.}../*.** Give
7300: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  n the name of a 
7310: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66 6f  column of the fo
7320: 72 6d 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20  rm X.Y.Z or Y.Z 
7330: 6f 72 20 6a 75 73 74 20 5a 2c 20 6c 6f 6f 6b 20  or just Z, look 
7340: 75 70 0a 2a 2a 20 74 68 61 74 20 6e 61 6d 65 20  up.** that name 
7350: 69 6e 20 74 68 65 20 73 65 74 20 6f 66 20 73 6f  in the set of so
7360: 75 72 63 65 20 74 61 62 6c 65 73 20 69 6e 20 70  urce tables in p
7370: 53 72 63 4c 69 73 74 20 61 6e 64 20 6d 61 6b 65  SrcList and make
7380: 20 74 68 65 20 70 45 78 70 72 20 0a 2a 2a 20 65   the pExpr .** e
7390: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 72  xpression node r
73a0: 65 66 65 72 20 62 61 63 6b 20 74 6f 20 74 68 61  efer back to tha
73b0: 74 20 73 6f 75 72 63 65 20 63 6f 6c 75 6d 6e 2e  t source column.
73c0: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
73d0: 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d  changes.** are m
73e0: 61 64 65 20 74 6f 20 70 45 78 70 72 3a 0a 2a 2a  ade to pExpr:.**
73f0: 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 69 44  .**    pExpr->iD
7400: 62 20 20 20 20 20 20 20 20 20 20 20 53 65 74 20  b           Set 
7410: 74 68 65 20 69 6e 64 65 78 20 69 6e 20 64 62 2d  the index in db-
7420: 3e 61 44 62 5b 5d 20 6f 66 20 74 68 65 20 64 61  >aDb[] of the da
7430: 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 0a 2a  tabase holding.*
7440: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
7450: 20 20 20 20 20 20 20 20 20 20 74 68 65 20 74 61            the ta
7460: 62 6c 65 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72  ble..**    pExpr
7470: 2d 3e 69 54 61 62 6c 65 20 20 20 20 20 20 20 20  ->iTable        
7480: 53 65 74 20 74 6f 20 74 68 65 20 63 75 72 73 6f  Set to the curso
7490: 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  r number for the
74a0: 20 74 61 62 6c 65 20 6f 62 74 61 69 6e 65 64 0a   table obtained.
74b0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
74c0: 20 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d 20             from 
74d0: 70 53 72 63 4c 69 73 74 2e 0a 2a 2a 20 20 20 20  pSrcList..**    
74e0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 20  pExpr->iColumn  
74f0: 20 20 20 20 20 53 65 74 20 74 6f 20 74 68 65 20       Set to the 
7500: 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69  column number wi
7510: 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  thin the table..
7520: 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20  **    pExpr->op 
7530: 20 20 20 20 20 20 20 20 20 20 20 53 65 74 20 74             Set t
7540: 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 0a 2a 2a 20  o TK_COLUMN..** 
7550: 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20     pExpr->pLeft 
7560: 20 20 20 20 20 20 20 20 41 6e 79 20 65 78 70 72          Any expr
7570: 65 73 73 69 6f 6e 20 74 68 69 73 20 70 6f 69 6e  ession this poin
7580: 74 73 20 74 6f 20 69 73 20 64 65 6c 65 74 65 64  ts to is deleted
7590: 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 70 52  .**    pExpr->pR
75a0: 69 67 68 74 20 20 20 20 20 20 20 20 41 6e 79 20  ight        Any 
75b0: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 69 73 20  expression this 
75c0: 70 6f 69 6e 74 73 20 74 6f 20 69 73 20 64 65 6c  points to is del
75d0: 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  eted..**.** The 
75e0: 70 44 62 54 6f 6b 65 6e 20 69 73 20 74 68 65 20  pDbToken is the 
75f0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
7600: 62 61 73 65 20 28 74 68 65 20 22 58 22 29 2e 20  base (the "X"). 
7610: 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20   This value may 
7620: 62 65 0a 2a 2a 20 4e 55 4c 4c 20 6d 65 61 6e 69  be.** NULL meani
7630: 6e 67 20 74 68 61 74 20 6e 61 6d 65 20 69 73 20  ng that name is 
7640: 6f 66 20 74 68 65 20 66 6f 72 6d 20 59 2e 5a 20  of the form Y.Z 
7650: 6f 72 20 5a 2e 20 20 41 6e 79 20 61 76 61 69 6c  or Z.  Any avail
7660: 61 62 6c 65 20 64 61 74 61 62 61 73 65 0a 2a 2a  able database.**
7670: 20 63 61 6e 20 62 65 20 75 73 65 64 2e 20 20 54   can be used.  T
7680: 68 65 20 70 54 61 62 6c 65 54 6f 6b 65 6e 20 69  he pTableToken i
7690: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
76a0: 65 20 74 61 62 6c 65 20 28 74 68 65 20 22 59 22  e table (the "Y"
76b0: 29 2e 20 20 54 68 69 73 0a 2a 2a 20 76 61 6c 75  ).  This.** valu
76c0: 65 20 63 61 6e 20 62 65 20 4e 55 4c 4c 20 69 66  e can be NULL if
76d0: 20 70 44 62 54 6f 6b 65 6e 20 69 73 20 61 6c 73   pDbToken is als
76e0: 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 70 54 61 62  o NULL.  If pTab
76f0: 6c 65 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20  leToken is NULL 
7700: 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74  it.** means that
7710: 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 74 68 65   the form of the
7720: 20 6e 61 6d 65 20 69 73 20 5a 20 61 6e 64 20 74   name is Z and t
7730: 68 61 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d  hat columns from
7740: 20 61 6e 79 20 74 61 62 6c 65 0a 2a 2a 20 63 61   any table.** ca
7750: 6e 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a  n be used..**.**
7760: 20 49 66 20 74 68 65 20 6e 61 6d 65 20 63 61 6e   If the name can
7770: 6e 6f 74 20 62 65 20 72 65 73 6f 6c 76 65 64 20  not be resolved 
7780: 75 6e 61 6d 62 69 67 75 6f 75 73 6c 79 2c 20 6c  unambiguously, l
7790: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
77a0: 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72  ssage.** in pPar
77b0: 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f  se and return no
77c0: 6e 2d 7a 65 72 6f 2e 20 20 52 65 74 75 72 6e 20  n-zero.  Return 
77d0: 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2e  zero on success.
77e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
77f0: 6f 6f 6b 75 70 4e 61 6d 65 28 0a 20 20 50 61 72  ookupName(.  Par
7800: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
7810: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
7820: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
7830: 6b 65 6e 20 2a 70 44 62 54 6f 6b 65 6e 2c 20 20  ken *pDbToken,  
7840: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
7850: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
7860: 69 6e 69 6e 67 20 74 61 62 6c 65 2c 20 6f 72 20  ining table, or 
7870: 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  NULL */.  Token 
7880: 2a 70 54 61 62 6c 65 54 6f 6b 65 6e 2c 20 20 2f  *pTableToken,  /
7890: 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20  * Name of table 
78a0: 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d  containing colum
78b0: 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  n, or NULL */.  
78c0: 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e 54 6f  Token *pColumnTo
78d0: 6b 65 6e 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  ken, /* Name of 
78e0: 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20  the column. */. 
78f0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
7900: 43 2c 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d  C,    /* The nam
7910: 65 20 63 6f 6e 74 65 78 74 20 75 73 65 64 20 74  e context used t
7920: 6f 20 72 65 73 6f 6c 76 65 20 74 68 65 20 6e 61  o resolve the na
7930: 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  me */.  Expr *pE
7940: 78 70 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20  xpr          /* 
7950: 4d 61 6b 65 20 74 68 69 73 20 45 58 50 52 20 6e  Make this EXPR n
7960: 6f 64 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  ode point to the
7970: 20 73 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e   selected column
7980: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
7990: 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  Db = 0;       /*
79a0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
79b0: 61 62 61 73 65 2e 20 20 54 68 65 20 22 58 22 20  abase.  The "X" 
79c0: 69 6e 20 58 2e 59 2e 5a 20 2a 2f 0a 20 20 63 68  in X.Y.Z */.  ch
79d0: 61 72 20 2a 7a 54 61 62 20 3d 20 30 3b 20 20 20  ar *zTab = 0;   
79e0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
79f0: 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 22 59  e table.  The "Y
7a00: 22 20 69 6e 20 58 2e 59 2e 5a 20 6f 72 20 59 2e  " in X.Y.Z or Y.
7a10: 5a 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f  Z */.  char *zCo
7a20: 6c 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e  l = 0;      /* N
7a30: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
7a40: 6e 2e 20 20 54 68 65 20 22 5a 22 20 2a 2f 0a 20  n.  The "Z" */. 
7a50: 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
7a60: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
7a70: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
7a80: 63 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  cnt = 0;        
7a90: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61   /* Number of ma
7aa0: 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61  tching column na
7ab0: 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  mes */.  int cnt
7ac0: 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  Tab = 0;      /*
7ad0: 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68   Number of match
7ae0: 69 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65 73 20  ing table names 
7af0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
7b00: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
7b10: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
7b20: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
7b30: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
7b40: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 66 6f         /* Use fo
7b50: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70  r looping over p
7b60: 53 72 63 4c 69 73 74 20 69 74 65 6d 73 20 2a 2f  SrcList items */
7b70: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
7b80: 74 5f 69 74 65 6d 20 2a 70 4d 61 74 63 68 20 3d  t_item *pMatch =
7b90: 20 30 3b 20 20 2f 2a 20 54 68 65 20 6d 61 74 63   0;  /* The matc
7ba0: 68 69 6e 67 20 70 53 72 63 4c 69 73 74 20 69 74  hing pSrcList it
7bb0: 65 6d 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  em */.  NameCont
7bc0: 65 78 74 20 2a 70 54 6f 70 4e 43 20 3d 20 70 4e  ext *pTopNC = pN
7bd0: 43 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72  C;        /* Fir
7be0: 73 74 20 6e 61 6d 65 63 6f 6e 74 65 78 74 20 69  st namecontext i
7bf0: 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 0a 20  n the list */.. 
7c00: 20 61 73 73 65 72 74 28 20 70 43 6f 6c 75 6d 6e   assert( pColumn
7c10: 54 6f 6b 65 6e 20 26 26 20 70 43 6f 6c 75 6d 6e  Token && pColumn
7c20: 54 6f 6b 65 6e 2d 3e 7a 20 29 3b 20 2f 2a 20 54  Token->z ); /* T
7c30: 68 65 20 5a 20 69 6e 20 58 2e 59 2e 5a 20 63 61  he Z in X.Y.Z ca
7c40: 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  nnot be NULL */.
7c50: 20 20 7a 44 62 20 3d 20 73 71 6c 69 74 65 33 4e    zDb = sqlite3N
7c60: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
7c70: 20 70 44 62 54 6f 6b 65 6e 29 3b 0a 20 20 7a 54   pDbToken);.  zT
7c80: 61 62 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  ab = sqlite3Name
7c90: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54  FromToken(db, pT
7ca0: 61 62 6c 65 54 6f 6b 65 6e 29 3b 0a 20 20 7a 43  ableToken);.  zC
7cb0: 6f 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  ol = sqlite3Name
7cc0: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 43  FromToken(db, pC
7cd0: 6f 6c 75 6d 6e 54 6f 6b 65 6e 29 3b 0a 20 20 69  olumnToken);.  i
7ce0: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
7cf0: 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
7d00: 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 3b 0a  lookupname_end;.
7d10: 20 20 7d 0a 0a 20 20 70 45 78 70 72 2d 3e 69 54    }..  pExpr->iT
7d20: 61 62 6c 65 20 3d 20 2d 31 3b 0a 20 20 77 68 69  able = -1;.  whi
7d30: 6c 65 28 20 70 4e 43 20 26 26 20 63 6e 74 3d 3d  le( pNC && cnt==
7d40: 30 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  0 ){.    ExprLis
7d50: 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 53  t *pEList;.    S
7d60: 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74  rcList *pSrcList
7d70: 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
7d80: 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63 4c  ;..    if( pSrcL
7d90: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ist ){.      for
7da0: 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 53 72 63  (i=0, pItem=pSrc
7db0: 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 53 72 63 4c  List->a; i<pSrcL
7dc0: 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
7dd0: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
7de0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
7df0: 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a         int iDb;.
7e00: 20 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 2a          Column *
7e10: 70 43 6f 6c 3b 0a 20 20 0a 20 20 20 20 20 20 20  pCol;.  .       
7e20: 20 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70   pTab = pItem->p
7e30: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Tab;.        ass
7e40: 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a  ert( pTab!=0 );.
7e50: 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 73 71          iDb = sq
7e60: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
7e70: 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
7e80: 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 61  hema);.        a
7e90: 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f  ssert( pTab->nCo
7ea0: 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  l>0 );.        i
7eb0: 66 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20 20  f( zTab ){.     
7ec0: 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
7ed0: 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20  zAlias ){.      
7ee0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62        char *zTab
7ef0: 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 41  Name = pItem->zA
7f00: 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lias;.          
7f10: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
7f20: 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65 2c 20 7a  ICmp(zTabName, z
7f30: 54 61 62 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  Tab)!=0 ) contin
7f40: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ue;.          }e
7f50: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
7f60: 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20   char *zTabName 
7f70: 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
7f80: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a             if( z
7f90: 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 73 71  TabName==0 || sq
7fa0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 61  lite3StrICmp(zTa
7fb0: 62 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d 30 20  bName, zTab)!=0 
7fc0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
7fd0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 44 62 21          if( zDb!
7fe0: 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  =0 && sqlite3Str
7ff0: 49 43 6d 70 28 64 62 2d 3e 61 44 62 5b 69 44 62  ICmp(db->aDb[iDb
8000: 5d 2e 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d 30  ].zName, zDb)!=0
8010: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8020: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
8030: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8040: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
8050: 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28          if( 0==(
8060: 63 6e 74 54 61 62 2b 2b 29 20 29 7b 0a 20 20 20  cntTab++) ){.   
8070: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
8080: 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43  able = pItem->iC
8090: 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  ursor;.         
80a0: 20 70 45 78 70 72 2d 3e 70 53 63 68 65 6d 61 20   pExpr->pSchema 
80b0: 3d 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3b  = pTab->pSchema;
80c0: 0a 20 20 20 20 20 20 20 20 20 20 70 4d 61 74 63  .          pMatc
80d0: 68 20 3d 20 70 49 74 65 6d 3b 0a 20 20 20 20 20  h = pItem;.     
80e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72     }.        for
80f0: 28 6a 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d  (j=0, pCol=pTab-
8100: 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e  >aCol; j<pTab->n
8110: 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; j++, pCol++
8120: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
8130: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
8140: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  pCol->zName, zCo
8150: 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)==0 ){.       
8160: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
8170: 2a 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61  *zColl = pTab->a
8180: 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20  Col[j].zColl;.  
8190: 20 20 20 20 20 20 20 20 20 20 49 64 4c 69 73 74            IdList
81a0: 20 2a 70 55 73 69 6e 67 3b 0a 20 20 20 20 20 20   *pUsing;.      
81b0: 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20        cnt++;.   
81c0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
81d0: 69 54 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e  iTable = pItem->
81e0: 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20  iCursor;.       
81f0: 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70 49       pMatch = pI
8200: 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  tem;.           
8210: 20 70 45 78 70 72 2d 3e 70 53 63 68 65 6d 61 20   pExpr->pSchema 
8220: 3d 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3b  = pTab->pSchema;
8230: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
8240: 53 75 62 73 74 69 74 75 74 65 20 74 68 65 20 72  Substitute the r
8250: 6f 77 69 64 20 28 63 6f 6c 75 6d 6e 20 2d 31 29  owid (column -1)
8260: 20 66 6f 72 20 74 68 65 20 49 4e 54 45 47 45 52   for the INTEGER
8270: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 2a 2f 0a   PRIMARY KEY */.
8280: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
8290: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3d 3d  r->iColumn = j==
82a0: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3f 20 2d 31  pTab->iPKey ? -1
82b0: 20 3a 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   : j;.          
82c0: 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74    pExpr->affinit
82d0: 79 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  y = pTab->aCol[j
82e0: 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20  ].affinity;.    
82f0: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 45 78          if( (pEx
8300: 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45  pr->flags & EP_E
8310: 78 70 43 6f 6c 6c 61 74 65 29 3d 3d 30 20 29 7b  xpCollate)==0 ){
8320: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
8330: 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71  Expr->pColl = sq
8340: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
8350: 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43  (db, ENC(db), zC
8360: 6f 6c 6c 2c 2d 31 2c 20 30 29 3b 0a 20 20 20 20  oll,-1, 0);.    
8370: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8380: 20 20 20 20 20 20 69 66 28 20 69 3c 70 53 72 63        if( i<pSrc
8390: 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 20 29 7b 0a  List->nSrc-1 ){.
83a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
83b0: 28 20 70 49 74 65 6d 5b 31 5d 2e 6a 6f 69 6e 74  ( pItem[1].joint
83c0: 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c  ype & JT_NATURAL
83d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
83e0: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6d      /* If this m
83f0: 61 74 63 68 20 6f 63 63 75 72 72 65 64 20 69 6e  atch occurred in
8400: 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20   the left table 
8410: 6f 66 20 61 20 6e 61 74 75 72 61 6c 20 6a 6f 69  of a natural joi
8420: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
8430: 20 20 20 2a 2a 20 74 68 65 6e 20 73 6b 69 70 20     ** then skip 
8440: 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20  the right table 
8450: 74 6f 20 61 76 6f 69 64 20 61 20 64 75 70 6c 69  to avoid a dupli
8460: 63 61 74 65 20 6d 61 74 63 68 20 2a 2f 0a 20 20  cate match */.  
8470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
8480: 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  tem++;.         
8490: 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
84a0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
84b0: 69 66 28 20 28 70 55 73 69 6e 67 20 3d 20 70 49  if( (pUsing = pI
84c0: 74 65 6d 5b 31 5d 2e 70 55 73 69 6e 67 29 21 3d  tem[1].pUsing)!=
84d0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
84e0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
84f0: 6d 61 74 63 68 20 6f 63 63 75 72 73 20 6f 6e 20  match occurs on 
8500: 61 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69 73  a column that is
8510: 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c   in the USING cl
8520: 61 75 73 65 0a 20 20 20 20 20 20 20 20 20 20 20  ause.           
8530: 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 6a 6f 69       ** of a joi
8540: 6e 2c 20 73 6b 69 70 20 74 68 65 20 73 65 61 72  n, skip the sear
8550: 63 68 20 6f 66 20 74 68 65 20 72 69 67 68 74 20  ch of the right 
8560: 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69  table of the joi
8570: 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n.              
8580: 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 61 20    ** to avoid a 
8590: 64 75 70 6c 69 63 61 74 65 20 6d 61 74 63 68 20  duplicate match 
85a0: 74 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20  there. */.      
85b0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b            int k;
85c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
85d0: 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 55 73 69   for(k=0; k<pUsi
85e0: 6e 67 2d 3e 6e 49 64 3b 20 6b 2b 2b 29 7b 0a 20  ng->nId; k++){. 
85f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8600: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
8610: 43 6d 70 28 70 55 73 69 6e 67 2d 3e 61 5b 6b 5d  Cmp(pUsing->a[k]
8620: 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30  .zName, zCol)==0
8630: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8640: 20 20 20 20 20 20 20 20 70 49 74 65 6d 2b 2b 3b          pItem++;
8650: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8660: 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
8670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
8680: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
8690: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
86a0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
86b0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
86c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
86d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
86e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
86f0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
8700: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8710: 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20  OMIT_TRIGGER.   
8720: 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20 6e   /* If we have n
8730: 6f 74 20 61 6c 72 65 61 64 79 20 72 65 73 6f 6c  ot already resol
8740: 76 65 64 20 74 68 65 20 6e 61 6d 65 2c 20 74 68  ved the name, th
8750: 65 6e 20 6d 61 79 62 65 20 0a 20 20 20 20 2a 2a  en maybe .    **
8760: 20 69 74 20 69 73 20 61 20 6e 65 77 2e 2a 20 6f   it is a new.* o
8770: 72 20 6f 6c 64 2e 2a 20 74 72 69 67 67 65 72 20  r old.* trigger 
8780: 61 72 67 75 6d 65 6e 74 20 72 65 66 65 72 65 6e  argument referen
8790: 63 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  ce.    */.    if
87a0: 28 20 7a 44 62 3d 3d 30 20 26 26 20 7a 54 61 62  ( zDb==0 && zTab
87b0: 21 3d 30 20 26 26 20 63 6e 74 3d 3d 30 20 26 26  !=0 && cnt==0 &&
87c0: 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61   pParse->trigSta
87d0: 63 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 54  ck!=0 ){.      T
87e0: 72 69 67 67 65 72 53 74 61 63 6b 20 2a 70 54 72  riggerStack *pTr
87f0: 69 67 67 65 72 53 74 61 63 6b 20 3d 20 70 50 61  iggerStack = pPa
8800: 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 3b 0a  rse->trigStack;.
8810: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
8820: 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  b = 0;.      if(
8830: 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e   pTriggerStack->
8840: 6e 65 77 49 64 78 20 21 3d 20 2d 31 20 26 26 20  newIdx != -1 && 
8850: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 22  sqlite3StrICmp("
8860: 6e 65 77 22 2c 20 7a 54 61 62 29 20 3d 3d 20 30  new", zTab) == 0
8870: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70   ){.        pExp
8880: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 54 72 69  r->iTable = pTri
8890: 67 67 65 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64  ggerStack->newId
88a0: 78 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  x;.        asser
88b0: 74 28 20 70 54 72 69 67 67 65 72 53 74 61 63 6b  t( pTriggerStack
88c0: 2d 3e 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20  ->pTab );.      
88d0: 20 20 70 54 61 62 20 3d 20 70 54 72 69 67 67 65    pTab = pTrigge
88e0: 72 53 74 61 63 6b 2d 3e 70 54 61 62 3b 0a 20 20  rStack->pTab;.  
88f0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54      }else if( pT
8900: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64  riggerStack->old
8910: 49 64 78 20 21 3d 20 2d 31 20 26 26 20 73 71 6c  Idx != -1 && sql
8920: 69 74 65 33 53 74 72 49 43 6d 70 28 22 6f 6c 64  ite3StrICmp("old
8930: 22 2c 20 7a 54 61 62 29 3d 3d 30 20 29 7b 0a 20  ", zTab)==0 ){. 
8940: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
8950: 61 62 6c 65 20 3d 20 70 54 72 69 67 67 65 72 53  able = pTriggerS
8960: 74 61 63 6b 2d 3e 6f 6c 64 49 64 78 3b 0a 20 20  tack->oldIdx;.  
8970: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
8980: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61  riggerStack->pTa
8990: 62 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61  b );.        pTa
89a0: 62 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63  b = pTriggerStac
89b0: 6b 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 7d  k->pTab;.      }
89c0: 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ..      if( pTab
89d0: 20 29 7b 20 0a 20 20 20 20 20 20 20 20 69 6e 74   ){ .        int
89e0: 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 43   iCol;.        C
89f0: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 70 54  olumn *pCol = pT
8a00: 61 62 2d 3e 61 43 6f 6c 3b 0a 0a 20 20 20 20 20  ab->aCol;..     
8a10: 20 20 20 70 45 78 70 72 2d 3e 70 53 63 68 65 6d     pExpr->pSchem
8a20: 61 20 3d 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  a = pTab->pSchem
8a30: 61 3b 0a 20 20 20 20 20 20 20 20 63 6e 74 54 61  a;.        cntTa
8a40: 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  b++;.        for
8a50: 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 20 3c 20  (iCol=0; iCol < 
8a60: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c  pTab->nCol; iCol
8a70: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 20 7b 0a 20 20  ++, pCol++) {.  
8a80: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
8a90: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d  te3StrICmp(pCol-
8aa0: 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30  >zName, zCol)==0
8ab0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8ac0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
8ad0: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l = pTab->aCol[i
8ae0: 43 6f 6c 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20  Col].zColl;.    
8af0: 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20          cnt++;. 
8b00: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
8b10: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c  ->iColumn = iCol
8b20: 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 3f 20  ==pTab->iPKey ? 
8b30: 2d 31 20 3a 20 69 43 6f 6c 3b 0a 20 20 20 20 20  -1 : iCol;.     
8b40: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66         pExpr->af
8b50: 66 69 6e 69 74 79 20 3d 20 70 54 61 62 2d 3e 61  finity = pTab->a
8b60: 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e 69  Col[iCol].affini
8b70: 74 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ty;.            
8b80: 69 66 28 20 28 70 45 78 70 72 2d 3e 66 6c 61 67  if( (pExpr->flag
8b90: 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74  s & EP_ExpCollat
8ba0: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
8bb0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 43         pExpr->pC
8bc0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
8bd0: 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43  dCollSeq(db, ENC
8be0: 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 2d 31 2c 20  (db), zColl,-1, 
8bf0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
8c00: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  }.            pE
8c10: 78 70 72 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  xpr->pTab = pTab
8c20: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
8c30: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
8c40: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8c50: 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20   }.    }.#endif 
8c60: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
8c70: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29  TE_OMIT_TRIGGER)
8c80: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20   */..    /*.    
8c90: 2a 2a 20 50 65 72 68 61 70 73 20 74 68 65 20 6e  ** Perhaps the n
8ca0: 61 6d 65 20 69 73 20 61 20 72 65 66 65 72 65 6e  ame is a referen
8cb0: 63 65 20 74 6f 20 74 68 65 20 52 4f 57 49 44 0a  ce to the ROWID.
8cc0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63      */.    if( c
8cd0: 6e 74 3d 3d 30 20 26 26 20 63 6e 74 54 61 62 3d  nt==0 && cntTab=
8ce0: 3d 31 20 26 26 20 73 71 6c 69 74 65 33 49 73 52  =1 && sqlite3IsR
8cf0: 6f 77 69 64 28 7a 43 6f 6c 29 20 29 7b 0a 20 20  owid(zCol) ){.  
8d00: 20 20 20 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20      cnt = 1;.   
8d10: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
8d20: 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 45  n = -1;.      pE
8d30: 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  xpr->affinity = 
8d40: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
8d50: 45 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ER;.    }..    /
8d60: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20  *.    ** If the 
8d70: 69 6e 70 75 74 20 69 73 20 6f 66 20 74 68 65 20  input is of the 
8d80: 66 6f 72 6d 20 5a 20 28 6e 6f 74 20 59 2e 5a 20  form Z (not Y.Z 
8d90: 6f 72 20 58 2e 59 2e 5a 29 20 74 68 65 6e 20 74  or X.Y.Z) then t
8da0: 68 65 20 6e 61 6d 65 20 5a 0a 20 20 20 20 2a 2a  he name Z.    **
8db0: 20 6d 69 67 68 74 20 72 65 66 65 72 20 74 6f 20   might refer to 
8dc0: 61 6e 20 72 65 73 75 6c 74 2d 73 65 74 20 61 6c  an result-set al
8dd0: 69 61 73 2e 20 20 54 68 69 73 20 68 61 70 70 65  ias.  This happe
8de0: 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  ns, for example,
8df0: 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 77 65 20   when.    ** we 
8e00: 61 72 65 20 72 65 73 6f 6c 76 69 6e 67 20 6e 61  are resolving na
8e10: 6d 65 73 20 69 6e 20 74 68 65 20 57 48 45 52 45  mes in the WHERE
8e20: 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66   clause of the f
8e30: 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e 64  ollowing command
8e40: 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
8e50: 20 20 20 20 53 45 4c 45 43 54 20 61 2b 62 20 41      SELECT a+b A
8e60: 53 20 78 20 46 52 4f 4d 20 74 61 62 6c 65 20 57  S x FROM table W
8e70: 48 45 52 45 20 78 3c 31 30 3b 0a 20 20 20 20 2a  HERE x<10;.    *
8e80: 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 63 61 73 65  *.    ** In case
8e90: 73 20 6c 69 6b 65 20 74 68 69 73 2c 20 72 65 70  s like this, rep
8ea0: 6c 61 63 65 20 70 45 78 70 72 20 77 69 74 68 20  lace pExpr with 
8eb0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78  a copy of the ex
8ec0: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 0a 20 20  pression that.  
8ed0: 20 20 2a 2a 20 66 6f 72 6d 73 20 74 68 65 20 72    ** forms the r
8ee0: 65 73 75 6c 74 20 73 65 74 20 65 6e 74 72 79 20  esult set entry 
8ef0: 28 22 61 2b 62 22 20 69 6e 20 74 68 65 20 65 78  ("a+b" in the ex
8f00: 61 6d 70 6c 65 29 20 61 6e 64 20 72 65 74 75 72  ample) and retur
8f10: 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  n immediately.. 
8f20: 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
8f30: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
8f40: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
8f50: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72   should have alr
8f60: 65 61 64 79 20 62 65 65 6e 0a 20 20 20 20 2a 2a  eady been.    **
8f70: 20 72 65 73 6f 6c 76 65 64 20 62 79 20 74 68 65   resolved by the
8f80: 20 74 69 6d 65 20 74 68 65 20 57 48 45 52 45 20   time the WHERE 
8f90: 63 6c 61 75 73 65 20 69 73 20 72 65 73 6f 6c 76  clause is resolv
8fa0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
8fb0: 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 28 70 45  f( cnt==0 && (pE
8fc0: 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 45 4c 69  List = pNC->pELi
8fd0: 73 74 29 21 3d 30 20 26 26 20 7a 54 61 62 3d 3d  st)!=0 && zTab==
8fe0: 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a  0 ){.      for(j
8ff0: 3d 30 3b 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; j<pEList->nE
9000: 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  xpr; j++){.     
9010: 20 20 20 63 68 61 72 20 2a 7a 41 73 20 3d 20 70     char *zAs = p
9020: 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d  EList->a[j].zNam
9030: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  e;.        if( z
9040: 41 73 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33  As!=0 && sqlite3
9050: 53 74 72 49 43 6d 70 28 7a 41 73 2c 20 7a 43 6f  StrICmp(zAs, zCo
9060: 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)==0 ){.       
9070: 20 20 20 45 78 70 72 20 2a 70 44 75 70 2c 20 2a     Expr *pDup, *
9080: 70 4f 72 69 67 3b 0a 20 20 20 20 20 20 20 20 20  pOrig;.         
9090: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
90a0: 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70  pLeft==0 && pExp
90b0: 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  r->pRight==0 );.
90c0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
90d0: 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d  ( pExpr->pList==
90e0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  0 );.          a
90f0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 53  ssert( pExpr->pS
9100: 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20  elect==0 );.    
9110: 20 20 20 20 20 20 70 4f 72 69 67 20 3d 20 70 45        pOrig = pE
9120: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72  List->a[j].pExpr
9130: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
9140: 21 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 26  !pNC->allowAgg &
9150: 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  & ExprHasPropert
9160: 79 28 70 4f 72 69 67 2c 20 45 50 5f 41 67 67 29  y(pOrig, EP_Agg)
9170: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
9180: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
9190: 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20  pParse, "misuse 
91a0: 6f 66 20 61 6c 69 61 73 65 64 20 61 67 67 72 65  of aliased aggre
91b0: 67 61 74 65 20 25 73 22 2c 20 7a 41 73 29 3b 0a  gate %s", zAs);.
91c0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
91d0: 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c 29 3b 0a  te3_free(zCol);.
91e0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
91f0: 72 6e 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20  rn 2;.          
9200: 7d 0a 20 20 20 20 20 20 20 20 20 20 70 44 75 70  }.          pDup
9210: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
9220: 70 28 64 62 2c 20 70 4f 72 69 67 29 3b 0a 20 20  p(db, pOrig);.  
9230: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
9240: 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78  r->flags & EP_Ex
9250: 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20  pCollate ){.    
9260: 20 20 20 20 20 20 20 20 70 44 75 70 2d 3e 70 43          pDup->pC
9270: 6f 6c 6c 20 3d 20 70 45 78 70 72 2d 3e 70 43 6f  oll = pExpr->pCo
9280: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll;.            
9290: 70 44 75 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  pDup->flags |= E
92a0: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20  P_ExpCollate;.  
92b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
92c0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 73      if( pExpr->s
92d0: 70 61 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74 65  pan.dyn ) sqlite
92e0: 33 5f 66 72 65 65 28 28 63 68 61 72 2a 29 70 45  3_free((char*)pE
92f0: 78 70 72 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20  xpr->span.z);.  
9300: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
9310: 72 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 29 20 73  r->token.dyn ) s
9320: 71 6c 69 74 65 33 5f 66 72 65 65 28 28 63 68 61  qlite3_free((cha
9330: 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  r*)pExpr->token.
9340: 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  z);.          me
9350: 6d 63 70 79 28 70 45 78 70 72 2c 20 70 44 75 70  mcpy(pExpr, pDup
9360: 2c 20 73 69 7a 65 6f 66 28 2a 70 45 78 70 72 29  , sizeof(*pExpr)
9370: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
9380: 69 74 65 33 5f 66 72 65 65 28 70 44 75 70 29 3b  ite3_free(pDup);
9390: 0a 20 20 20 20 20 20 20 20 20 20 63 6e 74 20 3d  .          cnt =
93a0: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4d   1;.          pM
93b0: 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  atch = 0;.      
93c0: 20 20 20 20 61 73 73 65 72 74 28 20 7a 54 61 62      assert( zTab
93d0: 3d 3d 30 20 26 26 20 7a 44 62 3d 3d 30 20 29 3b  ==0 && zDb==0 );
93e0: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
93f0: 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 5f 32  lookupname_end_2
9400: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9410: 20 20 7d 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20    } .    }..    
9420: 2f 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68  /* Advance to th
9430: 65 20 6e 65 78 74 20 6e 61 6d 65 20 63 6f 6e 74  e next name cont
9440: 65 78 74 2e 20 20 54 68 65 20 6c 6f 6f 70 20 77  ext.  The loop w
9450: 69 6c 6c 20 65 78 69 74 20 77 68 65 6e 20 65 69  ill exit when ei
9460: 74 68 65 72 0a 20 20 20 20 2a 2a 20 77 65 20 68  ther.    ** we h
9470: 61 76 65 20 61 20 6d 61 74 63 68 20 28 63 6e 74  ave a match (cnt
9480: 3e 30 29 20 6f 72 20 77 68 65 6e 20 77 65 20 72  >0) or when we r
9490: 75 6e 20 6f 75 74 20 6f 66 20 6e 61 6d 65 20 63  un out of name c
94a0: 6f 6e 74 65 78 74 73 2e 0a 20 20 20 20 2a 2f 0a  ontexts..    */.
94b0: 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 29      if( cnt==0 )
94c0: 7b 0a 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e  {.      pNC = pN
94d0: 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  C->pNext;.    }.
94e0: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49    }..  /*.  ** I
94f0: 66 20 58 20 61 6e 64 20 59 20 61 72 65 20 4e 55  f X and Y are NU
9500: 4c 4c 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72  LL (in other wor
9510: 64 73 20 69 66 20 6f 6e 6c 79 20 74 68 65 20 63  ds if only the c
9520: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 5a 20 69 73 0a  olumn name Z is.
9530: 20 20 2a 2a 20 73 75 70 70 6c 69 65 64 29 20 61    ** supplied) a
9540: 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  nd the value of 
9550: 5a 20 69 73 20 65 6e 63 6c 6f 73 65 64 20 69 6e  Z is enclosed in
9560: 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2c 20   double-quotes, 
9570: 74 68 65 6e 0a 20 20 2a 2a 20 5a 20 69 73 20 61  then.  ** Z is a
9580: 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 20   string literal 
9590: 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20 6d 61  if it doesn't ma
95a0: 74 63 68 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6e  tch any column n
95b0: 61 6d 65 73 2e 20 20 49 6e 20 74 68 61 74 0a 20  ames.  In that. 
95c0: 20 2a 2a 20 63 61 73 65 2c 20 77 65 20 6e 65 65   ** case, we nee
95d0: 64 20 74 6f 20 72 65 74 75 72 6e 20 72 69 67 68  d to return righ
95e0: 74 20 61 77 61 79 20 61 6e 64 20 6e 6f 74 20 6d  t away and not m
95f0: 61 6b 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20  ake any changes 
9600: 74 6f 0a 20 20 2a 2a 20 70 45 78 70 72 2e 0a 20  to.  ** pExpr.. 
9610: 20 2a 2a 0a 20 20 2a 2a 20 42 65 63 61 75 73 65   **.  ** Because
9620: 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61   no reference wa
9630: 73 20 6d 61 64 65 20 74 6f 20 6f 75 74 65 72 20  s made to outer 
9640: 63 6f 6e 74 65 78 74 73 2c 20 74 68 65 20 70 4e  contexts, the pN
9650: 43 2d 3e 6e 52 65 66 0a 20 20 2a 2a 20 66 69 65  C->nRef.  ** fie
9660: 6c 64 73 20 61 72 65 20 6e 6f 74 20 63 68 61 6e  lds are not chan
9670: 67 65 64 20 69 6e 20 61 6e 79 20 63 6f 6e 74 65  ged in any conte
9680: 78 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  xt..  */.  if( c
9690: 6e 74 3d 3d 30 20 26 26 20 7a 54 61 62 3d 3d 30  nt==0 && zTab==0
96a0: 20 26 26 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e   && pColumnToken
96b0: 2d 3e 7a 5b 30 5d 3d 3d 27 22 27 20 29 7b 0a 20  ->z[0]=='"' ){. 
96c0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
96d0: 7a 43 6f 6c 29 3b 0a 20 20 20 20 72 65 74 75 72  zCol);.    retur
96e0: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  n 0;.  }..  /*. 
96f0: 20 2a 2a 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73   ** cnt==0 means
9700: 20 74 68 65 72 65 20 77 61 73 20 6e 6f 74 20 6d   there was not m
9710: 61 74 63 68 2e 20 20 63 6e 74 3e 31 20 6d 65 61  atch.  cnt>1 mea
9720: 6e 73 20 74 68 65 72 65 20 77 65 72 65 20 74 77  ns there were tw
9730: 6f 20 6f 72 0a 20 20 2a 2a 20 6d 6f 72 65 20 6d  o or.  ** more m
9740: 61 74 63 68 65 73 2e 20 20 45 69 74 68 65 72 20  atches.  Either 
9750: 77 61 79 2c 20 77 65 20 68 61 76 65 20 61 6e 20  way, we have an 
9760: 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  error..  */.  if
9770: 28 20 63 6e 74 21 3d 31 20 29 7b 0a 20 20 20 20  ( cnt!=1 ){.    
9780: 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 20  char *z = 0;.   
9790: 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20   char *zErr;.   
97a0: 20 7a 45 72 72 20 3d 20 63 6e 74 3d 3d 30 20 3f   zErr = cnt==0 ?
97b0: 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e   "no such column
97c0: 3a 20 25 73 22 20 3a 20 22 61 6d 62 69 67 75 6f  : %s" : "ambiguo
97d0: 75 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20  us column name: 
97e0: 25 73 22 3b 0a 20 20 20 20 69 66 28 20 7a 44 62  %s";.    if( zDb
97f0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9800: 33 53 65 74 53 74 72 69 6e 67 28 26 7a 2c 20 7a  3SetString(&z, z
9810: 44 62 2c 20 22 2e 22 2c 20 7a 54 61 62 2c 20 22  Db, ".", zTab, "
9820: 2e 22 2c 20 7a 43 6f 6c 2c 20 28 63 68 61 72 2a  .", zCol, (char*
9830: 29 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  )0);.    }else i
9840: 66 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20 20  f( zTab ){.     
9850: 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
9860: 67 28 26 7a 2c 20 7a 54 61 62 2c 20 22 2e 22 2c  g(&z, zTab, ".",
9870: 20 7a 43 6f 6c 2c 20 28 63 68 61 72 2a 29 30 29   zCol, (char*)0)
9880: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9890: 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 53 74     z = sqlite3St
98a0: 72 44 75 70 28 7a 43 6f 6c 29 3b 0a 20 20 20 20  rDup(zCol);.    
98b0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  }.    sqlite3Err
98c0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 7a 45  orMsg(pParse, zE
98d0: 72 72 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69  rr, z);.    sqli
98e0: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20  te3_free(z);.   
98f0: 20 70 54 6f 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b   pTopNC->nErr++;
9900: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20  .  }..  /* If a 
9910: 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 20 74 61  column from a ta
9920: 62 6c 65 20 69 6e 20 70 53 72 63 4c 69 73 74 20  ble in pSrcList 
9930: 69 73 20 72 65 66 65 72 65 6e 63 65 64 2c 20 74  is referenced, t
9940: 68 65 6e 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20  hen record.  ** 
9950: 74 68 69 73 20 66 61 63 74 20 69 6e 20 74 68 65  this fact in the
9960: 20 70 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 63 6f   pSrcList.a[].co
9970: 6c 55 73 65 64 20 62 69 74 6d 61 73 6b 2e 20 20  lUsed bitmask.  
9980: 43 6f 6c 75 6d 6e 20 30 20 63 61 75 73 65 73 0a  Column 0 causes.
9990: 20 20 2a 2a 20 62 69 74 20 30 20 74 6f 20 62 65    ** bit 0 to be
99a0: 20 73 65 74 2e 20 20 43 6f 6c 75 6d 6e 20 31 20   set.  Column 1 
99b0: 73 65 74 73 20 62 69 74 20 31 2e 20 20 41 6e 64  sets bit 1.  And
99c0: 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 66 20 74   so forth.  If t
99d0: 68 65 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 6e  he.  ** column n
99e0: 75 6d 62 65 72 20 69 73 20 67 72 65 61 74 65 72  umber is greater
99f0: 20 74 68 61 6e 20 74 68 65 20 6e 75 6d 62 65 72   than the number
9a00: 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68 65 20   of bits in the 
9a10: 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 74 68 65  bitmask.  ** the
9a20: 6e 20 73 65 74 20 74 68 65 20 68 69 67 68 2d 6f  n set the high-o
9a30: 72 64 65 72 20 62 69 74 20 6f 66 20 74 68 65 20  rder bit of the 
9a40: 62 69 74 6d 61 73 6b 2e 0a 20 20 2a 2f 0a 20 20  bitmask..  */.  
9a50: 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
9a60: 6d 6e 3e 3d 30 20 26 26 20 70 4d 61 74 63 68 21  mn>=0 && pMatch!
9a70: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20  =0 ){.    int n 
9a80: 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
9a90: 3b 0a 20 20 20 20 69 66 28 20 6e 3e 3d 73 69 7a  ;.    if( n>=siz
9aa0: 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 20 29  eof(Bitmask)*8 )
9ab0: 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73 69 7a 65  {.      n = size
9ac0: 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 2d 31 3b  of(Bitmask)*8-1;
9ad0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
9ae0: 74 28 20 70 4d 61 74 63 68 2d 3e 69 43 75 72 73  t( pMatch->iCurs
9af0: 6f 72 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  or==pExpr->iTabl
9b00: 65 20 29 3b 0a 20 20 20 20 70 4d 61 74 63 68 2d  e );.    pMatch-
9b10: 3e 63 6f 6c 55 73 65 64 20 7c 3d 20 28 28 42 69  >colUsed |= ((Bi
9b20: 74 6d 61 73 6b 29 31 29 3c 3c 6e 3b 0a 20 20 7d  tmask)1)<<n;.  }
9b30: 0a 0a 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64  ..lookupname_end
9b40: 3a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20  :.  /* Clean up 
9b50: 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a  and return.  */.
9b60: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
9b70: 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  Db);.  sqlite3_f
9b80: 72 65 65 28 7a 54 61 62 29 3b 0a 20 20 73 71 6c  ree(zTab);.  sql
9b90: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
9ba0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
9bb0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30  pExpr->pLeft = 0
9bc0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
9bd0: 65 6c 65 74 65 28 70 45 78 70 72 2d 3e 70 52 69  elete(pExpr->pRi
9be0: 67 68 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70  ght);.  pExpr->p
9bf0: 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 70 45 78  Right = 0;.  pEx
9c00: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55  pr->op = TK_COLU
9c10: 4d 4e 3b 0a 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65  MN;.lookupname_e
9c20: 6e 64 5f 32 3a 0a 20 20 73 71 6c 69 74 65 33 5f  nd_2:.  sqlite3_
9c30: 66 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 69 66  free(zCol);.  if
9c40: 28 20 63 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20  ( cnt==1 ){.    
9c50: 61 73 73 65 72 74 28 20 70 4e 43 21 3d 30 20 29  assert( pNC!=0 )
9c60: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 75 74  ;.    sqlite3Aut
9c70: 68 52 65 61 64 28 70 50 61 72 73 65 2c 20 70 45  hRead(pParse, pE
9c80: 78 70 72 2c 20 70 4e 43 2d 3e 70 53 72 63 4c 69  xpr, pNC->pSrcLi
9c90: 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 61  st);.    if( pMa
9ca0: 74 63 68 20 26 26 20 21 70 4d 61 74 63 68 2d 3e  tch && !pMatch->
9cb0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
9cc0: 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d 20 70   pExpr->pTab = p
9cd0: 4d 61 74 63 68 2d 3e 70 54 61 62 3b 0a 20 20 20  Match->pTab;.   
9ce0: 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d   }.    /* Increm
9cf0: 65 6e 74 20 74 68 65 20 6e 52 65 66 20 76 61 6c  ent the nRef val
9d00: 75 65 20 6f 6e 20 61 6c 6c 20 6e 61 6d 65 20 63  ue on all name c
9d10: 6f 6e 74 65 78 74 73 20 66 72 6f 6d 20 54 6f 70  ontexts from Top
9d20: 4e 43 20 75 70 20 74 6f 0a 20 20 20 20 2a 2a 20  NC up to.    ** 
9d30: 74 68 65 20 70 6f 69 6e 74 20 77 68 65 72 65 20  the point where 
9d40: 74 68 65 20 6e 61 6d 65 20 6d 61 74 63 68 65 64  the name matched
9d50: 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 3b 3b 29  . */.    for(;;)
9d60: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
9d70: 70 54 6f 70 4e 43 21 3d 30 20 29 3b 0a 20 20 20  pTopNC!=0 );.   
9d80: 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 52 65 66 2b     pTopNC->nRef+
9d90: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 6f  +;.      if( pTo
9da0: 70 4e 43 3d 3d 70 4e 43 20 29 20 62 72 65 61 6b  pNC==pNC ) break
9db0: 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e 43 20 3d  ;.      pTopNC =
9dc0: 20 70 54 6f 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a   pTopNC->pNext;.
9dd0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
9de0: 20 30 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20   0;.  } else {. 
9df0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
9e00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
9e10: 6f 75 74 69 6e 65 20 69 73 20 64 65 73 69 67 6e  outine is design
9e20: 65 64 20 61 73 20 61 6e 20 78 46 75 6e 63 20 66  ed as an xFunc f
9e30: 6f 72 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  or walkExprTree(
9e40: 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65  )..**.** Resolve
9e50: 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 73 20   symbolic names 
9e60: 69 6e 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6f  into TK_COLUMN o
9e70: 70 65 72 61 74 6f 72 73 20 66 6f 72 20 74 68 65  perators for the
9e80: 20 63 75 72 72 65 6e 74 0a 2a 2a 20 6e 6f 64 65   current.** node
9e90: 20 69 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   in the expressi
9ea0: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
9eb0: 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 74   0 to continue t
9ec0: 68 65 20 73 65 61 72 63 68 20 64 6f 77 6e 0a 2a  he search down.*
9ed0: 2a 20 74 68 65 20 74 72 65 65 20 6f 72 20 32 20  * the tree or 2 
9ee0: 74 6f 20 61 62 6f 72 74 20 74 68 65 20 74 72 65  to abort the tre
9ef0: 65 20 77 61 6c 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  e walk..**.** Th
9f00: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20  is routine also 
9f10: 64 6f 65 73 20 65 72 72 6f 72 20 63 68 65 63 6b  does error check
9f20: 69 6e 67 20 61 6e 64 20 6e 61 6d 65 20 72 65 73  ing and name res
9f30: 6f 6c 75 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 66  olution for.** f
9f40: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 2e 20 20  unction names.  
9f50: 54 68 65 20 6f 70 65 72 61 74 6f 72 20 66 6f 72  The operator for
9f60: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
9f70: 69 6f 6e 73 20 69 73 20 63 68 61 6e 67 65 64 0a  ions is changed.
9f80: 2a 2a 20 74 6f 20 54 4b 5f 41 47 47 5f 46 55 4e  ** to TK_AGG_FUN
9f90: 43 54 49 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63  CTION..*/.static
9fa0: 20 69 6e 74 20 6e 61 6d 65 52 65 73 6f 6c 76 65   int nameResolve
9fb0: 72 53 74 65 70 28 76 6f 69 64 20 2a 70 41 72 67  rStep(void *pArg
9fc0: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
9fd0: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
9fe0: 4e 43 20 3d 20 28 4e 61 6d 65 43 6f 6e 74 65 78  NC = (NameContex
9ff0: 74 2a 29 70 41 72 67 3b 0a 20 20 50 61 72 73 65  t*)pArg;.  Parse
a000: 20 2a 70 50 61 72 73 65 3b 0a 0a 20 20 69 66 28   *pParse;..  if(
a010: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
a020: 72 6e 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 1;.  assert( 
a030: 70 4e 43 21 3d 30 20 29 3b 0a 20 20 70 50 61 72  pNC!=0 );.  pPar
a040: 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
a050: 3b 0a 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  ;..  if( ExprHas
a060: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70  AnyProperty(pExp
a070: 72 2c 20 45 50 5f 52 65 73 6f 6c 76 65 64 29 20  r, EP_Resolved) 
a080: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 45 78  ) return 1;.  Ex
a090: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
a0a0: 78 70 72 2c 20 45 50 5f 52 65 73 6f 6c 76 65 64  xpr, EP_Resolved
a0b0: 29 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  );.#ifndef NDEBU
a0c0: 47 0a 20 20 69 66 28 20 70 4e 43 2d 3e 70 53 72  G.  if( pNC->pSr
a0d0: 63 4c 69 73 74 20 26 26 20 70 4e 43 2d 3e 70 53  cList && pNC->pS
a0e0: 72 63 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3e 30  rcList->nAlloc>0
a0f0: 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20   ){.    SrcList 
a100: 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d  *pSrcList = pNC-
a110: 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 69  >pSrcList;.    i
a120: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
a130: 30 3b 20 69 3c 70 4e 43 2d 3e 70 53 72 63 4c 69  0; i<pNC->pSrcLi
a140: 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
a150: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
a160: 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75  rcList->a[i].iCu
a170: 72 73 6f 72 3e 3d 30 20 26 26 20 70 53 72 63 4c  rsor>=0 && pSrcL
a180: 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  ist->a[i].iCurso
a190: 72 3c 70 50 61 72 73 65 2d 3e 6e 54 61 62 29 3b  r<pParse->nTab);
a1a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
a1b0: 66 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  f.  switch( pExp
a1c0: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20  r->op ){.    /* 
a1d0: 44 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74  Double-quoted st
a1e0: 72 69 6e 67 73 20 28 65 78 3a 20 22 61 62 63 22  rings (ex: "abc"
a1f0: 29 20 61 72 65 20 75 73 65 64 20 61 73 20 69 64  ) are used as id
a200: 65 6e 74 69 66 69 65 72 73 20 69 66 0a 20 20 20  entifiers if.   
a210: 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 20 4f   ** possible.  O
a220: 74 68 65 72 77 69 73 65 20 74 68 65 79 20 72 65  therwise they re
a230: 6d 61 69 6e 20 61 73 20 73 74 72 69 6e 67 73 2e  main as strings.
a240: 20 20 53 69 6e 67 6c 65 2d 71 75 6f 74 65 64 0a    Single-quoted.
a250: 20 20 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 28      ** strings (
a260: 65 78 3a 20 27 61 62 63 27 29 20 61 72 65 20 61  ex: 'abc') are a
a270: 6c 77 61 79 73 20 73 74 72 69 6e 67 20 6c 69 74  lways string lit
a280: 65 72 61 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  erals..    */.  
a290: 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
a2a0: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  : {.      if( pE
a2b0: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d  xpr->token.z[0]=
a2c0: 3d 27 5c 27 27 20 29 20 62 72 65 61 6b 3b 0a 20  ='\'' ) break;. 
a2d0: 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
a2e0: 75 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 49 44  u into the TK_ID
a2f0: 20 63 61 73 65 20 69 66 20 74 68 69 73 20 69 73   case if this is
a300: 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64   a double-quoted
a310: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 7d   string */.    }
a320: 0a 20 20 20 20 2f 2a 20 41 20 6c 6f 6e 65 20 69  .    /* A lone i
a330: 64 65 6e 74 69 66 69 65 72 20 69 73 20 74 68 65  dentifier is the
a340: 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d   name of a colum
a350: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  n..    */.    ca
a360: 73 65 20 54 4b 5f 49 44 3a 20 7b 0a 20 20 20 20  se TK_ID: {.    
a370: 20 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70 50 61    lookupName(pPa
a380: 72 73 65 2c 20 30 2c 20 30 2c 20 26 70 45 78 70  rse, 0, 0, &pExp
a390: 72 2d 3e 74 6f 6b 65 6e 2c 20 70 4e 43 2c 20 70  r->token, pNC, p
a3a0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 72 65 74  Expr);.      ret
a3b0: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 0a  urn 1;.    }.  .
a3c0: 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 6e      /* A table n
a3d0: 61 6d 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e  ame and column n
a3e0: 61 6d 65 3a 20 20 20 20 20 49 44 2e 49 44 0a 20  ame:     ID.ID. 
a3f0: 20 20 20 2a 2a 20 4f 72 20 61 20 64 61 74 61 62     ** Or a datab
a400: 61 73 65 2c 20 74 61 62 6c 65 20 61 6e 64 20 63  ase, table and c
a410: 6f 6c 75 6d 6e 3a 20 20 49 44 2e 49 44 2e 49 44  olumn:  ID.ID.ID
a420: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
a430: 20 54 4b 5f 44 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_DOT: {.     
a440: 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e 3b   Token *pColumn;
a450: 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54  .      Token *pT
a460: 61 62 6c 65 3b 0a 20 20 20 20 20 20 54 6f 6b 65  able;.      Toke
a470: 6e 20 2a 70 44 62 3b 0a 20 20 20 20 20 20 45 78  n *pDb;.      Ex
a480: 70 72 20 2a 70 52 69 67 68 74 3b 0a 0a 20 20 20  pr *pRight;..   
a490: 20 20 20 2f 2a 20 69 66 28 20 70 53 72 63 4c 69     /* if( pSrcLi
a4a0: 73 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 20 2a  st==0 ) break; *
a4b0: 2f 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d  /.      pRight =
a4c0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a   pExpr->pRight;.
a4d0: 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74        if( pRight
a4e0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20  ->op==TK_ID ){. 
a4f0: 20 20 20 20 20 20 20 70 44 62 20 3d 20 30 3b 0a         pDb = 0;.
a500: 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 20 3d          pTable =
a510: 20 26 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e   &pExpr->pLeft->
a520: 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 70  token;.        p
a530: 43 6f 6c 75 6d 6e 20 3d 20 26 70 52 69 67 68 74  Column = &pRight
a540: 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d  ->token;.      }
a550: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
a560: 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e 6f 70  sert( pRight->op
a570: 3d 3d 54 4b 5f 44 4f 54 20 29 3b 0a 20 20 20 20  ==TK_DOT );.    
a580: 20 20 20 20 70 44 62 20 3d 20 26 70 45 78 70 72      pDb = &pExpr
a590: 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a  ->pLeft->token;.
a5a0: 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 20 3d          pTable =
a5b0: 20 26 70 52 69 67 68 74 2d 3e 70 4c 65 66 74 2d   &pRight->pLeft-
a5c0: 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  >token;.        
a5d0: 70 43 6f 6c 75 6d 6e 20 3d 20 26 70 52 69 67 68  pColumn = &pRigh
a5e0: 74 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e  t->pRight->token
a5f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a600: 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70 50 61 72 73  lookupName(pPars
a610: 65 2c 20 70 44 62 2c 20 70 54 61 62 6c 65 2c 20  e, pDb, pTable, 
a620: 70 43 6f 6c 75 6d 6e 2c 20 70 4e 43 2c 20 70 45  pColumn, pNC, pE
a630: 78 70 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  xpr);.      retu
a640: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 1;.    }..   
a650: 20 2f 2a 20 52 65 73 6f 6c 76 65 20 66 75 6e 63   /* Resolve func
a660: 74 69 6f 6e 20 6e 61 6d 65 73 0a 20 20 20 20 2a  tion names.    *
a670: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  /.    case TK_CO
a680: 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20 20 63 61  NST_FUNC:.    ca
a690: 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20  se TK_FUNCTION: 
a6a0: 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  {.      ExprList
a6b0: 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
a6c0: 3e 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68  >pList;    /* Th
a6d0: 65 20 61 72 67 75 6d 65 6e 74 20 6c 69 73 74 20  e argument list 
a6e0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  */.      int n =
a6f0: 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e   pList ? pList->
a700: 6e 45 78 70 72 20 3a 20 30 3b 20 20 2f 2a 20 4e  nExpr : 0;  /* N
a710: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
a720: 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
a730: 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20 30  no_such_func = 0
a740: 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ;       /* True 
a750: 69 66 20 6e 6f 20 73 75 63 68 20 66 75 6e 63 74  if no such funct
a760: 69 6f 6e 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ion exists */.  
a770: 20 20 20 20 69 6e 74 20 77 72 6f 6e 67 5f 6e 75      int wrong_nu
a780: 6d 5f 61 72 67 73 20 3d 20 30 3b 20 20 20 20 20  m_args = 0;     
a790: 2f 2a 20 54 72 75 65 20 69 66 20 77 72 6f 6e 67  /* True if wrong
a7a0: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
a7b0: 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ents */.      in
a7c0: 74 20 69 73 5f 61 67 67 20 3d 20 30 3b 20 20 20  t is_agg = 0;   
a7d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
a7e0: 65 20 69 66 20 69 73 20 61 6e 20 61 67 67 72 65  e if is an aggre
a7f0: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  gate function */
a800: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
a810: 20 20 20 20 69 6e 74 20 61 75 74 68 3b 20 20 20      int auth;   
a820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a830: 2f 2a 20 41 75 74 68 6f 72 69 7a 61 74 69 6f 6e  /* Authorization
a840: 20 74 6f 20 75 73 65 20 74 68 65 20 66 75 6e 63   to use the func
a850: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tion */.      in
a860: 74 20 6e 49 64 3b 20 20 20 20 20 20 20 20 20 20  t nId;          
a870: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
a880: 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
a890: 73 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 6e 61  s in function na
a8a0: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73  me */.      cons
a8b0: 74 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20  t char *zId;    
a8c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
a8d0: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 2e 20 2a 2f  unction name. */
a8e0: 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
a8f0: 70 44 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  pDef;           
a900: 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
a910: 6e 20 61 62 6f 75 74 20 74 68 65 20 66 75 6e 63  n about the func
a920: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tion */.      in
a930: 74 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72  t enc = ENC(pPar
a940: 73 65 2d 3e 64 62 29 3b 20 20 2f 2a 20 54 68 65  se->db);  /* The
a950: 20 64 61 74 61 62 61 73 65 20 65 6e 63 6f 64 69   database encodi
a960: 6e 67 20 2a 2f 0a 0a 20 20 20 20 20 20 7a 49 64  ng */..      zId
a970: 20 3d 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d   = (char*)pExpr-
a980: 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20  >token.z;.      
a990: 6e 49 64 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b  nId = pExpr->tok
a9a0: 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 70 44 65 66  en.n;.      pDef
a9b0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
a9c0: 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64  nction(pParse->d
a9d0: 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 2c 20  b, zId, nId, n, 
a9e0: 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  enc, 0);.      i
a9f0: 66 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20  f( pDef==0 ){.  
aa00: 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c        pDef = sql
aa10: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
aa20: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64  (pParse->db, zId
aa30: 2c 20 6e 49 64 2c 20 2d 31 2c 20 65 6e 63 2c 20  , nId, -1, enc, 
aa40: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
aa50: 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pDef==0 ){.     
aa60: 20 20 20 20 20 6e 6f 5f 73 75 63 68 5f 66 75 6e       no_such_fun
aa70: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
aa80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
aa90: 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d  wrong_num_args =
aaa0: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
aab0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
aac0: 20 20 20 69 73 5f 61 67 67 20 3d 20 70 44 65 66     is_agg = pDef
aad0: 2d 3e 78 46 75 6e 63 3d 3d 30 3b 0a 20 20 20 20  ->xFunc==0;.    
aae0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
aaf0: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
ab00: 41 54 49 4f 4e 0a 20 20 20 20 20 20 69 66 28 20  ATION.      if( 
ab10: 70 44 65 66 20 29 7b 0a 20 20 20 20 20 20 20 20  pDef ){.        
ab20: 61 75 74 68 20 3d 20 73 71 6c 69 74 65 33 41 75  auth = sqlite3Au
ab30: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
ab40: 53 51 4c 49 54 45 5f 46 55 4e 43 54 49 4f 4e 2c  SQLITE_FUNCTION,
ab50: 20 30 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c   0, pDef->zName,
ab60: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
ab70: 20 61 75 74 68 21 3d 53 51 4c 49 54 45 5f 4f 4b   auth!=SQLITE_OK
ab80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
ab90: 28 20 61 75 74 68 3d 3d 53 51 4c 49 54 45 5f 44  ( auth==SQLITE_D
aba0: 45 4e 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ENY ){.         
abb0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
abc0: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 74 20  sg(pParse, "not 
abd0: 61 75 74 68 6f 72 69 7a 65 64 20 74 6f 20 75 73  authorized to us
abe0: 65 20 66 75 6e 63 74 69 6f 6e 3a 20 25 73 22 2c  e function: %s",
abf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ac00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac10: 20 20 20 20 20 70 44 65 66 2d 3e 7a 4e 61 6d 65       pDef->zName
ac20: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
ac30: 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  NC->nErr++;.    
ac40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ac50: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
ac60: 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20  _NULL;.         
ac70: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
ac80: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e     }.      }.#en
ac90: 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 69 73  dif.      if( is
aca0: 5f 61 67 67 20 26 26 20 21 70 4e 43 2d 3e 61 6c  _agg && !pNC->al
acb0: 6c 6f 77 41 67 67 20 29 7b 0a 20 20 20 20 20 20  lowAgg ){.      
acc0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
acd0: 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73  g(pParse, "misus
ace0: 65 20 6f 66 20 61 67 67 72 65 67 61 74 65 20 66  e of aggregate f
acf0: 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c  unction %.*s()",
ad00: 20 6e 49 64 2c 7a 49 64 29 3b 0a 20 20 20 20 20   nId,zId);.     
ad10: 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a     pNC->nErr++;.
ad20: 20 20 20 20 20 20 20 20 69 73 5f 61 67 67 20 3d          is_agg =
ad30: 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   0;.      }else 
ad40: 69 66 28 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63  if( no_such_func
ad50: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
ad60: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
ad70: 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 66 75 6e  se, "no such fun
ad80: 63 74 69 6f 6e 3a 20 25 2e 2a 73 22 2c 20 6e 49  ction: %.*s", nI
ad90: 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20  d, zId);.       
ada0: 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20   pNC->nErr++;.  
adb0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72      }else if( wr
adc0: 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 29 7b 0a  ong_num_args ){.
add0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
ade0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22  rrorMsg(pParse,"
adf0: 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20  wrong number of 
ae00: 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e  arguments to fun
ae10: 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 0a 20  ction %.*s()",. 
ae20: 20 20 20 20 20 20 20 20 20 20 20 20 6e 49 64 2c              nId,
ae30: 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20 70   zId);.        p
ae40: 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  NC->nErr++;.    
ae50: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73    }.      if( is
ae60: 5f 61 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20  _agg ){.        
ae70: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41  pExpr->op = TK_A
ae80: 47 47 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 20  GG_FUNCTION;.   
ae90: 20 20 20 20 20 70 4e 43 2d 3e 68 61 73 41 67 67       pNC->hasAgg
aea0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
aeb0: 20 20 20 20 69 66 28 20 69 73 5f 61 67 67 20 29      if( is_agg )
aec0: 20 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 3d   pNC->allowAgg =
aed0: 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   0;.      for(i=
aee0: 30 3b 20 70 4e 43 2d 3e 6e 45 72 72 3d 3d 30 20  0; pNC->nErr==0 
aef0: 26 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  && i<n; i++){.  
af00: 20 20 20 20 20 20 77 61 6c 6b 45 78 70 72 54 72        walkExprTr
af10: 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  ee(pList->a[i].p
af20: 45 78 70 72 2c 20 6e 61 6d 65 52 65 73 6f 6c 76  Expr, nameResolv
af30: 65 72 53 74 65 70 2c 20 70 4e 43 29 3b 0a 20 20  erStep, pNC);.  
af40: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
af50: 69 73 5f 61 67 67 20 29 20 70 4e 43 2d 3e 61 6c  is_agg ) pNC->al
af60: 6c 6f 77 41 67 67 20 3d 20 31 3b 0a 20 20 20 20  lowAgg = 1;.    
af70: 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f    /* FIX ME:  Co
af80: 6d 70 75 74 65 20 70 45 78 70 72 2d 3e 61 66 66  mpute pExpr->aff
af90: 69 6e 69 74 79 20 62 61 73 65 64 20 6f 6e 20 74  inity based on t
afa0: 68 65 20 65 78 70 65 63 74 65 64 20 72 65 74 75  he expected retu
afb0: 72 6e 0a 20 20 20 20 20 20 2a 2a 20 74 79 70 65  rn.      ** type
afc0: 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
afd0: 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
afe0: 20 72 65 74 75 72 6e 20 69 73 5f 61 67 67 3b 0a   return is_agg;.
aff0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
b000: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
b010: 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  RY.    case TK_S
b020: 45 4c 45 43 54 3a 0a 20 20 20 20 63 61 73 65 20  ELECT:.    case 
b030: 54 4b 5f 45 58 49 53 54 53 3a 0a 23 65 6e 64 69  TK_EXISTS:.#endi
b040: 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  f.    case TK_IN
b050: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  : {.      if( pE
b060: 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  xpr->pSelect ){.
b070: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 52 65 66          int nRef
b080: 20 3d 20 70 4e 43 2d 3e 6e 52 65 66 3b 0a 23 69   = pNC->nRef;.#i
b090: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b0a0: 54 5f 43 48 45 43 4b 0a 20 20 20 20 20 20 20 20  T_CHECK.        
b0b0: 69 66 28 20 70 4e 43 2d 3e 69 73 43 68 65 63 6b  if( pNC->isCheck
b0c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
b0d0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
b0e0: 61 72 73 65 2c 22 73 75 62 71 75 65 72 69 65 73  arse,"subqueries
b0f0: 20 70 72 6f 68 69 62 69 74 65 64 20 69 6e 20 43   prohibited in C
b100: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73  HECK constraints
b110: 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  ");.        }.#e
b120: 6e 64 69 66 0a 20 20 20 20 20 20 20 20 73 71 6c  ndif.        sql
b130: 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76  ite3SelectResolv
b140: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
b150: 3e 70 53 65 6c 65 63 74 2c 20 70 4e 43 29 3b 0a  >pSelect, pNC);.
b160: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
b170: 70 4e 43 2d 3e 6e 52 65 66 3e 3d 6e 52 65 66 20  pNC->nRef>=nRef 
b180: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
b190: 52 65 66 21 3d 70 4e 43 2d 3e 6e 52 65 66 20 29  Ref!=pNC->nRef )
b1a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
b1b0: 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70  SetProperty(pExp
b1c0: 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29  r, EP_VarSelect)
b1d0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
b1e0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
b1f0: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
b200: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
b210: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52  .    case TK_VAR
b220: 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 69  IABLE: {.      i
b230: 66 28 20 70 4e 43 2d 3e 69 73 43 68 65 63 6b 20  f( pNC->isCheck 
b240: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
b250: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
b260: 65 2c 22 70 61 72 61 6d 65 74 65 72 73 20 70 72  e,"parameters pr
b270: 6f 68 69 62 69 74 65 64 20 69 6e 20 43 48 45 43  ohibited in CHEC
b280: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 22 29 3b  K constraints");
b290: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
b2a0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
b2b0: 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  if.  }.  return 
b2c0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
b2d0: 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 61   routine walks a
b2e0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
b2f0: 65 20 61 6e 64 20 72 65 73 6f 6c 76 65 73 20 72  e and resolves r
b300: 65 66 65 72 65 6e 63 65 73 20 74 6f 0a 2a 2a 20  eferences to.** 
b310: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 2e 20 20  table columns.  
b320: 4e 6f 64 65 73 20 6f 66 20 74 68 65 20 66 6f 72  Nodes of the for
b330: 6d 20 49 44 2e 49 44 20 6f 72 20 49 44 20 72 65  m ID.ID or ID re
b340: 73 6f 6c 76 65 20 69 6e 74 6f 20 61 6e 0a 2a 2a  solve into an.**
b350: 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 74 61   index to the ta
b360: 62 6c 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ble in the table
b370: 20 6c 69 73 74 20 61 6e 64 20 61 20 63 6f 6c 75   list and a colu
b380: 6d 6e 20 6f 66 66 73 65 74 2e 20 20 54 68 65 20  mn offset.  The 
b390: 0a 2a 2a 20 45 78 70 72 2e 6f 70 63 6f 64 65 20  .** Expr.opcode 
b3a0: 66 6f 72 20 73 75 63 68 20 6e 6f 64 65 73 20 69  for such nodes i
b3b0: 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f  s changed to TK_
b3c0: 43 4f 4c 55 4d 4e 2e 20 20 54 68 65 20 45 78 70  COLUMN.  The Exp
b3d0: 72 2e 69 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75  r.iTable.** valu
b3e0: 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20  e is changed to 
b3f0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
b400: 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c   referenced tabl
b410: 65 20 69 6e 20 70 54 61 62 4c 69 73 74 0a 2a 2a  e in pTabList.**
b420: 20 70 6c 75 73 20 74 68 65 20 22 62 61 73 65 22   plus the "base"
b430: 20 76 61 6c 75 65 2e 20 20 54 68 65 20 62 61 73   value.  The bas
b440: 65 20 76 61 6c 75 65 20 77 69 6c 6c 20 75 6c 74  e value will ult
b450: 69 6d 61 74 65 6c 79 20 62 65 63 6f 6d 65 20 74  imately become t
b460: 68 65 0a 2a 2a 20 56 44 42 45 20 63 75 72 73 6f  he.** VDBE curso
b470: 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 61 20 63  r number for a c
b480: 75 72 73 6f 72 20 74 68 61 74 20 69 73 20 70 6f  ursor that is po
b490: 69 6e 74 69 6e 67 20 69 6e 74 6f 20 74 68 65 20  inting into the 
b4a0: 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20 74 61  referenced.** ta
b4b0: 62 6c 65 2e 20 20 54 68 65 20 45 78 70 72 2e 69  ble.  The Expr.i
b4c0: 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73 20  Column value is 
b4d0: 63 68 61 6e 67 65 64 20 74 6f 20 74 68 65 20 69  changed to the i
b4e0: 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75  ndex of the colu
b4f0: 6d 6e 20 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65  mn .** of the re
b500: 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 2e 20  ferenced table. 
b510: 20 54 68 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d   The Expr.iColum
b520: 6e 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  n value for the 
b530: 73 70 65 63 69 61 6c 0a 2a 2a 20 52 4f 57 49 44  special.** ROWID
b540: 20 63 6f 6c 75 6d 6e 20 69 73 20 2d 31 2e 20 20   column is -1.  
b550: 41 6e 79 20 49 4e 54 45 47 45 52 20 50 52 49 4d  Any INTEGER PRIM
b560: 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 69  ARY KEY column i
b570: 73 20 74 72 69 65 64 20 61 73 20 61 6e 0a 2a 2a  s tried as an.**
b580: 20 61 6c 69 61 73 20 66 6f 72 20 52 4f 57 49 44   alias for ROWID
b590: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 73  ..**.** Also res
b5a0: 6f 6c 76 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61  olve function na
b5b0: 6d 65 73 20 61 6e 64 20 63 68 65 63 6b 20 74 68  mes and check th
b5c0: 65 20 66 75 6e 63 74 69 6f 6e 73 20 66 6f 72 20  e functions for 
b5d0: 70 72 6f 70 65 72 0a 2a 2a 20 75 73 61 67 65 2e  proper.** usage.
b5e0: 20 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20    Make sure all 
b5f0: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 20 61  function names a
b600: 72 65 20 72 65 63 6f 67 6e 69 7a 65 64 20 61 6e  re recognized an
b610: 64 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 73 0a  d all functions.
b620: 2a 2a 20 68 61 76 65 20 74 68 65 20 63 6f 72 72  ** have the corr
b630: 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  ect number of ar
b640: 67 75 6d 65 6e 74 73 2e 20 20 4c 65 61 76 65 20  guments.  Leave 
b650: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
b660: 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a  .** in pParse->z
b670: 45 72 72 4d 73 67 20 69 66 20 61 6e 79 74 68 69  ErrMsg if anythi
b680: 6e 67 20 69 73 20 61 6d 69 73 73 2e 20 20 52 65  ng is amiss.  Re
b690: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
b6a0: 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a  of errors..**.**
b6b0: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
b6c0: 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61 67 67 72  on contains aggr
b6d0: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
b6e0: 74 68 65 6e 20 73 65 74 20 74 68 65 20 45 50 5f  then set the EP_
b6f0: 41 67 67 0a 2a 2a 20 70 72 6f 70 65 72 74 79 20  Agg.** property 
b700: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
b710: 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
b720: 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
b730: 73 28 20 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  s( .  NameContex
b740: 74 20 2a 70 4e 43 2c 20 20 20 20 20 20 20 2f 2a  t *pNC,       /*
b750: 20 4e 61 6d 65 73 70 61 63 65 20 74 6f 20 72 65   Namespace to re
b760: 73 6f 6c 76 65 20 65 78 70 72 65 73 73 69 6f 6e  solve expression
b770: 73 20 69 6e 2e 20 2a 2f 0a 20 20 45 78 70 72 20  s in. */.  Expr 
b780: 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20  *pExpr          
b790: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
b7a0: 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e 61 6c 79  sion to be analy
b7b0: 7a 65 64 2e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  zed. */.){.  int
b7c0: 20 73 61 76 65 64 48 61 73 41 67 67 3b 0a 20 20   savedHasAgg;.  
b7d0: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
b7e0: 65 74 75 72 6e 20 30 3b 0a 23 69 66 20 53 51 4c  eturn 0;.#if SQL
b7f0: 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
b800: 54 48 3e 30 0a 20 20 69 66 28 20 28 70 45 78 70  TH>0.  if( (pExp
b810: 72 2d 3e 6e 48 65 69 67 68 74 2b 70 4e 43 2d 3e  r->nHeight+pNC->
b820: 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 29  pParse->nHeight)
b830: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52  >SQLITE_MAX_EXPR
b840: 5f 44 45 50 54 48 20 29 7b 0a 20 20 20 20 73 71  _DEPTH ){.    sq
b850: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 4e  lite3ErrorMsg(pN
b860: 43 2d 3e 70 50 61 72 73 65 2c 20 0a 20 20 20 20  C->pParse, .    
b870: 20 20 20 22 45 78 70 72 65 73 73 69 6f 6e 20 74     "Expression t
b880: 72 65 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65  ree is too large
b890: 20 28 6d 61 78 69 6d 75 6d 20 64 65 70 74 68 20   (maximum depth 
b8a0: 25 64 29 22 2c 0a 20 20 20 20 20 20 20 53 51 4c  %d)",.       SQL
b8b0: 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
b8c0: 54 48 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 65  TH.    );.    re
b8d0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 70 4e  turn 1;.  }.  pN
b8e0: 43 2d 3e 70 50 61 72 73 65 2d 3e 6e 48 65 69 67  C->pParse->nHeig
b8f0: 68 74 20 2b 3d 20 70 45 78 70 72 2d 3e 6e 48 65  ht += pExpr->nHe
b900: 69 67 68 74 3b 0a 23 65 6e 64 69 66 0a 20 20 73  ight;.#endif.  s
b910: 61 76 65 64 48 61 73 41 67 67 20 3d 20 70 4e 43  avedHasAgg = pNC
b920: 2d 3e 68 61 73 41 67 67 3b 0a 20 20 70 4e 43 2d  ->hasAgg;.  pNC-
b930: 3e 68 61 73 41 67 67 20 3d 20 30 3b 0a 20 20 77  >hasAgg = 0;.  w
b940: 61 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78 70  alkExprTree(pExp
b950: 72 2c 20 6e 61 6d 65 52 65 73 6f 6c 76 65 72 53  r, nameResolverS
b960: 74 65 70 2c 20 70 4e 43 29 3b 0a 23 69 66 20 53  tep, pNC);.#if S
b970: 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
b980: 45 50 54 48 3e 30 0a 20 20 70 4e 43 2d 3e 70 50  EPTH>0.  pNC->pP
b990: 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d  arse->nHeight -=
b9a0: 20 70 45 78 70 72 2d 3e 6e 48 65 69 67 68 74 3b   pExpr->nHeight;
b9b0: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 4e  .#endif.  if( pN
b9c0: 43 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20  C->nErr>0 ){.   
b9d0: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
b9e0: 28 70 45 78 70 72 2c 20 45 50 5f 45 72 72 6f 72  (pExpr, EP_Error
b9f0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 43  );.  }.  if( pNC
ba00: 2d 3e 68 61 73 41 67 67 20 29 7b 0a 20 20 20 20  ->hasAgg ){.    
ba10: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
ba20: 70 45 78 70 72 2c 20 45 50 5f 41 67 67 29 3b 0a  pExpr, EP_Agg);.
ba30: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 61 76 65    }else if( save
ba40: 64 48 61 73 41 67 67 20 29 7b 0a 20 20 20 20 70  dHasAgg ){.    p
ba50: 4e 43 2d 3e 68 61 73 41 67 67 20 3d 20 31 3b 0a  NC->hasAgg = 1;.
ba60: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 45 78 70    }.  return Exp
ba70: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
ba80: 70 72 2c 20 45 50 5f 45 72 72 6f 72 29 3b 0a 7d  pr, EP_Error);.}
ba90: 0a 0a 2f 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65  ../*.** A pointe
baa0: 72 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  r instance of th
bab0: 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20  is structure is 
bac0: 75 73 65 64 20 74 6f 20 70 61 73 73 20 69 6e 66  used to pass inf
bad0: 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 68 72 6f  ormation.** thro
bae0: 75 67 68 20 77 61 6c 6b 45 78 70 72 54 72 65 65  ugh walkExprTree
baf0: 20 69 6e 74 6f 20 63 6f 64 65 53 75 62 71 75 65   into codeSubque
bb00: 72 79 53 74 65 70 28 29 2e 0a 2a 2f 0a 74 79 70  ryStep()..*/.typ
bb10: 65 64 65 66 20 73 74 72 75 63 74 20 51 75 65 72  edef struct Quer
bb20: 79 43 6f 64 65 72 20 51 75 65 72 79 43 6f 64 65  yCoder QueryCode
bb30: 72 3b 0a 73 74 72 75 63 74 20 51 75 65 72 79 43  r;.struct QueryC
bb40: 6f 64 65 72 20 7b 0a 20 20 50 61 72 73 65 20 2a  oder {.  Parse *
bb50: 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 2f 2a  pParse;       /*
bb60: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
bb70: 74 65 78 74 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f  text */.  NameCo
bb80: 6e 74 65 78 74 20 2a 70 4e 43 3b 20 20 20 20 2f  ntext *pNC;    /
bb90: 2a 20 4e 61 6d 65 73 70 61 63 65 20 6f 66 20 66  * Namespace of f
bba0: 69 72 73 74 20 65 6e 63 6c 6f 73 69 6e 67 20 71  irst enclosing q
bbb0: 75 65 72 79 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a  uery */.};.../*.
bbc0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
bbd0: 20 66 6f 72 20 73 63 61 6c 61 72 20 73 75 62 71   for scalar subq
bbe0: 75 65 72 69 65 73 20 75 73 65 64 20 61 73 20 61  ueries used as a
bbf0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  n expression.** 
bc00: 61 6e 64 20 49 4e 20 6f 70 65 72 61 74 6f 72 73  and IN operators
bc10: 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a  .  Examples:.**.
bc20: 2a 2a 20 20 20 20 20 28 53 45 4c 45 43 54 20 61  **     (SELECT a
bc30: 20 46 52 4f 4d 20 62 29 20 20 20 20 20 20 20 20   FROM b)        
bc40: 20 20 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a    -- subquery.**
bc50: 20 20 20 20 20 45 58 49 53 54 53 20 28 53 45 4c       EXISTS (SEL
bc60: 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20  ECT a FROM b)   
bc70: 2d 2d 20 45 58 49 53 54 53 20 73 75 62 71 75 65  -- EXISTS subque
bc80: 72 79 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28  ry.**     x IN (
bc90: 34 2c 35 2c 31 31 29 20 20 20 20 20 20 20 20 20  4,5,11)         
bca0: 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61       -- IN opera
bcb0: 74 6f 72 20 77 69 74 68 20 6c 69 73 74 20 6f 6e  tor with list on
bcc0: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
bcd0: 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 53 45  .**     x IN (SE
bce0: 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20  LECT a FROM b)  
bcf0: 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f     -- IN operato
bd00: 72 20 77 69 74 68 20 73 75 62 71 75 65 72 79 20  r with subquery 
bd10: 6f 6e 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a  on the right.**.
bd20: 2a 2a 20 54 68 65 20 70 45 78 70 72 20 70 61 72  ** The pExpr par
bd30: 61 6d 65 74 65 72 20 64 65 73 63 72 69 62 65 73  ameter describes
bd40: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
bd50: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
bd60: 65 20 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72  e IN.** operator
bd70: 20 6f 72 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f   or subquery..*/
bd80: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
bd90: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 76 6f  OMIT_SUBQUERY.vo
bda0: 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75  id sqlite3CodeSu
bdb0: 62 73 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70  bselect(Parse *p
bdc0: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
bdd0: 70 72 29 7b 0a 20 20 69 6e 74 20 74 65 73 74 41  pr){.  int testA
bde0: 64 64 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ddr = 0;        
bdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
be00: 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65 73 74 20  * One-time test 
be10: 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 56 64 62  address */.  Vdb
be20: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
be30: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
be40: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
be50: 72 6e 3b 0a 0a 0a 20 20 2f 2a 20 54 68 69 73 20  rn;...  /* This 
be60: 63 6f 64 65 20 6d 75 73 74 20 62 65 20 72 75 6e  code must be run
be70: 20 69 6e 20 69 74 73 20 65 6e 74 69 72 65 74 79   in its entirety
be80: 20 65 76 65 72 79 20 74 69 6d 65 20 69 74 20 69   every time it i
be90: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20  s encountered.  
bea0: 2a 2a 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  ** if any of the
beb0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72   following is tr
bec0: 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ue:.  **.  **   
bed0: 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61   *  The right-ha
bee0: 6e 64 20 73 69 64 65 20 69 73 20 61 20 63 6f 72  nd side is a cor
bef0: 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79  related subquery
bf00: 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20  .  **    *  The 
bf10: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
bf20: 69 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  is an expression
bf30: 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67   list containing
bf40: 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20   variables.  ** 
bf50: 20 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73     *  We are ins
bf60: 69 64 65 20 61 20 74 72 69 67 67 65 72 0a 20 20  ide a trigger.  
bf70: 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f  **.  ** If all o
bf80: 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20  f the above are 
bf90: 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63  false, then we c
bfa0: 61 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65  an run this code
bfb0: 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20   just once.  ** 
bfc0: 73 61 76 65 20 74 68 65 20 72 65 73 75 6c 74 73  save the results
bfd0: 2c 20 61 6e 64 20 72 65 75 73 65 20 74 68 65 20  , and reuse the 
bfe0: 73 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73  same result on s
bff0: 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61  ubsequent invoca
c000: 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tions..  */.  if
c010: 28 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f  ( !ExprHasAnyPro
c020: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
c030: 56 61 72 53 65 6c 65 63 74 29 20 26 26 20 21 70  VarSelect) && !p
c040: 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b  Parse->trigStack
c050: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 65 6d 20   ){.    int mem 
c060: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b  = pParse->nMem++
c070: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
c080: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
c090: 4c 6f 61 64 2c 20 6d 65 6d 2c 20 30 29 3b 0a 20  Load, mem, 0);. 
c0a0: 20 20 20 74 65 73 74 41 64 64 72 20 3d 20 73 71     testAddr = sq
c0b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c0c0: 2c 20 4f 50 5f 49 66 2c 20 30 2c 20 30 29 3b 0a  , OP_If, 0, 0);.
c0d0: 20 20 20 20 61 73 73 65 72 74 28 20 74 65 73 74      assert( test
c0e0: 41 64 64 72 3e 30 20 7c 7c 20 70 50 61 72 73 65  Addr>0 || pParse
c0f0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
c100: 65 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ed );.    sqlite
c110: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
c120: 5f 4d 65 6d 49 6e 74 2c 20 31 2c 20 6d 65 6d 29  _MemInt, 1, mem)
c130: 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28  ;.  }..  switch(
c140: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
c150: 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
c160: 20 20 20 20 20 20 63 68 61 72 20 61 66 66 69 6e        char affin
c170: 69 74 79 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e  ity;.      KeyIn
c180: 66 6f 20 6b 65 79 49 6e 66 6f 3b 0a 20 20 20 20  fo keyInfo;.    
c190: 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20    int addr;     
c1a0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
c1b0: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
c1c0: 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f  l instruction */
c1d0: 0a 0a 20 20 20 20 20 20 61 66 66 69 6e 69 74 79  ..      affinity
c1e0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
c1f0: 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 4c  finity(pExpr->pL
c200: 65 66 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  eft);..      /* 
c210: 57 68 65 74 68 65 72 20 74 68 69 73 20 69 73 20  Whether this is 
c220: 61 6e 20 27 78 20 49 4e 28 53 45 4c 45 43 54 2e  an 'x IN(SELECT.
c230: 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78 20 49 4e  ..)' or an 'x IN
c240: 28 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a 20 20  (<exprlist>)'.  
c250: 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
c260: 6e 20 69 74 20 69 73 20 68 61 6e 64 6c 65 64 20  n it is handled 
c270: 74 68 65 20 73 61 6d 65 20 77 61 79 2e 20 41 20  the same way. A 
c280: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 73  virtual table is
c290: 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65   .      ** fille
c2a0: 64 20 77 69 74 68 20 73 69 6e 67 6c 65 2d 66 69  d with single-fi
c2b0: 65 6c 64 20 69 6e 64 65 78 20 6b 65 79 73 20 72  eld index keys r
c2c0: 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20  epresenting the 
c2d0: 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a  results.      **
c2e0: 20 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54   from the SELECT
c2f0: 20 6f 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73   or the <exprlis
c300: 74 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  t>..      **.   
c310: 20 20 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27     ** If the 'x'
c320: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
c330: 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f   column value, o
c340: 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a  r the SELECT....
c350: 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
c360: 6e 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c  nt returns a col
c370: 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  umn value, then 
c380: 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20  the affinity of 
c390: 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f  that.      ** co
c3a0: 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20  lumn is used to 
c3b0: 62 75 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20  build the index 
c3c0: 6b 65 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78  keys. If both 'x
c3d0: 27 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20  ' and the.      
c3e0: 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61  ** SELECT... sta
c3f0: 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d  tement are colum
c400: 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63  ns, then numeric
c410: 20 61 66 66 69 6e 69 74 79 20 69 73 20 75 73 65   affinity is use
c420: 64 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69  d.      ** if ei
c430: 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20  ther column has 
c440: 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47  NUMERIC or INTEG
c450: 45 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20  ER affinity. If 
c460: 6e 65 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a  neither.      **
c470: 20 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c   'x' nor the SEL
c480: 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74  ECT... statement
c490: 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68   are columns, th
c4a0: 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  en numeric affin
c4b0: 69 74 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  ity.      ** is 
c4c0: 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  used..      */. 
c4d0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
c4e0: 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  le = pParse->nTa
c4f0: 62 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 20  b++;.      addr 
c500: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
c510: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  Op(v, OP_OpenEph
c520: 65 6d 65 72 61 6c 2c 20 70 45 78 70 72 2d 3e 69  emeral, pExpr->i
c530: 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20  Table, 0);.     
c540: 20 6d 65 6d 73 65 74 28 26 6b 65 79 49 6e 66 6f   memset(&keyInfo
c550: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79 49  , 0, sizeof(keyI
c560: 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 6b 65 79  nfo));.      key
c570: 49 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 31 3b  Info.nField = 1;
c580: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c590: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
c5a0: 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 70 45 78  tNumColumns, pEx
c5b0: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 31 29 3b 0a  pr->iTable, 1);.
c5c0: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
c5d0: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
c5e0: 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20       /* Case 1: 
c5f0: 20 20 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c      expr IN (SEL
c600: 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20  ECT ...).       
c610: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47   **.        ** G
c620: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
c630: 77 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74  write the result
c640: 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20  s of the select 
c650: 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61  into the tempora
c660: 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61  ry.        ** ta
c670: 62 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  ble allocated an
c680: 64 20 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a  d opened above..
c690: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
c6a0: 20 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70     int iParm = p
c6b0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 2b 20 20  Expr->iTable +  
c6c0: 28 28 28 69 6e 74 29 61 66 66 69 6e 69 74 79 29  (((int)affinity)
c6d0: 3c 3c 31 36 29 3b 0a 20 20 20 20 20 20 20 20 45  <<16);.        E
c6e0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
c6f0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
c700: 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 26   (pExpr->iTable&
c710: 30 78 30 30 30 30 46 46 46 46 29 3d 3d 70 45 78  0x0000FFFF)==pEx
c720: 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20  pr->iTable );.  
c730: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
c740: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
c750: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20  pExpr->pSelect, 
c760: 53 52 54 5f 53 65 74 2c 20 69 50 61 72 6d 2c 20  SRT_Set, iParm, 
c770: 30 2c 20 30 2c 20 30 2c 20 30 29 20 29 7b 0a 20  0, 0, 0, 0) ){. 
c780: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b           return;
c790: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c7a0: 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70     pEList = pExp
c7b0: 72 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  r->pSelect->pELi
c7c0: 73 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  st;.        if( 
c7d0: 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
c7e0: 2d 3e 6e 45 78 70 72 3e 30 20 29 7b 20 0a 20 20  ->nExpr>0 ){ .  
c7f0: 20 20 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e          keyInfo.
c800: 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74  aColl[0] = sqlit
c810: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
c820: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
c830: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20 20  Expr->pLeft,.   
c840: 20 20 20 20 20 20 20 20 20 20 20 70 45 4c 69 73             pELis
c850: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  t->a[0].pExpr);.
c860: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c870: 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d  }else if( pExpr-
c880: 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  >pList ){.      
c890: 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20    /* Case 2:    
c8a0: 20 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69   expr IN (exprli
c8b0: 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  st).        **. 
c8c0: 20 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 65 61         ** For ea
c8d0: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 62  ch expression, b
c8e0: 75 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b 65  uild an index ke
c8f0: 79 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c 75  y from the evalu
c900: 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20  ation and.      
c910: 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69 6e    ** store it in
c920: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
c930: 61 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e 20  able. If <expr> 
c940: 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65  is a column, the
c950: 6e 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a  n use.        **
c960: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66   that columns af
c970: 66 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69 6c  finity when buil
c980: 64 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73 2e  ding index keys.
c990: 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f   If <expr> is no
c9a0: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63  t.        ** a c
c9b0: 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72  olumn, use numer
c9c0: 69 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20  ic affinity..   
c9d0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
c9e0: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 45  int i;.        E
c9f0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
ca00: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20   pExpr->pList;. 
ca10: 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78         struct Ex
ca20: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
ca30: 65 6d 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28  em;..        if(
ca40: 20 21 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20   !affinity ){.  
ca50: 20 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79          affinity
ca60: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
ca70: 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NE;.        }.  
ca80: 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43        keyInfo.aC
ca90: 6f 6c 6c 5b 30 5d 20 3d 20 70 45 78 70 72 2d 3e  oll[0] = pExpr->
caa0: 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 0a 20  pLeft->pColl;.. 
cab0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74         /* Loop t
cac0: 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72  hrough each expr
cad0: 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c  ession in <exprl
cae0: 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ist>. */.       
caf0: 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45   for(i=pList->nE
cb00: 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74  xpr, pItem=pList
cb10: 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70  ->a; i>0; i--, p
cb20: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
cb30: 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70     Expr *pE2 = p
cb40: 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20  Item->pExpr;..  
cb50: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
cb60: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
cb70: 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74 68 65  not constant the
cb80: 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  n we will need t
cb90: 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64  o.          ** d
cba0: 69 73 61 62 6c 65 20 74 68 65 20 74 65 73 74 20  isable the test 
cbb0: 74 68 61 74 20 77 61 73 20 67 65 6e 65 72 61 74  that was generat
cbc0: 65 64 20 61 62 6f 76 65 20 74 68 61 74 20 6d 61  ed above that ma
cbd0: 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20 20 20  kes sure.       
cbe0: 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20     ** this code 
cbf0: 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e  only executes on
cc00: 63 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72  ce.  Because for
cc10: 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a   a non-constant.
cc20: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70            ** exp
cc30: 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64 20  ression we need 
cc40: 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63 6f  to rerun this co
cc50: 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20  de each time..  
cc60: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
cc70: 20 20 20 20 20 69 66 28 20 74 65 73 74 41 64 64       if( testAdd
cc80: 72 3e 30 20 26 26 20 21 73 71 6c 69 74 65 33 45  r>0 && !sqlite3E
cc90: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45  xprIsConstant(pE
cca0: 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  2) ){.          
ccb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
ccc0: 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 74 65 73  ngeToNoop(v, tes
ccd0: 74 41 64 64 72 2d 31 2c 20 33 29 3b 0a 20 20 20  tAddr-1, 3);.   
cce0: 20 20 20 20 20 20 20 20 20 74 65 73 74 41 64 64           testAdd
ccf0: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  r = 0;.         
cd00: 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   }..          /*
cd10: 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 78   Evaluate the ex
cd20: 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73  pression and ins
cd30: 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20  ert it into the 
cd40: 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20  temp table */.  
cd50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
cd60: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
cd70: 70 45 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pE2);.          
cd80: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
cd90: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
cda0: 20 31 2c 20 30 2c 20 26 61 66 66 69 6e 69 74 79   1, 0, &affinity
cdb0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
cdc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cdd0: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
cde0: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
cdf0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
ce00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
ce10: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
ce20: 28 76 2c 20 61 64 64 72 2c 20 28 76 6f 69 64 20  (v, addr, (void 
ce30: 2a 29 26 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b  *)&keyInfo, P3_K
ce40: 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 62  EYINFO);.      b
ce50: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
ce60: 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
ce70: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
ce80: 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ECT: {.      /* 
ce90: 54 68 69 73 20 68 61 73 20 74 6f 20 62 65 20 61  This has to be a
cea0: 20 73 63 61 6c 61 72 20 53 45 4c 45 43 54 2e 20   scalar SELECT. 
ceb0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
cec0: 6f 20 70 75 74 20 74 68 65 0a 20 20 20 20 20 20  o put the.      
ced0: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  ** value of this
cee0: 20 73 65 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d   select in a mem
cef0: 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 63  ory cell and rec
cf00: 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 0a 20  ord the number. 
cf10: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d       ** of the m
cf20: 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43  emory cell in iC
cf30: 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  olumn..      */.
cf40: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
cf50: 73 74 20 54 6f 6b 65 6e 20 6f 6e 65 20 3d 20 7b  st Token one = {
cf60: 20 28 75 38 2a 29 22 31 22 2c 20 30 2c 20 31 20   (u8*)"1", 0, 1 
cf70: 7d 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  };.      Select 
cf80: 2a 70 53 65 6c 3b 0a 20 20 20 20 20 20 69 6e 74  *pSel;.      int
cf90: 20 69 4d 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74   iMem;.      int
cfa0: 20 73 6f 70 3b 0a 0a 20 20 20 20 20 20 70 45 78   sop;..      pEx
cfb0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 4d  pr->iColumn = iM
cfc0: 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
cfd0: 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 53 65 6c 20  m++;.      pSel 
cfe0: 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  = pExpr->pSelect
cff0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
d000: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
d010: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 6f 70 20   ){.        sop 
d020: 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20  = SRT_Mem;.     
d030: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d040: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4e 75 6c  dOp(v, OP_MemNul
d050: 6c 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20  l, iMem, 0);.   
d060: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
d070: 28 28 76 2c 20 22 23 20 49 6e 69 74 20 73 75 62  ((v, "# Init sub
d080: 71 75 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b  query result"));
d090: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
d0a0: 20 20 20 20 20 20 73 6f 70 20 3d 20 53 52 54 5f        sop = SRT_
d0b0: 45 78 69 73 74 73 3b 0a 20 20 20 20 20 20 20 20  Exists;.        
d0c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d0d0: 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 30  (v, OP_MemInt, 0
d0e0: 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20  , iMem);.       
d0f0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
d100: 20 22 23 20 49 6e 69 74 20 45 58 49 53 54 53 20   "# Init EXISTS 
d110: 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20  result"));.     
d120: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
d130: 45 78 70 72 44 65 6c 65 74 65 28 70 53 65 6c 2d  ExprDelete(pSel-
d140: 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >pLimit);.      
d150: 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73  pSel->pLimit = s
d160: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49 4e  qlite3Expr(TK_IN
d170: 54 45 47 45 52 2c 20 30 2c 20 30 2c 20 26 6f 6e  TEGER, 0, 0, &on
d180: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  e);.      if( sq
d190: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
d1a0: 73 65 2c 20 70 53 65 6c 2c 20 73 6f 70 2c 20 69  se, pSel, sop, i
d1b0: 4d 65 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29  Mem, 0, 0, 0, 0)
d1c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
d1d0: 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
d1e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
d1f0: 20 7d 0a 0a 20 20 69 66 28 20 74 65 73 74 41 64   }..  if( testAd
d200: 64 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  dr ){.    sqlite
d210: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
d220: 20 74 65 73 74 41 64 64 72 29 3b 0a 20 20 7d 0a   testAddr);.  }.
d230: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e  .  return;.}.#en
d240: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
d250: 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
d260: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
d270: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  n instruction th
d280: 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20  at will put the 
d290: 69 6e 74 65 67 65 72 20 64 65 73 63 72 69 62 65  integer describe
d2a0: 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e   by.** text z[0.
d2b0: 2e 6e 2d 31 5d 20 6f 6e 20 74 68 65 20 73 74 61  .n-1] on the sta
d2c0: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
d2d0: 69 64 20 63 6f 64 65 49 6e 74 65 67 65 72 28 56  id codeInteger(V
d2e0: 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68  dbe *v, const ch
d2f0: 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20  ar *z, int n){. 
d300: 20 61 73 73 65 72 74 28 20 7a 20 7c 7c 20 76 3d   assert( z || v=
d310: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62  =0 || sqlite3Vdb
d320: 65 44 62 28 76 29 2d 3e 6d 61 6c 6c 6f 63 46 61  eDb(v)->mallocFa
d330: 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 7a 20  iled );.  if( z 
d340: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
d350: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 65 74    if( sqlite3Get
d360: 49 6e 74 33 32 28 7a 2c 20 26 69 29 20 29 7b 0a  Int32(z, &i) ){.
d370: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d380: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
d390: 65 67 65 72 2c 20 69 2c 20 30 29 3b 0a 20 20 20  eger, i, 0);.   
d3a0: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
d3b0: 65 33 46 69 74 73 49 6e 36 34 42 69 74 73 28 7a  e3FitsIn64Bits(z
d3c0: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
d3d0: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
d3e0: 49 6e 74 36 34 2c 20 30 2c 20 30 2c 20 7a 2c 20  Int64, 0, 0, z, 
d3f0: 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
d400: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d410: 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20  Op3(v, OP_Real, 
d420: 30 2c 20 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  0, 0, z, n);.   
d430: 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   }.  }.}.../*.**
d440: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
d450: 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74  hat will extract
d460: 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20   the iColumn-th 
d470: 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74  column from.** t
d480: 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 70 75  able pTab and pu
d490: 73 68 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 76  sh that column v
d4a0: 61 6c 75 65 20 6f 6e 20 74 68 65 20 73 74 61 63  alue on the stac
d4b0: 6b 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20  k.  There.** is 
d4c0: 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74  an open cursor t
d4d0: 6f 20 70 54 61 62 20 69 6e 20 69 54 61 62 6c 65  o pTab in iTable
d4e0: 2e 20 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20  .  If iColumn<0 
d4f0: 74 68 65 6e 0a 2a 2a 20 63 6f 64 65 20 69 73 20  then.** code is 
d500: 67 65 6e 65 72 61 74 65 64 20 74 68 61 74 20 65  generated that e
d510: 78 74 72 61 63 74 73 20 74 68 65 20 72 6f 77 69  xtracts the rowi
d520: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
d530: 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
d540: 75 6d 6e 28 56 64 62 65 20 2a 76 2c 20 54 61 62  umn(Vdbe *v, Tab
d550: 6c 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 43  le *pTab, int iC
d560: 6f 6c 75 6d 6e 2c 20 69 6e 74 20 69 54 61 62 6c  olumn, int iTabl
d570: 65 29 7b 0a 20 20 69 66 28 20 69 43 6f 6c 75 6d  e){.  if( iColum
d580: 6e 3c 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f  n<0 ){.    int o
d590: 70 20 3d 20 28 70 54 61 62 20 26 26 20 49 73 56  p = (pTab && IsV
d5a0: 69 72 74 75 61 6c 28 70 54 61 62 29 29 20 3f 20  irtual(pTab)) ? 
d5b0: 4f 50 5f 56 52 6f 77 69 64 20 3a 20 4f 50 5f 52  OP_VRowid : OP_R
d5c0: 6f 77 69 64 3b 0a 20 20 20 20 73 71 6c 69 74 65  owid;.    sqlite
d5d0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  3VdbeAddOp(v, op
d5e0: 2c 20 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20  , iTable, 0);.  
d5f0: 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62 3d 3d  }else if( pTab==
d600: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
d610: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
d620: 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 6c 65 2c 20  Column, iTable, 
d630: 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 7d 65 6c 73  iColumn);.  }els
d640: 65 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  e{.    int op = 
d650: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
d660: 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f  ? OP_VColumn : O
d670: 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71  P_Column;.    sq
d680: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
d690: 2c 20 6f 70 2c 20 69 54 61 62 6c 65 2c 20 69 43  , op, iTable, iC
d6a0: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 73 71 6c 69  olumn);.    sqli
d6b0: 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74  te3ColumnDefault
d6c0: 28 76 2c 20 70 54 61 62 2c 20 69 43 6f 6c 75 6d  (v, pTab, iColum
d6d0: 6e 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  n);.#ifndef SQLI
d6e0: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
d6f0: 5f 50 4f 49 4e 54 0a 20 20 20 20 69 66 28 20 70  _POINT.    if( p
d700: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d  Tab->aCol[iColum
d710: 6e 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  n].affinity==SQL
d720: 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 29 7b 0a  ITE_AFF_REAL ){.
d730: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d740: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 61  eAddOp(v, OP_Rea
d750: 6c 41 66 66 69 6e 69 74 79 2c 20 30 2c 20 30 29  lAffinity, 0, 0)
d760: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
d770: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
d780: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
d790: 68 65 20 63 75 72 72 65 6e 74 20 56 64 62 65 20  he current Vdbe 
d7a0: 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
d7b0: 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73  given.** express
d7c0: 69 6f 6e 20 61 6e 64 20 6c 65 61 76 65 20 74 68  ion and leave th
d7d0: 65 20 72 65 73 75 6c 74 20 6f 6e 20 74 68 65 20  e result on the 
d7e0: 74 6f 70 20 6f 66 20 73 74 61 63 6b 2e 0a 2a 2a  top of stack..**
d7f0: 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65  .** This code de
d800: 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63  pends on the fac
d810: 74 20 74 68 61 74 20 63 65 72 74 61 69 6e 20 74  t that certain t
d820: 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a  oken values (ex:
d830: 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74   TK_EQ).** are t
d840: 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64  he same as opcod
d850: 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50  e values (ex: OP
d860: 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d  _Eq) that implem
d870: 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f  ent the correspo
d880: 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69  nding.** operati
d890: 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d  on.  Special com
d8a0: 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20  ments in vdbe.c 
d8b0: 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65  and the mkopcode
d8c0: 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a  h.awk script in.
d8d0: 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63  ** the make proc
d8e0: 65 73 73 20 63 61 75 73 65 20 74 68 65 73 65 20  ess cause these 
d8f0: 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e  values to align.
d900: 20 20 41 73 73 65 72 74 28 29 73 20 69 6e 20 74    Assert()s in t
d910: 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77  he code.** below
d920: 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
d930: 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69   numbers are ali
d940: 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a  gned correctly..
d950: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
d960: 78 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70  xprCode(Parse *p
d970: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
d980: 70 72 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  pr){.  Vdbe *v =
d990: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
d9a0: 20 20 69 6e 74 20 6f 70 3b 0a 20 20 69 6e 74 20    int op;.  int 
d9b0: 73 74 61 63 6b 43 68 6e 67 20 3d 20 31 3b 20 20  stackChng = 1;  
d9c0: 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 63    /* Amount of c
d9d0: 68 61 6e 67 65 20 74 6f 20 73 74 61 63 6b 20 64  hange to stack d
d9e0: 65 70 74 68 20 2a 2f 0a 0a 20 20 69 66 28 20 76  epth */..  if( v
d9f0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
da00: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a  if( pExpr==0 ){.
da10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
da20: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  ddOp(v, OP_Null,
da30: 20 30 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75   0, 0);.    retu
da40: 72 6e 3b 0a 20 20 7d 0a 20 20 6f 70 20 3d 20 70  rn;.  }.  op = p
da50: 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74  Expr->op;.  swit
da60: 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
da70: 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
da80: 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66  : {.      AggInf
da90: 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 45  o *pAggInfo = pE
daa0: 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20  xpr->pAggInfo;. 
dab0: 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
dac0: 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20  nfo_col *pCol = 
dad0: 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b  &pAggInfo->aCol[
dae0: 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20  pExpr->iAgg];.  
daf0: 20 20 20 20 69 66 28 20 21 70 41 67 67 49 6e 66      if( !pAggInf
db00: 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 29 7b  o->directMode ){
db10: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
db20: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
db30: 4d 65 6d 4c 6f 61 64 2c 20 70 43 6f 6c 2d 3e 69  MemLoad, pCol->i
db40: 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Mem, 0);.       
db50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65   break;.      }e
db60: 6c 73 65 20 69 66 28 20 70 41 67 67 49 6e 66 6f  lse if( pAggInfo
db70: 2d 3e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20  ->useSortingIdx 
db80: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
db90: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
dba0: 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e  P_Column, pAggIn
dbb0: 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64 78 2c 0a  fo->sortingIdx,.
dbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
dbe0: 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
dbf0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  n);.        brea
dc00: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
dc10: 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66   /* Otherwise, f
dc20: 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68  all thru into th
dc30: 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65  e TK_COLUMN case
dc40: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   */.    }.    ca
dc50: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
dc60: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
dc70: 3e 69 54 61 62 6c 65 3c 30 20 29 7b 0a 20 20 20  >iTable<0 ){.   
dc80: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c       /* This onl
dc90: 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63  y happens when c
dca0: 6f 64 69 6e 67 20 63 68 65 63 6b 20 63 6f 6e 73  oding check cons
dcb0: 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20  traints */.     
dcc0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
dcd0: 65 2d 3e 63 6b 4f 66 66 73 65 74 3e 30 20 29 3b  e->ckOffset>0 );
dce0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
dcf0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
dd00: 44 75 70 2c 20 70 50 61 72 73 65 2d 3e 63 6b 4f  Dup, pParse->ckO
dd10: 66 66 73 65 74 2d 70 45 78 70 72 2d 3e 69 43 6f  ffset-pExpr->iCo
dd20: 6c 75 6d 6e 2d 31 2c 20 31 29 3b 0a 20 20 20 20  lumn-1, 1);.    
dd30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
dd40: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
dd50: 47 65 74 43 6f 6c 75 6d 6e 28 76 2c 20 70 45 78  GetColumn(v, pEx
dd60: 70 72 2d 3e 70 54 61 62 2c 20 70 45 78 70 72 2d  pr->pTab, pExpr-
dd70: 3e 69 43 6f 6c 75 6d 6e 2c 20 70 45 78 70 72 2d  >iColumn, pExpr-
dd80: 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20  >iTable);.      
dd90: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
dda0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
ddb0: 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
ddc0: 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 76 2c    codeInteger(v,
ddd0: 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74   (char*)pExpr->t
dde0: 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74  oken.z, pExpr->t
ddf0: 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 62  oken.n);.      b
de00: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
de10: 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20  case TK_FLOAT:. 
de20: 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
de30: 47 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  G: {.      asser
de40: 74 28 20 54 4b 5f 46 4c 4f 41 54 3d 3d 4f 50 5f  t( TK_FLOAT==OP_
de50: 52 65 61 6c 20 29 3b 0a 20 20 20 20 20 20 61 73  Real );.      as
de60: 73 65 72 74 28 20 54 4b 5f 53 54 52 49 4e 47 3d  sert( TK_STRING=
de70: 3d 4f 50 5f 53 74 72 69 6e 67 38 20 29 3b 0a 20  =OP_String8 );. 
de80: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75       sqlite3Dequ
de90: 6f 74 65 45 78 70 72 28 70 50 61 72 73 65 2d 3e  oteExpr(pParse->
dea0: 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  db, pExpr);.    
deb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
dec0: 28 76 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 28 63  (v, op, 0, 0, (c
ded0: 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65  har*)pExpr->toke
dee0: 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  n.z, pExpr->toke
def0: 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  n.n);.      brea
df00: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
df10: 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20  e TK_NULL: {.   
df20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
df30: 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  dOp(v, OP_Null, 
df40: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  0, 0);.      bre
df50: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
df60: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c  f SQLITE_OMIT_BL
df70: 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63  OB_LITERAL.    c
df80: 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20  ase TK_BLOB: {. 
df90: 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
dfa0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
dfb0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
dfc0: 4b 5f 42 4c 4f 42 3d 3d 4f 50 5f 48 65 78 42 6c  K_BLOB==OP_HexBl
dfd0: 6f 62 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20  ob );.      n = 
dfe0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 2d  pExpr->token.n -
dff0: 20 33 3b 0a 20 20 20 20 20 20 7a 20 3d 20 28 63   3;.      z = (c
e000: 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65  har*)pExpr->toke
e010: 6e 2e 7a 20 2b 20 32 3b 0a 20 20 20 20 20 20 61  n.z + 2;.      a
e020: 73 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a 20  ssert( n>=0 );. 
e030: 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b       if( n==0 ){
e040: 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 22 22 3b  .        z = "";
e050: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
e060: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
e070: 20 6f 70 2c 20 30 2c 20 30 2c 20 7a 2c 20 6e 29   op, 0, 0, z, n)
e080: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
e090: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
e0a0: 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45  case TK_VARIABLE
e0b0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
e0c0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
e0d0: 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70 72  _Variable, pExpr
e0e0: 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20  ->iTable, 0);.  
e0f0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74      if( pExpr->t
e100: 6f 6b 65 6e 2e 6e 3e 31 20 29 7b 0a 20 20 20 20  oken.n>1 ){.    
e110: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
e120: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 28  hangeP3(v, -1, (
e130: 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b  char*)pExpr->tok
e140: 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  en.z, pExpr->tok
e150: 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  en.n);.      }. 
e160: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e170: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  }.    case TK_RE
e180: 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20  GISTER: {.      
e190: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e1a0: 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20  (v, OP_MemLoad, 
e1b0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30  pExpr->iTable, 0
e1c0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
e1d0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
e1e0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20  LITE_OMIT_CAST. 
e1f0: 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a     case TK_CAST:
e200: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72   {.      /* Expr
e210: 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66  essions of the f
e220: 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66  orm:   CAST(pLef
e230: 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20  t AS token) */. 
e240: 20 20 20 20 20 69 6e 74 20 61 66 66 2c 20 74 6f       int aff, to
e250: 5f 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  _op;.      sqlit
e260: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
e270: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
e280: 3b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 73 71  ;.      aff = sq
e290: 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70  lite3AffinityTyp
e2a0: 65 28 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 29  e(&pExpr->token)
e2b0: 3b 0a 20 20 20 20 20 20 74 6f 5f 6f 70 20 3d 20  ;.      to_op = 
e2c0: 61 66 66 20 2d 20 53 51 4c 49 54 45 5f 41 46 46  aff - SQLITE_AFF
e2d0: 5f 54 45 58 54 20 2b 20 4f 50 5f 54 6f 54 65 78  _TEXT + OP_ToTex
e2e0: 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
e2f0: 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 54 65 78   to_op==OP_ToTex
e300: 74 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c  t    || aff!=SQL
e310: 49 54 45 5f 41 46 46 5f 54 45 58 54 20 20 20 20  ITE_AFF_TEXT    
e320: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
e330: 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f   to_op==OP_ToBlo
e340: 62 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c  b    || aff!=SQL
e350: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 20 20 20  ITE_AFF_NONE    
e360: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
e370: 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d   to_op==OP_ToNum
e380: 65 72 69 63 20 7c 7c 20 61 66 66 21 3d 53 51 4c  eric || aff!=SQL
e390: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
e3a0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
e3b0: 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 49 6e 74   to_op==OP_ToInt
e3c0: 20 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c       || aff!=SQL
e3d0: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
e3e0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
e3f0: 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61   to_op==OP_ToRea
e400: 6c 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c  l    || aff!=SQL
e410: 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 20 20 20  ITE_AFF_REAL    
e420: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e430: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 74 6f 5f  VdbeAddOp(v, to_
e440: 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  op, 0, 0);.     
e450: 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 30 3b 0a   stackChng = 0;.
e460: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e470: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
e480: 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f  ITE_OMIT_CAST */
e490: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
e4a0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
e4b0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
e4c0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
e4d0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
e4e0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
e4f0: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
e500: 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b   TK_LT==OP_Lt );
e510: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
e520: 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20  K_LE==OP_Le );. 
e530: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
e540: 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20  GT==OP_Gt );.   
e550: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45     assert( TK_GE
e560: 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20 20  ==OP_Ge );.     
e570: 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d   assert( TK_EQ==
e580: 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 61  OP_Eq );.      a
e590: 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50  ssert( TK_NE==OP
e5a0: 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  _Ne );.      sql
e5b0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
e5c0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
e5d0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
e5e0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
e5f0: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
e600: 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
e610: 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
e620: 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
e630: 3e 70 52 69 67 68 74 2c 20 6f 70 2c 20 30 2c 20  >pRight, op, 0, 
e640: 30 29 3b 0a 20 20 20 20 20 20 73 74 61 63 6b 43  0);.      stackC
e650: 68 6e 67 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  hng = -1;.      
e660: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
e670: 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20   case TK_AND:.  
e680: 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20    case TK_OR:.  
e690: 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a    case TK_PLUS:.
e6a0: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52      case TK_STAR
e6b0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49  :.    case TK_MI
e6c0: 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NUS:.    case TK
e6d0: 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54  _REM:.    case T
e6e0: 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61  K_BITAND:.    ca
e6f0: 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20  se TK_BITOR:.   
e700: 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a   case TK_SLASH:.
e710: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49      case TK_LSHI
e720: 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  FT:.    case TK_
e730: 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73  RSHIFT: .    cas
e740: 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20  e TK_CONCAT: {. 
e750: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
e760: 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 0a 20  AND==OP_And );. 
e770: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
e780: 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 0a 20 20 20  OR==OP_Or );.   
e790: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 50 4c     assert( TK_PL
e7a0: 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 0a 20 20  US==OP_Add );.  
e7b0: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d      assert( TK_M
e7c0: 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63  INUS==OP_Subtrac
e7d0: 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
e7e0: 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65  t( TK_REM==OP_Re
e7f0: 6d 61 69 6e 64 65 72 20 29 3b 0a 20 20 20 20 20  mainder );.     
e800: 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 41   assert( TK_BITA
e810: 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b  ND==OP_BitAnd );
e820: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
e830: 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f  K_BITOR==OP_BitO
e840: 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  r );.      asser
e850: 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f  t( TK_SLASH==OP_
e860: 44 69 76 69 64 65 20 29 3b 0a 20 20 20 20 20 20  Divide );.      
e870: 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48 49 46  assert( TK_LSHIF
e880: 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20  T==OP_ShiftLeft 
e890: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
e8a0: 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53   TK_RSHIFT==OP_S
e8b0: 68 69 66 74 52 69 67 68 74 20 29 3b 0a 20 20 20  hiftRight );.   
e8c0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 43 4f     assert( TK_CO
e8d0: 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20  NCAT==OP_Concat 
e8e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e8f0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
e900: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
e910: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
e920: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
e930: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
e940: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e950: 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30  ddOp(v, op, 0, 0
e960: 29 3b 0a 20 20 20 20 20 20 73 74 61 63 6b 43 68  );.      stackCh
e970: 6e 67 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 62  ng = -1;.      b
e980: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
e990: 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
e9a0: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  {.      Expr *pL
e9b0: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
e9c0: 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ft;.      assert
e9d0: 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20  ( pLeft );.     
e9e0: 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d   if( pLeft->op==
e9f0: 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20 70 4c 65 66  TK_FLOAT || pLef
ea00: 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45  t->op==TK_INTEGE
ea10: 52 20 29 7b 0a 20 20 20 20 20 20 20 20 54 6f 6b  R ){.        Tok
ea20: 65 6e 20 2a 70 20 3d 20 26 70 4c 65 66 74 2d 3e  en *p = &pLeft->
ea30: 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 63  token;.        c
ea40: 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33  har *z = sqlite3
ea50: 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e  MPrintf(pParse->
ea60: 64 62 2c 20 22 2d 25 2e 2a 73 22 2c 20 70 2d 3e  db, "-%.*s", p->
ea70: 6e 2c 20 70 2d 3e 7a 29 3b 0a 20 20 20 20 20 20  n, p->z);.      
ea80: 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d    if( pLeft->op=
ea90: 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20  =TK_FLOAT ){.   
eaa0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
eab0: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61 6c  beOp3(v, OP_Real
eac0: 2c 20 30 2c 20 30 2c 20 7a 2c 20 70 2d 3e 6e 2b  , 0, 0, z, p->n+
ead0: 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  1);.        }els
eae0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 64  e{.          cod
eaf0: 65 49 6e 74 65 67 65 72 28 76 2c 20 7a 2c 20 70  eInteger(v, z, p
eb00: 2d 3e 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  ->n+1);.        
eb10: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
eb20: 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20 20 20  3_free(z);.     
eb30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
eb40: 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20  }.      /* Fall 
eb50: 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 54 4b 5f  through into TK_
eb60: 4e 4f 54 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  NOT */.    }.   
eb70: 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a   case TK_BITNOT:
eb80: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
eb90: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
eba0: 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f  ( TK_BITNOT==OP_
ebb0: 42 69 74 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20  BitNot );.      
ebc0: 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d  assert( TK_NOT==
ebd0: 4f 50 5f 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20  OP_Not );.      
ebe0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
ebf0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
ec00: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
ec10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
ec20: 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20   op, 0, 0);.    
ec30: 20 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 30 3b    stackChng = 0;
ec40: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ec50: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
ec60: 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
ec70: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
ec80: 20 20 20 20 20 69 6e 74 20 64 65 73 74 3b 0a 20       int dest;. 
ec90: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
eca0: 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c  ISNULL==OP_IsNul
ecb0: 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  l );.      asser
ecc0: 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f  t( TK_NOTNULL==O
ecd0: 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20  P_NotNull );.   
ece0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ecf0: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
ed00: 72 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  r, 1, 0);.      
ed10: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
ed20: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
ed30: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 64 65 73  Left);.      des
ed40: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
ed50: 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
ed60: 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  2;.      sqlite3
ed70: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c  VdbeAddOp(v, op,
ed80: 20 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20   1, dest);.     
ed90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
eda0: 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  p(v, OP_AddImm, 
edb0: 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 74  -1, 0);.      st
edc0: 61 63 6b 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20  ackChng = 0;.   
edd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ede0: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
edf0: 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
ee00: 20 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f    AggInfo *pInfo
ee10: 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e   = pExpr->pAggIn
ee20: 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  fo;.      if( pI
ee30: 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nfo==0 ){.      
ee40: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
ee50: 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73  g(pParse, "misus
ee60: 65 20 6f 66 20 61 67 67 72 65 67 61 74 65 3a 20  e of aggregate: 
ee70: 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %T",.           
ee80: 20 26 70 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a   &pExpr->span);.
ee90: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
eea0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
eeb0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c  AddOp(v, OP_MemL
eec0: 6f 61 64 2c 20 70 49 6e 66 6f 2d 3e 61 46 75 6e  oad, pInfo->aFun
eed0: 63 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69  c[pExpr->iAgg].i
eee0: 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  Mem, 0);.      }
eef0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ef00: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
ef10: 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20 20  CONST_FUNC:.    
ef20: 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  case TK_FUNCTION
ef30: 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69  : {.      ExprLi
ef40: 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70  st *pList = pExp
ef50: 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  r->pList;.      
ef60: 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 4c 69 73  int nExpr = pLis
ef70: 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  t ? pList->nExpr
ef80: 20 3a 20 30 3b 0a 20 20 20 20 20 20 46 75 6e 63   : 0;.      Func
ef90: 44 65 66 20 2a 70 44 65 66 3b 0a 20 20 20 20 20  Def *pDef;.     
efa0: 20 69 6e 74 20 6e 49 64 3b 0a 20 20 20 20 20 20   int nId;.      
efb0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b  const char *zId;
efc0: 0a 20 20 20 20 20 20 69 6e 74 20 63 6f 6e 73 74  .      int const
efd0: 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  Mask = 0;.      
efe0: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 71 6c  int i;.      sql
eff0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
f000: 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 75 38 20  e->db;.      u8 
f010: 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
f020: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
f030: 6f 6c 6c 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  oll = 0;..      
f040: 7a 49 64 20 3d 20 28 63 68 61 72 2a 29 70 45 78  zId = (char*)pEx
f050: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20  pr->token.z;.   
f060: 20 20 20 6e 49 64 20 3d 20 70 45 78 70 72 2d 3e     nId = pExpr->
f070: 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 70  token.n;.      p
f080: 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Def = sqlite3Fin
f090: 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  dFunction(pParse
f0a0: 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20  ->db, zId, nId, 
f0b0: 6e 45 78 70 72 2c 20 65 6e 63 2c 20 30 29 3b 0a  nExpr, enc, 0);.
f0c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44        assert( pD
f0d0: 65 66 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e  ef!=0 );.      n
f0e0: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
f0f0: 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
f100: 50 61 72 73 65 2c 20 70 4c 69 73 74 29 3b 0a 23  Parse, pList);.#
f110: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f120: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
f130: 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c        /* Possibl
f140: 79 20 6f 76 65 72 6c 6f 61 64 20 74 68 65 20 66  y overload the f
f150: 75 6e 63 74 69 6f 6e 20 69 66 20 74 68 65 20 66  unction if the f
f160: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
f170: 0a 20 20 20 20 20 20 2a 2a 20 61 20 76 69 72 74  .      ** a virt
f180: 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  ual table column
f190: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
f1a0: 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78 20 66 75   ** For infix fu
f1b0: 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47  nctions (LIKE, G
f1c0: 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20 61 6e 64  LOB, REGEXP, and
f1d0: 20 4d 41 54 43 48 29 20 75 73 65 20 74 68 65 0a   MATCH) use the.
f1e0: 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20        ** second 
f1f0: 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68  argument, not th
f200: 65 20 66 69 72 73 74 2c 20 61 73 20 74 68 65 20  e first, as the 
f210: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 65 73 74  argument to test
f220: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65   to.      ** see
f230: 20 69 66 20 69 74 20 69 73 20 61 20 63 6f 6c 75   if it is a colu
f240: 6d 6e 20 69 6e 20 61 20 76 69 72 74 75 61 6c 20  mn in a virtual 
f250: 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20  table.  This is 
f260: 64 6f 6e 65 20 62 65 63 61 75 73 65 0a 20 20 20  done because.   
f270: 20 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f     ** the left o
f280: 70 65 72 61 6e 64 20 6f 66 20 69 6e 66 69 78 20  perand of infix 
f290: 66 75 6e 63 74 69 6f 6e 73 20 28 74 68 65 20 6f  functions (the o
f2a0: 70 65 72 61 6e 64 20 77 65 20 77 61 6e 74 20 74  perand we want t
f2b0: 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72  o.      ** contr
f2c0: 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20  ol overloading) 
f2d0: 65 6e 64 73 20 75 70 20 61 73 20 74 68 65 20 73  ends up as the s
f2e0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
f2f0: 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66  o the.      ** f
f300: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 65 78  unction.  The ex
f310: 70 72 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62  pression "A glob
f320: 20 42 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e   B" is equivalen
f330: 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22  t to .      ** "
f340: 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57 65 20 77  glob(B,A).  We w
f350: 61 6e 74 20 74 6f 20 75 73 65 20 74 68 65 20 41  ant to use the A
f360: 20 69 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 74   in "A glob B" t
f370: 6f 20 74 65 73 74 0a 20 20 20 20 20 20 2a 2a 20  o test.      ** 
f380: 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65  for function ove
f390: 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75 74 20 77  rloading.  But w
f3a0: 65 20 75 73 65 20 74 68 65 20 42 20 74 65 72 6d  e use the B term
f3b0: 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e   in "glob(B,A)".
f3c0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
f3d0: 69 66 28 20 6e 45 78 70 72 3e 3d 32 20 26 26 20  if( nExpr>=2 && 
f3e0: 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20  (pExpr->flags & 
f3f0: 45 50 5f 49 6e 66 69 78 46 75 6e 63 29 20 29 7b  EP_InfixFunc) ){
f400: 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20  .        pDef = 
f410: 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c  sqlite3VtabOverl
f420: 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  oadFunction(db, 
f430: 70 44 65 66 2c 20 6e 45 78 70 72 2c 20 70 4c 69  pDef, nExpr, pLi
f440: 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b  st->a[1].pExpr);
f450: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
f460: 20 6e 45 78 70 72 3e 30 20 29 7b 0a 20 20 20 20   nExpr>0 ){.    
f470: 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
f480: 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75  e3VtabOverloadFu
f490: 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c  nction(db, pDef,
f4a0: 20 6e 45 78 70 72 2c 20 70 4c 69 73 74 2d 3e 61   nExpr, pList->a
f4b0: 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [0].pExpr);.    
f4c0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
f4d0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70   for(i=0; i<nExp
f4e0: 72 20 26 26 20 69 3c 33 32 3b 20 69 2b 2b 29 7b  r && i<32; i++){
f4f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
f500: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
f510: 6e 74 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  nt(pList->a[i].p
f520: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
f530: 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20     constMask |= 
f540: 28 31 3c 3c 69 29 3b 0a 20 20 20 20 20 20 20 20  (1<<i);.        
f550: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 44  }.        if( pD
f560: 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20  ef->needCollSeq 
f570: 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  && !pColl ){.   
f580: 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
f590: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
f5a0: 71 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d  q(pParse, pList-
f5b0: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
f5c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
f5d0: 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e        if( pDef->
f5e0: 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20  needCollSeq ){. 
f5f0: 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c         if( !pCol
f600: 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72  l ) pColl = pPar
f610: 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  se->db->pDfltCol
f620: 6c 3b 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l; .        sqli
f630: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
f640: 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20  _CollSeq, 0, 0, 
f650: 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50  (char *)pColl, P
f660: 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  3_COLLSEQ);.    
f670: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
f680: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 46  3VdbeOp3(v, OP_F
f690: 75 6e 63 74 69 6f 6e 2c 20 63 6f 6e 73 74 4d 61  unction, constMa
f6a0: 73 6b 2c 20 6e 45 78 70 72 2c 20 28 63 68 61 72  sk, nExpr, (char
f6b0: 2a 29 70 44 65 66 2c 20 50 33 5f 46 55 4e 43 44  *)pDef, P3_FUNCD
f6c0: 45 46 29 3b 0a 20 20 20 20 20 20 73 74 61 63 6b  EF);.      stack
f6d0: 43 68 6e 67 20 3d 20 31 2d 6e 45 78 70 72 3b 0a  Chng = 1-nExpr;.
f6e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f6f0: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
f700: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
f710: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53      case TK_EXIS
f720: 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  TS:.    case TK_
f730: 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20  SELECT: {.      
f740: 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
f750: 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  mn==0 ){.       
f760: 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
f770: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45  elect(pParse, pE
f780: 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  xpr);.      }.  
f790: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f7a0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f  ddOp(v, OP_MemLo
f7b0: 61 64 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  ad, pExpr->iColu
f7c0: 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 56 64  mn, 0);.      Vd
f7d0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
f7e0: 20 6c 6f 61 64 20 73 75 62 71 75 65 72 79 20 72   load subquery r
f7f0: 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20  esult"));.      
f800: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
f810: 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
f820: 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
f830: 20 20 20 20 20 63 68 61 72 20 61 66 66 69 6e 69       char affini
f840: 74 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6b  ty;.      int ck
f850: 4f 66 66 73 65 74 20 3d 20 70 50 61 72 73 65 2d  Offset = pParse-
f860: 3e 63 6b 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  >ckOffset;.     
f870: 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
f880: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45  elect(pParse, pE
f890: 78 70 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  xpr);..      /* 
f8a0: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 61  Figure out the a
f8b0: 66 66 69 6e 69 74 79 20 74 6f 20 75 73 65 20 74  ffinity to use t
f8c0: 6f 20 63 72 65 61 74 65 20 61 20 6b 65 79 20 66  o create a key f
f8d0: 72 6f 6d 20 74 68 65 20 72 65 73 75 6c 74 73 0a  rom the results.
f8e0: 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
f8f0: 65 78 70 72 65 73 73 69 6f 6e 2e 20 61 66 66 69  expression. affi
f900: 6e 69 74 79 53 74 72 20 73 74 6f 72 65 73 20 61  nityStr stores a
f910: 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 73   static string s
f920: 75 69 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20  uitable for.    
f930: 20 20 2a 2a 20 50 33 20 6f 66 20 4f 50 5f 4d 61    ** P3 of OP_Ma
f940: 6b 65 52 65 63 6f 72 64 2e 0a 20 20 20 20 20 20  keRecord..      
f950: 2a 2f 0a 20 20 20 20 20 20 61 66 66 69 6e 69 74  */.      affinit
f960: 79 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66  y = comparisonAf
f970: 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 0a  finity(pExpr);..
f980: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f990: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
f9a0: 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a 20 20 20  eger, 1, 0);.   
f9b0: 20 20 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66     pParse->ckOff
f9c0: 73 65 74 20 3d 20 28 63 6b 4f 66 66 73 65 74 20  set = (ckOffset 
f9d0: 3f 20 28 63 6b 4f 66 66 73 65 74 2b 31 29 20 3a  ? (ckOffset+1) :
f9e0: 20 30 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43   0);..      /* C
f9f0: 6f 64 65 20 74 68 65 20 3c 65 78 70 72 3e 20 66  ode the <expr> f
fa00: 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20 28  rom "<expr> IN (
fa10: 2e 2e 2e 29 22 2e 20 54 68 65 20 74 65 6d 70 6f  ...)". The tempo
fa20: 72 61 72 79 20 74 61 62 6c 65 0a 20 20 20 20 20  rary table.     
fa30: 20 2a 2a 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   ** pExpr->iTabl
fa40: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76  e contains the v
fa50: 61 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20  alues that make 
fa60: 75 70 20 74 68 65 20 28 2e 2e 2e 29 20 73 65 74  up the (...) set
fa70: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
fa80: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
fa90: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
faa0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61 64  pLeft);.      ad
fab0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
fac0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
fad0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fae0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74  eAddOp(v, OP_Not
faf0: 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64 64 72 2b 34  Null, -1, addr+4
fb00: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  );            /*
fb10: 20 61 64 64 72 20 2b 20 30 20 2a 2f 0a 20 20 20   addr + 0 */.   
fb20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fb30: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 32  dOp(v, OP_Pop, 2
fb40: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
fb50: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
fb60: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a  OP_Null, 0, 0);.
fb70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fb80: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
fb90: 6f 2c 20 30 2c 20 61 64 64 72 2b 37 29 3b 0a 20  o, 0, addr+7);. 
fba0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fbb0: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
fbc0: 63 6f 72 64 2c 20 31 2c 20 30 2c 20 26 61 66 66  cord, 1, 0, &aff
fbd0: 69 6e 69 74 79 2c 20 31 29 3b 20 20 20 2f 2a 20  inity, 1);   /* 
fbe0: 61 64 64 72 20 2b 20 34 20 2a 2f 0a 20 20 20 20  addr + 4 */.    
fbf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fc00: 4f 70 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  Op(v, OP_Found, 
fc10: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 61  pExpr->iTable, a
fc20: 64 64 72 2b 37 29 3b 0a 20 20 20 20 20 20 73 71  ddr+7);.      sq
fc30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
fc40: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c  , OP_AddImm, -1,
fc50: 20 30 29 3b 20 20 20 20 20 20 20 20 20 20 20 20   0);            
fc60: 20 20 20 20 20 20 2f 2a 20 61 64 64 72 20 2b 20        /* addr + 
fc70: 36 20 2a 2f 0a 0a 20 20 20 20 20 20 62 72 65 61  6 */..      brea
fc80: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
fc90: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
fca0: 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  EEN: {.      Exp
fcb0: 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
fcc0: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 73  ->pLeft;.      s
fcd0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
fce0: 74 65 6d 20 2a 70 4c 49 74 65 6d 20 3d 20 70 45  tem *pLItem = pE
fcf0: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 3b 0a 20  xpr->pList->a;. 
fd00: 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
fd10: 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70  t = pLItem->pExp
fd20: 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
fd30: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
fd40: 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73   pLeft);.      s
fd50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
fd60: 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29  v, OP_Dup, 0, 0)
fd70: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
fd80: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
fd90: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63  pRight);.      c
fda0: 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
fdb0: 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
fdc0: 2c 20 4f 50 5f 47 65 2c 20 30 2c 20 30 29 3b 0a  , OP_Ge, 0, 0);.
fdd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fde0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c  eAddOp(v, OP_Pul
fdf0: 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  l, 1, 0);.      
fe00: 70 4c 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20  pLItem++;.      
fe10: 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d  pRight = pLItem-
fe20: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  >pExpr;.      sq
fe30: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
fe40: 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20  arse, pRight);. 
fe50: 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
fe60: 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
fe70: 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 30  pRight, OP_Le, 0
fe80: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
fe90: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
fea0: 4f 50 5f 41 6e 64 2c 20 30 2c 20 30 29 3b 0a 20  OP_And, 0, 0);. 
feb0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
fec0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50  }.    case TK_UP
fed0: 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  LUS: {.      sql
fee0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
fef0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
ff00: 74 29 3b 0a 20 20 20 20 20 20 73 74 61 63 6b 43  t);.      stackC
ff10: 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  hng = 0;.      b
ff20: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
ff30: 63 61 73 65 20 54 4b 5f 43 41 53 45 3a 20 7b 0a  case TK_CASE: {.
ff40: 20 20 20 20 20 20 69 6e 74 20 65 78 70 72 5f 65        int expr_e
ff50: 6e 64 5f 6c 61 62 65 6c 3b 0a 20 20 20 20 20 20  nd_label;.      
ff60: 69 6e 74 20 6a 75 6d 70 49 6e 73 74 3b 0a 20 20  int jumpInst;.  
ff70: 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20      int nExpr;. 
ff80: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
ff90: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
ffa0: 73 74 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74  st;.      struct
ffb0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
ffc0: 61 4c 69 73 74 65 6c 65 6d 3b 0a 0a 20 20 20 20  aListelem;..    
ffd0: 20 20 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e    assert(pExpr->
ffe0: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 61 73  pList);.      as
fff0: 73 65 72 74 28 28 70 45 78 70 72 2d 3e 70 4c 69  sert((pExpr->pLi
10000 73 74 2d 3e 6e 45 78 70 72 20 25 20 32 29 20 3d  st->nExpr % 2) =
10010 3d 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  = 0);.      asse
10020 72 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  rt(pExpr->pList-
10030 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20 20  >nExpr > 0);.   
10040 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70     pEList = pExp
10050 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  r->pList;.      
10060 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69  aListelem = pELi
10070 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78  st->a;.      nEx
10080 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  pr = pEList->nEx
10090 70 72 3b 0a 20 20 20 20 20 20 65 78 70 72 5f 65  pr;.      expr_e
100a0 6e 64 5f 6c 61 62 65 6c 20 3d 20 73 71 6c 69 74  nd_label = sqlit
100b0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
100c0 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  v);.      if( pE
100d0 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20  xpr->pLeft ){.  
100e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
100f0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
10100 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
10110 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
10120 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 3d 69  =0; i<nExpr; i=i
10130 2b 32 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  +2){.        sql
10140 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
10150 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69  rse, aListelem[i
10160 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
10170 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65    if( pExpr->pLe
10180 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ft ){.          
10190 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
101a0 28 76 2c 20 4f 50 5f 44 75 70 2c 20 31 2c 20 31  (v, OP_Dup, 1, 1
101b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 75 6d  );.          jum
101c0 70 49 6e 73 74 20 3d 20 63 6f 64 65 43 6f 6d 70  pInst = codeComp
101d0 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
101e0 72 2d 3e 70 4c 65 66 74 2c 20 61 4c 69 73 74 65  r->pLeft, aListe
101f0 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 2c 0a 20 20  lem[i].pExpr,.  
10200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f                 O
10220 50 5f 4e 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20  P_Ne, 0, 1);.   
10230 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
10240 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
10250 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 1, 0);.      
10260 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10270 20 20 20 6a 75 6d 70 49 6e 73 74 20 3d 20 73 71     jumpInst = sq
10280 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
10290 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 31 2c 20 30  , OP_IfNot, 1, 0
102a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
102b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
102c0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69  Code(pParse, aLi
102d0 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70  stelem[i+1].pExp
102e0 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
102f0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10300 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 78 70 72  OP_Goto, 0, expr
10310 5f 65 6e 64 5f 6c 61 62 65 6c 29 3b 0a 20 20 20  _end_label);.   
10320 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10330 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 75 6d 70  JumpHere(v, jump
10340 49 6e 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Inst);.      }. 
10350 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
10360 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20  pLeft ){.       
10370 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10380 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20  p(v, OP_Pop, 1, 
10390 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
103a0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69    if( pExpr->pRi
103b0 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ght ){.        s
103c0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
103d0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
103e0 69 67 68 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ight);.      }el
103f0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
10400 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10410 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a  OP_Null, 0, 0);.
10420 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
10430 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
10440 4c 61 62 65 6c 28 76 2c 20 65 78 70 72 5f 65 6e  Label(v, expr_en
10450 64 5f 6c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  d_label);.      
10460 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
10470 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10480 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63 61 73  _TRIGGER.    cas
10490 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20  e TK_RAISE: {.  
104a0 20 20 20 20 69 66 28 20 21 70 50 61 72 73 65 2d      if( !pParse-
104b0 3e 74 72 69 67 53 74 61 63 6b 20 29 7b 0a 20 20  >trigStack ){.  
104c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
104d0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
104e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104f0 20 20 20 20 20 22 52 41 49 53 45 28 29 20 6d 61       "RAISE() ma
10500 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77  y only be used w
10510 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 2d  ithin a trigger-
10520 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20  program");.     
10530 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
10540 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   }.      if( pEx
10550 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 4f 45 5f  pr->iColumn!=OE_
10560 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20  Ignore ){.      
10570 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
10580 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 4f 45 5f 52 6f  ->iColumn==OE_Ro
10590 6c 6c 62 61 63 6b 20 7c 7c 0a 20 20 20 20 20 20  llback ||.      
105a0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
105b0 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f  ->iColumn == OE_
105c0 41 62 6f 72 74 20 7c 7c 0a 20 20 20 20 20 20 20  Abort ||.       
105d0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
105e0 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 46  >iColumn == OE_F
105f0 61 69 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ail );.         
10600 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 45 78  sqlite3DequoteEx
10610 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  pr(pParse->db, p
10620 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
10630 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
10640 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54  , OP_Halt, SQLIT
10650 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 70 45  E_CONSTRAINT, pE
10660 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20  xpr->iColumn,.  
10670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10680 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 45 78        (char*)pEx
10690 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
106a0 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20  pr->token.n);.  
106b0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
106c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
106d0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20  xpr->iColumn == 
106e0 4f 45 5f 49 67 6e 6f 72 65 20 29 3b 0a 20 20 20  OE_Ignore );.   
106f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10700 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6e  eAddOp(v, OP_Con
10710 74 65 78 74 50 6f 70 2c 20 30 2c 20 30 29 3b 0a  textPop, 0, 0);.
10720 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
10730 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10740 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d  Goto, 0, pParse-
10750 3e 74 72 69 67 53 74 61 63 6b 2d 3e 69 67 6e 6f  >trigStack->igno
10760 72 65 4a 75 6d 70 29 3b 0a 20 20 20 20 20 20 20  reJump);.       
10770 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
10780 2c 20 22 23 20 72 61 69 73 65 28 49 47 4e 4f 52  , "# raise(IGNOR
10790 45 29 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  E)"));.      }. 
107a0 20 20 20 20 20 73 74 61 63 6b 43 68 6e 67 20 3d       stackChng =
107b0 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
107c0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
107d0 7d 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  }..  if( pParse-
107e0 3e 63 6b 4f 66 66 73 65 74 20 29 7b 0a 20 20 20  >ckOffset ){.   
107f0 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65   pParse->ckOffse
10800 74 20 2b 3d 20 73 74 61 63 6b 43 68 6e 67 3b 0a  t += stackChng;.
10810 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
10820 73 65 2d 3e 63 6b 4f 66 66 73 65 74 20 29 3b 0a  se->ckOffset );.
10830 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
10840 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
10850 45 52 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  ER./*.** Generat
10860 65 20 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c  e code that eval
10870 75 74 65 73 20 74 68 65 20 67 69 76 65 6e 20 65  utes the given e
10880 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 6c 65  xpression and le
10890 61 76 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a  aves the result.
108a0 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  ** on the stack.
108b0 20 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74    See also sqlit
108c0 65 33 45 78 70 72 43 6f 64 65 28 29 2e 0a 2a 2a  e3ExprCode()..**
108d0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
108e0 20 6d 69 67 68 74 20 61 6c 73 6f 20 63 61 63 68   might also cach
108f0 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 6e 64  e the result and
10900 20 6d 6f 64 69 66 79 20 74 68 65 20 70 45 78 70   modify the pExp
10910 72 20 74 72 65 65 0a 2a 2a 20 73 6f 20 74 68 61  r tree.** so tha
10920 74 20 69 74 20 77 69 6c 6c 20 6d 61 6b 65 20 75  t it will make u
10930 73 65 20 6f 66 20 74 68 65 20 63 61 63 68 65 64  se of the cached
10940 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65   result on subse
10950 71 75 65 6e 74 20 65 76 61 6c 75 61 74 69 6f 6e  quent evaluation
10960 73 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e  s.** rather than
10970 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 77 68   evaluate the wh
10980 6f 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  ole expression a
10990 67 61 69 6e 2e 20 20 54 72 69 76 69 61 6c 20 65  gain.  Trivial e
109a0 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a  xpressions are.*
109b0 2a 20 6e 6f 74 20 63 61 63 68 65 64 2e 20 20 49  * not cached.  I
109c0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
109d0 20 69 73 20 63 61 63 68 65 64 2c 20 69 74 73 20   is cached, its 
109e0 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64  result is stored
109f0 20 69 6e 20 61 20 0a 2a 2a 20 6d 65 6d 6f 72 79   in a .** memory
10a00 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   location..*/.vo
10a10 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
10a20 64 65 41 6e 64 43 61 63 68 65 28 50 61 72 73 65  deAndCache(Parse
10a30 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
10a40 70 45 78 70 72 29 7b 0a 20 20 56 64 62 65 20 2a  pExpr){.  Vdbe *
10a50 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
10a60 65 3b 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 20  e;.  int iMem;. 
10a70 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72   int addr1, addr
10a80 32 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  2;.  if( v==0 ) 
10a90 72 65 74 75 72 6e 3b 0a 20 20 61 64 64 72 31 20  return;.  addr1 
10aa0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
10ab0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 73  rentAddr(v);.  s
10ac0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
10ad0 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
10ae0 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33   addr2 = sqlite3
10af0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
10b00 76 29 3b 0a 20 20 69 66 28 20 61 64 64 72 32 3e  v);.  if( addr2>
10b10 61 64 64 72 31 2b 31 20 7c 7c 20 73 71 6c 69 74  addr1+1 || sqlit
10b20 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 61  e3VdbeGetOp(v, a
10b30 64 64 72 31 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ddr1)->opcode==O
10b40 50 5f 46 75 6e 63 74 69 6f 6e 20 29 7b 0a 20 20  P_Function ){.  
10b50 20 20 69 4d 65 6d 20 3d 20 70 45 78 70 72 2d 3e    iMem = pExpr->
10b60 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d  iTable = pParse-
10b70 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 73 71 6c  >nMem++;.    sql
10b80 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
10b90 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d   OP_MemStore, iM
10ba0 65 6d 2c 20 30 29 3b 0a 20 20 20 20 70 45 78 70  em, 0);.    pExp
10bb0 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53  r->op = TK_REGIS
10bc0 54 45 52 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  TER;.  }.}.#endi
10bd0 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  f../*.** Generat
10be0 65 20 63 6f 64 65 20 74 68 61 74 20 70 75 73 68  e code that push
10bf0 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  es the value of 
10c00 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66  every element of
10c10 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78   the given.** ex
10c20 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 6f 6e  pression list on
10c30 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a  to the stack..**
10c40 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
10c50 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
10c60 73 20 70 75 73 68 65 64 20 6f 6e 74 6f 20 74 68  s pushed onto th
10c70 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a 69 6e 74 20  e stack..*/.int 
10c80 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
10c90 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65  xprList(.  Parse
10ca0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
10cb0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
10cc0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
10cd0 70 4c 69 73 74 20 20 20 20 2f 2a 20 54 68 65 20  pList    /* The 
10ce0 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
10cf0 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 29  to be coded */.)
10d00 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  {.  struct ExprL
10d10 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
10d20 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69  .  int i, n;.  i
10d30 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
10d40 74 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 70 4c  turn 0;.  n = pL
10d50 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 66 6f  ist->nExpr;.  fo
10d60 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  r(pItem=pList->a
10d70 2c 20 69 3d 6e 3b 20 69 3e 30 3b 20 69 2d 2d 2c  , i=n; i>0; i--,
10d80 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73   pItem++){.    s
10d90 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
10da0 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45  Parse, pItem->pE
10db0 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  xpr);.  }.  retu
10dc0 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn n;.}../*.** G
10dd0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
10de0 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65   a boolean expre
10df0 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20  ssion such that 
10e00 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a  a jump is made.*
10e10 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22  * to the label "
10e20 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70  dest" if the exp
10e30 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20  ression is true 
10e40 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a  but execution.**
10e50 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69   continues strai
10e60 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20  ght thru if the 
10e70 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61  expression is fa
10e80 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  lse..**.** If th
10e90 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61  e expression eva
10ea0 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28  luates to NULL (
10eb0 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72  neither true nor
10ec0 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a   false), then.**
10ed0 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69   take the jump i
10ee0 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c  f the jumpIfNull
10ef0 20 66 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a   flag is true..*
10f00 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64  *.** This code d
10f10 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61  epends on the fa
10f20 63 74 20 74 68 61 74 20 63 65 72 74 61 69 6e 20  ct that certain 
10f30 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78  token values (ex
10f40 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20  : TK_EQ).** are 
10f50 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f  the same as opco
10f60 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f  de values (ex: O
10f70 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65  P_Eq) that imple
10f80 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70  ment the corresp
10f90 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74  onding.** operat
10fa0 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f  ion.  Special co
10fb0 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63  mments in vdbe.c
10fc0 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64   and the mkopcod
10fd0 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e  eh.awk script in
10fe0 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f  .** the make pro
10ff0 63 65 73 73 20 63 61 75 73 65 20 74 68 65 73 65  cess cause these
11000 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e   values to align
11010 2e 20 20 41 73 73 65 72 74 28 29 73 20 69 6e 20  .  Assert()s in 
11020 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f  the code.** belo
11030 77 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  w verify that th
11040 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c  e numbers are al
11050 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e  igned correctly.
11060 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
11070 45 78 70 72 49 66 54 72 75 65 28 50 61 72 73 65  ExprIfTrue(Parse
11080 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
11090 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c  pExpr, int dest,
110a0 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
110b0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
110c0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
110d0 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74  nt op = 0;.  int
110e0 20 63 6b 4f 66 66 73 65 74 20 3d 20 70 50 61 72   ckOffset = pPar
110f0 73 65 2d 3e 63 6b 4f 66 66 73 65 74 3b 0a 20 20  se->ckOffset;.  
11100 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70  if( v==0 || pExp
11110 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
11120 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
11130 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
11140 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
11150 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32  : {.      int d2
11160 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
11170 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
11180 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
11190 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
111a0 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 21  pr->pLeft, d2, !
111b0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
111c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
111d0 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
111e0 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
111f0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
11200 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11210 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
11220 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  d2);.      break
11230 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
11240 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20   TK_OR: {.      
11250 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
11260 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
11270 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
11280 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
11290 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
112a0 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
112b0 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
112c0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
112d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
112e0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
112f0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
11300 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
11310 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
11320 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
11330 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
11340 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
11350 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
11360 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
11370 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
11380 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
11390 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
113a0 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
113b0 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f  assert( TK_LT==O
113c0 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Lt );.      as
113d0 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f  sert( TK_LE==OP_
113e0 4c 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Le );.      asse
113f0 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74  rt( TK_GT==OP_Gt
11400 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
11410 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29  ( TK_GE==OP_Ge )
11420 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
11430 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a  TK_EQ==OP_Eq );.
11440 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
11450 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20  _NE==OP_Ne );.  
11460 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
11470 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
11480 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
11490 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
114a0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
114b0 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63  pRight);.      c
114c0 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
114d0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
114e0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
114f0 6f 70 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  op, dest, jumpIf
11500 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
11510 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
11520 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20  se TK_ISNULL:.  
11530 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
11540 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  L: {.      asser
11550 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50  t( TK_ISNULL==OP
11560 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20  _IsNull );.     
11570 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e   assert( TK_NOTN
11580 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20  ULL==OP_NotNull 
11590 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
115a0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
115b0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
115c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
115d0 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c  eAddOp(v, op, 1,
115e0 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72   dest);.      br
115f0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
11600 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
11610 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65  {.      /* The e
11620 78 70 72 65 73 73 69 6f 6e 20 22 78 20 42 45 54  xpression "x BET
11630 57 45 45 4e 20 79 20 41 4e 44 20 7a 22 20 69 73  WEEN y AND z" is
11640 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 3a   implemented as:
11650 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
11660 2a 2a 20 31 20 49 46 20 28 78 20 3c 20 79 29 20  ** 1 IF (x < y) 
11670 47 4f 54 4f 20 33 0a 20 20 20 20 20 20 2a 2a 20  GOTO 3.      ** 
11680 32 20 49 46 20 28 78 20 3c 3d 20 7a 29 20 47 4f  2 IF (x <= z) GO
11690 54 4f 20 3c 64 65 73 74 3e 0a 20 20 20 20 20 20  TO <dest>.      
116a0 2a 2a 20 33 20 2e 2e 2e 0a 20 20 20 20 20 20 2a  ** 3 ....      *
116b0 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
116c0 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  ;.      Expr *pL
116d0 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
116e0 66 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  ft;.      Expr *
116f0 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
11700 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
11710 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
11720 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
11730 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73   pLeft);.      s
11740 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
11750 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29  v, OP_Dup, 0, 0)
11760 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
11770 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
11780 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 61  pRight);.      a
11790 64 64 72 20 3d 20 63 6f 64 65 43 6f 6d 70 61 72  ddr = codeCompar
117a0 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  e(pParse, pLeft,
117b0 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 74 2c 20   pRight, OP_Lt, 
117c0 30 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  0, !jumpIfNull);
117d0 0a 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d  ..      pRight =
117e0 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
117f0 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [1].pExpr;.     
11800 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
11810 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
11820 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
11830 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66  are(pParse, pLef
11840 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65  t, pRight, OP_Le
11850 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
11860 6c 6c 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  ll);..      sqli
11870 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
11880 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30  OP_Integer, 0, 0
11890 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
118a0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
118b0 61 64 64 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  addr);.      sql
118c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
118d0 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a   OP_Pop, 1, 0);.
118e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
118f0 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
11900 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
11910 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
11920 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71  pExpr);.      sq
11930 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
11940 2c 20 4f 50 5f 49 66 2c 20 6a 75 6d 70 49 66 4e  , OP_If, jumpIfN
11950 75 6c 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  ull, dest);.    
11960 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
11970 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 63 6b 4f   }.  pParse->ckO
11980 66 66 73 65 74 20 3d 20 63 6b 4f 66 66 73 65 74  ffset = ckOffset
11990 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
119a0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62  ate code for a b
119b0 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f  oolean expressio
119c0 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75  n such that a ju
119d0 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f  mp is made.** to
119e0 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74   the label "dest
119f0 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  " if the express
11a00 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74  ion is false but
11a10 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f   execution.** co
11a20 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74  ntinues straight
11a30 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70   thru if the exp
11a40 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e  ression is true.
11a50 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
11a60 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74  pression evaluat
11a70 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74  es to NULL (neit
11a80 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c  her true nor fal
11a90 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70  se) then.** jump
11aa0 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69   if jumpIfNull i
11ab0 73 20 74 72 75 65 20 6f 72 20 66 61 6c 6c 20 74  s true or fall t
11ac0 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66  hrough if jumpIf
11ad0 4e 75 6c 6c 20 69 73 20 66 61 6c 73 65 2e 0a 2a  Null is false..*
11ae0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
11af0 70 72 49 66 46 61 6c 73 65 28 50 61 72 73 65 20  prIfFalse(Parse 
11b00 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
11b10 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20  Expr, int dest, 
11b20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b  int jumpIfNull){
11b30 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
11b40 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
11b50 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  t op = 0;.  int 
11b60 63 6b 4f 66 66 73 65 74 20 3d 20 70 50 61 72 73  ckOffset = pPars
11b70 65 2d 3e 63 6b 4f 66 66 73 65 74 3b 0a 20 20 69  e->ckOffset;.  i
11b80 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72  f( v==0 || pExpr
11b90 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
11ba0 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66   /* The value of
11bb0 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f   pExpr->op and o
11bc0 70 20 61 72 65 20 72 65 6c 61 74 65 64 20 61 73  p are related as
11bd0 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20   follows:.  **. 
11be0 20 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d   **       pExpr-
11bf0 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 6f  >op            o
11c00 70 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d  p.  **       ---
11c10 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20  ------          
11c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20  ----------.  ** 
11c30 20 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20        TK_ISNULL 
11c40 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e           OP_NotN
11c50 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  ull.  **       T
11c60 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20  K_NOTNULL       
11c70 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a    OP_IsNull.  **
11c80 20 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20         TK_NE    
11c90 20 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a            OP_Eq.
11ca0 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51    **       TK_EQ
11cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
11cc0 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Ne.  **       T
11cd0 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20 20 20  K_GT            
11ce0 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20    OP_Le.  **    
11cf0 20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20     TK_LE        
11d00 20 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a        OP_Gt.  **
11d10 20 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20         TK_GE    
11d20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a            OP_Lt.
11d30 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54    **       TK_LT
11d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
11d50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f  _Ge.  **.  ** Fo
11d60 72 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f  r other values o
11d70 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20  f pExpr->op, op 
11d80 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64  is undefined and
11d90 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68   unused..  ** Th
11da0 65 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61  e value of TK_ a
11db0 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73  nd OP_ constants
11dc0 20 61 72 65 20 61 72 72 61 6e 67 65 64 20 73 75   are arranged su
11dd0 63 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20  ch that we.  ** 
11de0 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20  can compute the 
11df0 6d 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73  mapping above us
11e00 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
11e10 67 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20  g expression..  
11e20 2a 2a 20 41 73 73 65 72 74 28 29 73 20 76 65 72  ** Assert()s ver
11e30 69 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d  ify that the com
11e40 70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72  putation is corr
11e50 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d  ect..  */.  op =
11e60 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b   ((pExpr->op+(TK
11e70 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28  _ISNULL&1))^1)-(
11e80 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20  TK_ISNULL&1);.. 
11e90 20 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65   /* Verify corre
11ea0 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  ct alignment of 
11eb0 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73  TK_ and OP_ cons
11ec0 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73  tants.  */.  ass
11ed0 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
11ee0 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d  TK_ISNULL || op=
11ef0 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20  =OP_NotNull );. 
11f00 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
11f10 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c  op!=TK_NOTNULL |
11f20 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  | op==OP_IsNull 
11f30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
11f40 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c  pr->op!=TK_NE ||
11f50 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20   op==OP_Eq );.  
11f60 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
11f70 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d  p!=TK_EQ || op==
11f80 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Ne );.  asser
11f90 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
11fa0 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65  _LT || op==OP_Ge
11fb0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
11fc0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c  xpr->op!=TK_LE |
11fd0 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20  | op==OP_Gt );. 
11fe0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
11ff0 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d  op!=TK_GT || op=
12000 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65  =OP_Le );.  asse
12010 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
12020 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c  K_GE || op==OP_L
12030 74 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  t );..  switch( 
12040 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
12050 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a   case TK_AND: {.
12060 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
12070 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
12080 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
12090 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
120a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
120b0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
120c0 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
120d0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
120e0 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
120f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
12100 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20   TK_OR: {.      
12110 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
12120 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
12130 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
12140 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
12150 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
12160 64 32 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29  d2, !jumpIfNull)
12170 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
12180 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
12190 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
121a0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
121b0 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
121c0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
121d0 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20  el(v, d2);.     
121e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
121f0 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
12200 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
12210 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
12220 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
12230 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
12240 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
12250 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
12260 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LT:.    case TK
12270 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LE:.    case TK
12280 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GT:.    case TK
12290 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GE:.    case TK
122a0 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _NE:.    case TK
122b0 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  _EQ: {.      sql
122c0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
122d0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
122e0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
122f0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
12300 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
12310 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
12320 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
12330 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
12340 3e 70 52 69 67 68 74 2c 20 6f 70 2c 20 64 65 73  >pRight, op, des
12350 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
12360 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12370 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
12380 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
12390 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
123a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
123b0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
123c0 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
123d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
123e0 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74  p(v, op, 1, dest
123f0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
12400 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
12410 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20  K_BETWEEN: {.   
12420 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
12430 73 69 6f 6e 20 69 73 20 22 78 20 42 45 54 57 45  sion is "x BETWE
12440 45 4e 20 79 20 41 4e 44 20 7a 22 2e 20 49 74 20  EN y AND z". It 
12450 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
12460 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s:.      **.    
12470 20 20 2a 2a 20 31 20 49 46 20 28 78 20 3e 3d 20    ** 1 IF (x >= 
12480 79 29 20 47 4f 54 4f 20 33 0a 20 20 20 20 20 20  y) GOTO 3.      
12490 2a 2a 20 32 20 47 4f 54 4f 20 3c 64 65 73 74 3e  ** 2 GOTO <dest>
124a0 0a 20 20 20 20 20 20 2a 2a 20 33 20 49 46 20 28  .      ** 3 IF (
124b0 78 20 3e 20 7a 29 20 47 4f 54 4f 20 3c 64 65 73  x > z) GOTO <des
124c0 74 3e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t>.      */.    
124d0 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
124e0 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
124f0 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
12500 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
12510 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
12520 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
12530 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
12540 64 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  de(pParse, pLeft
12550 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12560 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
12570 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Dup, 0, 0);.    
12580 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
12590 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  e(pParse, pRight
125a0 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
125b0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
125c0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
125d0 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
125e0 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
125f0 68 74 2c 20 4f 50 5f 47 65 2c 20 61 64 64 72 2b  ht, OP_Ge, addr+
12600 33 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  3, !jumpIfNull);
12610 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ..      sqlite3V
12620 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
12630 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  op, 1, 0);.     
12640 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12650 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
12660 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 52   dest);.      pR
12670 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  ight = pExpr->pL
12680 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
12690 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
126a0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
126b0 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f  Right);.      co
126c0 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
126d0 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
126e0 20 4f 50 5f 47 74 2c 20 64 65 73 74 2c 20 6a 75   OP_Gt, dest, ju
126f0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
12700 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
12710 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
12720 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
12730 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
12740 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12750 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
12760 49 66 4e 6f 74 2c 20 6a 75 6d 70 49 66 4e 75 6c  IfNot, jumpIfNul
12770 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  l, dest);.      
12780 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
12790 0a 20 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66  .  pParse->ckOff
127a0 73 65 74 20 3d 20 63 6b 4f 66 66 73 65 74 3b 0a  set = ckOffset;.
127b0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65  }../*.** Do a de
127c0 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66  ep comparison of
127d0 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20   two expression 
127e0 74 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20 54  trees.  Return T
127f0 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a  RUE (non-zero).*
12800 2a 20 69 66 20 74 68 65 79 20 61 72 65 20 69 64  * if they are id
12810 65 6e 74 69 63 61 6c 20 61 6e 64 20 72 65 74 75  entical and retu
12820 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65 79  rn FALSE if they
12830 20 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77   differ in any w
12840 61 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  ay..**.** Someti
12850 6d 65 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  mes this routine
12860 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 46 41 4c   will return FAL
12870 53 45 20 65 76 65 6e 20 69 66 20 74 68 65 20 74  SE even if the t
12880 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  wo expressions.*
12890 2a 20 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75  * really are equ
128a0 69 76 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20  ivalent.  If we 
128b0 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61  cannot prove tha
128c0 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
128d0 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63  s are.** identic
128e0 61 6c 2c 20 77 65 20 72 65 74 75 72 6e 20 46 41  al, we return FA
128f0 4c 53 45 20 6a 75 73 74 20 74 6f 20 62 65 20 73  LSE just to be s
12900 61 66 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73  afe.  So if this
12910 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
12920 72 6e 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20  rns false, then 
12930 79 6f 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c  you do not reall
12940 79 20 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74 61  y know for certa
12950 69 6e 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a  in if the two.**
12960 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
12970 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20   the same.  But 
12980 69 66 20 79 6f 75 20 67 65 74 20 61 20 54 52 55  if you get a TRU
12990 45 20 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79  E return, then y
129a0 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72  ou.** can be sur
129b0 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
129c0 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20  s are the same. 
129d0 20 49 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77   In the places w
129e0 68 65 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  here.** this rou
129f0 74 69 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74  tine is used, it
12a00 20 64 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74   does not hurt t
12a10 6f 20 67 65 74 20 61 6e 20 65 78 74 72 61 20 46  o get an extra F
12a20 41 4c 53 45 20 2d 20 74 68 61 74 0a 2a 2a 20 6a  ALSE - that.** j
12a30 75 73 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74  ust might result
12a40 20 69 6e 20 73 6f 6d 65 20 73 6c 69 67 68 74 6c   in some slightl
12a50 79 20 73 6c 6f 77 65 72 20 63 6f 64 65 2e 20 20  y slower code.  
12a60 42 75 74 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a  But returning.**
12a70 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 54 52   an incorrect TR
12a80 55 45 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f  UE could lead to
12a90 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a   a malfunction..
12aa0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
12ab0 70 72 43 6f 6d 70 61 72 65 28 45 78 70 72 20 2a  prCompare(Expr *
12ac0 70 41 2c 20 45 78 70 72 20 2a 70 42 29 7b 0a 20  pA, Expr *pB){. 
12ad0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41   int i;.  if( pA
12ae0 3d 3d 30 7c 7c 70 42 3d 3d 30 20 29 7b 0a 20 20  ==0||pB==0 ){.  
12af0 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 70 41 3b    return pB==pA;
12b00 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f  .  }.  if( pA->o
12b10 70 21 3d 70 42 2d 3e 6f 70 20 29 20 72 65 74 75  p!=pB->op ) retu
12b20 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 41 2d  rn 0;.  if( (pA-
12b30 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74  >flags & EP_Dist
12b40 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67  inct)!=(pB->flag
12b50 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29  s & EP_Distinct)
12b60 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
12b70 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 43  f( !sqlite3ExprC
12b80 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74  ompare(pA->pLeft
12b90 2c 20 70 42 2d 3e 70 4c 65 66 74 29 20 29 20 72  , pB->pLeft) ) r
12ba0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21  eturn 0;.  if( !
12bb0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
12bc0 72 65 28 70 41 2d 3e 70 52 69 67 68 74 2c 20 70  re(pA->pRight, p
12bd0 42 2d 3e 70 52 69 67 68 74 29 20 29 20 72 65 74  B->pRight) ) ret
12be0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d  urn 0;.  if( pA-
12bf0 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 69 66  >pList ){.    if
12c00 28 20 70 42 2d 3e 70 4c 69 73 74 3d 3d 30 20 29  ( pB->pList==0 )
12c10 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69   return 0;.    i
12c20 66 28 20 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45  f( pA->pList->nE
12c30 78 70 72 21 3d 70 42 2d 3e 70 4c 69 73 74 2d 3e  xpr!=pB->pList->
12c40 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e 20 30  nExpr ) return 0
12c50 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
12c60 3c 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  <pA->pList->nExp
12c70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  r; i++){.      i
12c80 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 43  f( !sqlite3ExprC
12c90 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 69 73 74  ompare(pA->pList
12ca0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 42  ->a[i].pExpr, pB
12cb0 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  ->pList->a[i].pE
12cc0 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
12cd0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
12ce0 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  }.    }.  }else 
12cf0 69 66 28 20 70 42 2d 3e 70 4c 69 73 74 20 29 7b  if( pB->pList ){
12d00 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
12d10 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 70 53 65   }.  if( pA->pSe
12d20 6c 65 63 74 20 7c 7c 20 70 42 2d 3e 70 53 65 6c  lect || pB->pSel
12d30 65 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ect ) return 0;.
12d40 20 20 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65    if( pA->iTable
12d50 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20 7c 7c 20  !=pB->iTable || 
12d60 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d  pA->iColumn!=pB-
12d70 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72  >iColumn ) retur
12d80 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6f  n 0;.  if( pA->o
12d90 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p!=TK_COLUMN && 
12da0 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 7b 0a 20  pA->token.z ){. 
12db0 20 20 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e     if( pB->token
12dc0 2e 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  .z==0 ) return 0
12dd0 3b 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 74 6f  ;.    if( pB->to
12de0 6b 65 6e 2e 6e 21 3d 70 41 2d 3e 74 6f 6b 65 6e  ken.n!=pA->token
12df0 2e 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  .n ) return 0;. 
12e00 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
12e10 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 41  rNICmp((char*)pA
12e20 2d 3e 74 6f 6b 65 6e 2e 7a 2c 28 63 68 61 72 2a  ->token.z,(char*
12e30 29 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 2c 70 42 2d  )pB->token.z,pB-
12e40 3e 74 6f 6b 65 6e 2e 6e 29 21 3d 30 20 29 7b 0a  >token.n)!=0 ){.
12e50 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
12e60 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
12e70 72 6e 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn 1;.}.../*.** 
12e80 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
12e90 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66  t to the pAggInf
12ea0 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e  o->aCol[] array.
12eb0 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64    Return the ind
12ec0 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ex of.** the new
12ed0 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72   element.  Retur
12ee0 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  n a negative num
12ef0 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61  ber if malloc fa
12f00 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
12f10 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c  nt addAggInfoCol
12f20 75 6d 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  umn(sqlite3 *db,
12f30 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29   AggInfo *pInfo)
12f40 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e  {.  int i;.  pIn
12f50 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74  fo->aCol = sqlit
12f60 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28  e3ArrayAllocate(
12f70 0a 20 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20  .       db,.    
12f80 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a     pInfo->aCol,.
12f90 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49         sizeof(pI
12fa0 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20  nfo->aCol[0]),. 
12fb0 20 20 20 20 20 20 33 2c 0a 20 20 20 20 20 20 20        3,.       
12fc0 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c  &pInfo->nColumn,
12fd0 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e  .       &pInfo->
12fe0 6e 43 6f 6c 75 6d 6e 41 6c 6c 6f 63 2c 0a 20 20  nColumnAlloc,.  
12ff0 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72       &i.  );.  r
13000 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a  eturn i;.}    ..
13010 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
13020 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70  element to the p
13030 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d  AggInfo->aFunc[]
13040 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20   array.  Return 
13050 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20  the index of.** 
13060 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e  the new element.
13070 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74    Return a negat
13080 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61  ive number if ma
13090 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  lloc fails..*/.s
130a0 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67  tatic int addAgg
130b0 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69 74 65 33  InfoFunc(sqlite3
130c0 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70   *db, AggInfo *p
130d0 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Info){.  int i;.
130e0 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d    pInfo->aFunc =
130f0 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c   sqlite3ArrayAll
13100 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64 62  ocate(.       db
13110 2c 20 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d  , .       pInfo-
13120 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 73  >aFunc,.       s
13130 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75  izeof(pInfo->aFu
13140 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 33  nc[0]),.       3
13150 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d  ,.       &pInfo-
13160 3e 6e 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 26  >nFunc,.       &
13170 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 41 6c 6c 6f  pInfo->nFuncAllo
13180 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29  c,.       &i.  )
13190 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20  ;.  return i;.} 
131a0 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20     ../*.** This 
131b0 69 73 20 61 6e 20 78 46 75 6e 63 20 66 6f 72 20  is an xFunc for 
131c0 77 61 6c 6b 45 78 70 72 54 72 65 65 28 29 20 75  walkExprTree() u
131d0 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
131e0 20 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72   .** sqlite3Expr
131f0 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
13200 73 28 29 2e 20 20 53 65 65 20 73 71 6c 69 74 65  s().  See sqlite
13210 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
13220 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64  egates.** for ad
13230 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
13240 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tion..**.** This
13250 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65   routine analyze
13260 73 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  s the aggregate 
13270 66 75 6e 63 74 69 6f 6e 20 61 74 20 70 45 78 70  function at pExp
13280 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
13290 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
132a0 65 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 45 78  e(void *pArg, Ex
132b0 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e  pr *pExpr){.  in
132c0 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  t i;.  NameConte
132d0 78 74 20 2a 70 4e 43 20 3d 20 28 4e 61 6d 65 43  xt *pNC = (NameC
132e0 6f 6e 74 65 78 74 20 2a 29 70 41 72 67 3b 0a 20  ontext *)pArg;. 
132f0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
13300 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
13310 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73  SrcList *pSrcLis
13320 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
13330 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70 41  t;.  AggInfo *pA
13340 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41  ggInfo = pNC->pA
13350 67 67 49 6e 66 6f 3b 0a 0a 20 20 73 77 69 74 63  ggInfo;..  switc
13360 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
13370 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
13380 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
13390 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
133a0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
133b0 73 65 65 20 69 66 20 74 68 65 20 63 6f 6c 75 6d  see if the colum
133c0 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74  n is in one of t
133d0 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  he tables in the
133e0 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 63   FROM.      ** c
133f0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67  lause of the agg
13400 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a  regate query */.
13410 20 20 20 20 20 20 69 66 28 20 70 53 72 63 4c 69        if( pSrcLi
13420 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  st ){.        st
13430 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
13440 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72 63 4c  m *pItem = pSrcL
13450 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20  ist->a;.        
13460 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c  for(i=0; i<pSrcL
13470 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
13480 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
13490 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
134a0 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20  fo_col *pCol;.  
134b0 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
134c0 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d  r->iTable==pItem
134d0 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ->iCursor ){.   
134e0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
134f0 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
13500 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  nt, it means tha
13510 74 20 70 45 78 70 72 20 72 65 66 65 72 73 20 74  t pExpr refers t
13520 6f 20 61 20 74 61 62 6c 65 0a 20 20 20 20 20 20  o a table.      
13530 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73        ** that is
13540 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
13550 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65  use of the aggre
13560 67 61 74 65 20 71 75 65 72 79 2e 20 20 0a 20 20  gate query.  .  
13570 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20            **.   
13580 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b 65           ** Make
13590 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68   an entry for th
135a0 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67 67  e column in pAgg
135b0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20  Info->aCol[] if 
135c0 74 68 65 72 65 0a 20 20 20 20 20 20 20 20 20 20  there.          
135d0 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20 65    ** is not an e
135e0 6e 74 72 79 20 74 68 65 72 65 20 61 6c 72 65 61  ntry there alrea
135f0 64 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  dy..            
13600 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
13610 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt k;.          
13620 20 20 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e 66    pCol = pAggInf
13630 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20  o->aCol;.       
13640 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c       for(k=0; k<
13650 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
13660 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  n; k++, pCol++){
13670 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
13680 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d  f( pCol->iTable=
13690 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26  =pExpr->iTable &
136a0 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
136b0 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d      pCol->iColum
136c0 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  n==pExpr->iColum
136d0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
136e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
136f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
13700 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13710 20 20 20 20 20 20 69 66 28 20 28 6b 3e 3d 70 41        if( (k>=pA
13720 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29  ggInfo->nColumn)
13730 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
13740 20 28 6b 20 3d 20 61 64 64 41 67 67 49 6e 66 6f   (k = addAggInfo
13750 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d 3e 64  Column(pParse->d
13760 62 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e 3d 30  b, pAggInfo))>=0
13770 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b   .            ){
13780 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
13790 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d  Col = &pAggInfo-
137a0 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20  >aCol[k];.      
137b0 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54          pCol->pT
137c0 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62  ab = pExpr->pTab
137d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
137e0 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20 70  pCol->iTable = p
137f0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Expr->iTable;.  
13800 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
13810 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70  ->iColumn = pExp
13820 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
13830 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
13840 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iMem = pParse->n
13850 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Mem++;.         
13860 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
13870 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20  erColumn = -1;. 
13880 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
13890 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  l->pExpr = pExpr
138a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
138b0 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47  if( pAggInfo->pG
138c0 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
138d0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 2c            int j,
138e0 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   n;.            
138f0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47      ExprList *pG
13900 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47  B = pAggInfo->pG
13910 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20  roupBy;.        
13920 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45          struct E
13930 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  xprList_item *pT
13940 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20 20  erm = pGB->a;.  
13950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 20                n 
13960 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20 20  = pGB->nExpr;.  
13970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
13980 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c  r(j=0; j<n; j++,
13990 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
139a0 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
139b0 72 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70  r *pE = pTerm->p
139c0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
139d0 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e          if( pE->
139e0 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
139f0 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78   pE->iTable==pEx
13a00 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20  pr->iTable &&.  
13a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d      pE->iColumn=
13a30 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20  =pExpr->iColumn 
13a40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
13a50 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
13a60 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a  rterColumn = j;.
13a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
13a90 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
13aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
13ab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
13ac0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
13ad0 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72  f( pCol->iSorter
13ae0 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
13af0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
13b00 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20  ->iSorterColumn 
13b10 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72  = pAggInfo->nSor
13b20 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20  tingColumn++;.  
13b30 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
13b40 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
13b50 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65          /* There
13b60 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72 79   is now an entry
13b70 20 66 6f 72 20 70 45 78 70 72 20 69 6e 20 70 41   for pExpr in pA
13b80 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28  ggInfo->aCol[] (
13b90 65 69 74 68 65 72 0a 20 20 20 20 20 20 20 20 20  either.         
13ba0 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20 69 74     ** because it
13bb0 20 77 61 73 20 74 68 65 72 65 20 62 65 66 6f 72   was there befor
13bc0 65 20 6f 72 20 62 65 63 61 75 73 65 20 77 65 20  e or because we 
13bd0 6a 75 73 74 20 63 72 65 61 74 65 64 20 69 74 29  just created it)
13be0 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  ..            **
13bf0 20 43 6f 6e 76 65 72 74 20 74 68 65 20 70 45 78   Convert the pEx
13c00 70 72 20 74 6f 20 62 65 20 61 20 54 4b 5f 41 47  pr to be a TK_AG
13c10 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72 69  G_COLUMN referri
13c20 6e 67 20 74 6f 20 74 68 61 74 0a 20 20 20 20 20  ng to that.     
13c30 20 20 20 20 20 20 20 2a 2a 20 70 41 67 67 49 6e         ** pAggIn
13c40 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72 79  fo->aCol[] entry
13c50 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  ..            */
13c60 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
13c70 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70  pr->pAggInfo = p
13c80 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  AggInfo;.       
13c90 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
13ca0 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a   TK_AGG_COLUMN;.
13cb0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
13cc0 72 2d 3e 69 41 67 67 20 3d 20 6b 3b 0a 20 20 20  r->iAgg = k;.   
13cd0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
13ce0 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65            } /* e
13cf0 6e 64 69 66 20 70 45 78 70 72 2d 3e 69 54 61 62  ndif pExpr->iTab
13d00 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73  le==pItem->iCurs
13d10 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20  or */.        } 
13d20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72  /* end loop over
13d30 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20   pSrcList */.   
13d40 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
13d50 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 1;.    }.    c
13d60 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
13d70 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ION: {.      /* 
13d80 54 68 65 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d  The pNC->nDepth=
13d90 3d 30 20 74 65 73 74 20 63 61 75 73 65 73 20 61  =0 test causes a
13da0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
13db0 6e 73 20 69 6e 20 73 75 62 71 75 65 72 69 65 73  ns in subqueries
13dc0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20  .      ** to be 
13dd0 69 67 6e 6f 72 65 64 20 2a 2f 0a 20 20 20 20 20  ignored */.     
13de0 20 69 66 28 20 70 4e 43 2d 3e 6e 44 65 70 74 68   if( pNC->nDepth
13df0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
13e00 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
13e10 66 20 70 45 78 70 72 20 69 73 20 61 20 64 75 70  f pExpr is a dup
13e20 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65  licate of anothe
13e30 72 20 61 67 67 72 65 67 61 74 65 20 0a 20 20 20  r aggregate .   
13e40 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
13e50 20 74 68 61 74 20 69 73 20 61 6c 72 65 61 64 79   that is already
13e60 20 69 6e 20 74 68 65 20 70 41 67 67 49 6e 66 6f   in the pAggInfo
13e70 20 73 74 72 75 63 74 75 72 65 0a 20 20 20 20 20   structure.     
13e80 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74     */.        st
13e90 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
13ea0 63 20 2a 70 49 74 65 6d 20 3d 20 70 41 67 67 49  c *pItem = pAggI
13eb0 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20 20  nfo->aFunc;.    
13ec0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
13ed0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
13ee0 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
13ef0 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
13f00 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
13f10 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70 45  pItem->pExpr, pE
13f20 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
13f30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
13f40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
13f50 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d  .        if( i>=
13f60 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20  pAggInfo->nFunc 
13f70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
13f80 70 45 78 70 72 20 69 73 20 6f 72 69 67 69 6e 61  pExpr is origina
13f90 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77 20 65  l.  Make a new e
13fa0 6e 74 72 79 20 69 6e 20 70 41 67 67 49 6e 66 6f  ntry in pAggInfo
13fb0 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20  ->aFunc[].      
13fc0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
13fd0 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 70 50   u8 enc = ENC(pP
13fe0 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20  arse->db);.     
13ff0 20 20 20 20 20 69 20 3d 20 61 64 64 41 67 67 49       i = addAggI
14000 6e 66 6f 46 75 6e 63 28 70 50 61 72 73 65 2d 3e  nfoFunc(pParse->
14010 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 3b 0a 20  db, pAggInfo);. 
14020 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d           if( i>=
14030 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
14040 20 70 49 74 65 6d 20 3d 20 26 70 41 67 67 49 6e   pItem = &pAggIn
14050 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20  fo->aFunc[i];.  
14060 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
14070 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
14080 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
14090 6d 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65  m->iMem = pParse
140a0 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20  ->nMem++;.      
140b0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 46 75        pItem->pFu
140c0 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  nc = sqlite3Find
140d0 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d  Function(pParse-
140e0 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  >db,.           
140f0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
14100 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  Expr->token.z, p
14110 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 0a 20  Expr->token.n,. 
14120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14130 20 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 3f    pExpr->pList ?
14140 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e   pExpr->pList->n
14150 45 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30  Expr : 0, enc, 0
14160 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
14170 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  f( pExpr->flags 
14180 26 20 45 50 5f 44 69 73 74 69 6e 63 74 20 29 7b  & EP_Distinct ){
14190 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
141a0 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20  Item->iDistinct 
141b0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
141c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
141d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
141e0 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69     pItem->iDisti
141f0 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  nct = -1;.      
14200 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14210 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
14220 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45        /* Make pE
14230 78 70 72 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  xpr point to the
14240 20 61 70 70 72 6f 70 72 69 61 74 65 20 70 41 67   appropriate pAg
14250 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65  gInfo->aFunc[] e
14260 6e 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ntry.        */.
14270 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
14280 41 67 67 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  Agg = i;.       
14290 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
142a0 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20   = pAggInfo;.   
142b0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
142c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
142d0 0a 0a 20 20 2f 2a 20 52 65 63 75 72 73 69 76 65  ..  /* Recursive
142e0 6c 79 20 77 61 6c 6b 20 73 75 62 71 75 65 72 69  ly walk subqueri
142f0 65 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 54  es looking for T
14300 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 74  K_COLUMN nodes t
14310 68 61 74 20 6e 65 65 64 0a 20 20 2a 2a 20 74 6f  hat need.  ** to
14320 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20 54   be changed to T
14330 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20 42  K_AGG_COLUMN.  B
14340 75 74 20 69 6e 63 72 65 6d 65 6e 74 20 6e 44 65  ut increment nDe
14350 70 74 68 20 73 6f 20 74 68 61 74 0a 20 20 2a 2a  pth so that.  **
14360 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
14370 20 6e 6f 64 65 73 20 69 6e 20 73 75 62 71 75 65   nodes in subque
14380 72 69 65 73 20 77 69 6c 6c 20 62 65 20 75 6e 63  ries will be unc
14390 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  hanged..  */.  i
143a0 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63  f( pExpr->pSelec
143b0 74 20 29 7b 0a 20 20 20 20 70 4e 43 2d 3e 6e 44  t ){.    pNC->nD
143c0 65 70 74 68 2b 2b 3b 0a 20 20 20 20 77 61 6c 6b  epth++;.    walk
143d0 53 65 6c 65 63 74 45 78 70 72 28 70 45 78 70 72  SelectExpr(pExpr
143e0 2d 3e 70 53 65 6c 65 63 74 2c 20 61 6e 61 6c 79  ->pSelect, analy
143f0 7a 65 41 67 67 72 65 67 61 74 65 2c 20 70 4e 43  zeAggregate, pNC
14400 29 3b 0a 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70  );.    pNC->nDep
14410 74 68 2d 2d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  th--;.  }.  retu
14420 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn 0;.}../*.** A
14430 6e 61 6c 79 7a 65 20 74 68 65 20 67 69 76 65 6e  nalyze the given
14440 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b   expression look
14450 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74  ing for aggregat
14460 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a  e functions and.
14470 2a 2a 20 66 6f 72 20 76 61 72 69 61 62 6c 65 73  ** for variables
14480 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
14490 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 70 50   added to the pP
144a0 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72  arse->aAgg[] arr
144b0 61 79 2e 0a 2a 2a 20 4d 61 6b 65 20 61 64 64 69  ay..** Make addi
144c0 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20 74  tional entries t
144d0 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41  o the pParse->aA
144e0 67 67 5b 5d 20 61 72 72 61 79 20 61 73 20 6e 65  gg[] array as ne
144f0 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  cessary..**.** T
14500 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
14510 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ld only be calle
14520 64 20 61 66 74 65 72 20 74 68 65 20 65 78 70 72  d after the expr
14530 65 73 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a  ession has been.
14540 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79 20 73  ** analyzed by s
14550 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
14560 65 4e 61 6d 65 73 28 29 2e 0a 2a 2a 0a 2a 2a 20  eNames()..**.** 
14570 49 66 20 65 72 72 6f 72 73 20 61 72 65 20 73 65  If errors are se
14580 65 6e 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  en, leave an err
14590 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 7a 45  or message in zE
145a0 72 72 4d 73 67 20 61 6e 64 20 72 65 74 75 72 6e  rrMsg and return
145b0 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
145c0 66 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74  f errors..*/.int
145d0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
145e0 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 4e 61  yzeAggregates(Na
145f0 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
14600 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
14610 69 6e 74 20 6e 45 72 72 20 3d 20 70 4e 43 2d 3e  int nErr = pNC->
14620 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 20 20  pParse->nErr;.  
14630 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78  walkExprTree(pEx
14640 70 72 2c 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  pr, analyzeAggre
14650 67 61 74 65 2c 20 70 4e 43 29 3b 0a 20 20 72 65  gate, pNC);.  re
14660 74 75 72 6e 20 70 4e 43 2d 3e 70 50 61 72 73 65  turn pNC->pParse
14670 2d 3e 6e 45 72 72 20 2d 20 6e 45 72 72 3b 0a 7d  ->nErr - nErr;.}
14680 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c  ../*.** Call sql
14690 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
146a0 67 67 72 65 67 61 74 65 73 28 29 20 66 6f 72 20  ggregates() for 
146b0 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  every expression
146c0 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73   in an.** expres
146d0 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74 75  sion list.  Retu
146e0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
146f0 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49   errors..**.** I
14700 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 66 6f  f an error is fo
14710 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c 79 73 69  und, the analysi
14720 73 20 69 73 20 63 75 74 20 73 68 6f 72 74 2e 0a  s is cut short..
14730 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
14740 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
14750 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e  (NameContext *pN
14760 43 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  C, ExprList *pLi
14770 73 74 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78  st){.  struct Ex
14780 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
14790 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  em;.  int i;.  i
147a0 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69  nt nErr = 0;.  i
147b0 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
147c0 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
147d0 3e 61 2c 20 69 3d 30 3b 20 6e 45 72 72 3d 3d 30  >a, i=0; nErr==0
147e0 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78   && i<pList->nEx
147f0 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
14800 29 7b 0a 20 20 20 20 20 20 6e 45 72 72 20 2b 3d  ){.      nErr +=
14810 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
14820 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 4e  yzeAggregates(pN
14830 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  C, pItem->pExpr)
14840 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
14850 74 75 72 6e 20 6e 45 72 72 3b 0a 7d 0a           turn nErr;.}.