/ Hex Artifact Content
Login

Artifact cb8b65c3adc8bb39f67503dfe8db8da24ebe5d21:


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 33 34 20 32 30 30 38 2f 30 31 2f 30 35 20  .334 2008/01/05 
0220: 31 36 3a 32 39 3a 32 38 20 64 72 68 20 45 78 70  16:29:28 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: 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 30 3b  char *zColl = 0;
0730: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
0740: 65 71 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20  equoted name of 
0750: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
0760: 63 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20  ce */.  CollSeq 
0770: 2a 70 43 6f 6c 6c 3b 0a 20 20 7a 43 6f 6c 6c 20  *pColl;.  zColl 
0780: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
0790: 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64  mToken(pParse->d
07a0: 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b, pName);.  if(
07b0: 20 70 45 78 70 72 20 26 26 20 7a 43 6f 6c 6c 20   pExpr && zColl 
07c0: 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  ){.    pColl = s
07d0: 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
07e0: 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  Seq(pParse, zCol
07f0: 6c 2c 20 2d 31 29 3b 0a 20 20 20 20 69 66 28 20  l, -1);.    if( 
0800: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  pColl ){.      p
0810: 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43  Expr->pColl = pC
0820: 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 45 78 70 72  oll;.      pExpr
0830: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78  ->flags |= EP_Ex
0840: 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 7d 0a  pCollate;.    }.
0850: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
0860: 65 65 28 7a 43 6f 6c 6c 29 3b 0a 20 20 72 65 74  ee(zColl);.  ret
0870: 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a  urn pExpr;.}../*
0880: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
0890: 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e  efault collation
08a0: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
08b0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
08c0: 70 72 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65 20  pr. If.** there 
08d0: 69 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f  is no default co
08e0: 6c 6c 61 74 69 6f 6e 20 74 79 70 65 2c 20 72 65  llation type, re
08f0: 74 75 72 6e 20 30 2e 0a 2a 2f 0a 43 6f 6c 6c 53  turn 0..*/.CollS
0900: 65 71 20 2a 73 71 6c 69 74 65 33 45 78 70 72 43  eq *sqlite3ExprC
0910: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
0920: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
0930: 72 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  r){.  CollSeq *p
0940: 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20  Coll = 0;.  if( 
0950: 70 45 78 70 72 20 29 7b 0a 20 20 20 20 69 6e 74  pExpr ){.    int
0960: 20 6f 70 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d   op;.    pColl =
0970: 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a 20   pExpr->pColl;. 
0980: 20 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f     op = pExpr->o
0990: 70 3b 0a 20 20 20 20 69 66 28 20 28 6f 70 3d 3d  p;.    if( (op==
09a0: 54 4b 5f 43 41 53 54 20 7c 7c 20 6f 70 3d 3d 54  TK_CAST || op==T
09b0: 4b 5f 55 50 4c 55 53 29 20 26 26 20 21 70 43 6f  K_UPLUS) && !pCo
09c0: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ll ){.      retu
09d0: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  rn sqlite3ExprCo
09e0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
09f0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
0a00: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c   }.  }.  if( sql
0a10: 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71  ite3CheckCollSeq
0a20: 28 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20  (pParse, pColl) 
0a30: 29 7b 20 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20  ){ .    pColl = 
0a40: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
0a50: 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pColl;.}../*.** 
0a60: 70 45 78 70 72 20 69 73 20 61 6e 20 6f 70 65 72  pExpr is an oper
0a70: 61 6e 64 20 6f 66 20 61 20 63 6f 6d 70 61 72 69  and of a compari
0a80: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 61  son operator.  a
0a90: 66 66 32 20 69 73 20 74 68 65 0a 2a 2a 20 74 79  ff2 is the.** ty
0aa0: 70 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74  pe affinity of t
0ab0: 68 65 20 6f 74 68 65 72 20 6f 70 65 72 61 6e 64  he other operand
0ac0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
0ad0: 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 74  returns the.** t
0ae0: 79 70 65 20 61 66 66 69 6e 69 74 79 20 74 68 61  ype affinity tha
0af0: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
0b00: 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 61 72 69   for the compari
0b10: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f  son operator..*/
0b20: 0a 63 68 61 72 20 73 71 6c 69 74 65 33 43 6f 6d  .char sqlite3Com
0b30: 70 61 72 65 41 66 66 69 6e 69 74 79 28 45 78 70  pareAffinity(Exp
0b40: 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20 61  r *pExpr, char a
0b50: 66 66 32 29 7b 0a 20 20 63 68 61 72 20 61 66 66  ff2){.  char aff
0b60: 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  1 = sqlite3ExprA
0b70: 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a  ffinity(pExpr);.
0b80: 20 20 69 66 28 20 61 66 66 31 20 26 26 20 61 66    if( aff1 && af
0b90: 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20 42 6f 74  f2 ){.    /* Bot
0ba0: 68 20 73 69 64 65 73 20 6f 66 20 74 68 65 20 63  h sides of the c
0bb0: 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65 20 63 6f  omparison are co
0bc0: 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e 65 20 68 61  lumns. If one ha
0bd0: 73 20 6e 75 6d 65 72 69 63 0a 20 20 20 20 2a 2a  s numeric.    **
0be0: 20 61 66 66 69 6e 69 74 79 2c 20 75 73 65 20 74   affinity, use t
0bf0: 68 61 74 2e 20 4f 74 68 65 72 77 69 73 65 20 75  hat. Otherwise u
0c00: 73 65 20 6e 6f 20 61 66 66 69 6e 69 74 79 2e 0a  se no affinity..
0c10: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
0c20: 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41  qlite3IsNumericA
0c30: 66 66 69 6e 69 74 79 28 61 66 66 31 29 20 7c 7c  ffinity(aff1) ||
0c40: 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69   sqlite3IsNumeri
0c50: 63 41 66 66 69 6e 69 74 79 28 61 66 66 32 29 20  cAffinity(aff2) 
0c60: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
0c70: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
0c80: 49 43 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  IC;.    }else{. 
0c90: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
0ca0: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
0cb0: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21   }.  }else if( !
0cc0: 61 66 66 31 20 26 26 20 21 61 66 66 32 20 29 7b  aff1 && !aff2 ){
0cd0: 0a 20 20 20 20 2f 2a 20 4e 65 69 74 68 65 72 20  .    /* Neither 
0ce0: 73 69 64 65 20 6f 66 20 74 68 65 20 63 6f 6d 70  side of the comp
0cf0: 61 72 69 73 6f 6e 20 69 73 20 61 20 63 6f 6c 75  arison is a colu
0d00: 6d 6e 2e 20 20 43 6f 6d 70 61 72 65 20 74 68 65  mn.  Compare the
0d10: 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 73 20  .    ** results 
0d20: 64 69 72 65 63 74 6c 79 2e 0a 20 20 20 20 2a 2f  directly..    */
0d30: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
0d40: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d  TE_AFF_NONE;.  }
0d50: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65  else{.    /* One
0d60: 20 73 69 64 65 20 69 73 20 61 20 63 6f 6c 75 6d   side is a colum
0d70: 6e 2c 20 74 68 65 20 6f 74 68 65 72 20 69 73 20  n, the other is 
0d80: 6e 6f 74 2e 20 55 73 65 20 74 68 65 20 63 6f 6c  not. Use the col
0d90: 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 2e 20 2a  umns affinity. *
0da0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 66  /.    assert( af
0db0: 66 31 3d 3d 30 20 7c 7c 20 61 66 66 32 3d 3d 30  f1==0 || aff2==0
0dc0: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   );.    return (
0dd0: 61 66 66 31 20 2b 20 61 66 66 32 29 3b 0a 20 20  aff1 + aff2);.  
0de0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72  }.}../*.** pExpr
0df0: 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e   is a comparison
0e00: 20 6f 70 65 72 61 74 6f 72 2e 20 20 52 65 74 75   operator.  Retu
0e10: 72 6e 20 74 68 65 20 74 79 70 65 20 61 66 66 69  rn the type affi
0e20: 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64  nity that should
0e30: 0a 2a 2a 20 62 65 20 61 70 70 6c 69 65 64 20 74  .** be applied t
0e40: 6f 20 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20  o both operands 
0e50: 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20 74  prior to doing t
0e60: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a  he comparison..*
0e70: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 63 6f  /.static char co
0e80: 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79  mparisonAffinity
0e90: 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20  (Expr *pExpr){. 
0ea0: 20 63 68 61 72 20 61 66 66 3b 0a 20 20 61 73 73   char aff;.  ass
0eb0: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
0ec0: 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_EQ || pExpr->
0ed0: 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 70 45 78  op==TK_IN || pEx
0ee0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c  pr->op==TK_LT ||
0ef0: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
0f00: 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20 70  ->op==TK_GT || p
0f10: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20  Expr->op==TK_GE 
0f20: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
0f30: 5f 4c 45 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  _LE ||.         
0f40: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e   pExpr->op==TK_N
0f50: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
0f60: 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20  Expr->pLeft );. 
0f70: 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 45 78   aff = sqlite3Ex
0f80: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
0f90: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  ->pLeft);.  if( 
0fa0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b  pExpr->pRight ){
0fb0: 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74  .    aff = sqlit
0fc0: 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
0fd0: 79 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  y(pExpr->pRight,
0fe0: 20 61 66 66 29 3b 0a 20 20 7d 0a 20 20 65 6c 73   aff);.  }.  els
0ff0: 65 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65  e if( pExpr->pSe
1000: 6c 65 63 74 20 29 7b 0a 20 20 20 20 61 66 66 20  lect ){.    aff 
1010: 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
1020: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
1030: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
1040: 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61 66 66  >a[0].pExpr, aff
1050: 29 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66  );.  }.  else if
1060: 28 20 21 61 66 66 20 29 7b 0a 20 20 20 20 61 66  ( !aff ){.    af
1070: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  f = SQLITE_AFF_N
1080: 4f 4e 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ONE;.  }.  retur
1090: 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aff;.}../*.** 
10a0: 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61  pExpr is a compa
10b0: 72 69 73 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e  rison expression
10c0: 2c 20 65 67 2e 20 27 3d 27 2c 20 27 3c 27 2c 20  , eg. '=', '<', 
10d0: 49 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a 2a 20  IN(...) etc..** 
10e0: 69 64 78 5f 61 66 66 69 6e 69 74 79 20 69 73 20  idx_affinity is 
10f0: 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20  the affinity of 
1100: 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d  an indexed colum
1110: 6e 2e 20 52 65 74 75 72 6e 20 74 72 75 65 0a 2a  n. Return true.*
1120: 2a 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 77  * if the index w
1130: 69 74 68 20 61 66 66 69 6e 69 74 79 20 69 64 78  ith affinity idx
1140: 5f 61 66 66 69 6e 69 74 79 20 6d 61 79 20 62 65  _affinity may be
1150: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
1160: 6e 74 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61 72  nt.** the compar
1170: 69 73 6f 6e 20 69 6e 20 70 45 78 70 72 2e 0a 2a  ison in pExpr..*
1180: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64  /.int sqlite3Ind
1190: 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 45 78 70  exAffinityOk(Exp
11a0: 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20 69  r *pExpr, char i
11b0: 64 78 5f 61 66 66 69 6e 69 74 79 29 7b 0a 20 20  dx_affinity){.  
11c0: 63 68 61 72 20 61 66 66 20 3d 20 63 6f 6d 70 61  char aff = compa
11d0: 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45  risonAffinity(pE
11e0: 78 70 72 29 3b 0a 20 20 73 77 69 74 63 68 28 20  xpr);.  switch( 
11f0: 61 66 66 20 29 7b 0a 20 20 20 20 63 61 73 65 20  aff ){.    case 
1200: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3a  SQLITE_AFF_NONE:
1210: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
1220: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1230: 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20 20  _AFF_TEXT:.     
1240: 20 72 65 74 75 72 6e 20 69 64 78 5f 61 66 66 69   return idx_affi
1250: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
1260: 5f 54 45 58 54 3b 0a 20 20 20 20 64 65 66 61 75  _TEXT;.    defau
1270: 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  lt:.      return
1280: 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69   sqlite3IsNumeri
1290: 63 41 66 66 69 6e 69 74 79 28 69 64 78 5f 61 66  cAffinity(idx_af
12a0: 66 69 6e 69 74 79 29 3b 0a 20 20 7d 0a 7d 0a 0a  finity);.  }.}..
12b0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
12c0: 20 50 31 20 76 61 6c 75 65 20 74 68 61 74 20 73   P1 value that s
12d0: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f  hould be used fo
12e0: 72 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70 61  r a binary compa
12f0: 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64 65 20  rison.** opcode 
1300: 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20 65 74  (OP_Eq, OP_Ge et
1310: 63 2e 29 20 75 73 65 64 20 74 6f 20 63 6f 6d 70  c.) used to comp
1320: 61 72 65 20 70 45 78 70 72 31 20 61 6e 64 20 70  are pExpr1 and p
1330: 45 78 70 72 32 2e 0a 2a 2a 20 49 66 20 6a 75 6d  Expr2..** If jum
1340: 70 49 66 4e 75 6c 6c 20 69 73 20 74 72 75 65 2c  pIfNull is true,
1350: 20 74 68 65 6e 20 73 65 74 20 74 68 65 20 6c 6f   then set the lo
1360: 77 20 62 79 74 65 20 6f 66 20 74 68 65 20 72 65  w byte of the re
1370: 74 75 72 6e 65 64 0a 2a 2a 20 50 31 20 76 61 6c  turned.** P1 val
1380: 75 65 20 74 6f 20 74 65 6c 6c 20 74 68 65 20 6f  ue to tell the o
1390: 70 63 6f 64 65 20 74 6f 20 6a 75 6d 70 20 69 66  pcode to jump if
13a0: 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69   either expressi
13b0: 6f 6e 0a 2a 2a 20 65 76 61 6c 75 61 74 65 73 20  on.** evaluates 
13c0: 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  to NULL..*/.stat
13d0: 69 63 20 69 6e 74 20 62 69 6e 61 72 79 43 6f 6d  ic int binaryCom
13e0: 70 61 72 65 50 31 28 45 78 70 72 20 2a 70 45 78  pareP1(Expr *pEx
13f0: 70 72 31 2c 20 45 78 70 72 20 2a 70 45 78 70 72  pr1, Expr *pExpr
1400: 32 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  2, int jumpIfNul
1410: 6c 29 7b 0a 20 20 63 68 61 72 20 61 66 66 20 3d  l){.  char aff =
1420: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
1430: 6e 69 74 79 28 70 45 78 70 72 32 29 3b 0a 20 20  nity(pExpr2);.  
1440: 72 65 74 75 72 6e 20 28 28 69 6e 74 29 73 71 6c  return ((int)sql
1450: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
1460: 69 74 79 28 70 45 78 70 72 31 2c 20 61 66 66 29  ity(pExpr1, aff)
1470: 29 2b 28 6a 75 6d 70 49 66 4e 75 6c 6c 3f 30 78  )+(jumpIfNull?0x
1480: 31 30 30 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  100:0);.}../*.**
1490: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
14a0: 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74 69  r to the collati
14b0: 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61 74  on sequence that
14c0: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
14d0: 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20 63  by.** a binary c
14e0: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
14f0: 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c 65  or comparing pLe
1500: 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a  ft and pRight..*
1510: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66 74  *.** If the left
1520: 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e   hand expression
1530: 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67   has a collating
1540: 20 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c 20   sequence type, 
1550: 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75 73  then it is.** us
1560: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68  ed. Otherwise th
1570: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
1580: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69 67  ence for the rig
1590: 68 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69  ht hand expressi
15a0: 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 6f  on.** is used, o
15b0: 72 20 74 68 65 20 64 65 66 61 75 6c 74 20 28 42  r the default (B
15c0: 49 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68 65  INARY) if neithe
15d0: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73  r expression has
15e0: 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20   a collating.** 
15f0: 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75  type..**.** Argu
1600: 6d 65 6e 74 20 70 52 69 67 68 74 20 28 62 75 74  ment pRight (but
1610: 20 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61 79 20   not pLeft) may 
1620: 62 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65  be a null pointe
1630: 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  r. In this case,
1640: 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 63 6f  .** it is not co
1650: 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f 6c  nsidered..*/.Col
1660: 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 42 69 6e  lSeq *sqlite3Bin
1670: 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
1680: 71 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  q(.  Parse *pPar
1690: 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c 65  se, .  Expr *pLe
16a0: 66 74 2c 20 0a 20 20 45 78 70 72 20 2a 70 52 69  ft, .  Expr *pRi
16b0: 67 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  ght.){.  CollSeq
16c0: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72   *pColl;.  asser
16d0: 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 69 66  t( pLeft );.  if
16e0: 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26  ( pLeft->flags &
16f0: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29   EP_ExpCollate )
1700: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  {.    assert( pL
1710: 65 66 74 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20  eft->pColl );.  
1720: 20 20 70 43 6f 6c 6c 20 3d 20 70 4c 65 66 74 2d    pColl = pLeft-
1730: 3e 70 43 6f 6c 6c 3b 0a 20 20 7d 65 6c 73 65 20  >pColl;.  }else 
1740: 69 66 28 20 70 52 69 67 68 74 20 26 26 20 70 52  if( pRight && pR
1750: 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45 50  ight->flags & EP
1760: 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20  _ExpCollate ){. 
1770: 20 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68     assert( pRigh
1780: 74 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20  t->pColl );.    
1790: 70 43 6f 6c 6c 20 3d 20 70 52 69 67 68 74 2d 3e  pColl = pRight->
17a0: 70 43 6f 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pColl;.  }else{.
17b0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
17c0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
17d0: 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20  Parse, pLeft);. 
17e0: 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b     if( !pColl ){
17f0: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  .      pColl = s
1800: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
1810: 71 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  q(pParse, pRight
1820: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
1830: 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a  eturn pColl;.}..
1840: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1850: 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 61 72  ode for a compar
1860: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  ison operator..*
1870: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64  /.static int cod
1880: 65 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73  eCompare(.  Pars
1890: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
18a0: 20 54 68 65 20 70 61 72 73 69 6e 67 20 28 61 6e   The parsing (an
18b0: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
18c0: 67 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  g) context */.  
18d0: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20  Expr *pLeft,    
18e0: 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70    /* The left op
18f0: 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20  erand */.  Expr 
1900: 2a 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20  *pRight,     /* 
1910: 54 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  The right operan
1920: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64  d */.  int opcod
1930: 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e,       /* The 
1940: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64  comparison opcod
1950: 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c  e */.  int dest,
1960: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
1970: 20 68 65 72 65 20 69 66 20 74 72 75 65 2e 20 20   here if true.  
1980: 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e  */.  int jumpIfN
1990: 75 6c 6c 20 20 20 20 2f 2a 20 49 66 20 74 72 75  ull    /* If tru
19a0: 65 2c 20 6a 75 6d 70 20 69 66 20 65 69 74 68 65  e, jump if eithe
19b0: 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c  r operand is NUL
19c0: 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 70 31  L */.){.  int p1
19d0: 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65   = binaryCompare
19e0: 50 31 28 70 4c 65 66 74 2c 20 70 52 69 67 68 74  P1(pLeft, pRight
19f0: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
1a00: 20 43 6f 6c 6c 53 65 71 20 2a 70 33 20 3d 20 73   CollSeq *p3 = s
1a10: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
1a20: 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
1a30: 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
1a40: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
1a50: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 70 50  te3VdbeAddOp4(pP
1a60: 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63  arse->pVdbe, opc
1a70: 6f 64 65 2c 20 70 31 2c 20 64 65 73 74 2c 20 30  ode, p1, dest, 0
1a80: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
1aa0: 69 64 2a 29 70 33 2c 20 50 34 5f 43 4f 4c 4c 53  id*)p3, P4_COLLS
1ab0: 45 51 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  EQ);.}../*.** Co
1ac0: 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78  nstruct a new ex
1ad0: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e  pression node an
1ae0: 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
1af0: 65 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72  er to it.  Memor
1b00: 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f  y.** for this no
1b10: 64 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  de is obtained f
1b20: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
1b30: 6f 63 28 29 2e 20 20 54 68 65 20 63 61 6c 6c 69  oc().  The calli
1b40: 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  ng function.** i
1b50: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
1b60: 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 74 68  r making sure th
1b70: 65 20 6e 6f 64 65 20 65 76 65 6e 74 75 61 6c 6c  e node eventuall
1b80: 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a 2a 2f  y gets freed..*/
1b90: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
1ba0: 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  pr(.  sqlite3 *d
1bb0: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b,            /*
1bc0: 20 48 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69   Handle for sqli
1bd0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
1be0: 29 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20  ) (may be null) 
1bf0: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
1c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c10: 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64  Expression opcod
1c20: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65  e */.  Expr *pLe
1c30: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ft,            /
1c40: 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a  * Left operand *
1c50: 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74  /.  Expr *pRight
1c60: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ,           /* R
1c70: 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  ight operand */.
1c80: 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70    const Token *p
1c90: 54 6f 6b 65 6e 20 20 20 20 20 2f 2a 20 41 72 67  Token     /* Arg
1ca0: 75 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29  ument token */.)
1cb0: 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a  {.  Expr *pNew;.
1cc0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
1cd0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
1ce0: 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a   sizeof(Expr));.
1cf0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
1d00: 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 6d 61 6c  .    /* When mal
1d10: 6c 6f 63 20 66 61 69 6c 73 2c 20 64 65 6c 65 74  loc fails, delet
1d20: 65 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67  e pLeft and pRig
1d30: 68 74 2e 20 45 78 70 72 65 73 73 69 6f 6e 73 20  ht. Expressions 
1d40: 70 61 73 73 65 64 20 74 6f 20 0a 20 20 20 20 2a  passed to .    *
1d50: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
1d60: 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 20 61  must always be a
1d70: 6c 6c 6f 63 61 74 65 64 20 77 69 74 68 20 73 71  llocated with sq
1d80: 6c 69 74 65 33 45 78 70 72 28 29 20 66 6f 72 20  lite3Expr() for 
1d90: 74 68 69 73 20 0a 20 20 20 20 2a 2a 20 72 65 61  this .    ** rea
1da0: 73 6f 6e 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  son. .    */.   
1db0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
1dc0: 74 65 28 70 4c 65 66 74 29 3b 0a 20 20 20 20 73  te(pLeft);.    s
1dd0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
1de0: 28 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65  (pRight);.    re
1df0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e  turn 0;.  }.  pN
1e00: 65 77 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20 70  ew->op = op;.  p
1e10: 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65  New->pLeft = pLe
1e20: 66 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67  ft;.  pNew->pRig
1e30: 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 70  ht = pRight;.  p
1e40: 4e 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a  New->iAgg = -1;.
1e50: 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a    if( pToken ){.
1e60: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b      assert( pTok
1e70: 65 6e 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20 20  en->dyn==0 );.  
1e80: 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20 70    pNew->span = p
1e90: 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54  New->token = *pT
1ea0: 6f 6b 65 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66  oken;.  }else if
1eb0: 28 20 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 69  ( pLeft ){.    i
1ec0: 66 28 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20  f( pRight ){.   
1ed0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 70     sqlite3ExprSp
1ee0: 61 6e 28 70 4e 65 77 2c 20 26 70 4c 65 66 74 2d  an(pNew, &pLeft-
1ef0: 3e 73 70 61 6e 2c 20 26 70 52 69 67 68 74 2d 3e  >span, &pRight->
1f00: 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  span);.      if(
1f10: 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26   pRight->flags &
1f20: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29   EP_ExpCollate )
1f30: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
1f40: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78 70 43  flags |= EP_ExpC
1f50: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 20 20  ollate;.        
1f60: 70 4e 65 77 2d 3e 70 43 6f 6c 6c 20 3d 20 70 52  pNew->pColl = pR
1f70: 69 67 68 74 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20  ight->pColl;.   
1f80: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1f90: 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20  f( pLeft->flags 
1fa0: 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20  & EP_ExpCollate 
1fb0: 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  ){.      pNew->f
1fc0: 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f  lags |= EP_ExpCo
1fd0: 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 70 4e 65  llate;.      pNe
1fe0: 77 2d 3e 70 43 6f 6c 6c 20 3d 20 70 4c 65 66 74  w->pColl = pLeft
1ff0: 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20  ->pColl;.    }. 
2000: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 45 78 70   }..  sqlite3Exp
2010: 72 53 65 74 48 65 69 67 68 74 28 70 4e 65 77 29  rSetHeight(pNew)
2020: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
2030: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 6f 72 6b 73 20  .}../*.** Works 
2040: 6c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72  like sqlite3Expr
2050: 28 29 20 65 78 63 65 70 74 20 74 68 61 74 20 69  () except that i
2060: 74 20 74 61 6b 65 73 20 61 6e 20 65 78 74 72 61  t takes an extra
2070: 20 50 61 72 73 65 2a 0a 2a 2a 20 61 72 67 75 6d   Parse*.** argum
2080: 65 6e 74 20 61 6e 64 20 6e 6f 74 69 66 69 65 73  ent and notifies
2090: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
20a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 6a 65 63  connection objec
20b0: 74 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  t if malloc fail
20c0: 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  s..*/.Expr *sqli
20d0: 74 65 33 50 45 78 70 72 28 0a 20 20 50 61 72 73  te3PExpr(.  Pars
20e0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
20f0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
2100: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
2110: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
2120: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
2130: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78  n opcode */.  Ex
2140: 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20  pr *pLeft,      
2150: 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70        /* Left op
2160: 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20  erand */.  Expr 
2170: 2a 70 52 69 67 68 74 2c 20 20 20 20 20 20 20 20  *pRight,        
2180: 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65 72     /* Right oper
2190: 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54  and */.  const T
21a0: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 20 20 20  oken *pToken    
21b0: 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 6b   /* Argument tok
21c0: 65 6e 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72  en */.){.  retur
21d0: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 28 70 50  n sqlite3Expr(pP
21e0: 61 72 73 65 2d 3e 64 62 2c 20 6f 70 2c 20 70 4c  arse->db, op, pL
21f0: 65 66 74 2c 20 70 52 69 67 68 74 2c 20 70 54 6f  eft, pRight, pTo
2200: 6b 65 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  ken);.}../*.** W
2210: 68 65 6e 20 64 6f 69 6e 67 20 61 20 6e 65 73 74  hen doing a nest
2220: 65 64 20 70 61 72 73 65 2c 20 79 6f 75 20 63 61  ed parse, you ca
2230: 6e 20 69 6e 63 6c 75 64 65 20 74 65 72 6d 73 20  n include terms 
2240: 69 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  in an expression
2250: 0a 2a 2a 20 74 68 61 74 20 6c 6f 6f 6b 20 6c 69  .** that look li
2260: 6b 65 20 74 68 69 73 3a 20 20 20 23 30 20 23 31  ke this:   #0 #1
2270: 20 23 32 20 2e 2e 2e 20 20 54 68 65 73 65 20 74   #2 ...  These t
2280: 65 72 6d 73 20 72 65 66 65 72 20 74 6f 20 65 6c  erms refer to el
2290: 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 20 74 68 65  ements.** on the
22a0: 20 73 74 61 63 6b 2e 20 20 22 23 30 22 20 6d 65   stack.  "#0" me
22b0: 61 6e 73 20 74 68 65 20 74 6f 70 20 6f 66 20 74  ans the top of t
22c0: 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 20 22 23 31  he stack..** "#1
22d0: 22 20 6d 65 61 6e 73 20 74 68 65 20 6e 65 78 74  " means the next
22e0: 20 64 6f 77 6e 20 6f 6e 20 74 68 65 20 73 74 61   down on the sta
22f0: 63 6b 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74  ck.  And so fort
2300: 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  h..**.** This ro
2310: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
2320: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 74 6f  by the parser to
2330: 20 64 65 61 6c 20 77 69 74 68 20 6f 6e 20 6f 66   deal with on of
2340: 20 74 68 6f 73 65 20 74 65 72 6d 73 2e 0a 2a 2a   those terms..**
2350: 20 49 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   It immediately 
2360: 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74  generates code t
2370: 6f 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75  o store the valu
2380: 65 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20 6c 6f  e in a memory lo
2390: 63 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 72  cation..** The r
23a0: 65 74 75 72 6e 73 20 61 6e 20 65 78 70 72 65 73  eturns an expres
23b0: 73 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 63  sion that will c
23c0: 6f 64 65 20 74 6f 20 65 78 74 72 61 63 74 20 74  ode to extract t
23d0: 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 0a 2a 2a  he value from.**
23e0: 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 6c 6f 63   that memory loc
23f0: 61 74 69 6f 6e 20 61 73 20 6e 65 65 64 65 64 2e  ation as needed.
2400: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
2410: 33 52 65 67 69 73 74 65 72 45 78 70 72 28 50 61  3RegisterExpr(Pa
2420: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
2430: 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 56  en *pToken){.  V
2440: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
2450: 3e 70 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a  >pVdbe;.  Expr *
2460: 70 3b 0a 20 20 69 6e 74 20 64 65 70 74 68 3b 0a  p;.  int depth;.
2470: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 65    if( pParse->ne
2480: 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73  sted==0 ){.    s
2490: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
24a0: 50 61 72 73 65 2c 20 22 6e 65 61 72 20 5c 22 25  Parse, "near \"%
24b0: 54 5c 22 3a 20 73 79 6e 74 61 78 20 65 72 72 6f  T\": syntax erro
24c0: 72 22 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 20  r", pToken);.   
24d0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
24e0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
24f0: 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  NULL, 0, 0, 0);.
2500: 20 20 7d 0a 20 20 69 66 28 20 76 3d 3d 30 20 29    }.  if( v==0 )
2510: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 20 3d   return 0;.  p =
2520: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
2530: 61 72 73 65 2c 20 54 4b 5f 52 45 47 49 53 54 45  arse, TK_REGISTE
2540: 52 2c 20 30 2c 20 30 2c 20 70 54 6f 6b 65 6e 29  R, 0, 0, pToken)
2550: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  ;.  if( p==0 ){.
2560: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f      return 0;  /
2570: 2a 20 4d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20  * Malloc failed 
2580: 2a 2f 0a 20 20 7d 0a 20 20 64 65 70 74 68 20 3d  */.  }.  depth =
2590: 20 61 74 6f 69 28 28 63 68 61 72 2a 29 26 70 54   atoi((char*)&pT
25a0: 6f 6b 65 6e 2d 3e 7a 5b 31 5d 29 3b 0a 20 20 70  oken->z[1]);.  p
25b0: 2d 3e 69 54 61 62 6c 65 20 3d 20 2b 2b 70 50 61  ->iTable = ++pPa
25c0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c  rse->nMem;.  sql
25d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
25e0: 2c 20 4f 50 5f 43 6f 70 79 2c 20 2d 64 65 70 74  , OP_Copy, -dept
25f0: 68 2c 20 70 2d 3e 69 54 61 62 6c 65 29 3b 0a 20  h, p->iTable);. 
2600: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
2610: 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70  .** Join two exp
2620: 72 65 73 73 69 6f 6e 73 20 75 73 69 6e 67 20 61  ressions using a
2630: 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20  n AND operator. 
2640: 20 49 66 20 65 69 74 68 65 72 20 65 78 70 72 65   If either expre
2650: 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c  ssion is.** NULL
2660: 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75  , then just retu
2670: 72 6e 20 74 68 65 20 6f 74 68 65 72 20 65 78 70  rn the other exp
2680: 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 45 78 70 72  ression..*/.Expr
2690: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64   *sqlite3ExprAnd
26a0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
26b0: 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72 20  pr *pLeft, Expr 
26c0: 2a 70 52 69 67 68 74 29 7b 0a 20 20 69 66 28 20  *pRight){.  if( 
26d0: 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pLeft==0 ){.    
26e0: 72 65 74 75 72 6e 20 70 52 69 67 68 74 3b 0a 20  return pRight;. 
26f0: 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68   }else if( pRigh
2700: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  t==0 ){.    retu
2710: 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c 73  rn pLeft;.  }els
2720: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  e{.    return sq
2730: 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
2740: 5f 41 4e 44 2c 20 70 4c 65 66 74 2c 20 70 52 69  _AND, pLeft, pRi
2750: 67 68 74 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  ght, 0);.  }.}..
2760: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78  /*.** Set the Ex
2770: 70 72 2e 73 70 61 6e 20 66 69 65 6c 64 20 6f 66  pr.span field of
2780: 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
2790: 73 73 69 6f 6e 20 74 6f 20 73 70 61 6e 20 61 6c  ssion to span al
27a0: 6c 0a 2a 2a 20 74 65 78 74 20 62 65 74 77 65 65  l.** text betwee
27b0: 6e 20 74 68 65 20 74 77 6f 20 67 69 76 65 6e 20  n the two given 
27c0: 74 6f 6b 65 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20  tokens..*/.void 
27d0: 73 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28  sqlite3ExprSpan(
27e0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b  Expr *pExpr, Tok
27f0: 65 6e 20 2a 70 4c 65 66 74 2c 20 54 6f 6b 65 6e  en *pLeft, Token
2800: 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 61 73 73   *pRight){.  ass
2810: 65 72 74 28 20 70 52 69 67 68 74 21 3d 30 20 29  ert( pRight!=0 )
2820: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66  ;.  assert( pLef
2830: 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 45  t!=0 );.  if( pE
2840: 78 70 72 20 26 26 20 70 52 69 67 68 74 2d 3e 7a  xpr && pRight->z
2850: 20 26 26 20 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a   && pLeft->z ){.
2860: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66      assert( pLef
2870: 74 2d 3e 64 79 6e 3d 3d 30 20 7c 7c 20 70 4c 65  t->dyn==0 || pLe
2880: 66 74 2d 3e 7a 5b 70 4c 65 66 74 2d 3e 6e 5d 3d  ft->z[pLeft->n]=
2890: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  =0 );.    if( pL
28a0: 65 66 74 2d 3e 64 79 6e 3d 3d 30 20 26 26 20 70  eft->dyn==0 && p
28b0: 52 69 67 68 74 2d 3e 64 79 6e 3d 3d 30 20 29 7b  Right->dyn==0 ){
28c0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70  .      pExpr->sp
28d0: 61 6e 2e 7a 20 3d 20 70 4c 65 66 74 2d 3e 7a 3b  an.z = pLeft->z;
28e0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70  .      pExpr->sp
28f0: 61 6e 2e 6e 20 3d 20 70 52 69 67 68 74 2d 3e 6e  an.n = pRight->n
2900: 20 2b 20 28 70 52 69 67 68 74 2d 3e 7a 20 2d 20   + (pRight->z - 
2910: 70 4c 65 66 74 2d 3e 7a 29 3b 0a 20 20 20 20 7d  pLeft->z);.    }
2920: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 45 78 70  else{.      pExp
2930: 72 2d 3e 73 70 61 6e 2e 7a 20 3d 20 30 3b 0a 20  r->span.z = 0;. 
2940: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
2950: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65  * Construct a ne
2960: 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  w expression nod
2970: 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e  e for a function
2980: 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a   with multiple.*
2990: 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a  * arguments..*/.
29a0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
29b0: 72 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20  rFunction(Parse 
29c0: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73  *pParse, ExprLis
29d0: 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20  t *pList, Token 
29e0: 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72  *pToken){.  Expr
29f0: 20 2a 70 4e 65 77 3b 0a 20 20 61 73 73 65 72 74   *pNew;.  assert
2a00: 28 20 70 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e  ( pToken );.  pN
2a10: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
2a20: 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
2a30: 3e 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  >db, sizeof(Expr
2a40: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
2a50: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
2a60: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
2a70: 70 4c 69 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64  pList); /* Avoid
2a80: 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20   leaking memory 
2a90: 77 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  when malloc fail
2aa0: 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  s */.    return 
2ab0: 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f  0;.  }.  pNew->o
2ac0: 70 20 3d 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3b  p = TK_FUNCTION;
2ad0: 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 73 74 20 3d  .  pNew->pList =
2ae0: 20 70 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74   pList;.  assert
2af0: 28 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e 3d 3d 30  ( pToken->dyn==0
2b00: 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 74 6f 6b 65   );.  pNew->toke
2b10: 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 70  n = *pToken;.  p
2b20: 4e 65 77 2d 3e 73 70 61 6e 20 3d 20 70 4e 65 77  New->span = pNew
2b30: 2d 3e 74 6f 6b 65 6e 3b 0a 0a 20 20 73 71 6c 69  ->token;..  sqli
2b40: 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74  te3ExprSetHeight
2b50: 28 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e  (pNew);.  return
2b60: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
2b70: 41 73 73 69 67 6e 20 61 20 76 61 72 69 61 62 6c  Assign a variabl
2b80: 65 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20 65  e number to an e
2b90: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 65  xpression that e
2ba0: 6e 63 6f 64 65 73 20 61 20 77 69 6c 64 63 61 72  ncodes a wildcar
2bb0: 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69 67  d.** in the orig
2bc0: 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65  inal SQL stateme
2bd0: 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64  nt.  .**.** Wild
2be0: 63 61 72 64 73 20 63 6f 6e 73 69 73 74 69 6e 67  cards consisting
2bf0: 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 22 3f 22   of a single "?"
2c00: 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 68   are assigned th
2c10: 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69 61  e next sequentia
2c20: 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e 75  l.** variable nu
2c30: 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64  mber..**.** Wild
2c40: 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72  cards of the for
2c50: 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73 73  m "?nnn" are ass
2c60: 69 67 6e 65 64 20 74 68 65 20 6e 75 6d 62 65 72  igned the number
2c70: 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b 65   "nnn".  We make
2c80: 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20 69  .** sure "nnn" i
2c90: 73 20 6e 6f 74 20 74 6f 6f 20 62 65 20 74 6f 20  s not too be to 
2ca0: 61 76 6f 69 64 20 61 20 64 65 6e 69 61 6c 20 6f  avoid a denial o
2cb0: 66 20 73 65 72 76 69 63 65 20 61 74 74 61 63 6b  f service attack
2cc0: 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c   when.** the SQL
2cd0: 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73   statement comes
2ce0: 20 66 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61   from an externa
2cf0: 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20  l source..**.** 
2d00: 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65  Wildcards of the
2d10: 20 66 6f 72 6d 20 22 3a 61 61 61 22 20 6f 72 20   form ":aaa" or 
2d20: 22 24 61 61 61 22 20 61 72 65 20 61 73 73 69 67  "$aaa" are assig
2d30: 6e 65 64 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ned the same num
2d40: 62 65 72 0a 2a 2a 20 61 73 20 74 68 65 20 70 72  ber.** as the pr
2d50: 65 76 69 6f 75 73 20 69 6e 73 74 61 6e 63 65 20  evious instance 
2d60: 6f 66 20 74 68 65 20 73 61 6d 65 20 77 69 6c 64  of the same wild
2d70: 63 61 72 64 2e 20 20 4f 72 20 69 66 20 74 68 69  card.  Or if thi
2d80: 73 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a  s is the first.*
2d90: 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  * instance of th
2da0: 65 20 77 69 6c 64 63 61 72 64 2c 20 74 68 65 20  e wildcard, the 
2db0: 6e 65 78 74 20 73 65 71 75 65 6e 69 61 6c 20 76  next sequenial v
2dc0: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 69  ariable number i
2dd0: 73 0a 2a 2a 20 61 73 73 69 67 6e 65 64 2e 0a 2a  s.** assigned..*
2de0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
2df0: 70 72 41 73 73 69 67 6e 56 61 72 4e 75 6d 62 65  prAssignVarNumbe
2e00: 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
2e10: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
2e20: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 3b 0a   Token *pToken;.
2e30: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
2e40: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69  pParse->db;..  i
2e50: 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
2e60: 74 75 72 6e 3b 0a 20 20 70 54 6f 6b 65 6e 20 3d  turn;.  pToken =
2e70: 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a   &pExpr->token;.
2e80: 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e    assert( pToken
2e90: 2d 3e 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65  ->n>=1 );.  asse
2ea0: 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30  rt( pToken->z!=0
2eb0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
2ec0: 6f 6b 65 6e 2d 3e 7a 5b 30 5d 21 3d 30 20 29 3b  oken->z[0]!=0 );
2ed0: 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 6e  .  if( pToken->n
2ee0: 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69  ==1 ){.    /* Wi
2ef0: 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f  ldcard of the fo
2f00: 72 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20  rm "?".  Assign 
2f10: 74 68 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c  the next variabl
2f20: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  e number */.    
2f30: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
2f40: 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a  ++pParse->nVar;.
2f50: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 6b    }else if( pTok
2f60: 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b  en->z[0]=='?' ){
2f70: 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64  .    /* Wildcard
2f80: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e   of the form "?n
2f90: 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22 6e  nn".  Convert "n
2fa0: 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  nn" to an intege
2fb0: 72 20 61 6e 64 0a 20 20 20 20 2a 2a 20 75 73 65  r and.    ** use
2fc0: 20 69 74 20 61 73 20 74 68 65 20 76 61 72 69 61   it as the varia
2fd0: 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ble number */.  
2fe0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 45 78    int i;.    pEx
2ff0: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69 20 3d  pr->iTable = i =
3000: 20 61 74 6f 69 28 28 63 68 61 72 2a 29 26 70 54   atoi((char*)&pT
3010: 6f 6b 65 6e 2d 3e 7a 5b 31 5d 29 3b 0a 20 20 20  oken->z[1]);.   
3020: 20 69 66 28 20 69 3c 31 20 7c 7c 20 69 3e 53 51   if( i<1 || i>SQ
3030: 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c  LITE_MAX_VARIABL
3040: 45 5f 4e 55 4d 42 45 52 20 29 7b 0a 20 20 20 20  E_NUMBER ){.    
3050: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
3060: 67 28 70 50 61 72 73 65 2c 20 22 76 61 72 69 61  g(pParse, "varia
3070: 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20  ble number must 
3080: 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61 6e  be between ?1 an
3090: 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20 20  d ?%d",.        
30a0: 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52    SQLITE_MAX_VAR
30b0: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 29 3b 0a 20  IABLE_NUMBER);. 
30c0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 70     }.    if( i>p
30d0: 50 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a 20  Parse->nVar ){. 
30e0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61       pParse->nVa
30f0: 72 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d  r = i;.    }.  }
3100: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57 69 6c  else{.    /* Wil
3110: 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f  dcards of the fo
3120: 72 6d 20 22 3a 61 61 61 22 20 6f 72 20 22 24 61  rm ":aaa" or "$a
3130: 61 61 22 2e 20 20 52 65 75 73 65 20 74 68 65 20  aa".  Reuse the 
3140: 73 61 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20  same variable.  
3150: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20 74    ** number as t
3160: 68 65 20 70 72 69 6f 72 20 61 70 70 65 61 72 61  he prior appeara
3170: 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  nce of the same 
3180: 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65 20  name, or if the 
3190: 6e 61 6d 65 0a 20 20 20 20 2a 2a 20 68 61 73 20  name.    ** has 
31a0: 6e 65 76 65 72 20 61 70 70 65 61 72 65 64 20 62  never appeared b
31b0: 65 66 6f 72 65 2c 20 72 65 75 73 65 20 74 68 65  efore, reuse the
31c0: 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 20 6e   same variable n
31d0: 75 6d 62 65 72 0a 20 20 20 20 2a 2f 0a 20 20 20  umber.    */.   
31e0: 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 20 20 6e   int i, n;.    n
31f0: 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 3b 0a 20 20   = pToken->n;.  
3200: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
3210: 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 3b 20 69  rse->nVarExpr; i
3220: 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
3230: 2a 70 45 3b 0a 20 20 20 20 20 20 69 66 28 20 28  *pE;.      if( (
3240: 70 45 20 3d 20 70 50 61 72 73 65 2d 3e 61 70 56  pE = pParse->apV
3250: 61 72 45 78 70 72 5b 69 5d 29 21 3d 30 0a 20 20  arExpr[i])!=0.  
3260: 20 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e 74          && pE->t
3270: 6f 6b 65 6e 2e 6e 3d 3d 6e 0a 20 20 20 20 20 20  oken.n==n.      
3280: 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 45      && memcmp(pE
3290: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 54 6f 6b 65  ->token.z, pToke
32a0: 6e 2d 3e 7a 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  n->z, n)==0 ){. 
32b0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
32c0: 61 62 6c 65 20 3d 20 70 45 2d 3e 69 54 61 62 6c  able = pE->iTabl
32d0: 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  e;.        break
32e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
32f0: 20 20 20 20 69 66 28 20 69 3e 3d 70 50 61 72 73      if( i>=pPars
3300: 65 2d 3e 6e 56 61 72 45 78 70 72 20 29 7b 0a 20  e->nVarExpr ){. 
3310: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
3320: 6c 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  le = ++pParse->n
3330: 56 61 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Var;.      if( p
3340: 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 3e  Parse->nVarExpr>
3350: 3d 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70  =pParse->nVarExp
3360: 72 41 6c 6c 6f 63 2d 31 20 29 7b 0a 20 20 20 20  rAlloc-1 ){.    
3370: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72      pParse->nVar
3380: 45 78 70 72 41 6c 6c 6f 63 20 2b 3d 20 70 50 61  ExprAlloc += pPa
3390: 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c  rse->nVarExprAll
33a0: 6f 63 20 2b 20 31 30 3b 0a 20 20 20 20 20 20 20  oc + 10;.       
33b0: 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78   pParse->apVarEx
33c0: 70 72 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20  pr =.           
33d0: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
33e0: 63 4f 72 46 72 65 65 28 0a 20 20 20 20 20 20 20  cOrFree(.       
33f0: 20 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20         db,.     
3400: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
3410: 3e 61 70 56 61 72 45 78 70 72 2c 0a 20 20 20 20  >apVarExpr,.    
3420: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
3430: 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 2a  ->nVarExprAlloc*
3440: 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61  sizeof(pParse->a
3450: 70 56 61 72 45 78 70 72 5b 30 5d 29 0a 20 20 20  pVarExpr[0]).   
3460: 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
3470: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 64    }.      if( !d
3480: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
3490: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
34a0: 74 28 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72  t( pParse->apVar
34b0: 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  Expr!=0 );.     
34c0: 20 20 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72     pParse->apVar
34d0: 45 78 70 72 5b 70 50 61 72 73 65 2d 3e 6e 56 61  Expr[pParse->nVa
34e0: 72 45 78 70 72 2b 2b 5d 20 3d 20 70 45 78 70 72  rExpr++] = pExpr
34f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3500: 20 20 7d 20 0a 20 20 69 66 28 20 21 70 50 61 72    } .  if( !pPar
3510: 73 65 2d 3e 6e 45 72 72 20 26 26 20 70 50 61 72  se->nErr && pPar
3520: 73 65 2d 3e 6e 56 61 72 3e 53 51 4c 49 54 45 5f  se->nVar>SQLITE_
3530: 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MAX_VARIABLE_NUM
3540: 42 45 52 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  BER ){.    sqlit
3550: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
3560: 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 53 51 4c  e, "too many SQL
3570: 20 76 61 72 69 61 62 6c 65 73 22 29 3b 0a 20 20   variables");.  
3580: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72  }.}../*.** Recur
3590: 73 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61 6e  sively delete an
35a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
35b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
35c0: 33 45 78 70 72 44 65 6c 65 74 65 28 45 78 70 72  3ExprDelete(Expr
35d0: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30   *p){.  if( p==0
35e0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
35f0: 20 70 2d 3e 73 70 61 6e 2e 64 79 6e 20 29 20 73   p->span.dyn ) s
3600: 71 6c 69 74 65 33 5f 66 72 65 65 28 28 63 68 61  qlite3_free((cha
3610: 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20  r*)p->span.z);. 
3620: 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 64 79   if( p->token.dy
3630: 6e 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  n ) sqlite3_free
3640: 28 28 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e  ((char*)p->token
3650: 2e 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  .z);.  sqlite3Ex
3660: 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c 65 66  prDelete(p->pLef
3670: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t);.  sqlite3Exp
3680: 72 44 65 6c 65 74 65 28 70 2d 3e 70 52 69 67 68  rDelete(p->pRigh
3690: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t);.  sqlite3Exp
36a0: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70  rListDelete(p->p
36b0: 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  List);.  sqlite3
36c0: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 2d 3e  SelectDelete(p->
36d0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69  pSelect);.  sqli
36e0: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 7d 0a 0a  te3_free(p);.}..
36f0: 2f 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e 74  /*.** The Expr.t
3700: 6f 6b 65 6e 20 66 69 65 6c 64 20 6d 69 67 68 74  oken field might
3710: 20 62 65 20 61 20 73 74 72 69 6e 67 20 6c 69 74   be a string lit
3720: 65 72 61 6c 20 74 68 61 74 20 69 73 20 71 75 6f  eral that is quo
3730: 74 65 64 2e 0a 2a 2a 20 49 66 20 73 6f 2c 20 72  ted..** If so, r
3740: 65 6d 6f 76 65 20 74 68 65 20 71 75 6f 74 61 74  emove the quotat
3750: 69 6f 6e 20 6d 61 72 6b 73 2e 0a 2a 2f 0a 76 6f  ion marks..*/.vo
3760: 69 64 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74  id sqlite3Dequot
3770: 65 45 78 70 72 28 73 71 6c 69 74 65 33 20 2a 64  eExpr(sqlite3 *d
3780: 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  b, Expr *p){.  i
3790: 66 28 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f  f( ExprHasAnyPro
37a0: 70 65 72 74 79 28 70 2c 20 45 50 5f 44 65 71 75  perty(p, EP_Dequ
37b0: 6f 74 65 64 29 20 29 7b 0a 20 20 20 20 72 65 74  oted) ){.    ret
37c0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 45 78 70 72 53  urn;.  }.  ExprS
37d0: 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  etProperty(p, EP
37e0: 5f 44 65 71 75 6f 74 65 64 29 3b 0a 20 20 69 66  _Dequoted);.  if
37f0: 28 20 70 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 3d 3d  ( p->token.dyn==
3800: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
3810: 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70  TokenCopy(db, &p
3820: 2d 3e 74 6f 6b 65 6e 2c 20 26 70 2d 3e 74 6f 6b  ->token, &p->tok
3830: 65 6e 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  en);.  }.  sqlit
3840: 65 33 44 65 71 75 6f 74 65 28 28 63 68 61 72 2a  e3Dequote((char*
3850: 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 7d 0a  )p->token.z);.}.
3860: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
3870: 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66 20 72  owing group of r
3880: 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64 65 65  outines make dee
3890: 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78 70 72  p copies of expr
38a0: 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72  essions,.** expr
38b0: 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44  ession lists, ID
38c0: 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65 6c 65   lists, and sele
38d0: 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20  ct statements.  
38e0: 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a  The copies can.*
38f0: 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28 62 79  * be deleted (by
3900: 20 62 65 69 6e 67 20 70 61 73 73 65 64 20 74 6f   being passed to
3910: 20 74 68 65 69 72 20 72 65 73 70 65 63 74 69 76   their respectiv
3920: 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f  e ...Delete() ro
3930: 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f  utines).** witho
3940: 75 74 20 65 66 66 65 63 74 69 6e 67 20 74 68 65  ut effecting the
3950: 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a   originals..**.*
3960: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
3970: 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64 20 73   list, ID, and s
3980: 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65 74 75  ource lists retu
3990: 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45 78 70  rn by sqlite3Exp
39a0: 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73  rListDup(),.** s
39b0: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28  qlite3IdListDup(
39c0: 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33 53 72  ), and sqlite3Sr
39d0: 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e 20 6e  cListDup() can n
39e0: 6f 74 20 62 65 20 66 75 72 74 68 65 72 20 65 78  ot be further ex
39f0: 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73 75  panded .** by su
3a00: 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
3a10: 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41 70 70  o sqlite*ListApp
3a20: 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a  end() routines..
3a30: 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73  **.** Any tables
3a40: 20 74 68 61 74 20 74 68 65 20 53 72 63 4c 69 73   that the SrcLis
3a50: 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  t might point to
3a60: 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61   are not duplica
3a70: 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ted..*/.Expr *sq
3a80: 6c 69 74 65 33 45 78 70 72 44 75 70 28 73 71 6c  lite3ExprDup(sql
3a90: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a  ite3 *db, Expr *
3aa0: 70 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  p){.  Expr *pNew
3ab0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
3ac0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20  eturn 0;.  pNew 
3ad0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
3ae0: 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
3af0: 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  *p) );.  if( pNe
3b00: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
3b10: 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2c 20  .  memcpy(pNew, 
3b20: 70 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  p, sizeof(*pNew)
3b30: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65  );.  if( p->toke
3b40: 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 70 4e  n.z!=0 ){.    pN
3b50: 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 28 75  ew->token.z = (u
3b60: 38 2a 29 73 71 6c 69 74 65 33 44 62 53 74 72 4e  8*)sqlite3DbStrN
3b70: 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70  Dup(db, (char*)p
3b80: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 2d 3e 74 6f  ->token.z, p->to
3b90: 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 70 4e 65 77  ken.n);.    pNew
3ba0: 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 31 3b  ->token.dyn = 1;
3bb0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
3bc0: 73 65 72 74 28 20 70 4e 65 77 2d 3e 74 6f 6b 65  sert( pNew->toke
3bd0: 6e 2e 7a 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  n.z==0 );.  }.  
3be0: 70 4e 65 77 2d 3e 73 70 61 6e 2e 7a 20 3d 20 30  pNew->span.z = 0
3bf0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20  ;.  pNew->pLeft 
3c00: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
3c10: 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a  (db, p->pLeft);.
3c20: 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d    pNew->pRight =
3c30: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
3c40: 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a  db, p->pRight);.
3c50: 20 20 70 4e 65 77 2d 3e 70 4c 69 73 74 20 3d 20    pNew->pList = 
3c60: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
3c70: 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69 73 74 29  up(db, p->pList)
3c80: 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 65 6c 65 63  ;.  pNew->pSelec
3c90: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
3ca0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 53 65 6c  tDup(db, p->pSel
3cb0: 65 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ect);.  return p
3cc0: 4e 65 77 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  New;.}.void sqli
3cd0: 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 73 71 6c  te3TokenCopy(sql
3ce0: 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20  ite3 *db, Token 
3cf0: 2a 70 54 6f 2c 20 54 6f 6b 65 6e 20 2a 70 46 72  *pTo, Token *pFr
3d00: 6f 6d 29 7b 0a 20 20 69 66 28 20 70 54 6f 2d 3e  om){.  if( pTo->
3d10: 64 79 6e 20 29 20 73 71 6c 69 74 65 33 5f 66 72  dyn ) sqlite3_fr
3d20: 65 65 28 28 63 68 61 72 2a 29 70 54 6f 2d 3e 7a  ee((char*)pTo->z
3d30: 29 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  );.  if( pFrom->
3d40: 7a 20 29 7b 0a 20 20 20 20 70 54 6f 2d 3e 6e 20  z ){.    pTo->n 
3d50: 3d 20 70 46 72 6f 6d 2d 3e 6e 3b 0a 20 20 20 20  = pFrom->n;.    
3d60: 70 54 6f 2d 3e 7a 20 3d 20 28 75 38 2a 29 73 71  pTo->z = (u8*)sq
3d70: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64  lite3DbStrNDup(d
3d80: 62 2c 20 28 63 68 61 72 2a 29 70 46 72 6f 6d 2d  b, (char*)pFrom-
3d90: 3e 7a 2c 20 70 46 72 6f 6d 2d 3e 6e 29 3b 0a 20  >z, pFrom->n);. 
3da0: 20 20 20 70 54 6f 2d 3e 64 79 6e 20 3d 20 31 3b     pTo->dyn = 1;
3db0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54  .  }else{.    pT
3dc0: 6f 2d 3e 7a 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  o->z = 0;.  }.}.
3dd0: 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65  ExprList *sqlite
3de0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 73 71 6c  3ExprListDup(sql
3df0: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69  ite3 *db, ExprLi
3e00: 73 74 20 2a 70 29 7b 0a 20 20 45 78 70 72 4c 69  st *p){.  ExprLi
3e10: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75  st *pNew;.  stru
3e20: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
3e30: 20 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74   *pItem, *pOldIt
3e40: 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  em;.  int i;.  i
3e50: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
3e60: 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   0;.  pNew = sql
3e70: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
3e80: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  db, sizeof(*pNew
3e90: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
3ea0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
3eb0: 20 70 4e 65 77 2d 3e 69 45 43 75 72 73 6f 72 20   pNew->iECursor 
3ec0: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78  = 0;.  pNew->nEx
3ed0: 70 72 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f  pr = pNew->nAllo
3ee0: 63 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20  c = p->nExpr;.  
3ef0: 70 4e 65 77 2d 3e 61 20 3d 20 70 49 74 65 6d 20  pNew->a = pItem 
3f00: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
3f10: 63 52 61 77 28 64 62 2c 20 20 70 2d 3e 6e 45 78  cRaw(db,  p->nEx
3f20: 70 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30  pr*sizeof(p->a[0
3f30: 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65  ]) );.  if( pIte
3f40: 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  m==0 ){.    sqli
3f50: 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a  te3_free(pNew);.
3f60: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
3f70: 7d 20 0a 20 20 70 4f 6c 64 49 74 65 6d 20 3d 20  } .  pOldItem = 
3f80: 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  p->a;.  for(i=0;
3f90: 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b   i<p->nExpr; i++
3fa0: 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49  , pItem++, pOldI
3fb0: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  tem++){.    Expr
3fc0: 20 2a 70 4e 65 77 45 78 70 72 2c 20 2a 70 4f 6c   *pNewExpr, *pOl
3fd0: 64 45 78 70 72 3b 0a 20 20 20 20 70 49 74 65 6d  dExpr;.    pItem
3fe0: 2d 3e 70 45 78 70 72 20 3d 20 70 4e 65 77 45 78  ->pExpr = pNewEx
3ff0: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
4000: 44 75 70 28 64 62 2c 20 70 4f 6c 64 45 78 70 72  Dup(db, pOldExpr
4010: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78   = pOldItem->pEx
4020: 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c  pr);.    if( pOl
4030: 64 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 21 3d 30  dExpr->span.z!=0
4040: 20 26 26 20 70 4e 65 77 45 78 70 72 20 29 7b 0a   && pNewExpr ){.
4050: 20 20 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20        /* Always 
4060: 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  make a copy of t
4070: 68 65 20 73 70 61 6e 20 66 6f 72 20 74 6f 70 2d  he span for top-
4080: 6c 65 76 65 6c 20 65 78 70 72 65 73 73 69 6f 6e  level expression
4090: 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  s in the.      *
40a0: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * expression lis
40b0: 74 2e 20 20 54 68 65 20 6c 6f 67 69 63 20 69 6e  t.  The logic in
40c0: 20 53 45 4c 45 43 54 20 70 72 6f 63 65 73 73 69   SELECT processi
40d0: 6e 67 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e  ng that determin
40e0: 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  es.      ** the 
40f0: 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73  names of columns
4100: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
4110: 65 74 20 6e 65 65 64 73 20 74 68 69 73 20 69 6e  et needs this in
4120: 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  formation */.   
4130: 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43     sqlite3TokenC
4140: 6f 70 79 28 64 62 2c 20 26 70 4e 65 77 45 78 70  opy(db, &pNewExp
4150: 72 2d 3e 73 70 61 6e 2c 20 26 70 4f 6c 64 45 78  r->span, &pOldEx
4160: 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 7d  pr->span);.    }
4170: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
4180: 77 45 78 70 72 3d 3d 30 20 7c 7c 20 70 4e 65 77  wExpr==0 || pNew
4190: 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20  Expr->span.z!=0 
41a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
41b0: 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e 2e 7a  pOldExpr->span.z
41c0: 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  ==0.            
41d0: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
41e0: 6c 65 64 20 29 3b 0a 20 20 20 20 70 49 74 65 6d  led );.    pItem
41f0: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
4200: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
4210: 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ldItem->zName);.
4220: 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f      pItem->sortO
4230: 72 64 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  rder = pOldItem-
4240: 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  >sortOrder;.    
4250: 70 49 74 65 6d 2d 3e 69 73 41 67 67 20 3d 20 70  pItem->isAgg = p
4260: 4f 6c 64 49 74 65 6d 2d 3e 69 73 41 67 67 3b 0a  OldItem->isAgg;.
4270: 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20      pItem->done 
4280: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
4290: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
42a0: 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72 69   If cursors, tri
42b0: 67 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e 64  ggers, views and
42c0: 20 73 75 62 71 75 65 72 69 65 73 20 61 72 65 20   subqueries are 
42d0: 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d  all omitted from
42e0: 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20 74  .** the build, t
42f0: 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  hen none of the 
4300: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
4310: 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20 0a  es, except for .
4320: 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  ** sqlite3Select
4330: 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63 61  Dup(), can be ca
4340: 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65 6c  lled. sqlite3Sel
4350: 65 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d 65  ectDup() is some
4360: 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20  times.** called 
4370: 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67 75  with a NULL argu
4380: 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  ment..*/.#if !de
4390: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
43a0: 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
43b0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
43c0: 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21  TRIGGER) \. || !
43d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
43e0: 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53 72  MIT_SUBQUERY).Sr
43f0: 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
4400: 63 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33  cListDup(sqlite3
4410: 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70   *db, SrcList *p
4420: 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e  ){.  SrcList *pN
4430: 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ew;.  int i;.  i
4440: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 66 28 20  nt nByte;.  if( 
4450: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
4460: 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  .  nByte = sizeo
4470: 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63  f(*p) + (p->nSrc
4480: 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61  >0 ? sizeof(p->a
4490: 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d  [0]) * (p->nSrc-
44a0: 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20  1) : 0);.  pNew 
44b0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
44c0: 63 52 61 77 28 64 62 2c 20 6e 42 79 74 65 20 29  cRaw(db, nByte )
44d0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
44e0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
44f0: 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d  ew->nSrc = pNew-
4500: 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72  >nAlloc = p->nSr
4510: 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  c;.  for(i=0; i<
4520: 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  p->nSrc; i++){. 
4530: 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
4540: 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d  t_item *pNewItem
4550: 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a   = &pNew->a[i];.
4560: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
4570: 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65  st_item *pOldIte
4580: 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  m = &p->a[i];.  
4590: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
45a0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61     pNewItem->zDa
45b0: 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33  tabase = sqlite3
45c0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
45d0: 64 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  dItem->zDatabase
45e0: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
45f0: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
4600: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
4610: 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  dItem->zName);. 
4620: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c     pNewItem->zAl
4630: 69 61 73 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ias = sqlite3DbS
4640: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
4650: 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
4660: 20 70 4e 65 77 49 74 65 6d 2d 3e 6a 6f 69 6e 74   pNewItem->joint
4670: 79 70 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  ype = pOldItem->
4680: 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 70 4e  jointype;.    pN
4690: 65 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  ewItem->iCursor 
46a0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72  = pOldItem->iCur
46b0: 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  sor;.    pNewIte
46c0: 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 20 3d  m->isPopulated =
46d0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 73 50 6f 70   pOldItem->isPop
46e0: 75 6c 61 74 65 64 3b 0a 20 20 20 20 70 54 61 62  ulated;.    pTab
46f0: 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61   = pNewItem->pTa
4700: 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54  b = pOldItem->pT
4710: 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ab;.    if( pTab
4720: 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   ){.      pTab->
4730: 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nRef++;.    }.  
4740: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c    pNewItem->pSel
4750: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
4760: 65 63 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  ectDup(db, pOldI
4770: 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  tem->pSelect);. 
4780: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e     pNewItem->pOn
4790: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
47a0: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
47b0: 70 4f 6e 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  pOn);.    pNewIt
47c0: 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c  em->pUsing = sql
47d0: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 64 62  ite3IdListDup(db
47e0: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69  , pOldItem->pUsi
47f0: 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ng);.    pNewIte
4800: 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c  m->colUsed = pOl
4810: 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a  dItem->colUsed;.
4820: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
4830: 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c  w;.}.IdList *sql
4840: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 73 71  ite3IdListDup(sq
4850: 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73  lite3 *db, IdLis
4860: 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20  t *p){.  IdList 
4870: 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pNew;.  int i;.
4880: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
4890: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
48a0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
48b0: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  aw(db, sizeof(*p
48c0: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
48d0: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
48e0: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20  ;.  pNew->nId = 
48f0: 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70  pNew->nAlloc = p
4900: 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61  ->nId;.  pNew->a
4910: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
4920: 6f 63 52 61 77 28 64 62 2c 20 70 2d 3e 6e 49 64  ocRaw(db, p->nId
4930: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29  *sizeof(p->a[0])
4940: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e   );.  if( pNew->
4950: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  a==0 ){.    sqli
4960: 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a  te3_free(pNew);.
4970: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
4980: 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
4990: 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
49a0: 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69   struct IdList_i
49b0: 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20  tem *pNewItem = 
49c0: 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20  &pNew->a[i];.   
49d0: 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69   struct IdList_i
49e0: 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20  tem *pOldItem = 
49f0: 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e  &p->a[i];.    pN
4a00: 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20  ewItem->zName = 
4a10: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
4a20: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e  db, pOldItem->zN
4a30: 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ame);.    pNewIt
4a40: 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74  em->idx = pOldIt
4a50: 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72  em->idx;.  }.  r
4a60: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65  eturn pNew;.}.Se
4a70: 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c  lect *sqlite3Sel
4a80: 65 63 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  ectDup(sqlite3 *
4a90: 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  db, Select *p){.
4aa0: 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a    Select *pNew;.
4ab0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
4ac0: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
4ad0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
4ae0: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  aw(db, sizeof(*p
4af0: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
4b00: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
4b10: 20 70 4e 65 77 2d 3e 69 73 44 69 73 74 69 6e 63   pNew->isDistinc
4b20: 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63  t = p->isDistinc
4b30: 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73  t;.  pNew->pELis
4b40: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
4b50: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45  istDup(db, p->pE
4b60: 4c 69 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  List);.  pNew->p
4b70: 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Src = sqlite3Src
4b80: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
4b90: 53 72 63 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57  Src);.  pNew->pW
4ba0: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
4bb0: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 68  prDup(db, p->pWh
4bc0: 65 72 65 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 47  ere);.  pNew->pG
4bd0: 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
4be0: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
4bf0: 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  p->pGroupBy);.  
4c00: 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20  pNew->pHaving = 
4c10: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
4c20: 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a  b, p->pHaving);.
4c30: 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79    pNew->pOrderBy
4c40: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
4c50: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72  stDup(db, p->pOr
4c60: 64 65 72 42 79 29 3b 0a 20 20 70 4e 65 77 2d 3e  derBy);.  pNew->
4c70: 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e  op = p->op;.  pN
4c80: 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 73 71 6c  ew->pPrior = sql
4c90: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
4ca0: 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  , p->pPrior);.  
4cb0: 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73  pNew->pLimit = s
4cc0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
4cd0: 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  , p->pLimit);.  
4ce0: 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20  pNew->pOffset = 
4cf0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
4d00: 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a  b, p->pOffset);.
4d10: 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d    pNew->iLimit =
4d20: 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66   -1;.  pNew->iOf
4d30: 66 73 65 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  fset = -1;.  pNe
4d40: 77 2d 3e 69 73 52 65 73 6f 6c 76 65 64 20 3d 20  w->isResolved = 
4d50: 70 2d 3e 69 73 52 65 73 6f 6c 76 65 64 3b 0a 20  p->isResolved;. 
4d60: 20 70 4e 65 77 2d 3e 69 73 41 67 67 20 3d 20 70   pNew->isAgg = p
4d70: 2d 3e 69 73 41 67 67 3b 0a 20 20 70 4e 65 77 2d  ->isAgg;.  pNew-
4d80: 3e 75 73 65 73 45 70 68 6d 20 3d 20 30 3b 0a 20  >usesEphm = 0;. 
4d90: 20 70 4e 65 77 2d 3e 64 69 73 61 6c 6c 6f 77 4f   pNew->disallowO
4da0: 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 70 4e  rderBy = 0;.  pN
4db0: 65 77 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d  ew->pRightmost =
4dc0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72   0;.  pNew->addr
4dd0: 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31  OpenEphm[0] = -1
4de0: 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70  ;.  pNew->addrOp
4df0: 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a  enEphm[1] = -1;.
4e00: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
4e10: 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[2] = -1;.  
4e20: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23  return pNew;.}.#
4e30: 65 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c  else.Select *sql
4e40: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71  ite3SelectDup(sq
4e50: 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63  lite3 *db, Selec
4e60: 74 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  t *p){.  assert(
4e70: 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72   p==0 );.  retur
4e80: 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  n 0;.}.#endif...
4e90: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
4ea0: 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65  element to the e
4eb0: 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  nd of an express
4ec0: 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c  ion list.  If pL
4ed0: 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61  ist is.** initia
4ee0: 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63  lly NULL, then c
4ef0: 72 65 61 74 65 20 61 20 6e 65 77 20 65 78 70 72  reate a new expr
4f00: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a  ession list..*/.
4f10: 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65  ExprList *sqlite
4f20: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
4f30: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
4f40: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
4f50: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
4f60: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
4f70: 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  st,        /* Li
4f80: 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61  st to which to a
4f90: 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20  ppend. Might be 
4fa0: 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a  NULL */.  Expr *
4fb0: 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20  pExpr,          
4fc0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
4fd0: 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20 2a  to be appended *
4fe0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
4ff0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
5000: 53 20 6b 65 79 77 6f 72 64 20 66 6f 72 20 74 68  S keyword for th
5010: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  e expression */.
5020: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
5030: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
5040: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
5050: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
5060: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
5070: 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  (db, sizeof(Expr
5080: 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28  List) );.    if(
5090: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
50a0: 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a     goto no_mem;.
50b0: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
50c0: 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d  ( pList->nAlloc=
50d0: 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  =0 );.  }.  if( 
50e0: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3c 3d 70  pList->nAlloc<=p
50f0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
5100: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
5110: 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20  st_item *a;.    
5120: 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e  int n = pList->n
5130: 41 6c 6c 6f 63 2a 32 20 2b 20 34 3b 0a 20 20 20  Alloc*2 + 4;.   
5140: 20 61 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65   a = sqlite3DbRe
5150: 61 6c 6c 6f 63 28 64 62 2c 20 70 4c 69 73 74 2d  alloc(db, pList-
5160: 3e 61 2c 20 6e 2a 73 69 7a 65 6f 66 28 70 4c 69  >a, n*sizeof(pLi
5170: 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20  st->a[0]));.    
5180: 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20  if( a==0 ){.    
5190: 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20    goto no_mem;. 
51a0: 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e     }.    pList->
51b0: 61 20 3d 20 61 3b 0a 20 20 20 20 70 4c 69 73 74  a = a;.    pList
51c0: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 3b 0a 20 20  ->nAlloc = n;.  
51d0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  }.  assert( pLis
51e0: 74 2d 3e 61 21 3d 30 20 29 3b 0a 20 20 69 66 28  t->a!=0 );.  if(
51f0: 20 70 45 78 70 72 20 7c 7c 20 70 4e 61 6d 65 20   pExpr || pName 
5200: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
5210: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
5220: 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
5230: 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a  List->nExpr++];.
5240: 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d      memset(pItem
5250: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74  , 0, sizeof(*pIt
5260: 65 6d 29 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  em));.    pItem-
5270: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
5280: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
5290: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49  , pName);.    pI
52a0: 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78  tem->pExpr = pEx
52b0: 70 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  pr;.  }.  return
52c0: 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a   pList;..no_mem:
52d0: 20 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64       .  /* Avoid
52e0: 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20   leaking memory 
52f0: 69 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61  if malloc has fa
5300: 69 6c 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  iled. */.  sqlit
5310: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 78  e3ExprDelete(pEx
5320: 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  pr);.  sqlite3Ex
5330: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  prListDelete(pLi
5340: 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  st);.  return 0;
5350: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
5360: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
5370: 20 70 45 4c 69 73 74 20 63 6f 6e 74 61 69 6e 73   pEList contains
5380: 20 6d 6f 72 65 20 74 68 61 6e 20 69 4c 69 6d 69   more than iLimi
5390: 74 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c  t elements,.** l
53a0: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
53b0: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e  ssage in pParse.
53c0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
53d0: 45 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e  ExprListCheckLen
53e0: 67 74 68 28 0a 20 20 50 61 72 73 65 20 2a 70 50  gth(.  Parse *pP
53f0: 61 72 73 65 2c 0a 20 20 45 78 70 72 4c 69 73 74  arse,.  ExprList
5400: 20 2a 70 45 4c 69 73 74 2c 0a 20 20 69 6e 74 20   *pEList,.  int 
5410: 69 4c 69 6d 69 74 2c 0a 20 20 63 6f 6e 73 74 20  iLimit,.  const 
5420: 63 68 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b  char *zObject.){
5430: 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26  .  if( pEList &&
5440: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 69   pEList->nExpr>i
5450: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
5460: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
5470: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63  rse, "too many c
5480: 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c 20 7a  olumns in %s", z
5490: 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  Object);.  }.}..
54a0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
54b0: 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 53 51 4c  ITE_TEST) || SQL
54c0: 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
54d0: 54 48 3e 30 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c  TH>0./* The foll
54e0: 6f 77 69 6e 67 20 74 68 72 65 65 20 66 75 6e 63  owing three func
54f0: 74 69 6f 6e 73 2c 20 68 65 69 67 68 74 4f 66 45  tions, heightOfE
5500: 78 70 72 28 29 2c 20 68 65 69 67 68 74 4f 66 45  xpr(), heightOfE
5510: 78 70 72 4c 69 73 74 28 29 0a 2a 2a 20 61 6e 64  xprList().** and
5520: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
5530: 29 2c 20 61 72 65 20 75 73 65 64 20 74 6f 20 64  ), are used to d
5540: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 61 78  etermine the max
5550: 69 6d 75 6d 20 68 65 69 67 68 74 0a 2a 2a 20 6f  imum height.** o
5560: 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  f any expression
5570: 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65 64   tree referenced
5580: 20 62 79 20 74 68 65 20 73 74 72 75 63 74 75 72   by the structur
5590: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 0a  e passed as the.
55a0: 2a 2a 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  ** first argumen
55b0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  t..**.** If this
55c0: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20   maximum height 
55d0: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
55e0: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
55f0: 65 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20  e pointed.** to 
5600: 62 79 20 70 6e 48 65 69 67 68 74 2c 20 74 68 65  by pnHeight, the
5610: 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
5620: 72 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 6e 48  r, then set *pnH
5630: 65 69 67 68 74 20 74 6f 20 74 68 61 74 0a 2a 2a  eight to that.**
5640: 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
5650: 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45  c void heightOfE
5660: 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  xpr(Expr *p, int
5670: 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69   *pnHeight){.  i
5680: 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  f( p ){.    if( 
5690: 70 2d 3e 6e 48 65 69 67 68 74 3e 2a 70 6e 48 65  p->nHeight>*pnHe
56a0: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2a 70  ight ){.      *p
56b0: 6e 48 65 69 67 68 74 20 3d 20 70 2d 3e 6e 48 65  nHeight = p->nHe
56c0: 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ight;.    }.  }.
56d0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65  }.static void he
56e0: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 45  ightOfExprList(E
56f0: 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20  xprList *p, int 
5700: 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66  *pnHeight){.  if
5710: 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ( p ){.    int i
5720: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
5730: 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  <p->nExpr; i++){
5740: 0a 20 20 20 20 20 20 68 65 69 67 68 74 4f 66 45  .      heightOfE
5750: 78 70 72 28 70 2d 3e 61 5b 69 5d 2e 70 45 78 70  xpr(p->a[i].pExp
5760: 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  r, pnHeight);.  
5770: 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63    }.  }.}.static
5780: 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 53 65   void heightOfSe
5790: 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20  lect(Select *p, 
57a0: 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a  int *pnHeight){.
57b0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 68    if( p ){.    h
57c0: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
57d0: 57 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74 29  Where, pnHeight)
57e0: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
57f0: 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70  pr(p->pHaving, p
5800: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
5810: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c  ightOfExpr(p->pL
5820: 69 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29 3b  imit, pnHeight);
5830: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
5840: 72 28 70 2d 3e 70 4f 66 66 73 65 74 2c 20 70 6e  r(p->pOffset, pn
5850: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
5860: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
5870: 3e 70 45 4c 69 73 74 2c 20 70 6e 48 65 69 67 68  >pEList, pnHeigh
5880: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
5890: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f  ExprList(p->pGro
58a0: 75 70 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b  upBy, pnHeight);
58b0: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
58c0: 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42  rList(p->pOrderB
58d0: 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  y, pnHeight);.  
58e0: 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74    heightOfSelect
58f0: 28 70 2d 3e 70 50 72 69 6f 72 2c 20 70 6e 48 65  (p->pPrior, pnHe
5900: 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ight);.  }.}../*
5910: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72  .** Set the Expr
5920: 2e 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c  .nHeight variabl
5930: 65 20 69 6e 20 74 68 65 20 73 74 72 75 63 74 75  e in the structu
5940: 72 65 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  re passed as an 
5950: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e  .** argument. An
5960: 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68   expression with
5970: 20 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78   no children, Ex
5980: 70 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20  pr.pList or .** 
5990: 45 78 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d  Expr.pSelect mem
59a0: 62 65 72 20 68 61 73 20 61 20 68 65 69 67 68 74  ber has a height
59b0: 20 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72   of 1. Any other
59c0: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68   expression.** h
59d0: 61 73 20 61 20 68 65 69 67 68 74 20 65 71 75 61  as a height equa
59e0: 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  l to the maximum
59f0: 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f   height of any o
5a00: 74 68 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e  ther .** referen
5a10: 63 65 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e  ced Expr plus on
5a20: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
5a30: 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74 28  e3ExprSetHeight(
5a40: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Expr *p){.  int 
5a50: 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68  nHeight = 0;.  h
5a60: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
5a70: 4c 65 66 74 2c 20 26 6e 48 65 69 67 68 74 29 3b  Left, &nHeight);
5a80: 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28  .  heightOfExpr(
5a90: 70 2d 3e 70 52 69 67 68 74 2c 20 26 6e 48 65 69  p->pRight, &nHei
5aa0: 67 68 74 29 3b 0a 20 20 68 65 69 67 68 74 4f 66  ght);.  heightOf
5ab0: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4c 69 73  ExprList(p->pLis
5ac0: 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20  t, &nHeight);.  
5ad0: 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70  heightOfSelect(p
5ae0: 2d 3e 70 53 65 6c 65 63 74 2c 20 26 6e 48 65 69  ->pSelect, &nHei
5af0: 67 68 74 29 3b 0a 20 20 70 2d 3e 6e 48 65 69 67  ght);.  p->nHeig
5b00: 68 74 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31  ht = nHeight + 1
5b10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
5b20: 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65  n the maximum he
5b30: 69 67 68 74 20 6f 66 20 61 6e 79 20 65 78 70 72  ight of any expr
5b40: 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65  ession tree refe
5b50: 72 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74 68 65  renced.** by the
5b60: 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
5b70: 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  t passed as an a
5b80: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  rgument..*/.int 
5b90: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
5ba0: 72 48 65 69 67 68 74 28 53 65 6c 65 63 74 20 2a  rHeight(Select *
5bb0: 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67 68  p){.  int nHeigh
5bc0: 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74 4f  t = 0;.  heightO
5bd0: 66 53 65 6c 65 63 74 28 70 2c 20 26 6e 48 65 69  fSelect(p, &nHei
5be0: 67 68 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  ght);.  return n
5bf0: 48 65 69 67 68 74 3b 0a 7d 0a 23 65 6e 64 69 66  Height;.}.#endif
5c00: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
5c10: 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65 73 73  n entire express
5c20: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  ion list..*/.voi
5c30: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
5c40: 74 44 65 6c 65 74 65 28 45 78 70 72 4c 69 73 74  tDelete(ExprList
5c50: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
5c60: 69 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  i;.  struct Expr
5c70: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
5c80: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
5c90: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
5ca0: 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30  ert( pList->a!=0
5cb0: 20 7c 7c 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70   || (pList->nExp
5cc0: 72 3d 3d 30 20 26 26 20 70 4c 69 73 74 2d 3e 6e  r==0 && pList->n
5cd0: 41 6c 6c 6f 63 3d 3d 30 29 20 29 3b 0a 20 20 61  Alloc==0) );.  a
5ce0: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
5cf0: 78 70 72 3c 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c  xpr<=pList->nAll
5d00: 6f 63 20 29 3b 0a 20 20 66 6f 72 28 70 49 74 65  oc );.  for(pIte
5d10: 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b  m=pList->a, i=0;
5d20: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
5d30: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
5d40: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
5d50: 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 45 78  elete(pItem->pEx
5d60: 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pr);.    sqlite3
5d70: 5f 66 72 65 65 28 70 49 74 65 6d 2d 3e 7a 4e 61  _free(pItem->zNa
5d80: 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  me);.  }.  sqlit
5d90: 65 33 5f 66 72 65 65 28 70 4c 69 73 74 2d 3e 61  e3_free(pList->a
5da0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
5db0: 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  e(pList);.}../*.
5dc0: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
5dd0: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 43 61 6c  ssion tree.  Cal
5de0: 6c 20 78 46 75 6e 63 20 66 6f 72 20 65 61 63 68  l xFunc for each
5df0: 20 6e 6f 64 65 20 76 69 73 69 74 65 64 2e 0a 2a   node visited..*
5e00: 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  *.** The return 
5e10: 76 61 6c 75 65 20 66 72 6f 6d 20 78 46 75 6e 63  value from xFunc
5e20: 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74   determines whet
5e30: 68 65 72 20 74 68 65 20 74 72 65 65 20 77 61 6c  her the tree wal
5e40: 6b 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 2a 2a 20  k continues..** 
5e50: 30 20 6d 65 61 6e 73 20 63 6f 6e 74 69 6e 75 65  0 means continue
5e60: 20 77 61 6c 6b 69 6e 67 20 74 68 65 20 74 72 65   walking the tre
5e70: 65 2e 20 20 31 20 6d 65 61 6e 73 20 64 6f 20 6e  e.  1 means do n
5e80: 6f 74 20 77 61 6c 6b 20 63 68 69 6c 64 72 65 6e  ot walk children
5e90: 0a 2a 2a 20 6f 66 20 74 68 65 20 63 75 72 72 65  .** of the curre
5ea0: 6e 74 20 6e 6f 64 65 20 62 75 74 20 63 6f 6e 74  nt node but cont
5eb0: 69 6e 75 65 20 77 69 74 68 20 73 69 62 6c 69 6e  inue with siblin
5ec0: 67 73 2e 20 20 32 20 6d 65 61 6e 73 20 61 62 61  gs.  2 means aba
5ed0: 6e 64 6f 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65  ndon.** the tree
5ee0: 20 77 61 6c 6b 20 63 6f 6d 70 6c 65 74 65 6c 79   walk completely
5ef0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
5f00: 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68  rn value from th
5f10: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 31 20  is routine is 1 
5f20: 74 6f 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 74  to abandon the t
5f30: 72 65 65 20 77 61 6c 6b 0a 2a 2a 20 61 6e 64 20  ree walk.** and 
5f40: 30 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a  0 to continue..*
5f50: 2a 0a 2a 2a 20 4e 4f 54 49 43 45 3a 20 20 54 68  *.** NOTICE:  Th
5f60: 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
5f70: 2a 6e 6f 74 2a 20 64 65 73 63 65 6e 64 20 69 6e  *not* descend in
5f80: 74 6f 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a  to subqueries..*
5f90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c  /.static int wal
5fa0: 6b 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69  kExprList(ExprLi
5fb0: 73 74 20 2a 2c 20 69 6e 74 20 28 2a 29 28 76 6f  st *, int (*)(vo
5fc0: 69 64 20 2a 2c 20 45 78 70 72 2a 29 2c 20 76 6f  id *, Expr*), vo
5fd0: 69 64 20 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e  id *);.static in
5fe0: 74 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 45  t walkExprTree(E
5ff0: 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
6000: 28 2a 78 46 75 6e 63 29 28 76 6f 69 64 2a 2c 45  (*xFunc)(void*,E
6010: 78 70 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72  xpr*), void *pAr
6020: 67 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  g){.  int rc;.  
6030: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
6040: 65 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20  eturn 0;.  rc = 
6050: 28 2a 78 46 75 6e 63 29 28 70 41 72 67 2c 20 70  (*xFunc)(pArg, p
6060: 45 78 70 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  Expr);.  if( rc=
6070: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 77 61  =0 ){.    if( wa
6080: 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78 70 72  lkExprTree(pExpr
6090: 2d 3e 70 4c 65 66 74 2c 20 78 46 75 6e 63 2c 20  ->pLeft, xFunc, 
60a0: 70 41 72 67 29 20 29 20 72 65 74 75 72 6e 20 31  pArg) ) return 1
60b0: 3b 0a 20 20 20 20 69 66 28 20 77 61 6c 6b 45 78  ;.    if( walkEx
60c0: 70 72 54 72 65 65 28 70 45 78 70 72 2d 3e 70 52  prTree(pExpr->pR
60d0: 69 67 68 74 2c 20 78 46 75 6e 63 2c 20 70 41 72  ight, xFunc, pAr
60e0: 67 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  g) ) return 1;. 
60f0: 20 20 20 69 66 28 20 77 61 6c 6b 45 78 70 72 4c     if( walkExprL
6100: 69 73 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74  ist(pExpr->pList
6110: 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 20 29  , xFunc, pArg) )
6120: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
6130: 20 72 65 74 75 72 6e 20 72 63 3e 31 3b 0a 7d 0a   return rc>1;.}.
6140: 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 77 61 6c 6b  ./*.** Call walk
6150: 45 78 70 72 54 72 65 65 28 29 20 66 6f 72 20 65  ExprTree() for e
6160: 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  very expression 
6170: 69 6e 20 6c 69 73 74 20 70 2e 0a 2a 2f 0a 73 74  in list p..*/.st
6180: 61 74 69 63 20 69 6e 74 20 77 61 6c 6b 45 78 70  atic int walkExp
6190: 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a  rList(ExprList *
61a0: 70 2c 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28  p, int (*xFunc)(
61b0: 76 6f 69 64 20 2a 2c 20 45 78 70 72 2a 29 2c 20  void *, Expr*), 
61c0: 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 69  void *pArg){.  i
61d0: 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 45  nt i;.  struct E
61e0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
61f0: 74 65 6d 3b 0a 20 20 69 66 28 20 21 70 20 29 20  tem;.  if( !p ) 
6200: 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28  return 0;.  for(
6210: 69 3d 70 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65  i=p->nExpr, pIte
6220: 6d 3d 70 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d  m=p->a; i>0; i--
6230: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
6240: 69 66 28 20 77 61 6c 6b 45 78 70 72 54 72 65 65  if( walkExprTree
6250: 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 78  (pItem->pExpr, x
6260: 46 75 6e 63 2c 20 70 41 72 67 29 20 29 20 72 65  Func, pArg) ) re
6270: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
6280: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
6290: 20 43 61 6c 6c 20 77 61 6c 6b 45 78 70 72 54 72   Call walkExprTr
62a0: 65 65 28 29 20 66 6f 72 20 65 76 65 72 79 20 65  ee() for every e
62b0: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 53 65 6c  xpression in Sel
62c0: 65 63 74 20 70 2c 20 6e 6f 74 20 69 6e 63 6c 75  ect p, not inclu
62d0: 64 69 6e 67 0a 2a 2a 20 65 78 70 72 65 73 73 69  ding.** expressi
62e0: 6f 6e 73 20 74 68 61 74 20 61 72 65 20 70 61 72  ons that are par
62f0: 74 20 6f 66 20 73 75 62 2d 73 65 6c 65 63 74 73  t of sub-selects
6300: 20 69 6e 20 61 6e 79 20 46 52 4f 4d 20 63 6c 61   in any FROM cla
6310: 75 73 65 20 6f 72 20 74 68 65 20 4c 49 4d 49 54  use or the LIMIT
6320: 0a 2a 2a 20 6f 72 20 4f 46 46 53 45 54 20 65 78  .** or OFFSET ex
6330: 70 72 65 73 73 69 6f 6e 73 2e 2e 0a 2a 2f 0a 73  pressions...*/.s
6340: 74 61 74 69 63 20 69 6e 74 20 77 61 6c 6b 53 65  tatic int walkSe
6350: 6c 65 63 74 45 78 70 72 28 53 65 6c 65 63 74 20  lectExpr(Select 
6360: 2a 70 2c 20 69 6e 74 20 28 2a 78 46 75 6e 63 29  *p, int (*xFunc)
6370: 28 76 6f 69 64 20 2a 2c 20 45 78 70 72 2a 29 2c  (void *, Expr*),
6380: 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20   void *pArg){.  
6390: 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 2d 3e  walkExprList(p->
63a0: 70 45 4c 69 73 74 2c 20 78 46 75 6e 63 2c 20 70  pEList, xFunc, p
63b0: 41 72 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72  Arg);.  walkExpr
63c0: 54 72 65 65 28 70 2d 3e 70 57 68 65 72 65 2c 20  Tree(p->pWhere, 
63d0: 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20  xFunc, pArg);.  
63e0: 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 2d 3e  walkExprList(p->
63f0: 70 47 72 6f 75 70 42 79 2c 20 78 46 75 6e 63 2c  pGroupBy, xFunc,
6400: 20 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b 45 78   pArg);.  walkEx
6410: 70 72 54 72 65 65 28 70 2d 3e 70 48 61 76 69 6e  prTree(p->pHavin
6420: 67 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 3b  g, xFunc, pArg);
6430: 0a 20 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28  .  walkExprList(
6440: 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 78 46 75  p->pOrderBy, xFu
6450: 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 69 66 28  nc, pArg);.  if(
6460: 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
6470: 20 20 77 61 6c 6b 53 65 6c 65 63 74 45 78 70 72    walkSelectExpr
6480: 28 70 2d 3e 70 50 72 69 6f 72 2c 20 78 46 75 6e  (p->pPrior, xFun
6490: 63 2c 20 70 41 72 67 29 3b 0a 20 20 7d 0a 20 20  c, pArg);.  }.  
64a0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a  return 0;.}.../*
64b0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
64c0: 20 69 73 20 64 65 73 69 67 6e 65 64 20 61 73 20   is designed as 
64d0: 61 6e 20 78 46 75 6e 63 20 66 6f 72 20 77 61 6c  an xFunc for wal
64e0: 6b 45 78 70 72 54 72 65 65 28 29 2e 0a 2a 2a 0a  kExprTree()..**.
64f0: 2a 2a 20 70 41 72 67 20 69 73 20 72 65 61 6c 6c  ** pArg is reall
6500: 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  y a pointer to a
6510: 6e 20 69 6e 74 65 67 65 72 2e 20 20 49 66 20 77  n integer.  If w
6520: 65 20 63 61 6e 20 74 65 6c 6c 20 62 79 20 6c 6f  e can tell by lo
6530: 6f 6b 69 6e 67 0a 2a 2a 20 61 74 20 70 45 78 70  oking.** at pExp
6540: 72 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65  r that the expre
6550: 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61  ssion that conta
6560: 69 6e 73 20 70 45 78 70 72 20 69 73 20 6e 6f 74  ins pExpr is not
6570: 20 61 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 65   a constant.** e
6580: 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20  xpression, then 
6590: 73 65 74 20 2a 70 41 72 67 20 74 6f 20 30 20 61  set *pArg to 0 a
65a0: 6e 64 20 72 65 74 75 72 6e 20 32 20 74 6f 20 61  nd return 2 to a
65b0: 62 61 6e 64 6f 6e 20 74 68 65 20 74 72 65 65 20  bandon the tree 
65c0: 77 61 6c 6b 2e 0a 2a 2a 20 49 66 20 70 45 78 70  walk..** If pExp
65d0: 72 20 64 6f 65 73 20 64 6f 65 73 20 6e 6f 74 20  r does does not 
65e0: 64 69 73 71 75 61 6c 69 66 79 20 74 68 65 20 65  disqualify the e
65f0: 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 62  xpression from b
6600: 65 69 6e 67 20 61 20 63 6f 6e 73 74 61 6e 74 0a  eing a constant.
6610: 2a 2a 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69  ** then do nothi
6620: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20  ng..**.** After 
6630: 77 61 6c 6b 69 6e 67 20 74 68 65 20 77 68 6f 6c  walking the whol
6640: 65 20 74 72 65 65 2c 20 69 66 20 6e 6f 20 6e 6f  e tree, if no no
6650: 64 65 73 20 61 72 65 20 66 6f 75 6e 64 20 74 68  des are found th
6660: 61 74 20 64 69 73 71 75 61 6c 69 66 79 0a 2a 2a  at disqualify.**
6670: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
6680: 61 73 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65  as constant, the
6690: 6e 20 77 65 20 61 73 73 75 6d 65 20 74 68 65 20  n we assume the 
66a0: 77 68 6f 6c 65 20 65 78 70 72 65 73 73 69 6f 6e  whole expression
66b0: 0a 2a 2a 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e  .** is constant.
66c0: 20 20 53 65 65 20 73 71 6c 69 74 65 33 45 78 70    See sqlite3Exp
66d0: 72 49 73 43 6f 6e 73 74 61 6e 74 28 29 20 66 6f  rIsConstant() fo
66e0: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
66f0: 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ormation..*/.sta
6700: 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65  tic int exprNode
6710: 49 73 43 6f 6e 73 74 61 6e 74 28 76 6f 69 64 20  IsConstant(void 
6720: 2a 70 41 72 67 2c 20 45 78 70 72 20 2a 70 45 78  *pArg, Expr *pEx
6730: 70 72 29 7b 0a 20 20 69 6e 74 20 2a 70 4e 20 3d  pr){.  int *pN =
6740: 20 28 69 6e 74 2a 29 70 41 72 67 3b 0a 0a 20 20   (int*)pArg;..  
6750: 2f 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 33  /* If *pArg is 3
6760: 20 74 68 65 6e 20 61 6e 79 20 74 65 72 6d 20 6f   then any term o
6770: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
6780: 20 74 68 61 74 20 63 6f 6d 65 73 20 66 72 6f 6d   that comes from
6790: 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20  .  ** the ON or 
67a0: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66  USING clauses of
67b0: 20 61 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c 69   a join disquali
67c0: 66 69 65 73 20 74 68 65 20 65 78 70 72 65 73 73  fies the express
67d0: 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62 65  ion.  ** from be
67e0: 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20 63  ing considered c
67f0: 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69 66  onstant. */.  if
6800: 28 20 28 2a 70 4e 29 3d 3d 33 20 26 26 20 45 78  ( (*pN)==3 && Ex
6810: 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
6820: 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
6830: 6f 69 6e 29 20 29 7b 0a 20 20 20 20 2a 70 4e 20  oin) ){.    *pN 
6840: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
6850: 32 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68  2;.  }..  switch
6860: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
6870: 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66     /* Consider f
6880: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65 20 63  unctions to be c
6890: 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c 20 74  onstant if all t
68a0: 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20 61  heir arguments a
68b0: 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20  re constant.    
68c0: 2a 2a 20 61 6e 64 20 2a 70 41 72 67 3d 3d 32 20  ** and *pArg==2 
68d0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  */.    case TK_F
68e0: 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69  UNCTION:.      i
68f0: 66 28 20 28 2a 70 4e 29 3d 3d 32 20 29 20 72 65  f( (*pN)==2 ) re
6900: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 2f 2a  turn 0;.      /*
6910: 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f   Fall through */
6920: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a  .    case TK_ID:
6930: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
6940: 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UMN:.    case TK
6950: 5f 44 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54  _DOT:.    case T
6960: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a  K_AGG_FUNCTION:.
6970: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
6980: 43 4f 4c 55 4d 4e 3a 0a 23 69 66 6e 64 65 66 20  COLUMN:.#ifndef 
6990: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
69a0: 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
69b0: 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 63 61 73  _SELECT:.    cas
69c0: 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 23 65 6e  e TK_EXISTS:.#en
69d0: 64 69 66 0a 20 20 20 20 20 20 2a 70 4e 20 3d 20  dif.      *pN = 
69e0: 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
69f0: 32 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  2;.    case TK_I
6a00: 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  N:.      if( pEx
6a10: 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  pr->pSelect ){. 
6a20: 20 20 20 20 20 20 20 2a 70 4e 20 3d 20 30 3b 0a         *pN = 0;.
6a30: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 32          return 2
6a40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 64 65  ;.      }.    de
6a50: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74  fault:.      ret
6a60: 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  urn 0;.  }.}../*
6a70: 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
6a80: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
6a90: 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78  turn 1 if the ex
6aa0: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
6ab0: 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66  tant.** and 0 if
6ac0: 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72   it involves var
6ad0: 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69  iables or functi
6ae0: 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20  on calls..**.** 
6af0: 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  For the purposes
6b00: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
6b10: 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74  n, a double-quot
6b20: 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22  ed string (ex: "
6b30: 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73  abc").** is cons
6b40: 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c  idered a variabl
6b50: 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71  e but a single-q
6b60: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
6b70: 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61  : 'abc') is.** a
6b80: 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e   constant..*/.in
6b90: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
6ba0: 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 29  onstant(Expr *p)
6bb0: 7b 0a 20 20 69 6e 74 20 69 73 43 6f 6e 73 74 20  {.  int isConst 
6bc0: 3d 20 31 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54  = 1;.  walkExprT
6bd0: 72 65 65 28 70 2c 20 65 78 70 72 4e 6f 64 65 49  ree(p, exprNodeI
6be0: 73 43 6f 6e 73 74 61 6e 74 2c 20 26 69 73 43 6f  sConstant, &isCo
6bf0: 6e 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  nst);.  return i
6c00: 73 43 6f 6e 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  sConst;.}../*.**
6c10: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
6c20: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
6c30: 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65  n 1 if the expre
6c40: 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
6c50: 74 0a 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e  t.** that does n
6c60: 6f 20 6f 72 69 67 69 6e 61 74 65 20 66 72 6f 6d  o originate from
6c70: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
6c80: 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f   clauses of a jo
6c90: 69 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  in..** Return 0 
6ca0: 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76  if it involves v
6cb0: 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63  ariables or func
6cc0: 74 69 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74 65  tion calls or te
6cd0: 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f  rms from.** an O
6ce0: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
6cf0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
6d00: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e  3ExprIsConstantN
6d10: 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b  otJoin(Expr *p){
6d20: 0a 20 20 69 6e 74 20 69 73 43 6f 6e 73 74 20 3d  .  int isConst =
6d30: 20 33 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72   3;.  walkExprTr
6d40: 65 65 28 70 2c 20 65 78 70 72 4e 6f 64 65 49 73  ee(p, exprNodeIs
6d50: 43 6f 6e 73 74 61 6e 74 2c 20 26 69 73 43 6f 6e  Constant, &isCon
6d60: 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 73  st);.  return is
6d70: 43 6f 6e 73 74 21 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  Const!=0;.}../*.
6d80: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
6d90: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
6da0: 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70  urn 1 if the exp
6db0: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
6dc0: 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63  ant.** or a func
6dd0: 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20 63  tion call with c
6de0: 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74  onstant argument
6df0: 73 2e 20 20 52 65 74 75 72 6e 20 61 6e 64 20 30  s.  Return and 0
6e00: 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   if there.** are
6e10: 20 61 6e 79 20 76 61 72 69 61 62 6c 65 73 2e 0a   any variables..
6e20: 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75  **.** For the pu
6e30: 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66  rposes of this f
6e40: 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c  unction, a doubl
6e50: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
6e60: 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69  (ex: "abc").** i
6e70: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76  s considered a v
6e80: 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73 69  ariable but a si
6e90: 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  ngle-quoted stri
6ea0: 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20 69  ng (ex: 'abc') i
6eb0: 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e  s.** a constant.
6ec0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
6ed0: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46  xprIsConstantOrF
6ee0: 75 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a 70 29  unction(Expr *p)
6ef0: 7b 0a 20 20 69 6e 74 20 69 73 43 6f 6e 73 74 20  {.  int isConst 
6f00: 3d 20 32 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54  = 2;.  walkExprT
6f10: 72 65 65 28 70 2c 20 65 78 70 72 4e 6f 64 65 49  ree(p, exprNodeI
6f20: 73 43 6f 6e 73 74 61 6e 74 2c 20 26 69 73 43 6f  sConstant, &isCo
6f30: 6e 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  nst);.  return i
6f40: 73 43 6f 6e 73 74 21 3d 30 3b 0a 7d 0a 0a 2f 2a  sConst!=0;.}../*
6f50: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
6f60: 73 73 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20  ssion p codes a 
6f70: 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72  constant integer
6f80: 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65   that is small e
6f90: 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20  nough.** to fit 
6fa0: 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  in a 32-bit inte
6fb0: 67 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e  ger, return 1 an
6fc0: 64 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 20  d put the value 
6fd0: 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a  of the integer.*
6fe0: 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49  * in *pValue.  I
6ff0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
7000: 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67   is not an integ
7010: 65 72 20 6f 72 20 69 66 20 69 74 20 69 73 20 74  er or if it is t
7020: 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74  oo big.** to fit
7030: 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d   in a signed 32-
7040: 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74  bit integer, ret
7050: 75 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20  urn 0 and leave 
7060: 2a 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65  *pValue unchange
7070: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
7080: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 45  3ExprIsInteger(E
7090: 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61  xpr *p, int *pVa
70a0: 6c 75 65 29 7b 0a 20 20 73 77 69 74 63 68 28 20  lue){.  switch( 
70b0: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  p->op ){.    cas
70c0: 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  e TK_INTEGER: {.
70d0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
70e0: 33 47 65 74 49 6e 74 33 32 28 28 63 68 61 72 2a  3GetInt32((char*
70f0: 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 56 61  )p->token.z, pVa
7100: 6c 75 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  lue) ){.        
7110: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
7120: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
7130: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
7140: 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20  _UPLUS: {.      
7150: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
7160: 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70  prIsInteger(p->p
7170: 4c 65 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20  Left, pValue);. 
7180: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
7190: 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20  _UMINUS: {.     
71a0: 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66   int v;.      if
71b0: 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
71c0: 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c  nteger(p->pLeft,
71d0: 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20   &v) ){.        
71e0: 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20  *pValue = -v;.  
71f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
7200: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
7210: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
7220: 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20  efault: break;. 
7230: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
7240: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
7250: 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
7260: 20 73 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77   string is a row
7270: 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e  -id column name.
7280: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
7290: 73 52 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61  sRowid(const cha
72a0: 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c  r *z){.  if( sql
72b0: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
72c0: 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72  _ROWID_")==0 ) r
72d0: 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73  eturn 1;.  if( s
72e0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c  qlite3StrICmp(z,
72f0: 20 22 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72   "ROWID")==0 ) r
7300: 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73  eturn 1;.  if( s
7310: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c  qlite3StrICmp(z,
7320: 20 22 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74   "OID")==0 ) ret
7330: 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  urn 1;.  return 
7340: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  0;.}../*.** Give
7350: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  n the name of a 
7360: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66 6f  column of the fo
7370: 72 6d 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20  rm X.Y.Z or Y.Z 
7380: 6f 72 20 6a 75 73 74 20 5a 2c 20 6c 6f 6f 6b 20  or just Z, look 
7390: 75 70 0a 2a 2a 20 74 68 61 74 20 6e 61 6d 65 20  up.** that name 
73a0: 69 6e 20 74 68 65 20 73 65 74 20 6f 66 20 73 6f  in the set of so
73b0: 75 72 63 65 20 74 61 62 6c 65 73 20 69 6e 20 70  urce tables in p
73c0: 53 72 63 4c 69 73 74 20 61 6e 64 20 6d 61 6b 65  SrcList and make
73d0: 20 74 68 65 20 70 45 78 70 72 20 0a 2a 2a 20 65   the pExpr .** e
73e0: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 72  xpression node r
73f0: 65 66 65 72 20 62 61 63 6b 20 74 6f 20 74 68 61  efer back to tha
7400: 74 20 73 6f 75 72 63 65 20 63 6f 6c 75 6d 6e 2e  t source column.
7410: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
7420: 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d  changes.** are m
7430: 61 64 65 20 74 6f 20 70 45 78 70 72 3a 0a 2a 2a  ade to pExpr:.**
7440: 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 69 44  .**    pExpr->iD
7450: 62 20 20 20 20 20 20 20 20 20 20 20 53 65 74 20  b           Set 
7460: 74 68 65 20 69 6e 64 65 78 20 69 6e 20 64 62 2d  the index in db-
7470: 3e 61 44 62 5b 5d 20 6f 66 20 74 68 65 20 64 61  >aDb[] of the da
7480: 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 0a 2a  tabase holding.*
7490: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
74a0: 20 20 20 20 20 20 20 20 20 20 74 68 65 20 74 61            the ta
74b0: 62 6c 65 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72  ble..**    pExpr
74c0: 2d 3e 69 54 61 62 6c 65 20 20 20 20 20 20 20 20  ->iTable        
74d0: 53 65 74 20 74 6f 20 74 68 65 20 63 75 72 73 6f  Set to the curso
74e0: 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  r number for the
74f0: 20 74 61 62 6c 65 20 6f 62 74 61 69 6e 65 64 0a   table obtained.
7500: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
7510: 20 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d 20             from 
7520: 70 53 72 63 4c 69 73 74 2e 0a 2a 2a 20 20 20 20  pSrcList..**    
7530: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 20  pExpr->iColumn  
7540: 20 20 20 20 20 53 65 74 20 74 6f 20 74 68 65 20       Set to the 
7550: 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69  column number wi
7560: 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  thin the table..
7570: 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20  **    pExpr->op 
7580: 20 20 20 20 20 20 20 20 20 20 20 53 65 74 20 74             Set t
7590: 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 0a 2a 2a 20  o TK_COLUMN..** 
75a0: 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20     pExpr->pLeft 
75b0: 20 20 20 20 20 20 20 20 41 6e 79 20 65 78 70 72          Any expr
75c0: 65 73 73 69 6f 6e 20 74 68 69 73 20 70 6f 69 6e  ession this poin
75d0: 74 73 20 74 6f 20 69 73 20 64 65 6c 65 74 65 64  ts to is deleted
75e0: 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 70 52  .**    pExpr->pR
75f0: 69 67 68 74 20 20 20 20 20 20 20 20 41 6e 79 20  ight        Any 
7600: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 69 73 20  expression this 
7610: 70 6f 69 6e 74 73 20 74 6f 20 69 73 20 64 65 6c  points to is del
7620: 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  eted..**.** The 
7630: 70 44 62 54 6f 6b 65 6e 20 69 73 20 74 68 65 20  pDbToken is the 
7640: 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
7650: 62 61 73 65 20 28 74 68 65 20 22 58 22 29 2e 20  base (the "X"). 
7660: 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20   This value may 
7670: 62 65 0a 2a 2a 20 4e 55 4c 4c 20 6d 65 61 6e 69  be.** NULL meani
7680: 6e 67 20 74 68 61 74 20 6e 61 6d 65 20 69 73 20  ng that name is 
7690: 6f 66 20 74 68 65 20 66 6f 72 6d 20 59 2e 5a 20  of the form Y.Z 
76a0: 6f 72 20 5a 2e 20 20 41 6e 79 20 61 76 61 69 6c  or Z.  Any avail
76b0: 61 62 6c 65 20 64 61 74 61 62 61 73 65 0a 2a 2a  able database.**
76c0: 20 63 61 6e 20 62 65 20 75 73 65 64 2e 20 20 54   can be used.  T
76d0: 68 65 20 70 54 61 62 6c 65 54 6f 6b 65 6e 20 69  he pTableToken i
76e0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
76f0: 65 20 74 61 62 6c 65 20 28 74 68 65 20 22 59 22  e table (the "Y"
7700: 29 2e 20 20 54 68 69 73 0a 2a 2a 20 76 61 6c 75  ).  This.** valu
7710: 65 20 63 61 6e 20 62 65 20 4e 55 4c 4c 20 69 66  e can be NULL if
7720: 20 70 44 62 54 6f 6b 65 6e 20 69 73 20 61 6c 73   pDbToken is als
7730: 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 70 54 61 62  o NULL.  If pTab
7740: 6c 65 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20  leToken is NULL 
7750: 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74  it.** means that
7760: 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 74 68 65   the form of the
7770: 20 6e 61 6d 65 20 69 73 20 5a 20 61 6e 64 20 74   name is Z and t
7780: 68 61 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d  hat columns from
7790: 20 61 6e 79 20 74 61 62 6c 65 0a 2a 2a 20 63 61   any table.** ca
77a0: 6e 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a  n be used..**.**
77b0: 20 49 66 20 74 68 65 20 6e 61 6d 65 20 63 61 6e   If the name can
77c0: 6e 6f 74 20 62 65 20 72 65 73 6f 6c 76 65 64 20  not be resolved 
77d0: 75 6e 61 6d 62 69 67 75 6f 75 73 6c 79 2c 20 6c  unambiguously, l
77e0: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
77f0: 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72  ssage.** in pPar
7800: 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f  se and return no
7810: 6e 2d 7a 65 72 6f 2e 20 20 52 65 74 75 72 6e 20  n-zero.  Return 
7820: 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2e  zero on success.
7830: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
7840: 6f 6f 6b 75 70 4e 61 6d 65 28 0a 20 20 50 61 72  ookupName(.  Par
7850: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
7860: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
7870: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
7880: 6b 65 6e 20 2a 70 44 62 54 6f 6b 65 6e 2c 20 20  ken *pDbToken,  
7890: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
78a0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
78b0: 69 6e 69 6e 67 20 74 61 62 6c 65 2c 20 6f 72 20  ining table, or 
78c0: 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  NULL */.  Token 
78d0: 2a 70 54 61 62 6c 65 54 6f 6b 65 6e 2c 20 20 2f  *pTableToken,  /
78e0: 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20  * Name of table 
78f0: 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d  containing colum
7900: 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  n, or NULL */.  
7910: 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e 54 6f  Token *pColumnTo
7920: 6b 65 6e 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  ken, /* Name of 
7930: 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20  the column. */. 
7940: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
7950: 43 2c 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d  C,    /* The nam
7960: 65 20 63 6f 6e 74 65 78 74 20 75 73 65 64 20 74  e context used t
7970: 6f 20 72 65 73 6f 6c 76 65 20 74 68 65 20 6e 61  o resolve the na
7980: 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  me */.  Expr *pE
7990: 78 70 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20  xpr          /* 
79a0: 4d 61 6b 65 20 74 68 69 73 20 45 58 50 52 20 6e  Make this EXPR n
79b0: 6f 64 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  ode point to the
79c0: 20 73 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e   selected column
79d0: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
79e0: 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  Db = 0;       /*
79f0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
7a00: 61 62 61 73 65 2e 20 20 54 68 65 20 22 58 22 20  abase.  The "X" 
7a10: 69 6e 20 58 2e 59 2e 5a 20 2a 2f 0a 20 20 63 68  in X.Y.Z */.  ch
7a20: 61 72 20 2a 7a 54 61 62 20 3d 20 30 3b 20 20 20  ar *zTab = 0;   
7a30: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
7a40: 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 22 59  e table.  The "Y
7a50: 22 20 69 6e 20 58 2e 59 2e 5a 20 6f 72 20 59 2e  " in X.Y.Z or Y.
7a60: 5a 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f  Z */.  char *zCo
7a70: 6c 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e  l = 0;      /* N
7a80: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
7a90: 6e 2e 20 20 54 68 65 20 22 5a 22 20 2a 2f 0a 20  n.  The "Z" */. 
7aa0: 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
7ab0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
7ac0: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
7ad0: 63 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  cnt = 0;        
7ae0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61   /* Number of ma
7af0: 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61  tching column na
7b00: 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  mes */.  int cnt
7b10: 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  Tab = 0;      /*
7b20: 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68   Number of match
7b30: 69 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65 73 20  ing table names 
7b40: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
7b50: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
7b60: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
7b70: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
7b80: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
7b90: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 66 6f         /* Use fo
7ba0: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70  r looping over p
7bb0: 53 72 63 4c 69 73 74 20 69 74 65 6d 73 20 2a 2f  SrcList items */
7bc0: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
7bd0: 74 5f 69 74 65 6d 20 2a 70 4d 61 74 63 68 20 3d  t_item *pMatch =
7be0: 20 30 3b 20 20 2f 2a 20 54 68 65 20 6d 61 74 63   0;  /* The matc
7bf0: 68 69 6e 67 20 70 53 72 63 4c 69 73 74 20 69 74  hing pSrcList it
7c00: 65 6d 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  em */.  NameCont
7c10: 65 78 74 20 2a 70 54 6f 70 4e 43 20 3d 20 70 4e  ext *pTopNC = pN
7c20: 43 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72  C;        /* Fir
7c30: 73 74 20 6e 61 6d 65 63 6f 6e 74 65 78 74 20 69  st namecontext i
7c40: 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20  n the list */.  
7c50: 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20  Schema *pSchema 
7c60: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
7c70: 20 20 2f 2a 20 53 63 68 65 6d 61 20 6f 66 20 74    /* Schema of t
7c80: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  he expression */
7c90: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c  ..  assert( pCol
7ca0: 75 6d 6e 54 6f 6b 65 6e 20 26 26 20 70 43 6f 6c  umnToken && pCol
7cb0: 75 6d 6e 54 6f 6b 65 6e 2d 3e 7a 20 29 3b 20 2f  umnToken->z ); /
7cc0: 2a 20 54 68 65 20 5a 20 69 6e 20 58 2e 59 2e 5a  * The Z in X.Y.Z
7cd0: 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 20   cannot be NULL 
7ce0: 2a 2f 0a 20 20 7a 44 62 20 3d 20 73 71 6c 69 74  */.  zDb = sqlit
7cf0: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
7d00: 64 62 2c 20 70 44 62 54 6f 6b 65 6e 29 3b 0a 20  db, pDbToken);. 
7d10: 20 7a 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4e   zTab = sqlite3N
7d20: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
7d30: 20 70 54 61 62 6c 65 54 6f 6b 65 6e 29 3b 0a 20   pTableToken);. 
7d40: 20 7a 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 4e   zCol = sqlite3N
7d50: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
7d60: 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 29 3b 0a   pColumnToken);.
7d70: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
7d80: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
7d90: 74 6f 20 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e  to lookupname_en
7da0: 64 3b 0a 20 20 7d 0a 0a 20 20 70 45 78 70 72 2d  d;.  }..  pExpr-
7db0: 3e 69 54 61 62 6c 65 20 3d 20 2d 31 3b 0a 20 20  >iTable = -1;.  
7dc0: 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20 63 6e  while( pNC && cn
7dd0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72  t==0 ){.    Expr
7de0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
7df0: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c    SrcList *pSrcL
7e00: 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c  ist = pNC->pSrcL
7e10: 69 73 74 3b 0a 0a 20 20 20 20 69 66 28 20 70 53  ist;..    if( pS
7e20: 72 63 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  rcList ){.      
7e30: 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
7e40: 53 72 63 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 53  SrcList->a; i<pS
7e50: 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  rcList->nSrc; i+
7e60: 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
7e70: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
7e80: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 44  ;.        int iD
7e90: 62 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c 75 6d  b;.        Colum
7ea0: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 0a 20 20 20 20  n *pCol;.  .    
7eb0: 20 20 20 20 70 54 61 62 20 3d 20 70 49 74 65 6d      pTab = pItem
7ec0: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
7ed0: 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20  assert( pTab!=0 
7ee0: 29 3b 0a 20 20 20 20 20 20 20 20 69 44 62 20 3d  );.        iDb =
7ef0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
7f00: 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
7f10: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
7f20: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
7f30: 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20  nCol>0 );.      
7f40: 20 20 69 66 28 20 7a 54 61 62 20 29 7b 0a 20 20    if( zTab ){.  
7f50: 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
7f60: 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20  m->zAlias ){.   
7f70: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
7f80: 54 61 62 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d  TabName = pItem-
7f90: 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20  >zAlias;.       
7fa0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
7fb0: 53 74 72 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65  StrICmp(zTabName
7fc0: 2c 20 7a 54 61 62 29 21 3d 30 20 29 20 63 6f 6e  , zTab)!=0 ) con
7fd0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
7fe0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7ff0: 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61      char *zTabNa
8000: 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  me = pTab->zName
8010: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
8020: 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c  ( zTabName==0 ||
8030: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
8040: 7a 54 61 62 4e 61 6d 65 2c 20 7a 54 61 62 29 21  zTabName, zTab)!
8050: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
8060: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a             if( z
8070: 44 62 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33  Db!=0 && sqlite3
8080: 53 74 72 49 43 6d 70 28 64 62 2d 3e 61 44 62 5b  StrICmp(db->aDb[
8090: 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 7a 44 62 29  iDb].zName, zDb)
80a0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
80b0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
80c0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
80d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
80e0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 30   }.        if( 0
80f0: 3d 3d 28 63 6e 74 54 61 62 2b 2b 29 20 29 7b 0a  ==(cntTab++) ){.
8100: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
8110: 3e 69 54 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d  >iTable = pItem-
8120: 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  >iCursor;.      
8130: 20 20 20 20 70 53 63 68 65 6d 61 20 3d 20 70 54      pSchema = pT
8140: 61 62 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20  ab->pSchema;.   
8150: 20 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20         pMatch = 
8160: 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 7d  pItem;.        }
8170: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
8180: 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f  , pCol=pTab->aCo
8190: 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  l; j<pTab->nCol;
81a0: 20 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   j++, pCol++){. 
81b0: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
81c0: 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
81d0: 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d  ->zName, zCol)==
81e0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
81f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
8200: 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ll = pTab->aCol[
8210: 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  j].zColl;.      
8220: 20 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70 55        IdList *pU
8230: 73 69 6e 67 3b 0a 20 20 20 20 20 20 20 20 20 20  sing;.          
8240: 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20    cnt++;.       
8250: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
8260: 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72  le = pItem->iCur
8270: 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  sor;.           
8280: 20 70 4d 61 74 63 68 20 3d 20 70 49 74 65 6d 3b   pMatch = pItem;
8290: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63  .            pSc
82a0: 68 65 6d 61 20 3d 20 70 54 61 62 2d 3e 70 53 63  hema = pTab->pSc
82b0: 68 65 6d 61 3b 0a 20 20 20 20 20 20 20 20 20 20  hema;.          
82c0: 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20    /* Substitute 
82d0: 74 68 65 20 72 6f 77 69 64 20 28 63 6f 6c 75 6d  the rowid (colum
82e0: 6e 20 2d 31 29 20 66 6f 72 20 74 68 65 20 49 4e  n -1) for the IN
82f0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
8300: 59 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  Y */.           
8310: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
8320: 3d 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79  = j==pTab->iPKey
8330: 20 3f 20 2d 31 20 3a 20 6a 3b 0a 20 20 20 20 20   ? -1 : j;.     
8340: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66         pExpr->af
8350: 66 69 6e 69 74 79 20 3d 20 70 54 61 62 2d 3e 61  finity = pTab->a
8360: 43 6f 6c 5b 6a 5d 2e 61 66 66 69 6e 69 74 79 3b  Col[j].affinity;
8370: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
8380: 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26   (pExpr->flags &
8390: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3d   EP_ExpCollate)=
83a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
83b0: 20 20 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c      pExpr->pColl
83c0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
83d0: 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62  llSeq(db, ENC(db
83e0: 29 2c 20 7a 43 6f 6c 6c 2c 2d 31 2c 20 30 29 3b  ), zColl,-1, 0);
83f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
8400: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
8410: 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 2d  <pSrcList->nSrc-
8420: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
8430: 20 20 20 69 66 28 20 70 49 74 65 6d 5b 31 5d 2e     if( pItem[1].
8440: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41  jointype & JT_NA
8450: 54 55 52 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  TURAL ){.       
8460: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
8470: 68 69 73 20 6d 61 74 63 68 20 6f 63 63 75 72 72  his match occurr
8480: 65 64 20 69 6e 20 74 68 65 20 6c 65 66 74 20 74  ed in the left t
8490: 61 62 6c 65 20 6f 66 20 61 20 6e 61 74 75 72 61  able of a natura
84a0: 6c 20 6a 6f 69 6e 2c 0a 20 20 20 20 20 20 20 20  l join,.        
84b0: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
84c0: 73 6b 69 70 20 74 68 65 20 72 69 67 68 74 20 74  skip the right t
84d0: 61 62 6c 65 20 74 6f 20 61 76 6f 69 64 20 61 20  able to avoid a 
84e0: 64 75 70 6c 69 63 61 74 65 20 6d 61 74 63 68 20  duplicate match 
84f0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
8500: 20 20 20 70 49 74 65 6d 2b 2b 3b 0a 20 20 20 20     pItem++;.    
8510: 20 20 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b              i++;
8520: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
8530: 65 6c 73 65 20 69 66 28 20 28 70 55 73 69 6e 67  else if( (pUsing
8540: 20 3d 20 70 49 74 65 6d 5b 31 5d 2e 70 55 73 69   = pItem[1].pUsi
8550: 6e 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ng)!=0 ){.      
8560: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
8570: 74 68 69 73 20 6d 61 74 63 68 20 6f 63 63 75 72  this match occur
8580: 73 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 74 68  s on a column th
8590: 61 74 20 69 73 20 69 6e 20 74 68 65 20 55 53 49  at is in the USI
85a0: 4e 47 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20  NG clause.      
85b0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20            ** of 
85c0: 61 20 6a 6f 69 6e 2c 20 73 6b 69 70 20 74 68 65  a join, skip the
85d0: 20 73 65 61 72 63 68 20 6f 66 20 74 68 65 20 72   search of the r
85e0: 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20 74 68  ight table of th
85f0: 65 20 6a 6f 69 6e 0a 20 20 20 20 20 20 20 20 20  e join.         
8600: 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f         ** to avo
8610: 69 64 20 61 20 64 75 70 6c 69 63 61 74 65 20 6d  id a duplicate m
8620: 61 74 63 68 20 74 68 65 72 65 2e 20 2a 2f 0a 20  atch there. */. 
8630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
8640: 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt k;.          
8650: 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
8660: 3c 70 55 73 69 6e 67 2d 3e 6e 49 64 3b 20 6b 2b  <pUsing->nId; k+
8670: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
8680: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
8690: 33 53 74 72 49 43 6d 70 28 70 55 73 69 6e 67 2d  3StrICmp(pUsing-
86a0: 3e 61 5b 6b 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f  >a[k].zName, zCo
86b0: 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)==0 ){.       
86c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
86d0: 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  em++;.          
86e0: 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20            i++;. 
86f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8700: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8710: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
8720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
8730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
8740: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
8750: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
8760: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
8770: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
8780: 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
8790: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
87a0: 52 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 68  R.    /* If we h
87b0: 61 76 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  ave not already 
87c0: 72 65 73 6f 6c 76 65 64 20 74 68 65 20 6e 61 6d  resolved the nam
87d0: 65 2c 20 74 68 65 6e 20 6d 61 79 62 65 20 0a 20  e, then maybe . 
87e0: 20 20 20 2a 2a 20 69 74 20 69 73 20 61 20 6e 65     ** it is a ne
87f0: 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 74 72 69  w.* or old.* tri
8800: 67 67 65 72 20 61 72 67 75 6d 65 6e 74 20 72 65  gger argument re
8810: 66 65 72 65 6e 63 65 0a 20 20 20 20 2a 2f 0a 20  ference.    */. 
8820: 20 20 20 69 66 28 20 7a 44 62 3d 3d 30 20 26 26     if( zDb==0 &&
8830: 20 7a 54 61 62 21 3d 30 20 26 26 20 63 6e 74 3d   zTab!=0 && cnt=
8840: 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 74 72  =0 && pParse->tr
8850: 69 67 53 74 61 63 6b 21 3d 30 20 29 7b 0a 20 20  igStack!=0 ){.  
8860: 20 20 20 20 54 72 69 67 67 65 72 53 74 61 63 6b      TriggerStack
8870: 20 2a 70 54 72 69 67 67 65 72 53 74 61 63 6b 20   *pTriggerStack 
8880: 3d 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74  = pParse->trigSt
8890: 61 63 6b 3b 0a 20 20 20 20 20 20 54 61 62 6c 65  ack;.      Table
88a0: 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20   *pTab = 0;.    
88b0: 20 20 75 33 32 20 2a 70 69 43 6f 6c 4d 61 73 6b    u32 *piColMask
88c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 72 69  ;.      if( pTri
88d0: 67 67 65 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64  ggerStack->newId
88e0: 78 20 21 3d 20 2d 31 20 26 26 20 73 71 6c 69 74  x != -1 && sqlit
88f0: 65 33 53 74 72 49 43 6d 70 28 22 6e 65 77 22 2c  e3StrICmp("new",
8900: 20 7a 54 61 62 29 20 3d 3d 20 30 20 29 7b 0a 20   zTab) == 0 ){. 
8910: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
8920: 61 62 6c 65 20 3d 20 70 54 72 69 67 67 65 72 53  able = pTriggerS
8930: 74 61 63 6b 2d 3e 6e 65 77 49 64 78 3b 0a 20 20  tack->newIdx;.  
8940: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
8950: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61  riggerStack->pTa
8960: 62 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61  b );.        pTa
8970: 62 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63  b = pTriggerStac
8980: 6b 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  k->pTab;.       
8990: 20 70 69 43 6f 6c 4d 61 73 6b 20 3d 20 26 28 70   piColMask = &(p
89a0: 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6e 65  TriggerStack->ne
89b0: 77 43 6f 6c 4d 61 73 6b 29 3b 0a 20 20 20 20 20  wColMask);.     
89c0: 20 7d 65 6c 73 65 20 69 66 28 20 70 54 72 69 67   }else if( pTrig
89d0: 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 49 64 78  gerStack->oldIdx
89e0: 20 21 3d 20 2d 31 20 26 26 20 73 71 6c 69 74 65   != -1 && sqlite
89f0: 33 53 74 72 49 43 6d 70 28 22 6f 6c 64 22 2c 20  3StrICmp("old", 
8a00: 7a 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20  zTab)==0 ){.    
8a10: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
8a20: 65 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63  e = pTriggerStac
8a30: 6b 2d 3e 6f 6c 64 49 64 78 3b 0a 20 20 20 20 20  k->oldIdx;.     
8a40: 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67     assert( pTrig
8a50: 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 20 29  gerStack->pTab )
8a60: 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d  ;.        pTab =
8a70: 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e   pTriggerStack->
8a80: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 70 69  pTab;.        pi
8a90: 43 6f 6c 4d 61 73 6b 20 3d 20 26 28 70 54 72 69  ColMask = &(pTri
8aa0: 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 43 6f  ggerStack->oldCo
8ab0: 6c 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  lMask);.      }.
8ac0: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 20  .      if( pTab 
8ad0: 29 7b 20 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ){ .        int 
8ae0: 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 43 6f  iCol;.        Co
8af0: 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 70 54 61  lumn *pCol = pTa
8b00: 62 2d 3e 61 43 6f 6c 3b 0a 0a 20 20 20 20 20 20  b->aCol;..      
8b10: 20 20 70 53 63 68 65 6d 61 20 3d 20 70 54 61 62    pSchema = pTab
8b20: 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20  ->pSchema;.     
8b30: 20 20 20 63 6e 74 54 61 62 2b 2b 3b 0a 20 20 20     cntTab++;.   
8b40: 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b       for(iCol=0;
8b50: 20 69 43 6f 6c 20 3c 20 70 54 61 62 2d 3e 6e 43   iCol < pTab->nC
8b60: 6f 6c 3b 20 69 43 6f 6c 2b 2b 2c 20 70 43 6f 6c  ol; iCol++, pCol
8b70: 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ++) {.          
8b80: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
8b90: 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20  mp(pCol->zName, 
8ba0: 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  zCol)==0 ){.    
8bb0: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
8bc0: 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 54 61 62  ar *zColl = pTab
8bd0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 43 6f  ->aCol[iCol].zCo
8be0: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll;.            
8bf0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  cnt++;.         
8c00: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
8c10: 6e 20 3d 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e  n = iCol==pTab->
8c20: 69 50 4b 65 79 20 3f 20 2d 31 20 3a 20 69 43 6f  iPKey ? -1 : iCo
8c30: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  l;.            p
8c40: 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d  Expr->affinity =
8c50: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
8c60: 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20  ].affinity;.    
8c70: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 45 78          if( (pEx
8c80: 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45  pr->flags & EP_E
8c90: 78 70 43 6f 6c 6c 61 74 65 29 3d 3d 30 20 29 7b  xpCollate)==0 ){
8ca0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
8cb0: 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71  Expr->pColl = sq
8cc0: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
8cd0: 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43  (db, ENC(db), zC
8ce0: 6f 6c 6c 2c 2d 31 2c 20 30 29 3b 0a 20 20 20 20  oll,-1, 0);.    
8cf0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8d00: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 54 61        pExpr->pTa
8d10: 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20  b = pTab;.      
8d20: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d        if( iCol>=
8d30: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
8d40: 20 20 20 2a 70 69 43 6f 6c 4d 61 73 6b 20 7c 3d     *piColMask |=
8d50: 20 28 28 75 33 32 29 31 3c 3c 69 43 6f 6c 29 20   ((u32)1<<iCol) 
8d60: 7c 20 28 69 43 6f 6c 3e 3d 33 32 3f 30 78 66 66  | (iCol>=32?0xff
8d70: 66 66 66 66 66 66 3a 30 29 3b 0a 20 20 20 20 20  ffffff:0);.     
8d80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8d90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8da0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8db0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
8dc0: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
8dd0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
8de0: 52 49 47 47 45 52 29 20 2a 2f 0a 0a 20 20 20 20  RIGGER) */..    
8df0: 2f 2a 0a 20 20 20 20 2a 2a 20 50 65 72 68 61 70  /*.    ** Perhap
8e00: 73 20 74 68 65 20 6e 61 6d 65 20 69 73 20 61 20  s the name is a 
8e10: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
8e20: 20 52 4f 57 49 44 0a 20 20 20 20 2a 2f 0a 20 20   ROWID.    */.  
8e30: 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26 26 20    if( cnt==0 && 
8e40: 63 6e 74 54 61 62 3d 3d 31 20 26 26 20 73 71 6c  cntTab==1 && sql
8e50: 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c  ite3IsRowid(zCol
8e60: 29 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 20 3d  ) ){.      cnt =
8e70: 20 31 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   1;.      pExpr-
8e80: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20  >iColumn = -1;. 
8e90: 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69       pExpr->affi
8ea0: 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46  nity = SQLITE_AF
8eb0: 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 7d  F_INTEGER;.    }
8ec0: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
8ed0: 49 66 20 74 68 65 20 69 6e 70 75 74 20 69 73 20  If the input is 
8ee0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 5a 20 28 6e  of the form Z (n
8ef0: 6f 74 20 59 2e 5a 20 6f 72 20 58 2e 59 2e 5a 29  ot Y.Z or X.Y.Z)
8f00: 20 74 68 65 6e 20 74 68 65 20 6e 61 6d 65 20 5a   then the name Z
8f10: 0a 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 72 65  .    ** might re
8f20: 66 65 72 20 74 6f 20 61 6e 20 72 65 73 75 6c 74  fer to an result
8f30: 2d 73 65 74 20 61 6c 69 61 73 2e 20 20 54 68 69  -set alias.  Thi
8f40: 73 20 68 61 70 70 65 6e 73 2c 20 66 6f 72 20 65  s happens, for e
8f50: 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a 20 20 20  xample, when.   
8f60: 20 2a 2a 20 77 65 20 61 72 65 20 72 65 73 6f 6c   ** we are resol
8f70: 76 69 6e 67 20 6e 61 6d 65 73 20 69 6e 20 74 68  ving names in th
8f80: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
8f90: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
8fa0: 63 6f 6d 6d 61 6e 64 3a 0a 20 20 20 20 2a 2a 0a  command:.    **.
8fb0: 20 20 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43      **     SELEC
8fc0: 54 20 61 2b 62 20 41 53 20 78 20 46 52 4f 4d 20  T a+b AS x FROM 
8fd0: 74 61 62 6c 65 20 57 48 45 52 45 20 78 3c 31 30  table WHERE x<10
8fe0: 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
8ff0: 49 6e 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68  In cases like th
9000: 69 73 2c 20 72 65 70 6c 61 63 65 20 70 45 78 70  is, replace pExp
9010: 72 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66  r with a copy of
9020: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
9030: 74 68 61 74 0a 20 20 20 20 2a 2a 20 66 6f 72 6d  that.    ** form
9040: 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
9050: 20 65 6e 74 72 79 20 28 22 61 2b 62 22 20 69 6e   entry ("a+b" in
9060: 20 74 68 65 20 65 78 61 6d 70 6c 65 29 20 61 6e   the example) an
9070: 64 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61  d return immedia
9080: 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 4e 6f 74  tely..    ** Not
9090: 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65  e that the expre
90a0: 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 72 65 73  ssion in the res
90b0: 75 6c 74 20 73 65 74 20 73 68 6f 75 6c 64 20 68  ult set should h
90c0: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
90d0: 0a 20 20 20 20 2a 2a 20 72 65 73 6f 6c 76 65 64  .    ** resolved
90e0: 20 62 79 20 74 68 65 20 74 69 6d 65 20 74 68 65   by the time the
90f0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
9100: 20 72 65 73 6f 6c 76 65 64 2e 0a 20 20 20 20 2a   resolved..    *
9110: 2f 0a 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30  /.    if( cnt==0
9120: 20 26 26 20 28 70 45 4c 69 73 74 20 3d 20 70 4e   && (pEList = pN
9130: 43 2d 3e 70 45 4c 69 73 74 29 21 3d 30 20 26 26  C->pEList)!=0 &&
9140: 20 7a 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   zTab==0 ){.    
9150: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 45 4c    for(j=0; j<pEL
9160: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29  ist->nExpr; j++)
9170: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
9180: 7a 41 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  zAs = pEList->a[
9190: 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
91a0: 20 20 69 66 28 20 7a 41 73 21 3d 30 20 26 26 20    if( zAs!=0 && 
91b0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
91c0: 41 73 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a  As, zCol)==0 ){.
91d0: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
91e0: 70 44 75 70 2c 20 2a 70 4f 72 69 67 3b 0a 20 20  pDup, *pOrig;.  
91f0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9200: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20  pExpr->pLeft==0 
9210: 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  && pExpr->pRight
9220: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
9230: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
9240: 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pList==0 );.    
9250: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
9260: 78 70 72 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  xpr->pSelect==0 
9270: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72  );.          pOr
9280: 69 67 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a  ig = pEList->a[j
9290: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
92a0: 20 20 20 69 66 28 20 21 70 4e 43 2d 3e 61 6c 6c     if( !pNC->all
92b0: 6f 77 41 67 67 20 26 26 20 45 78 70 72 48 61 73  owAgg && ExprHas
92c0: 50 72 6f 70 65 72 74 79 28 70 4f 72 69 67 2c 20  Property(pOrig, 
92d0: 45 50 5f 41 67 67 29 20 29 7b 0a 20 20 20 20 20  EP_Agg) ){.     
92e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
92f0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
9300: 6d 69 73 75 73 65 20 6f 66 20 61 6c 69 61 73 65  misuse of aliase
9310: 64 20 61 67 67 72 65 67 61 74 65 20 25 73 22 2c  d aggregate %s",
9320: 20 7a 41 73 29 3b 0a 20 20 20 20 20 20 20 20 20   zAs);.         
9330: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
9340: 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  zCol);.         
9350: 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20     return 2;.   
9360: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9370: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
9380: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 72  3ExprDup(db, pOr
9390: 69 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ig);.          i
93a0: 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  f( pExpr->flags 
93b0: 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20  & EP_ExpCollate 
93c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
93d0: 44 75 70 2d 3e 70 43 6f 6c 6c 20 3d 20 70 45 78  Dup->pColl = pEx
93e0: 70 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  pr->pColl;.     
93f0: 20 20 20 20 20 20 20 70 44 75 70 2d 3e 66 6c 61         pDup->fla
9400: 67 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c  gs |= EP_ExpColl
9410: 61 74 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ate;.          }
9420: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
9430: 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 29  Expr->span.dyn )
9440: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 28 63   sqlite3_free((c
9450: 68 61 72 2a 29 70 45 78 70 72 2d 3e 73 70 61 6e  har*)pExpr->span
9460: 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  .z);.          i
9470: 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  f( pExpr->token.
9480: 64 79 6e 20 29 20 73 71 6c 69 74 65 33 5f 66 72  dyn ) sqlite3_fr
9490: 65 65 28 28 63 68 61 72 2a 29 70 45 78 70 72 2d  ee((char*)pExpr-
94a0: 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 20  >token.z);.     
94b0: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 45 78 70       memcpy(pExp
94c0: 72 2c 20 70 44 75 70 2c 20 73 69 7a 65 6f 66 28  r, pDup, sizeof(
94d0: 2a 70 45 78 70 72 29 29 3b 0a 20 20 20 20 20 20  *pExpr));.      
94e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
94f0: 28 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20  (pDup);.        
9500: 20 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20    cnt = 1;.     
9510: 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20 30 3b       pMatch = 0;
9520: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
9530: 74 28 20 7a 54 61 62 3d 3d 30 20 26 26 20 7a 44  t( zTab==0 && zD
9540: 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  b==0 );.        
9550: 20 20 67 6f 74 6f 20 6c 6f 6f 6b 75 70 6e 61 6d    goto lookupnam
9560: 65 5f 65 6e 64 5f 32 3b 0a 20 20 20 20 20 20 20  e_end_2;.       
9570: 20 7d 0a 20 20 20 20 20 20 7d 20 0a 20 20 20 20   }.      } .    
9580: 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 76 61 6e 63  }..    /* Advanc
9590: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6e 61  e to the next na
95a0: 6d 65 20 63 6f 6e 74 65 78 74 2e 20 20 54 68 65  me context.  The
95b0: 20 6c 6f 6f 70 20 77 69 6c 6c 20 65 78 69 74 20   loop will exit 
95c0: 77 68 65 6e 20 65 69 74 68 65 72 0a 20 20 20 20  when either.    
95d0: 2a 2a 20 77 65 20 68 61 76 65 20 61 20 6d 61 74  ** we have a mat
95e0: 63 68 20 28 63 6e 74 3e 30 29 20 6f 72 20 77 68  ch (cnt>0) or wh
95f0: 65 6e 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66  en we run out of
9600: 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 73 2e 0a   name contexts..
9610: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63      */.    if( c
9620: 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  nt==0 ){.      p
9630: 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b  NC = pNC->pNext;
9640: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
9650: 0a 20 20 2a 2a 20 49 66 20 58 20 61 6e 64 20 59  .  ** If X and Y
9660: 20 61 72 65 20 4e 55 4c 4c 20 28 69 6e 20 6f 74   are NULL (in ot
9670: 68 65 72 20 77 6f 72 64 73 20 69 66 20 6f 6e 6c  her words if onl
9680: 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  y the column nam
9690: 65 20 5a 20 69 73 0a 20 20 2a 2a 20 73 75 70 70  e Z is.  ** supp
96a0: 6c 69 65 64 29 20 61 6e 64 20 74 68 65 20 76 61  lied) and the va
96b0: 6c 75 65 20 6f 66 20 5a 20 69 73 20 65 6e 63 6c  lue of Z is encl
96c0: 6f 73 65 64 20 69 6e 20 64 6f 75 62 6c 65 2d 71  osed in double-q
96d0: 75 6f 74 65 73 2c 20 74 68 65 6e 0a 20 20 2a 2a  uotes, then.  **
96e0: 20 5a 20 69 73 20 61 20 73 74 72 69 6e 67 20 6c   Z is a string l
96f0: 69 74 65 72 61 6c 20 69 66 20 69 74 20 64 6f 65  iteral if it doe
9700: 73 6e 27 74 20 6d 61 74 63 68 20 61 6e 79 20 63  sn't match any c
9710: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 6e  olumn names.  In
9720: 20 74 68 61 74 0a 20 20 2a 2a 20 63 61 73 65 2c   that.  ** case,
9730: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 74 75   we need to retu
9740: 72 6e 20 72 69 67 68 74 20 61 77 61 79 20 61 6e  rn right away an
9750: 64 20 6e 6f 74 20 6d 61 6b 65 20 61 6e 79 20 63  d not make any c
9760: 68 61 6e 67 65 73 20 74 6f 0a 20 20 2a 2a 20 70  hanges to.  ** p
9770: 45 78 70 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Expr..  **.  ** 
9780: 42 65 63 61 75 73 65 20 6e 6f 20 72 65 66 65 72  Because no refer
9790: 65 6e 63 65 20 77 61 73 20 6d 61 64 65 20 74 6f  ence was made to
97a0: 20 6f 75 74 65 72 20 63 6f 6e 74 65 78 74 73 2c   outer contexts,
97b0: 20 74 68 65 20 70 4e 43 2d 3e 6e 52 65 66 0a 20   the pNC->nRef. 
97c0: 20 2a 2a 20 66 69 65 6c 64 73 20 61 72 65 20 6e   ** fields are n
97d0: 6f 74 20 63 68 61 6e 67 65 64 20 69 6e 20 61 6e  ot changed in an
97e0: 79 20 63 6f 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a  y context..  */.
97f0: 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26 26 20    if( cnt==0 && 
9800: 7a 54 61 62 3d 3d 30 20 26 26 20 70 43 6f 6c 75  zTab==0 && pColu
9810: 6d 6e 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27  mnToken->z[0]=='
9820: 22 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  "' ){.    sqlite
9830: 33 5f 66 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20  3_free(zCol);.  
9840: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
9850: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63 6e 74 3d 3d  .  /*.  ** cnt==
9860: 30 20 6d 65 61 6e 73 20 74 68 65 72 65 20 77 61  0 means there wa
9870: 73 20 6e 6f 74 20 6d 61 74 63 68 2e 20 20 63 6e  s not match.  cn
9880: 74 3e 31 20 6d 65 61 6e 73 20 74 68 65 72 65 20  t>1 means there 
9890: 77 65 72 65 20 74 77 6f 20 6f 72 0a 20 20 2a 2a  were two or.  **
98a0: 20 6d 6f 72 65 20 6d 61 74 63 68 65 73 2e 20 20   more matches.  
98b0: 45 69 74 68 65 72 20 77 61 79 2c 20 77 65 20 68  Either way, we h
98c0: 61 76 65 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20  ave an error..  
98d0: 2a 2f 0a 20 20 69 66 28 20 63 6e 74 21 3d 31 20  */.  if( cnt!=1 
98e0: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  ){.    char *z =
98f0: 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45   0;.    char *zE
9900: 72 72 3b 0a 20 20 20 20 7a 45 72 72 20 3d 20 63  rr;.    zErr = c
9910: 6e 74 3d 3d 30 20 3f 20 22 6e 6f 20 73 75 63 68  nt==0 ? "no such
9920: 20 63 6f 6c 75 6d 6e 3a 20 25 73 22 20 3a 20 22   column: %s" : "
9930: 61 6d 62 69 67 75 6f 75 73 20 63 6f 6c 75 6d 6e  ambiguous column
9940: 20 6e 61 6d 65 3a 20 25 73 22 3b 0a 20 20 20 20   name: %s";.    
9950: 69 66 28 20 7a 44 62 20 29 7b 0a 20 20 20 20 20  if( zDb ){.     
9960: 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
9970: 67 28 26 7a 2c 20 7a 44 62 2c 20 22 2e 22 2c 20  g(&z, zDb, ".", 
9980: 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c  zTab, ".", zCol,
9990: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
99a0: 7d 65 6c 73 65 20 69 66 28 20 7a 54 61 62 20 29  }else if( zTab )
99b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
99c0: 65 74 53 74 72 69 6e 67 28 26 7a 2c 20 7a 54 61  etString(&z, zTa
99d0: 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20 28 63  b, ".", zCol, (c
99e0: 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 7d 65 6c  har*)0);.    }el
99f0: 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71  se{.      z = sq
9a00: 6c 69 74 65 33 53 74 72 44 75 70 28 7a 43 6f 6c  lite3StrDup(zCol
9a10: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
9a20: 20 7a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69   z ){.      sqli
9a30: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
9a40: 73 65 2c 20 7a 45 72 72 2c 20 7a 29 3b 0a 20 20  se, zErr, z);.  
9a50: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
9a60: 28 7a 29 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e  (z);.      pTopN
9a70: 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d  C->nErr++;.    }
9a80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62 2d 3e  else{.      db->
9a90: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
9aa0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
9ab0: 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 66 72  * If a column fr
9ac0: 6f 6d 20 61 20 74 61 62 6c 65 20 69 6e 20 70 53  om a table in pS
9ad0: 72 63 4c 69 73 74 20 69 73 20 72 65 66 65 72 65  rcList is refere
9ae0: 6e 63 65 64 2c 20 74 68 65 6e 20 72 65 63 6f 72  nced, then recor
9af0: 64 0a 20 20 2a 2a 20 74 68 69 73 20 66 61 63 74  d.  ** this fact
9b00: 20 69 6e 20 74 68 65 20 70 53 72 63 4c 69 73 74   in the pSrcList
9b10: 2e 61 5b 5d 2e 63 6f 6c 55 73 65 64 20 62 69 74  .a[].colUsed bit
9b20: 6d 61 73 6b 2e 20 20 43 6f 6c 75 6d 6e 20 30 20  mask.  Column 0 
9b30: 63 61 75 73 65 73 0a 20 20 2a 2a 20 62 69 74 20  causes.  ** bit 
9b40: 30 20 74 6f 20 62 65 20 73 65 74 2e 20 20 43 6f  0 to be set.  Co
9b50: 6c 75 6d 6e 20 31 20 73 65 74 73 20 62 69 74 20  lumn 1 sets bit 
9b60: 31 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68  1.  And so forth
9b70: 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 63  .  If the.  ** c
9b80: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69 73 20  olumn number is 
9b90: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
9ba0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73 20   number of bits 
9bb0: 69 6e 20 74 68 65 20 62 69 74 6d 61 73 6b 0a 20  in the bitmask. 
9bc0: 20 2a 2a 20 74 68 65 6e 20 73 65 74 20 74 68 65   ** then set the
9bd0: 20 68 69 67 68 2d 6f 72 64 65 72 20 62 69 74 20   high-order bit 
9be0: 6f 66 20 74 68 65 20 62 69 74 6d 61 73 6b 2e 0a  of the bitmask..
9bf0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72    */.  if( pExpr
9c00: 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20  ->iColumn>=0 && 
9c10: 70 4d 61 74 63 68 21 3d 30 20 29 7b 0a 20 20 20  pMatch!=0 ){.   
9c20: 20 69 6e 74 20 6e 20 3d 20 70 45 78 70 72 2d 3e   int n = pExpr->
9c30: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 66 28  iColumn;.    if(
9c40: 20 6e 3e 3d 73 69 7a 65 6f 66 28 42 69 74 6d 61   n>=sizeof(Bitma
9c50: 73 6b 29 2a 38 20 29 7b 0a 20 20 20 20 20 20 6e  sk)*8 ){.      n
9c60: 20 3d 20 73 69 7a 65 6f 66 28 42 69 74 6d 61 73   = sizeof(Bitmas
9c70: 6b 29 2a 38 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  k)*8-1;.    }.  
9c80: 20 20 61 73 73 65 72 74 28 20 70 4d 61 74 63 68    assert( pMatch
9c90: 2d 3e 69 43 75 72 73 6f 72 3d 3d 70 45 78 70 72  ->iCursor==pExpr
9ca0: 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20 20 20  ->iTable );.    
9cb0: 70 4d 61 74 63 68 2d 3e 63 6f 6c 55 73 65 64 20  pMatch->colUsed 
9cc0: 7c 3d 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c  |= ((Bitmask)1)<
9cd0: 3c 6e 3b 0a 20 20 7d 0a 0a 6c 6f 6f 6b 75 70 6e  <n;.  }..lookupn
9ce0: 61 6d 65 5f 65 6e 64 3a 0a 20 20 2f 2a 20 43 6c  ame_end:.  /* Cl
9cf0: 65 61 6e 20 75 70 20 61 6e 64 20 72 65 74 75 72  ean up and retur
9d00: 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  n.  */.  sqlite3
9d10: 5f 66 72 65 65 28 7a 44 62 29 3b 0a 20 20 73 71  _free(zDb);.  sq
9d20: 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 61 62 29  lite3_free(zTab)
9d30: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
9d40: 65 6c 65 74 65 28 70 45 78 70 72 2d 3e 70 4c 65  elete(pExpr->pLe
9d50: 66 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 4c  ft);.  pExpr->pL
9d60: 65 66 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  eft = 0;.  sqlit
9d70: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 78  e3ExprDelete(pEx
9d80: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 70  pr->pRight);.  p
9d90: 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 30  Expr->pRight = 0
9da0: 3b 0a 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20  ;.  pExpr->op = 
9db0: 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 6c 6f 6f 6b 75  TK_COLUMN;.looku
9dc0: 70 6e 61 6d 65 5f 65 6e 64 5f 32 3a 0a 20 20 73  pname_end_2:.  s
9dd0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c  qlite3_free(zCol
9de0: 29 3b 0a 20 20 69 66 28 20 63 6e 74 3d 3d 31 20  );.  if( cnt==1 
9df0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
9e00: 4e 43 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  NC!=0 );.    sql
9e10: 69 74 65 33 41 75 74 68 52 65 61 64 28 70 50 61  ite3AuthRead(pPa
9e20: 72 73 65 2c 20 70 45 78 70 72 2c 20 70 53 63 68  rse, pExpr, pSch
9e30: 65 6d 61 2c 20 70 4e 43 2d 3e 70 53 72 63 4c 69  ema, pNC->pSrcLi
9e40: 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 61  st);.    if( pMa
9e50: 74 63 68 20 26 26 20 21 70 4d 61 74 63 68 2d 3e  tch && !pMatch->
9e60: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
9e70: 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d 20 70   pExpr->pTab = p
9e80: 4d 61 74 63 68 2d 3e 70 54 61 62 3b 0a 20 20 20  Match->pTab;.   
9e90: 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d   }.    /* Increm
9ea0: 65 6e 74 20 74 68 65 20 6e 52 65 66 20 76 61 6c  ent the nRef val
9eb0: 75 65 20 6f 6e 20 61 6c 6c 20 6e 61 6d 65 20 63  ue on all name c
9ec0: 6f 6e 74 65 78 74 73 20 66 72 6f 6d 20 54 6f 70  ontexts from Top
9ed0: 4e 43 20 75 70 20 74 6f 0a 20 20 20 20 2a 2a 20  NC up to.    ** 
9ee0: 74 68 65 20 70 6f 69 6e 74 20 77 68 65 72 65 20  the point where 
9ef0: 74 68 65 20 6e 61 6d 65 20 6d 61 74 63 68 65 64  the name matched
9f00: 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 3b 3b 29  . */.    for(;;)
9f10: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
9f20: 70 54 6f 70 4e 43 21 3d 30 20 29 3b 0a 20 20 20  pTopNC!=0 );.   
9f30: 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 52 65 66 2b     pTopNC->nRef+
9f40: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 6f  +;.      if( pTo
9f50: 70 4e 43 3d 3d 70 4e 43 20 29 20 62 72 65 61 6b  pNC==pNC ) break
9f60: 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e 43 20 3d  ;.      pTopNC =
9f70: 20 70 54 6f 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a   pTopNC->pNext;.
9f80: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
9f90: 20 30 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20   0;.  } else {. 
9fa0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
9fb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
9fc0: 6f 75 74 69 6e 65 20 69 73 20 64 65 73 69 67 6e  outine is design
9fd0: 65 64 20 61 73 20 61 6e 20 78 46 75 6e 63 20 66  ed as an xFunc f
9fe0: 6f 72 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  or walkExprTree(
9ff0: 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65  )..**.** Resolve
a000: 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 73 20   symbolic names 
a010: 69 6e 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6f  into TK_COLUMN o
a020: 70 65 72 61 74 6f 72 73 20 66 6f 72 20 74 68 65  perators for the
a030: 20 63 75 72 72 65 6e 74 0a 2a 2a 20 6e 6f 64 65   current.** node
a040: 20 69 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   in the expressi
a050: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
a060: 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 74   0 to continue t
a070: 68 65 20 73 65 61 72 63 68 20 64 6f 77 6e 0a 2a  he search down.*
a080: 2a 20 74 68 65 20 74 72 65 65 20 6f 72 20 32 20  * the tree or 2 
a090: 74 6f 20 61 62 6f 72 74 20 74 68 65 20 74 72 65  to abort the tre
a0a0: 65 20 77 61 6c 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  e walk..**.** Th
a0b0: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20  is routine also 
a0c0: 64 6f 65 73 20 65 72 72 6f 72 20 63 68 65 63 6b  does error check
a0d0: 69 6e 67 20 61 6e 64 20 6e 61 6d 65 20 72 65 73  ing and name res
a0e0: 6f 6c 75 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 66  olution for.** f
a0f0: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 2e 20 20  unction names.  
a100: 54 68 65 20 6f 70 65 72 61 74 6f 72 20 66 6f 72  The operator for
a110: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
a120: 69 6f 6e 73 20 69 73 20 63 68 61 6e 67 65 64 0a  ions is changed.
a130: 2a 2a 20 74 6f 20 54 4b 5f 41 47 47 5f 46 55 4e  ** to TK_AGG_FUN
a140: 43 54 49 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63  CTION..*/.static
a150: 20 69 6e 74 20 6e 61 6d 65 52 65 73 6f 6c 76 65   int nameResolve
a160: 72 53 74 65 70 28 76 6f 69 64 20 2a 70 41 72 67  rStep(void *pArg
a170: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
a180: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
a190: 4e 43 20 3d 20 28 4e 61 6d 65 43 6f 6e 74 65 78  NC = (NameContex
a1a0: 74 2a 29 70 41 72 67 3b 0a 20 20 50 61 72 73 65  t*)pArg;.  Parse
a1b0: 20 2a 70 50 61 72 73 65 3b 0a 0a 20 20 69 66 28   *pParse;..  if(
a1c0: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
a1d0: 72 6e 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 1;.  assert( 
a1e0: 70 4e 43 21 3d 30 20 29 3b 0a 20 20 70 50 61 72  pNC!=0 );.  pPar
a1f0: 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
a200: 3b 0a 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  ;..  if( ExprHas
a210: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70  AnyProperty(pExp
a220: 72 2c 20 45 50 5f 52 65 73 6f 6c 76 65 64 29 20  r, EP_Resolved) 
a230: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 45 78  ) return 1;.  Ex
a240: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
a250: 78 70 72 2c 20 45 50 5f 52 65 73 6f 6c 76 65 64  xpr, EP_Resolved
a260: 29 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  );.#ifndef NDEBU
a270: 47 0a 20 20 69 66 28 20 70 4e 43 2d 3e 70 53 72  G.  if( pNC->pSr
a280: 63 4c 69 73 74 20 26 26 20 70 4e 43 2d 3e 70 53  cList && pNC->pS
a290: 72 63 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3e 30  rcList->nAlloc>0
a2a0: 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20   ){.    SrcList 
a2b0: 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d  *pSrcList = pNC-
a2c0: 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 69  >pSrcList;.    i
a2d0: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
a2e0: 30 3b 20 69 3c 70 4e 43 2d 3e 70 53 72 63 4c 69  0; i<pNC->pSrcLi
a2f0: 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
a300: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
a310: 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75  rcList->a[i].iCu
a320: 72 73 6f 72 3e 3d 30 20 26 26 20 70 53 72 63 4c  rsor>=0 && pSrcL
a330: 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  ist->a[i].iCurso
a340: 72 3c 70 50 61 72 73 65 2d 3e 6e 54 61 62 29 3b  r<pParse->nTab);
a350: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
a360: 66 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  f.  switch( pExp
a370: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20  r->op ){.    /* 
a380: 44 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74  Double-quoted st
a390: 72 69 6e 67 73 20 28 65 78 3a 20 22 61 62 63 22  rings (ex: "abc"
a3a0: 29 20 61 72 65 20 75 73 65 64 20 61 73 20 69 64  ) are used as id
a3b0: 65 6e 74 69 66 69 65 72 73 20 69 66 0a 20 20 20  entifiers if.   
a3c0: 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 20 4f   ** possible.  O
a3d0: 74 68 65 72 77 69 73 65 20 74 68 65 79 20 72 65  therwise they re
a3e0: 6d 61 69 6e 20 61 73 20 73 74 72 69 6e 67 73 2e  main as strings.
a3f0: 20 20 53 69 6e 67 6c 65 2d 71 75 6f 74 65 64 0a    Single-quoted.
a400: 20 20 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 28      ** strings (
a410: 65 78 3a 20 27 61 62 63 27 29 20 61 72 65 20 61  ex: 'abc') are a
a420: 6c 77 61 79 73 20 73 74 72 69 6e 67 20 6c 69 74  lways string lit
a430: 65 72 61 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  erals..    */.  
a440: 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
a450: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  : {.      if( pE
a460: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d  xpr->token.z[0]=
a470: 3d 27 5c 27 27 20 29 20 62 72 65 61 6b 3b 0a 20  ='\'' ) break;. 
a480: 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
a490: 75 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 49 44  u into the TK_ID
a4a0: 20 63 61 73 65 20 69 66 20 74 68 69 73 20 69 73   case if this is
a4b0: 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64   a double-quoted
a4c0: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 7d   string */.    }
a4d0: 0a 20 20 20 20 2f 2a 20 41 20 6c 6f 6e 65 20 69  .    /* A lone i
a4e0: 64 65 6e 74 69 66 69 65 72 20 69 73 20 74 68 65  dentifier is the
a4f0: 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d   name of a colum
a500: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  n..    */.    ca
a510: 73 65 20 54 4b 5f 49 44 3a 20 7b 0a 20 20 20 20  se TK_ID: {.    
a520: 20 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70 50 61    lookupName(pPa
a530: 72 73 65 2c 20 30 2c 20 30 2c 20 26 70 45 78 70  rse, 0, 0, &pExp
a540: 72 2d 3e 74 6f 6b 65 6e 2c 20 70 4e 43 2c 20 70  r->token, pNC, p
a550: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 72 65 74  Expr);.      ret
a560: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 0a  urn 1;.    }.  .
a570: 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 6e      /* A table n
a580: 61 6d 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e  ame and column n
a590: 61 6d 65 3a 20 20 20 20 20 49 44 2e 49 44 0a 20  ame:     ID.ID. 
a5a0: 20 20 20 2a 2a 20 4f 72 20 61 20 64 61 74 61 62     ** Or a datab
a5b0: 61 73 65 2c 20 74 61 62 6c 65 20 61 6e 64 20 63  ase, table and c
a5c0: 6f 6c 75 6d 6e 3a 20 20 49 44 2e 49 44 2e 49 44  olumn:  ID.ID.ID
a5d0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
a5e0: 20 54 4b 5f 44 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_DOT: {.     
a5f0: 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e 3b   Token *pColumn;
a600: 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54  .      Token *pT
a610: 61 62 6c 65 3b 0a 20 20 20 20 20 20 54 6f 6b 65  able;.      Toke
a620: 6e 20 2a 70 44 62 3b 0a 20 20 20 20 20 20 45 78  n *pDb;.      Ex
a630: 70 72 20 2a 70 52 69 67 68 74 3b 0a 0a 20 20 20  pr *pRight;..   
a640: 20 20 20 2f 2a 20 69 66 28 20 70 53 72 63 4c 69     /* if( pSrcLi
a650: 73 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 20 2a  st==0 ) break; *
a660: 2f 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d  /.      pRight =
a670: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a   pExpr->pRight;.
a680: 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74        if( pRight
a690: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20  ->op==TK_ID ){. 
a6a0: 20 20 20 20 20 20 20 70 44 62 20 3d 20 30 3b 0a         pDb = 0;.
a6b0: 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 20 3d          pTable =
a6c0: 20 26 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e   &pExpr->pLeft->
a6d0: 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 70  token;.        p
a6e0: 43 6f 6c 75 6d 6e 20 3d 20 26 70 52 69 67 68 74  Column = &pRight
a6f0: 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d  ->token;.      }
a700: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
a710: 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e 6f 70  sert( pRight->op
a720: 3d 3d 54 4b 5f 44 4f 54 20 29 3b 0a 20 20 20 20  ==TK_DOT );.    
a730: 20 20 20 20 70 44 62 20 3d 20 26 70 45 78 70 72      pDb = &pExpr
a740: 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a  ->pLeft->token;.
a750: 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 20 3d          pTable =
a760: 20 26 70 52 69 67 68 74 2d 3e 70 4c 65 66 74 2d   &pRight->pLeft-
a770: 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  >token;.        
a780: 70 43 6f 6c 75 6d 6e 20 3d 20 26 70 52 69 67 68  pColumn = &pRigh
a790: 74 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e  t->pRight->token
a7a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a7b0: 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70 50 61 72 73  lookupName(pPars
a7c0: 65 2c 20 70 44 62 2c 20 70 54 61 62 6c 65 2c 20  e, pDb, pTable, 
a7d0: 70 43 6f 6c 75 6d 6e 2c 20 70 4e 43 2c 20 70 45  pColumn, pNC, pE
a7e0: 78 70 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  xpr);.      retu
a7f0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 1;.    }..   
a800: 20 2f 2a 20 52 65 73 6f 6c 76 65 20 66 75 6e 63   /* Resolve func
a810: 74 69 6f 6e 20 6e 61 6d 65 73 0a 20 20 20 20 2a  tion names.    *
a820: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  /.    case TK_CO
a830: 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20 20 63 61  NST_FUNC:.    ca
a840: 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20  se TK_FUNCTION: 
a850: 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  {.      ExprList
a860: 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
a870: 3e 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68  >pList;    /* Th
a880: 65 20 61 72 67 75 6d 65 6e 74 20 6c 69 73 74 20  e argument list 
a890: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  */.      int n =
a8a0: 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e   pList ? pList->
a8b0: 6e 45 78 70 72 20 3a 20 30 3b 20 20 2f 2a 20 4e  nExpr : 0;  /* N
a8c0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
a8d0: 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
a8e0: 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20 30  no_such_func = 0
a8f0: 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ;       /* True 
a900: 69 66 20 6e 6f 20 73 75 63 68 20 66 75 6e 63 74  if no such funct
a910: 69 6f 6e 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ion exists */.  
a920: 20 20 20 20 69 6e 74 20 77 72 6f 6e 67 5f 6e 75      int wrong_nu
a930: 6d 5f 61 72 67 73 20 3d 20 30 3b 20 20 20 20 20  m_args = 0;     
a940: 2f 2a 20 54 72 75 65 20 69 66 20 77 72 6f 6e 67  /* True if wrong
a950: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
a960: 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ents */.      in
a970: 74 20 69 73 5f 61 67 67 20 3d 20 30 3b 20 20 20  t is_agg = 0;   
a980: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
a990: 65 20 69 66 20 69 73 20 61 6e 20 61 67 67 72 65  e if is an aggre
a9a0: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  gate function */
a9b0: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
a9c0: 20 20 20 20 69 6e 74 20 61 75 74 68 3b 20 20 20      int auth;   
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9e0: 2f 2a 20 41 75 74 68 6f 72 69 7a 61 74 69 6f 6e  /* Authorization
a9f0: 20 74 6f 20 75 73 65 20 74 68 65 20 66 75 6e 63   to use the func
aa00: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tion */.      in
aa10: 74 20 6e 49 64 3b 20 20 20 20 20 20 20 20 20 20  t nId;          
aa20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
aa30: 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
aa40: 73 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 6e 61  s in function na
aa50: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73  me */.      cons
aa60: 74 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20  t char *zId;    
aa70: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
aa80: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 2e 20 2a 2f  unction name. */
aa90: 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
aaa0: 70 44 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  pDef;           
aab0: 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
aac0: 6e 20 61 62 6f 75 74 20 74 68 65 20 66 75 6e 63  n about the func
aad0: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tion */.      in
aae0: 74 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72  t enc = ENC(pPar
aaf0: 73 65 2d 3e 64 62 29 3b 20 20 2f 2a 20 54 68 65  se->db);  /* The
ab00: 20 64 61 74 61 62 61 73 65 20 65 6e 63 6f 64 69   database encodi
ab10: 6e 67 20 2a 2f 0a 0a 20 20 20 20 20 20 7a 49 64  ng */..      zId
ab20: 20 3d 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d   = (char*)pExpr-
ab30: 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20  >token.z;.      
ab40: 6e 49 64 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b  nId = pExpr->tok
ab50: 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 70 44 65 66  en.n;.      pDef
ab60: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
ab70: 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64  nction(pParse->d
ab80: 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 2c 20  b, zId, nId, n, 
ab90: 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  enc, 0);.      i
aba0: 66 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20  f( pDef==0 ){.  
abb0: 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c        pDef = sql
abc0: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
abd0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64  (pParse->db, zId
abe0: 2c 20 6e 49 64 2c 20 2d 31 2c 20 65 6e 63 2c 20  , nId, -1, enc, 
abf0: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
ac00: 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pDef==0 ){.     
ac10: 20 20 20 20 20 6e 6f 5f 73 75 63 68 5f 66 75 6e       no_such_fun
ac20: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
ac30: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
ac40: 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d  wrong_num_args =
ac50: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
ac60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ac70: 20 20 20 69 73 5f 61 67 67 20 3d 20 70 44 65 66     is_agg = pDef
ac80: 2d 3e 78 46 75 6e 63 3d 3d 30 3b 0a 20 20 20 20  ->xFunc==0;.    
ac90: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
aca0: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
acb0: 41 54 49 4f 4e 0a 20 20 20 20 20 20 69 66 28 20  ATION.      if( 
acc0: 70 44 65 66 20 29 7b 0a 20 20 20 20 20 20 20 20  pDef ){.        
acd0: 61 75 74 68 20 3d 20 73 71 6c 69 74 65 33 41 75  auth = sqlite3Au
ace0: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
acf0: 53 51 4c 49 54 45 5f 46 55 4e 43 54 49 4f 4e 2c  SQLITE_FUNCTION,
ad00: 20 30 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c   0, pDef->zName,
ad10: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
ad20: 20 61 75 74 68 21 3d 53 51 4c 49 54 45 5f 4f 4b   auth!=SQLITE_OK
ad30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
ad40: 28 20 61 75 74 68 3d 3d 53 51 4c 49 54 45 5f 44  ( auth==SQLITE_D
ad50: 45 4e 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ENY ){.         
ad60: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
ad70: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 74 20  sg(pParse, "not 
ad80: 61 75 74 68 6f 72 69 7a 65 64 20 74 6f 20 75 73  authorized to us
ad90: 65 20 66 75 6e 63 74 69 6f 6e 3a 20 25 73 22 2c  e function: %s",
ada0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
adb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adc0: 20 20 20 20 20 70 44 65 66 2d 3e 7a 4e 61 6d 65       pDef->zName
add0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
ade0: 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  NC->nErr++;.    
adf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ae00: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
ae10: 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20  _NULL;.         
ae20: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
ae30: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e     }.      }.#en
ae40: 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 69 73  dif.      if( is
ae50: 5f 61 67 67 20 26 26 20 21 70 4e 43 2d 3e 61 6c  _agg && !pNC->al
ae60: 6c 6f 77 41 67 67 20 29 7b 0a 20 20 20 20 20 20  lowAgg ){.      
ae70: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
ae80: 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73  g(pParse, "misus
ae90: 65 20 6f 66 20 61 67 67 72 65 67 61 74 65 20 66  e of aggregate f
aea0: 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c  unction %.*s()",
aeb0: 20 6e 49 64 2c 7a 49 64 29 3b 0a 20 20 20 20 20   nId,zId);.     
aec0: 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a     pNC->nErr++;.
aed0: 20 20 20 20 20 20 20 20 69 73 5f 61 67 67 20 3d          is_agg =
aee0: 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   0;.      }else 
aef0: 69 66 28 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63  if( no_such_func
af00: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
af10: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
af20: 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 66 75 6e  se, "no such fun
af30: 63 74 69 6f 6e 3a 20 25 2e 2a 73 22 2c 20 6e 49  ction: %.*s", nI
af40: 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20  d, zId);.       
af50: 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20   pNC->nErr++;.  
af60: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72      }else if( wr
af70: 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 29 7b 0a  ong_num_args ){.
af80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
af90: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22  rrorMsg(pParse,"
afa0: 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20  wrong number of 
afb0: 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e  arguments to fun
afc0: 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 0a 20  ction %.*s()",. 
afd0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 49 64 2c              nId,
afe0: 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20 70   zId);.        p
aff0: 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  NC->nErr++;.    
b000: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73    }.      if( is
b010: 5f 61 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20  _agg ){.        
b020: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41  pExpr->op = TK_A
b030: 47 47 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 20  GG_FUNCTION;.   
b040: 20 20 20 20 20 70 4e 43 2d 3e 68 61 73 41 67 67       pNC->hasAgg
b050: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
b060: 20 20 20 20 69 66 28 20 69 73 5f 61 67 67 20 29      if( is_agg )
b070: 20 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 3d   pNC->allowAgg =
b080: 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   0;.      for(i=
b090: 30 3b 20 70 4e 43 2d 3e 6e 45 72 72 3d 3d 30 20  0; pNC->nErr==0 
b0a0: 26 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  && i<n; i++){.  
b0b0: 20 20 20 20 20 20 77 61 6c 6b 45 78 70 72 54 72        walkExprTr
b0c0: 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  ee(pList->a[i].p
b0d0: 45 78 70 72 2c 20 6e 61 6d 65 52 65 73 6f 6c 76  Expr, nameResolv
b0e0: 65 72 53 74 65 70 2c 20 70 4e 43 29 3b 0a 20 20  erStep, pNC);.  
b0f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
b100: 69 73 5f 61 67 67 20 29 20 70 4e 43 2d 3e 61 6c  is_agg ) pNC->al
b110: 6c 6f 77 41 67 67 20 3d 20 31 3b 0a 20 20 20 20  lowAgg = 1;.    
b120: 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f    /* FIX ME:  Co
b130: 6d 70 75 74 65 20 70 45 78 70 72 2d 3e 61 66 66  mpute pExpr->aff
b140: 69 6e 69 74 79 20 62 61 73 65 64 20 6f 6e 20 74  inity based on t
b150: 68 65 20 65 78 70 65 63 74 65 64 20 72 65 74 75  he expected retu
b160: 72 6e 0a 20 20 20 20 20 20 2a 2a 20 74 79 70 65  rn.      ** type
b170: 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
b180: 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
b190: 20 72 65 74 75 72 6e 20 69 73 5f 61 67 67 3b 0a   return is_agg;.
b1a0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
b1b0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
b1c0: 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  RY.    case TK_S
b1d0: 45 4c 45 43 54 3a 0a 20 20 20 20 63 61 73 65 20  ELECT:.    case 
b1e0: 54 4b 5f 45 58 49 53 54 53 3a 0a 23 65 6e 64 69  TK_EXISTS:.#endi
b1f0: 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  f.    case TK_IN
b200: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  : {.      if( pE
b210: 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  xpr->pSelect ){.
b220: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 52 65 66          int nRef
b230: 20 3d 20 70 4e 43 2d 3e 6e 52 65 66 3b 0a 23 69   = pNC->nRef;.#i
b240: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b250: 54 5f 43 48 45 43 4b 0a 20 20 20 20 20 20 20 20  T_CHECK.        
b260: 69 66 28 20 70 4e 43 2d 3e 69 73 43 68 65 63 6b  if( pNC->isCheck
b270: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
b280: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
b290: 61 72 73 65 2c 22 73 75 62 71 75 65 72 69 65 73  arse,"subqueries
b2a0: 20 70 72 6f 68 69 62 69 74 65 64 20 69 6e 20 43   prohibited in C
b2b0: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73  HECK constraints
b2c0: 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  ");.        }.#e
b2d0: 6e 64 69 66 0a 20 20 20 20 20 20 20 20 73 71 6c  ndif.        sql
b2e0: 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76  ite3SelectResolv
b2f0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
b300: 3e 70 53 65 6c 65 63 74 2c 20 70 4e 43 29 3b 0a  >pSelect, pNC);.
b310: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
b320: 70 4e 43 2d 3e 6e 52 65 66 3e 3d 6e 52 65 66 20  pNC->nRef>=nRef 
b330: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
b340: 52 65 66 21 3d 70 4e 43 2d 3e 6e 52 65 66 20 29  Ref!=pNC->nRef )
b350: 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
b360: 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70  SetProperty(pExp
b370: 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29  r, EP_VarSelect)
b380: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
b390: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
b3a0: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
b3b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
b3c0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52  .    case TK_VAR
b3d0: 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 69  IABLE: {.      i
b3e0: 66 28 20 70 4e 43 2d 3e 69 73 43 68 65 63 6b 20  f( pNC->isCheck 
b3f0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
b400: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
b410: 65 2c 22 70 61 72 61 6d 65 74 65 72 73 20 70 72  e,"parameters pr
b420: 6f 68 69 62 69 74 65 64 20 69 6e 20 43 48 45 43  ohibited in CHEC
b430: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 22 29 3b  K constraints");
b440: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
b450: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
b460: 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  if.  }.  return 
b470: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
b480: 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 61   routine walks a
b490: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
b4a0: 65 20 61 6e 64 20 72 65 73 6f 6c 76 65 73 20 72  e and resolves r
b4b0: 65 66 65 72 65 6e 63 65 73 20 74 6f 0a 2a 2a 20  eferences to.** 
b4c0: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 2e 20 20  table columns.  
b4d0: 4e 6f 64 65 73 20 6f 66 20 74 68 65 20 66 6f 72  Nodes of the for
b4e0: 6d 20 49 44 2e 49 44 20 6f 72 20 49 44 20 72 65  m ID.ID or ID re
b4f0: 73 6f 6c 76 65 20 69 6e 74 6f 20 61 6e 0a 2a 2a  solve into an.**
b500: 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 74 61   index to the ta
b510: 62 6c 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ble in the table
b520: 20 6c 69 73 74 20 61 6e 64 20 61 20 63 6f 6c 75   list and a colu
b530: 6d 6e 20 6f 66 66 73 65 74 2e 20 20 54 68 65 20  mn offset.  The 
b540: 0a 2a 2a 20 45 78 70 72 2e 6f 70 63 6f 64 65 20  .** Expr.opcode 
b550: 66 6f 72 20 73 75 63 68 20 6e 6f 64 65 73 20 69  for such nodes i
b560: 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f  s changed to TK_
b570: 43 4f 4c 55 4d 4e 2e 20 20 54 68 65 20 45 78 70  COLUMN.  The Exp
b580: 72 2e 69 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75  r.iTable.** valu
b590: 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20  e is changed to 
b5a0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
b5b0: 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c   referenced tabl
b5c0: 65 20 69 6e 20 70 54 61 62 4c 69 73 74 0a 2a 2a  e in pTabList.**
b5d0: 20 70 6c 75 73 20 74 68 65 20 22 62 61 73 65 22   plus the "base"
b5e0: 20 76 61 6c 75 65 2e 20 20 54 68 65 20 62 61 73   value.  The bas
b5f0: 65 20 76 61 6c 75 65 20 77 69 6c 6c 20 75 6c 74  e value will ult
b600: 69 6d 61 74 65 6c 79 20 62 65 63 6f 6d 65 20 74  imately become t
b610: 68 65 0a 2a 2a 20 56 44 42 45 20 63 75 72 73 6f  he.** VDBE curso
b620: 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 61 20 63  r number for a c
b630: 75 72 73 6f 72 20 74 68 61 74 20 69 73 20 70 6f  ursor that is po
b640: 69 6e 74 69 6e 67 20 69 6e 74 6f 20 74 68 65 20  inting into the 
b650: 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20 74 61  referenced.** ta
b660: 62 6c 65 2e 20 20 54 68 65 20 45 78 70 72 2e 69  ble.  The Expr.i
b670: 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73 20  Column value is 
b680: 63 68 61 6e 67 65 64 20 74 6f 20 74 68 65 20 69  changed to the i
b690: 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75  ndex of the colu
b6a0: 6d 6e 20 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65  mn .** of the re
b6b0: 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 2e 20  ferenced table. 
b6c0: 20 54 68 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d   The Expr.iColum
b6d0: 6e 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  n value for the 
b6e0: 73 70 65 63 69 61 6c 0a 2a 2a 20 52 4f 57 49 44  special.** ROWID
b6f0: 20 63 6f 6c 75 6d 6e 20 69 73 20 2d 31 2e 20 20   column is -1.  
b700: 41 6e 79 20 49 4e 54 45 47 45 52 20 50 52 49 4d  Any INTEGER PRIM
b710: 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 69  ARY KEY column i
b720: 73 20 74 72 69 65 64 20 61 73 20 61 6e 0a 2a 2a  s tried as an.**
b730: 20 61 6c 69 61 73 20 66 6f 72 20 52 4f 57 49 44   alias for ROWID
b740: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 73  ..**.** Also res
b750: 6f 6c 76 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61  olve function na
b760: 6d 65 73 20 61 6e 64 20 63 68 65 63 6b 20 74 68  mes and check th
b770: 65 20 66 75 6e 63 74 69 6f 6e 73 20 66 6f 72 20  e functions for 
b780: 70 72 6f 70 65 72 0a 2a 2a 20 75 73 61 67 65 2e  proper.** usage.
b790: 20 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20    Make sure all 
b7a0: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 20 61  function names a
b7b0: 72 65 20 72 65 63 6f 67 6e 69 7a 65 64 20 61 6e  re recognized an
b7c0: 64 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 73 0a  d all functions.
b7d0: 2a 2a 20 68 61 76 65 20 74 68 65 20 63 6f 72 72  ** have the corr
b7e0: 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  ect number of ar
b7f0: 67 75 6d 65 6e 74 73 2e 20 20 4c 65 61 76 65 20  guments.  Leave 
b800: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
b810: 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a  .** in pParse->z
b820: 45 72 72 4d 73 67 20 69 66 20 61 6e 79 74 68 69  ErrMsg if anythi
b830: 6e 67 20 69 73 20 61 6d 69 73 73 2e 20 20 52 65  ng is amiss.  Re
b840: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
b850: 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a  of errors..**.**
b860: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
b870: 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61 67 67 72  on contains aggr
b880: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
b890: 74 68 65 6e 20 73 65 74 20 74 68 65 20 45 50 5f  then set the EP_
b8a0: 41 67 67 0a 2a 2a 20 70 72 6f 70 65 72 74 79 20  Agg.** property 
b8b0: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
b8c0: 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
b8d0: 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
b8e0: 73 28 20 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  s( .  NameContex
b8f0: 74 20 2a 70 4e 43 2c 20 20 20 20 20 20 20 2f 2a  t *pNC,       /*
b900: 20 4e 61 6d 65 73 70 61 63 65 20 74 6f 20 72 65   Namespace to re
b910: 73 6f 6c 76 65 20 65 78 70 72 65 73 73 69 6f 6e  solve expression
b920: 73 20 69 6e 2e 20 2a 2f 0a 20 20 45 78 70 72 20  s in. */.  Expr 
b930: 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20  *pExpr          
b940: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
b950: 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e 61 6c 79  sion to be analy
b960: 7a 65 64 2e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  zed. */.){.  int
b970: 20 73 61 76 65 64 48 61 73 41 67 67 3b 0a 20 20   savedHasAgg;.  
b980: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
b990: 65 74 75 72 6e 20 30 3b 0a 23 69 66 20 64 65 66  eturn 0;.#if def
b9a0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
b9b0: 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ) || SQLITE_MAX_
b9c0: 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 69  EXPR_DEPTH>0.  i
b9d0: 66 28 20 28 70 45 78 70 72 2d 3e 6e 48 65 69 67  f( (pExpr->nHeig
b9e0: 68 74 2b 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e  ht+pNC->pParse->
b9f0: 6e 48 65 69 67 68 74 29 3e 53 51 4c 49 54 45 5f  nHeight)>SQLITE_
ba00: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 20 29  MAX_EXPR_DEPTH )
ba10: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
ba20: 6f 72 4d 73 67 28 70 4e 43 2d 3e 70 50 61 72 73  orMsg(pNC->pPars
ba30: 65 2c 20 0a 20 20 20 20 20 20 20 22 45 78 70 72  e, .       "Expr
ba40: 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73 20 74  ession tree is t
ba50: 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78 69 6d 75  oo large (maximu
ba60: 6d 20 64 65 70 74 68 20 25 64 29 22 2c 0a 20 20  m depth %d)",.  
ba70: 20 20 20 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f       SQLITE_MAX_
ba80: 45 58 50 52 5f 44 45 50 54 48 0a 20 20 20 20 29  EXPR_DEPTH.    )
ba90: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
baa0: 20 20 7d 0a 20 20 70 4e 43 2d 3e 70 50 61 72 73    }.  pNC->pPars
bab0: 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 70 45  e->nHeight += pE
bac0: 78 70 72 2d 3e 6e 48 65 69 67 68 74 3b 0a 23 65  xpr->nHeight;.#e
bad0: 6e 64 69 66 0a 20 20 73 61 76 65 64 48 61 73 41  ndif.  savedHasA
bae0: 67 67 20 3d 20 70 4e 43 2d 3e 68 61 73 41 67 67  gg = pNC->hasAgg
baf0: 3b 0a 20 20 70 4e 43 2d 3e 68 61 73 41 67 67 20  ;.  pNC->hasAgg 
bb00: 3d 20 30 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54  = 0;.  walkExprT
bb10: 72 65 65 28 70 45 78 70 72 2c 20 6e 61 6d 65 52  ree(pExpr, nameR
bb20: 65 73 6f 6c 76 65 72 53 74 65 70 2c 20 70 4e 43  esolverStep, pNC
bb30: 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  );.#if defined(S
bb40: 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 53  QLITE_TEST) || S
bb50: 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
bb60: 45 50 54 48 3e 30 0a 20 20 70 4e 43 2d 3e 70 50  EPTH>0.  pNC->pP
bb70: 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d  arse->nHeight -=
bb80: 20 70 45 78 70 72 2d 3e 6e 48 65 69 67 68 74 3b   pExpr->nHeight;
bb90: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 4e  .#endif.  if( pN
bba0: 43 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20  C->nErr>0 ){.   
bbb0: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
bbc0: 28 70 45 78 70 72 2c 20 45 50 5f 45 72 72 6f 72  (pExpr, EP_Error
bbd0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 43  );.  }.  if( pNC
bbe0: 2d 3e 68 61 73 41 67 67 20 29 7b 0a 20 20 20 20  ->hasAgg ){.    
bbf0: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
bc00: 70 45 78 70 72 2c 20 45 50 5f 41 67 67 29 3b 0a  pExpr, EP_Agg);.
bc10: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 61 76 65    }else if( save
bc20: 64 48 61 73 41 67 67 20 29 7b 0a 20 20 20 20 70  dHasAgg ){.    p
bc30: 4e 43 2d 3e 68 61 73 41 67 67 20 3d 20 31 3b 0a  NC->hasAgg = 1;.
bc40: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 45 78 70    }.  return Exp
bc50: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
bc60: 70 72 2c 20 45 50 5f 45 72 72 6f 72 29 3b 0a 7d  pr, EP_Error);.}
bc70: 0a 0a 2f 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65  ../*.** A pointe
bc80: 72 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  r instance of th
bc90: 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20  is structure is 
bca0: 75 73 65 64 20 74 6f 20 70 61 73 73 20 69 6e 66  used to pass inf
bcb0: 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 68 72 6f  ormation.** thro
bcc0: 75 67 68 20 77 61 6c 6b 45 78 70 72 54 72 65 65  ugh walkExprTree
bcd0: 20 69 6e 74 6f 20 63 6f 64 65 53 75 62 71 75 65   into codeSubque
bce0: 72 79 53 74 65 70 28 29 2e 0a 2a 2f 0a 74 79 70  ryStep()..*/.typ
bcf0: 65 64 65 66 20 73 74 72 75 63 74 20 51 75 65 72  edef struct Quer
bd00: 79 43 6f 64 65 72 20 51 75 65 72 79 43 6f 64 65  yCoder QueryCode
bd10: 72 3b 0a 73 74 72 75 63 74 20 51 75 65 72 79 43  r;.struct QueryC
bd20: 6f 64 65 72 20 7b 0a 20 20 50 61 72 73 65 20 2a  oder {.  Parse *
bd30: 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 2f 2a  pParse;       /*
bd40: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
bd50: 74 65 78 74 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f  text */.  NameCo
bd60: 6e 74 65 78 74 20 2a 70 4e 43 3b 20 20 20 20 2f  ntext *pNC;    /
bd70: 2a 20 4e 61 6d 65 73 70 61 63 65 20 6f 66 20 66  * Namespace of f
bd80: 69 72 73 74 20 65 6e 63 6c 6f 73 69 6e 67 20 71  irst enclosing q
bd90: 75 65 72 79 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 64  uery */.};..#ifd
bda0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
bdb0: 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 6e 61   int sqlite3_ena
bdc0: 62 6c 65 5f 69 6e 5f 6f 70 74 20 3d 20 31 3b 0a  ble_in_opt = 1;.
bdd0: 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20  #else.  #define 
bde0: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 69  sqlite3_enable_i
bdf0: 6e 5f 6f 70 74 20 31 0a 23 65 6e 64 69 66 0a 0a  n_opt 1.#endif..
be00: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
be10: 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20 74  ion is used by t
be20: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
be30: 6e 20 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e  n of the IN (...
be40: 29 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 49  ) operator..** I
be50: 74 27 73 20 6a 6f 62 20 69 73 20 74 6f 20 66 69  t's job is to fi
be60: 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61 20 62  nd or create a b
be70: 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  -tree structure 
be80: 74 68 61 74 20 6d 61 79 20 62 65 20 75 73 65 64  that may be used
be90: 0a 2a 2a 20 65 69 74 68 65 72 20 74 6f 20 74 65  .** either to te
bea0: 73 74 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69  st for membershi
beb0: 70 20 6f 66 20 74 68 65 20 28 2e 2e 2e 29 20 73  p of the (...) s
bec0: 65 74 20 6f 72 20 74 6f 20 69 74 65 72 61 74 65  et or to iterate
bed0: 20 74 68 72 6f 75 67 68 0a 2a 2a 20 69 74 73 20   through.** its 
bee0: 6d 65 6d 62 65 72 73 2c 20 73 6b 69 70 70 69 6e  members, skippin
bef0: 67 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a  g duplicates..**
bf00: 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f  .** The cursor o
bf10: 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 73 74 72  pened on the str
bf20: 75 63 74 75 72 65 20 28 64 61 74 61 62 61 73 65  ucture (database
bf30: 20 74 61 62 6c 65 2c 20 64 61 74 61 62 61 73 65   table, database
bf40: 20 69 6e 64 65 78 20 0a 2a 2a 20 6f 72 20 65 70   index .** or ep
bf50: 68 65 72 6d 61 6c 20 74 61 62 6c 65 29 20 69 73  hermal table) is
bf60: 20 73 74 6f 72 65 64 20 69 6e 20 70 58 2d 3e 69   stored in pX->i
bf70: 54 61 62 6c 65 20 62 65 66 6f 72 65 20 74 68 69  Table before thi
bf80: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
bf90: 6e 73 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  ns..** The retur
bfa0: 6e 65 64 20 76 61 6c 75 65 20 69 6e 64 69 63 61  ned value indica
bfb0: 74 65 73 20 74 68 65 20 73 74 72 75 63 74 75 72  tes the structur
bfc0: 65 20 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c 6f  e type, as follo
bfd0: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49  ws:.**.**   IN_I
bfe0: 4e 44 45 58 5f 52 4f 57 49 44 20 2d 20 54 68 65  NDEX_ROWID - The
bff0: 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e   cursor was open
c000: 65 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  ed on a database
c010: 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f   table..**   IN_
c020: 49 4e 44 45 58 5f 49 4e 44 45 58 20 2d 20 54 68  INDEX_INDEX - Th
c030: 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
c040: 6e 65 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73  ned on a databas
c050: 65 20 69 6e 64 65 63 2e 0a 2a 2a 20 20 20 49 4e  e indec..**   IN
c060: 5f 49 4e 44 45 58 5f 45 50 48 20 2d 20 20 20 54  _INDEX_EPH -   T
c070: 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
c080: 65 6e 65 64 20 6f 6e 20 61 20 73 70 65 63 69 61  ened on a specia
c090: 6c 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64 0a  lly created and.
c0a0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
c0b0: 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20        populated 
c0c0: 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e  epheremal table.
c0d0: 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69  .**.** An existi
c0e0: 6e 67 20 73 74 72 75 63 74 75 72 65 20 6d 61 79  ng structure may
c0f0: 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 69 66   only be used if
c100: 20 74 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f   the SELECT is o
c110: 66 20 74 68 65 20 73 69 6d 70 6c 65 0a 2a 2a 20  f the simple.** 
c120: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  form:.**.**     
c130: 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20  SELECT <column> 
c140: 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a  FROM <table>.**.
c150: 2a 2a 20 49 66 20 74 68 65 20 6d 75 73 74 42 65  ** If the mustBe
c160: 55 6e 69 71 75 65 20 70 61 72 61 6d 65 74 65 72  Unique parameter
c170: 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 20 73   is false, the s
c180: 74 72 75 63 74 75 72 65 20 77 69 6c 6c 20 62 65  tructure will be
c190: 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61   used .** for fa
c1a0: 73 74 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69  st set membershi
c1b0: 70 20 74 65 73 74 73 2e 20 49 6e 20 74 68 69 73  p tests. In this
c1c0: 20 63 61 73 65 20 61 6e 20 65 70 68 65 72 65 6d   case an epherem
c1d0: 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a  al table must .*
c1e0: 2a 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73  * be used unless
c1f0: 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 61 6e 20   <column> is an 
c200: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
c210: 4b 45 59 20 6f 72 20 61 6e 20 69 6e 64 65 78 20  KEY or an index 
c220: 63 61 6e 20 0a 2a 2a 20 62 65 20 66 6f 75 6e 64  can .** be found
c230: 20 77 69 74 68 20 3c 63 6f 6c 75 6d 6e 3e 20 61   with <column> a
c240: 73 20 69 74 73 20 6c 65 66 74 2d 6d 6f 73 74 20  s its left-most 
c250: 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  column..**.** If
c260: 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20 69 73   mustBeUnique is
c270: 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
c280: 73 74 72 75 63 74 75 72 65 20 77 69 6c 6c 20 62  structure will b
c290: 65 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74  e used to iterat
c2a0: 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74 68 65  e.** through the
c2b0: 20 73 65 74 20 6d 65 6d 62 65 72 73 2c 20 73 6b   set members, sk
c2c0: 69 70 70 69 6e 67 20 61 6e 79 20 64 75 70 6c 69  ipping any dupli
c2d0: 63 61 74 65 73 2e 20 49 6e 20 74 68 69 73 20 63  cates. In this c
c2e0: 61 73 65 20 61 6e 0a 2a 2a 20 65 70 68 65 72 65  ase an.** ephere
c2f0: 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 62  mal table must b
c300: 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20 74 68  e used unless th
c310: 65 20 73 65 6c 65 63 74 65 64 20 3c 63 6f 6c 75  e selected <colu
c320: 6d 6e 3e 20 69 73 20 67 75 61 72 61 6e 74 65 65  mn> is guarantee
c330: 64 0a 2a 2a 20 74 6f 20 62 65 20 75 6e 69 71 75  d.** to be uniqu
c340: 65 20 2d 20 65 69 74 68 65 72 20 62 65 63 61 75  e - either becau
c350: 73 65 20 69 74 20 69 73 20 61 6e 20 49 4e 54 45  se it is an INTE
c360: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
c370: 6f 72 20 69 74 0a 2a 2a 20 69 73 20 75 6e 69 71  or it.** is uniq
c380: 75 65 20 62 79 20 76 69 72 74 75 65 20 6f 66 20  ue by virtue of 
c390: 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20  a constraint or 
c3a0: 69 6d 70 6c 69 63 69 74 20 69 6e 64 65 78 2e 0a  implicit index..
c3b0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
c3c0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
c3d0: 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 49  int sqlite3FindI
c3e0: 6e 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  nIndex(Parse *pP
c3f0: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 58 2c 20  arse, Expr *pX, 
c400: 69 6e 74 20 6d 75 73 74 42 65 55 6e 69 71 75 65  int mustBeUnique
c410: 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 0a  ){.  Select *p;.
c420: 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 30 3b    int eType = 0;
c430: 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50  .  int iTab = pP
c440: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 0a 20  arse->nTab++;.. 
c450: 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 77 69 6e 67   /* The follwing
c460: 20 69 66 28 2e 2e 2e 29 20 65 78 70 72 65 73 73   if(...) express
c470: 69 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20 74  ion is true if t
c480: 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66 20  he SELECT is of 
c490: 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65  the .  ** simple
c4a0: 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   form:.  **.  **
c4b0: 20 20 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c       SELECT <col
c4c0: 75 6d 6e 3e 20 46 52 4f 4d 20 3c 74 61 62 6c 65  umn> FROM <table
c4d0: 3e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  >.  **.  ** If t
c4e0: 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
c4f0: 20 69 74 20 6d 61 79 20 62 65 20 70 6f 73 73 69   it may be possi
c500: 62 6c 65 20 74 6f 20 75 73 65 20 61 6e 20 65 78  ble to use an ex
c510: 69 73 74 69 6e 67 20 74 61 62 6c 65 0a 20 20 2a  isting table.  *
c520: 2a 20 6f 72 20 69 6e 64 65 78 20 69 6e 73 74 65  * or index inste
c530: 61 64 20 6f 66 20 67 65 6e 65 72 61 74 69 6e 67  ad of generating
c540: 20 61 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61   an epheremal ta
c550: 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
c560: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 69  sqlite3_enable_i
c570: 6e 5f 6f 70 74 0a 20 20 20 26 26 20 28 70 3d 70  n_opt.   && (p=p
c580: 58 2d 3e 70 53 65 6c 65 63 74 29 20 26 26 20 21  X->pSelect) && !
c590: 70 2d 3e 70 50 72 69 6f 72 0a 20 20 20 26 26 20  p->pPrior.   && 
c5a0: 21 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 26  !p->isDistinct &
c5b0: 26 20 21 70 2d 3e 69 73 41 67 67 20 26 26 20 21  & !p->isAgg && !
c5c0: 70 2d 3e 70 47 72 6f 75 70 42 79 0a 20 20 20 26  p->pGroupBy.   &
c5d0: 26 20 70 2d 3e 70 53 72 63 20 26 26 20 70 2d 3e  & p->pSrc && p->
c5e0: 70 53 72 63 2d 3e 6e 53 72 63 3d 3d 31 20 26 26  pSrc->nSrc==1 &&
c5f0: 20 21 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e   !p->pSrc->a[0].
c600: 70 53 65 6c 65 63 74 0a 20 20 20 26 26 20 21 70  pSelect.   && !p
c610: 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  ->pSrc->a[0].pTa
c620: 62 2d 3e 70 53 65 6c 65 63 74 20 20 20 20 20 20  b->pSelect      
c630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c640: 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20              .   
c650: 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  && p->pEList->nE
c660: 78 70 72 3d 3d 31 20 26 26 20 70 2d 3e 70 45 4c  xpr==1 && p->pEL
c670: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  ist->a[0].pExpr-
c680: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20  >op==TK_COLUMN. 
c690: 20 20 26 26 20 21 70 2d 3e 70 4c 69 6d 69 74 20    && !p->pLimit 
c6a0: 26 26 20 21 70 2d 3e 70 4f 66 66 73 65 74 20 26  && !p->pOffset &
c6b0: 26 20 21 70 2d 3e 70 57 68 65 72 65 0a 20 20 29  & !p->pWhere.  )
c6c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
c6d0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
c6e0: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
c6f0: 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
c700: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b   = p->pEList->a[
c710: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 6e  0].pExpr;.    in
c720: 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e  t iCol = pExpr->
c730: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 56 64 62  iColumn;.    Vdb
c740: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
c750: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 0a  tVdbe(pParse);..
c760: 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63      /* This func
c770: 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tion is only cal
c780: 6c 65 64 20 66 72 6f 6d 20 74 77 6f 20 70 6c 61  led from two pla
c790: 63 65 73 2e 20 49 6e 20 62 6f 74 68 20 63 61 73  ces. In both cas
c7a0: 65 73 20 74 68 65 20 76 64 62 65 0a 20 20 20 20  es the vdbe.    
c7b0: 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ** has already b
c7c0: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 20 53  een allocated. S
c7d0: 6f 20 61 73 73 75 6d 65 20 73 71 6c 69 74 65 33  o assume sqlite3
c7e0: 47 65 74 56 64 62 65 28 29 20 69 73 20 61 6c 77  GetVdbe() is alw
c7f0: 61 79 73 0a 20 20 20 20 2a 2a 20 73 75 63 63 65  ays.    ** succe
c800: 73 73 66 75 6c 20 68 65 72 65 2e 0a 20 20 20 20  ssful here..    
c810: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 76 29  */.    assert(v)
c820: 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30  ;.    if( iCol<0
c830: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4d   ){.      int iM
c840: 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
c850: 4d 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Mem;.      int i
c860: 41 64 64 72 3b 0a 20 20 20 20 20 20 54 61 62 6c  Addr;.      Tabl
c870: 65 20 2a 70 54 61 62 20 3d 20 70 2d 3e 70 53 72  e *pTab = p->pSr
c880: 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20  c->a[0].pTab;.  
c890: 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
c8a0: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
c8b0: 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
c8c0: 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c  hema);.      sql
c8d0: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
c8e0: 65 28 76 2c 20 69 44 62 29 3b 0a 0a 20 20 20 20  e(v, iDb);..    
c8f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c900: 4f 70 31 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c  Op1(v, OP_SCopy,
c910: 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 69 41   iMem);.      iA
c920: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
c930: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
c940: 2c 20 30 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20  , 0, iMem);.    
c950: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c960: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
c970: 72 2c 20 31 2c 20 69 4d 65 6d 29 3b 0a 0a 20 20  r, 1, iMem);..  
c980: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
c990: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61  able(pParse, iTa
c9a0: 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50  b, iDb, pTab, OP
c9b0: 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20  _OpenRead);.    
c9c0: 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44    eType = IN_IND
c9d0: 45 58 5f 52 4f 57 49 44 3b 0a 0a 20 20 20 20 20  EX_ROWID;..     
c9e0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
c9f0: 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a  Here(v, iAddr);.
ca00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ca10: 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f   /* The collatio
ca20: 6e 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20  n sequence used 
ca30: 62 79 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  by the compariso
ca40: 6e 2e 20 49 66 20 61 6e 20 69 6e 64 65 78 20 69  n. If an index i
ca50: 73 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 62  s to .      ** b
ca60: 65 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20  e used in place 
ca70: 6f 66 20 61 20 74 65 6d 70 2d 74 61 62 6c 65 2c  of a temp-table,
ca80: 20 69 74 20 6d 75 73 74 20 62 65 20 6f 72 64 65   it must be orde
ca90: 72 65 64 20 61 63 63 6f 72 64 69 6e 67 0a 20 20  red according.  
caa0: 20 20 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 63      ** to this c
cab0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
cac0: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
cad0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 71 20    CollSeq *pReq 
cae0: 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
caf0: 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
cb00: 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c  arse, pX->pLeft,
cb10: 20 70 45 78 70 72 29 3b 0a 0a 20 20 20 20 20 20   pExpr);..      
cb20: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
cb30: 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20  e affinity that 
cb40: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
cb50: 70 65 72 66 6f 72 6d 20 74 68 65 20 0a 20 20 20  perform the .   
cb60: 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e     ** comparison
cb70: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
cb80: 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20  the affinity of 
cb90: 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 49 66 0a 20  the column. If. 
cba0: 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 6e 6f       ** it is no
cbb0: 74 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  t, it is not pos
cbc0: 73 69 62 6c 65 20 74 6f 20 75 73 65 20 61 6e 79  sible to use any
cbd0: 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 2a 2f   index..      */
cbe0: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
cbf0: 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  ab = p->pSrc->a[
cc00: 30 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 63  0].pTab;.      c
cc10: 68 61 72 20 61 66 66 20 3d 20 63 6f 6d 70 61 72  har aff = compar
cc20: 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 58 29  isonAffinity(pX)
cc30: 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66 69  ;.      int affi
cc40: 6e 69 74 79 5f 6f 6b 20 3d 20 28 70 54 61 62 2d  nity_ok = (pTab-
cc50: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69  >aCol[iCol].affi
cc60: 6e 69 74 79 3d 3d 61 66 66 7c 7c 61 66 66 3d 3d  nity==aff||aff==
cc70: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29  SQLITE_AFF_NONE)
cc80: 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64  ;..      for(pId
cc90: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
cca0: 70 49 64 78 20 26 26 20 65 54 79 70 65 3d 3d 30  pIdx && eType==0
ccb0: 20 26 26 20 61 66 66 69 6e 69 74 79 5f 6f 6b 3b   && affinity_ok;
ccc0: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
ccd0: 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t){.        if( 
cce0: 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  (pIdx->aiColumn[
ccf0: 30 5d 3d 3d 69 43 6f 6c 29 0a 20 20 20 20 20 20  0]==iCol).      
cd00: 20 20 20 26 26 20 28 70 52 65 71 3d 3d 73 71 6c     && (pReq==sql
cd10: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
cd20: 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 70 49 64  db, ENC(db), pId
cd30: 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 2c 20 2d 31  x->azColl[0], -1
cd40: 2c 20 30 29 29 0a 20 20 20 20 20 20 20 20 20 26  , 0)).         &
cd50: 26 20 28 21 6d 75 73 74 42 65 55 6e 69 71 75 65  & (!mustBeUnique
cd60: 20 7c 7c 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75   || (pIdx->nColu
cd70: 6d 6e 3d 3d 31 20 26 26 20 70 49 64 78 2d 3e 6f  mn==1 && pIdx->o
cd80: 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 29  nError!=OE_None)
cd90: 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
cda0: 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a         int iDb;.
cdb0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 4d            int iM
cdc0: 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
cdd0: 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Mem;.          i
cde0: 6e 74 20 69 41 64 64 72 3b 0a 20 20 20 20 20 20  nt iAddr;.      
cdf0: 20 20 20 20 63 68 61 72 20 2a 70 4b 65 79 3b 0a      char *pKey;.
ce00: 20 20 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65    .          pKe
ce10: 79 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  y = (char *)sqli
ce20: 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28  te3IndexKeyinfo(
ce30: 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20  pParse, pIdx);. 
ce40: 20 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 73           iDb = s
ce50: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
ce60: 64 65 78 28 64 62 2c 20 70 49 64 78 2d 3e 70 53  dex(db, pIdx->pS
ce70: 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20  chema);.        
ce80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65    sqlite3VdbeUse
ce90: 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a  sBtree(v, iDb);.
cea0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
ceb0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
cec0: 4f 50 5f 53 43 6f 70 79 2c 20 69 4d 65 6d 29 3b  OP_SCopy, iMem);
ced0: 0a 20 20 20 20 20 20 20 20 20 20 69 41 64 64 72  .          iAddr
cee0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
cef0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 30  dOp2(v, OP_If, 0
cf00: 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20  , iMem);.       
cf10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cf20: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
cf30: 65 72 2c 20 31 2c 20 69 4d 65 6d 29 3b 0a 20 20  er, 1, iMem);.  
cf40: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
cf50: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
cf60: 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54 61  OP_OpenRead, iTa
cf70: 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69  b, pIdx->tnum, i
cf80: 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Db,.            
cf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfa0: 20 20 20 70 4b 65 79 2c 50 34 5f 4b 45 59 49 4e     pKey,P4_KEYIN
cfb0: 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20  FO_HANDOFF);.   
cfc0: 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
cfd0: 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 64  nt((v, "%s", pId
cfe0: 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  x->zName));.    
cff0: 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e        eType = IN
d000: 5f 49 4e 44 45 58 5f 49 4e 44 45 58 3b 0a 20 20  _INDEX_INDEX;.  
d010: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d020: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
d030: 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69  SetNumColumns, i
d040: 54 61 62 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  Tab, pIdx->nColu
d050: 6d 6e 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  mn);..          
d060: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
d070: 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20  ere(v, iAddr);. 
d080: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
d090: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
d0a0: 28 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20  ( eType==0 ){.  
d0b0: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62    sqlite3CodeSub
d0c0: 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
d0d0: 58 29 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20  X);.    eType = 
d0e0: 49 4e 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20  IN_INDEX_EPH;.  
d0f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 58 2d 3e 69  }else{.    pX->i
d100: 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20  Table = iTab;.  
d110: 7d 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70 65  }.  return eType
d120: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
d130: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
d140: 66 6f 72 20 73 63 61 6c 61 72 20 73 75 62 71 75  for scalar subqu
d150: 65 72 69 65 73 20 75 73 65 64 20 61 73 20 61 6e  eries used as an
d160: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61   expression.** a
d170: 6e 64 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e  nd IN operators.
d180: 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a    Examples:.**.*
d190: 2a 20 20 20 20 20 28 53 45 4c 45 43 54 20 61 20  *     (SELECT a 
d1a0: 46 52 4f 4d 20 62 29 20 20 20 20 20 20 20 20 20  FROM b)         
d1b0: 20 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a 20   -- subquery.** 
d1c0: 20 20 20 20 45 58 49 53 54 53 20 28 53 45 4c 45      EXISTS (SELE
d1d0: 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 2d  CT a FROM b)   -
d1e0: 2d 20 45 58 49 53 54 53 20 73 75 62 71 75 65 72  - EXISTS subquer
d1f0: 79 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 34  y.**     x IN (4
d200: 2c 35 2c 31 31 29 20 20 20 20 20 20 20 20 20 20  ,5,11)          
d210: 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74      -- IN operat
d220: 6f 72 20 77 69 74 68 20 6c 69 73 74 20 6f 6e 20  or with list on 
d230: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 0a  right-hand side.
d240: 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c  **     x IN (SEL
d250: 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20  ECT a FROM b)   
d260: 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72    -- IN operator
d270: 20 77 69 74 68 20 73 75 62 71 75 65 72 79 20 6f   with subquery o
d280: 6e 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a  n the right.**.*
d290: 2a 20 54 68 65 20 70 45 78 70 72 20 70 61 72 61  * The pExpr para
d2a0: 6d 65 74 65 72 20 64 65 73 63 72 69 62 65 73 20  meter describes 
d2b0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
d2c0: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
d2d0: 20 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20   IN.** operator 
d2e0: 6f 72 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a  or subquery..*/.
d2f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d300: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 76 6f 69  MIT_SUBQUERY.voi
d310: 64 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62  d sqlite3CodeSub
d320: 73 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50  select(Parse *pP
d330: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
d340: 72 29 7b 0a 20 20 69 6e 74 20 74 65 73 74 41 64  r){.  int testAd
d350: 64 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  dr = 0;         
d360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d370: 20 4f 6e 65 2d 74 69 6d 65 20 74 65 73 74 20 61   One-time test a
d380: 64 64 72 65 73 73 20 2a 2f 0a 20 20 56 64 62 65  ddress */.  Vdbe
d390: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
d3a0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
d3b0: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
d3c0: 6e 3b 0a 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63  n;...  /* This c
d3d0: 6f 64 65 20 6d 75 73 74 20 62 65 20 72 75 6e 20  ode must be run 
d3e0: 69 6e 20 69 74 73 20 65 6e 74 69 72 65 74 79 20  in its entirety 
d3f0: 65 76 65 72 79 20 74 69 6d 65 20 69 74 20 69 73  every time it is
d400: 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a   encountered.  *
d410: 2a 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20  * if any of the 
d420: 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75  following is tru
d430: 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  e:.  **.  **    
d440: 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e  *  The right-han
d450: 64 20 73 69 64 65 20 69 73 20 61 20 63 6f 72 72  d side is a corr
d460: 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 0a  elated subquery.
d470: 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72    **    *  The r
d480: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69  ight-hand side i
d490: 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  s an expression 
d4a0: 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  list containing 
d4b0: 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20  variables.  **  
d4c0: 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69    *  We are insi
d4d0: 64 65 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a  de a trigger.  *
d4e0: 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66  *.  ** If all of
d4f0: 20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 66   the above are f
d500: 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61  alse, then we ca
d510: 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20  n run this code 
d520: 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73  just once.  ** s
d530: 61 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c  ave the results,
d540: 20 61 6e 64 20 72 65 75 73 65 20 74 68 65 20 73   and reuse the s
d550: 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75  ame result on su
d560: 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74  bsequent invocat
d570: 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
d580: 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70   !ExprHasAnyProp
d590: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56  erty(pExpr, EP_V
d5a0: 61 72 53 65 6c 65 63 74 29 20 26 26 20 21 70 50  arSelect) && !pP
d5b0: 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20  arse->trigStack 
d5c0: 29 7b 0a 20 20 20 20 69 6e 74 20 6d 65 6d 20 3d  ){.    int mem =
d5d0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
d5e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
d5f0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53 43 6f  AddOp1(v, OP_SCo
d600: 70 79 2c 20 6d 65 6d 29 3b 0a 20 20 20 20 74 65  py, mem);.    te
d610: 73 74 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33  stAddr = sqlite3
d620: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
d630: 5f 49 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74  _If);.    assert
d640: 28 20 74 65 73 74 41 64 64 72 3e 30 20 7c 7c 20  ( testAddr>0 || 
d650: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
d660: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
d670: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d680: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
d690: 20 31 2c 20 6d 65 6d 29 3b 0a 20 20 7d 0a 0a 20   1, mem);.  }.. 
d6a0: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
d6b0: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
d6c0: 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 63 68  K_IN: {.      ch
d6d0: 61 72 20 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  ar affinity;.   
d6e0: 20 20 20 4b 65 79 49 6e 66 6f 20 6b 65 79 49 6e     KeyInfo keyIn
d6f0: 66 6f 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  fo;.      int ad
d700: 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 64  dr;        /* Ad
d710: 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e  dress of OP_Open
d720: 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75  Ephemeral instru
d730: 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 20 20  ction */..      
d740: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
d750: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
d760: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 0a 20  Expr->pLeft);.. 
d770: 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20       /* Whether 
d780: 74 68 69 73 20 69 73 20 61 6e 20 27 78 20 49 4e  this is an 'x IN
d790: 28 53 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20  (SELECT...)' or 
d7a0: 61 6e 20 27 78 20 49 4e 28 3c 65 78 70 72 6c 69  an 'x IN(<exprli
d7b0: 73 74 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20 65  st>)'.      ** e
d7c0: 78 70 72 65 73 73 69 6f 6e 20 69 74 20 69 73 20  xpression it is 
d7d0: 68 61 6e 64 6c 65 64 20 74 68 65 20 73 61 6d 65  handled the same
d7e0: 20 77 61 79 2e 20 41 20 76 69 72 74 75 61 6c 20   way. A virtual 
d7f0: 74 61 62 6c 65 20 69 73 20 0a 20 20 20 20 20 20  table is .      
d800: 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20 73  ** filled with s
d810: 69 6e 67 6c 65 2d 66 69 65 6c 64 20 69 6e 64 65  ingle-field inde
d820: 78 20 6b 65 79 73 20 72 65 70 72 65 73 65 6e 74  x keys represent
d830: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ing the results.
d840: 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68        ** from th
d850: 65 20 53 45 4c 45 43 54 20 6f 72 20 74 68 65 20  e SELECT or the 
d860: 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20  <exprlist>..    
d870: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
d880: 20 74 68 65 20 27 78 27 20 65 78 70 72 65 73 73   the 'x' express
d890: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  ion is a column 
d8a0: 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20 53 45  value, or the SE
d8b0: 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  LECT....      **
d8c0: 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72   statement retur
d8d0: 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  ns a column valu
d8e0: 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69  e, then the affi
d8f0: 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 20 20 20  nity of that.   
d900: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20     ** column is 
d910: 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68  used to build th
d920: 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66  e index keys. If
d930: 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68   both 'x' and th
d940: 65 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43  e.      ** SELEC
d950: 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61  T... statement a
d960: 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  re columns, then
d970: 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
d980: 79 20 69 73 20 75 73 65 64 0a 20 20 20 20 20 20  y is used.      
d990: 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63 6f 6c  ** if either col
d9a0: 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49 43 20  umn has NUMERIC 
d9b0: 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e  or INTEGER affin
d9c0: 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65 72 0a  ity. If neither.
d9d0: 20 20 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72        ** 'x' nor
d9e0: 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73   the SELECT... s
d9f0: 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c  tatement are col
da00: 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72  umns, then numer
da10: 69 63 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20  ic affinity.    
da20: 20 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20 20    ** is used..  
da30: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78      */.      pEx
da40: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61  pr->iTable = pPa
da50: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
da60: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
da70: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
da80: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
da90: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b   pExpr->iTable);
daa0: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6b  .      memset(&k
dab0: 65 79 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  eyInfo, 0, sizeo
dac0: 66 28 6b 65 79 49 6e 66 6f 29 29 3b 0a 20 20 20  f(keyInfo));.   
dad0: 20 20 20 6b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c     keyInfo.nFiel
dae0: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  d = 1;.      sql
daf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
db00: 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d  , OP_SetNumColum
db10: 6e 73 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  ns, pExpr->iTabl
db20: 65 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 69 66  e, 1);..      if
db30: 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  ( pExpr->pSelect
db40: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
db50: 61 73 65 20 31 3a 20 20 20 20 20 65 78 70 72 20  ase 1:     expr 
db60: 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a  IN (SELECT ...).
db70: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
db80: 20 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63     ** Generate c
db90: 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ode to write the
dba0: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
dbb0: 73 65 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20  select into the 
dbc0: 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20  temporary.      
dbd0: 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63    ** table alloc
dbe0: 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20  ated and opened 
dbf0: 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a  above..        *
dc00: 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74  /.        Select
dc10: 44 65 73 74 20 64 65 73 74 20 3d 20 7b 53 52 54  Dest dest = {SRT
dc20: 5f 53 65 74 2c 20 30 2c 20 30 7d 3b 0a 20 20 20  _Set, 0, 0};.   
dc30: 20 20 20 20 20 64 65 73 74 2e 69 50 61 72 6d 20       dest.iParm 
dc40: 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  = pExpr->iTable;
dc50: 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 61 66  .        dest.af
dc60: 66 69 6e 69 74 79 20 3d 20 28 69 6e 74 29 61 66  finity = (int)af
dc70: 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20  finity;.        
dc80: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
dc90: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
dca0: 28 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  ( (pExpr->iTable
dcb0: 26 30 78 30 30 30 30 46 46 46 46 29 3d 3d 70 45  &0x0000FFFF)==pE
dcc0: 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20  xpr->iTable );. 
dcd0: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
dce0: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
dcf0: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c   pExpr->pSelect,
dd00: 20 26 64 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c   &dest, 0, 0, 0,
dd10: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   0) ){.         
dd20: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
dd30: 20 7d 0a 20 20 20 20 20 20 20 20 70 45 4c 69 73   }.        pELis
dd40: 74 20 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  t = pExpr->pSele
dd50: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20  ct->pEList;.    
dd60: 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 20 26      if( pEList &
dd70: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  & pEList->nExpr>
dd80: 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20  0 ){ .          
dd90: 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d  keyInfo.aColl[0]
dda0: 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
ddb0: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
ddc0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
ddd0: 65 66 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eft,.           
dde0: 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e     pEList->a[0].
ddf0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
de00: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
de10: 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 29  ( pExpr->pList )
de20: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73  {.        /* Cas
de30: 65 20 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e  e 2:     expr IN
de40: 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20   (exprlist).    
de50: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
de60: 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70 72 65  * For each expre
de70: 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20  ssion, build an 
de80: 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74  index key from t
de90: 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e  he evaluation an
dea0: 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f  d.        ** sto
deb0: 72 65 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d  re it in the tem
dec0: 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66  porary table. If
ded0: 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c   <expr> is a col
dee0: 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20  umn, then use.  
def0: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f        ** that co
df00: 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 77  lumns affinity w
df10: 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e 64  hen building ind
df20: 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78 70  ex keys. If <exp
df30: 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20  r> is not.      
df40: 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75    ** a column, u
df50: 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  se numeric affin
df60: 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ity..        */.
df70: 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
df80: 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20         ExprList 
df90: 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
dfa0: 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 73  pList;.        s
dfb0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
dfc0: 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 0a 20 20 20  tem *pItem;..   
dfd0: 20 20 20 20 20 69 66 28 20 21 61 66 66 69 6e 69       if( !affini
dfe0: 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ty ){.          
dff0: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
e000: 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
e010: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6b 65      }.        ke
e020: 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d  yInfo.aColl[0] =
e030: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 70   pExpr->pLeft->p
e040: 43 6f 6c 6c 3b 0a 0a 20 20 20 20 20 20 20 20 2f  Coll;..        /
e050: 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65  * Loop through e
e060: 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ach expression i
e070: 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a 2f  n <exprlist>. */
e080: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 70  .        for(i=p
e090: 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74  List->nExpr, pIt
e0a0: 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30  em=pList->a; i>0
e0b0: 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i--, pItem++){
e0c0: 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
e0d0: 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45  *pE2 = pItem->pE
e0e0: 78 70 72 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  xpr;..          
e0f0: 2f 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  /* If the expres
e100: 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73  sion is not cons
e110: 74 61 6e 74 20 74 68 65 6e 20 77 65 20 77 69 6c  tant then we wil
e120: 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20  l need to.      
e130: 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74      ** disable t
e140: 68 65 20 74 65 73 74 20 74 68 61 74 20 77 61 73  he test that was
e150: 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f 76 65   generated above
e160: 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65   that makes sure
e170: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68  .          ** th
e180: 69 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65 78 65  is code only exe
e190: 63 75 74 65 73 20 6f 6e 63 65 2e 20 20 42 65 63  cutes once.  Bec
e1a0: 61 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e 2d 63  ause for a non-c
e1b0: 6f 6e 73 74 61 6e 74 0a 20 20 20 20 20 20 20 20  onstant.        
e1c0: 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
e1d0: 77 65 20 6e 65 65 64 20 74 6f 20 72 65 72 75 6e  we need to rerun
e1e0: 20 74 68 69 73 20 63 6f 64 65 20 65 61 63 68 20   this code each 
e1f0: 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 20 20  time..          
e200: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
e210: 20 74 65 73 74 41 64 64 72 3e 30 20 26 26 20 21   testAddr>0 && !
e220: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
e230: 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20  stant(pE2) ){.  
e240: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
e250: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
e260: 70 28 76 2c 20 74 65 73 74 41 64 64 72 2d 31 2c  p(v, testAddr-1,
e270: 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   3);.           
e280: 20 74 65 73 74 41 64 64 72 20 3d 20 30 3b 0a 20   testAddr = 0;. 
e290: 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
e2a0: 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74        /* Evaluat
e2b0: 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
e2c0: 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69   and insert it i
e2d0: 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61 62  nto the temp tab
e2e0: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  le */.          
e2f0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
e300: 70 50 61 72 73 65 2c 20 70 45 32 2c 20 30 29 3b  pParse, pE2, 0);
e310: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
e320: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
e330: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31  OP_MakeRecord, 1
e340: 2c 20 30 2c 20 30 2c 20 26 61 66 66 69 6e 69 74  , 0, 0, &affinit
e350: 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  y, 1);.         
e360: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e370: 70 31 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p1(v, OP_IdxInse
e380: 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  rt, pExpr->iTabl
e390: 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
e3a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
e3b0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
e3c0: 76 2c 20 61 64 64 72 2c 20 28 76 6f 69 64 20 2a  v, addr, (void *
e3d0: 29 26 6b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )&keyInfo, P4_KE
e3e0: 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 62 72  YINFO);.      br
e3f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
e400: 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a  case TK_EXISTS:.
e410: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
e420: 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  CT: {.      /* T
e430: 68 69 73 20 68 61 73 20 74 6f 20 62 65 20 61 20  his has to be a 
e440: 73 63 61 6c 61 72 20 53 45 4c 45 43 54 2e 20 20  scalar SELECT.  
e450: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
e460: 20 70 75 74 20 74 68 65 0a 20 20 20 20 20 20 2a   put the.      *
e470: 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  * value of this 
e480: 73 65 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d 6f  select in a memo
e490: 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 63 6f  ry cell and reco
e4a0: 72 64 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20  rd the number.  
e4b0: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 65      ** of the me
e4c0: 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f  mory cell in iCo
e4d0: 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lumn..      */. 
e4e0: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
e4f0: 74 20 54 6f 6b 65 6e 20 6f 6e 65 20 3d 20 7b 20  t Token one = { 
e500: 28 75 38 2a 29 22 31 22 2c 20 30 2c 20 31 20 7d  (u8*)"1", 0, 1 }
e510: 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  ;.      Select *
e520: 70 53 65 6c 3b 0a 20 20 20 20 20 20 53 65 6c 65  pSel;.      Sele
e530: 63 74 44 65 73 74 20 64 65 73 74 3b 0a 0a 20 20  ctDest dest;..  
e540: 20 20 20 20 70 53 65 6c 20 3d 20 70 45 78 70 72      pSel = pExpr
e550: 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ->pSelect;.     
e560: 20 64 65 73 74 2e 69 50 61 72 6d 20 3d 20 2b 2b   dest.iParm = ++
e570: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
e580: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
e590: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
e5a0: 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44 65          dest.eDe
e5b0: 73 74 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20  st = SRT_Mem;.  
e5c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e5d0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
e5e0: 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69 50 61 72  ll, 0, dest.iPar
e5f0: 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  m);.        Vdbe
e600: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69  Comment((v, "Ini
e610: 74 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c  t subquery resul
e620: 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  t"));.      }els
e630: 65 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e  e{.        dest.
e640: 65 44 65 73 74 20 3d 20 53 52 54 5f 45 78 69 73  eDest = SRT_Exis
e650: 74 73 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ts;.        sqli
e660: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
e670: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
e680: 64 65 73 74 2e 69 50 61 72 6d 29 3b 0a 20 20 20  dest.iParm);.   
e690: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
e6a0: 28 28 76 2c 20 22 49 6e 69 74 20 45 58 49 53 54  ((v, "Init EXIST
e6b0: 53 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20  S result"));.   
e6c0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
e6d0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 53 65  e3ExprDelete(pSe
e6e0: 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20  l->pLimit);.    
e6f0: 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d    pSel->pLimit =
e700: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
e710: 61 72 73 65 2c 20 54 4b 5f 49 4e 54 45 47 45 52  arse, TK_INTEGER
e720: 2c 20 30 2c 20 30 2c 20 26 6f 6e 65 29 3b 0a 20  , 0, 0, &one);. 
e730: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
e740: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
e750: 53 65 6c 2c 20 26 64 65 73 74 2c 20 30 2c 20 30  Sel, &dest, 0, 0
e760: 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  , 0, 0) ){.     
e770: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
e780: 20 7d 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e   }.      pExpr->
e790: 69 43 6f 6c 75 6d 6e 20 3d 20 64 65 73 74 2e 69  iColumn = dest.i
e7a0: 50 61 72 6d 3b 0a 20 20 20 20 20 20 62 72 65 61  Parm;.      brea
e7b0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
e7c0: 69 66 28 20 74 65 73 74 41 64 64 72 20 29 7b 0a  if( testAddr ){.
e7d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
e7e0: 75 6d 70 48 65 72 65 28 76 2c 20 74 65 73 74 41  umpHere(v, testA
e7f0: 64 64 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ddr);.  }..  ret
e800: 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  urn;.}.#endif /*
e810: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
e820: 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  QUERY */../*.** 
e830: 44 75 70 6c 69 63 61 74 65 20 61 6e 20 38 2d 62  Duplicate an 8-b
e840: 79 74 65 20 76 61 6c 75 65 0a 2a 2f 0a 73 74 61  yte value.*/.sta
e850: 74 69 63 20 63 68 61 72 20 2a 64 75 70 38 62 79  tic char *dup8by
e860: 74 65 73 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e  tes(Vdbe *v, con
e870: 73 74 20 63 68 61 72 20 2a 69 6e 29 7b 0a 20 20  st char *in){.  
e880: 63 68 61 72 20 2a 6f 75 74 20 3d 20 73 71 6c 69  char *out = sqli
e890: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 73  te3DbMallocRaw(s
e8a0: 71 6c 69 74 65 33 56 64 62 65 44 62 28 76 29 2c  qlite3VdbeDb(v),
e8b0: 20 38 29 3b 0a 20 20 69 66 28 20 6f 75 74 20 29   8);.  if( out )
e8c0: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 6f 75 74  {.    memcpy(out
e8d0: 2c 20 69 6e 2c 20 38 29 3b 0a 20 20 7d 0a 20 20  , in, 8);.  }.  
e8e0: 72 65 74 75 72 6e 20 6f 75 74 3b 0a 7d 0a 0a 2f  return out;.}../
e8f0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e  *.** Generate an
e900: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61   instruction tha
e910: 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 66  t will put the f
e920: 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a  loating point.**
e930: 20 76 61 6c 75 65 20 64 65 73 63 72 69 62 65 64   value described
e940: 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 6f 6e   by z[0..n-1] on
e950: 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a   the stack..**.*
e960: 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67  * The z[] string
e970: 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e   will probably n
e980: 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69  ot be zero-termi
e990: 6e 61 74 65 64 2e 20 20 42 75 74 20 74 68 65 20  nated.  But the 
e9a0: 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74  .** z[n] charact
e9b0: 65 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  er is guaranteed
e9c0: 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67   to be something
e9d0: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c   that does not l
e9e0: 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20  ook.** like the 
e9f0: 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20  continuation of 
ea00: 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73  the number..*/.s
ea10: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 52  tatic void codeR
ea20: 65 61 6c 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e  eal(Vdbe *v, con
ea30: 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
ea40: 6e 2c 20 69 6e 74 20 6e 65 67 61 74 65 46 6c 61  n, int negateFla
ea50: 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20  g, int iMem){.  
ea60: 61 73 73 65 72 74 28 20 7a 20 7c 7c 20 76 3d 3d  assert( z || v==
ea70: 30 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65  0 || sqlite3Vdbe
ea80: 44 62 28 76 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69  Db(v)->mallocFai
ea90: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 7a 20 29  led );.  if( z )
eaa0: 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 61 6c  {.    double val
eab0: 75 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 56  ue;.    char *zV
eac0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69  ;.    assert( !i
ead0: 73 64 69 67 69 74 28 7a 5b 6e 5d 29 20 29 3b 0a  sdigit(z[n]) );.
eae0: 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f 46 28      sqlite3AtoF(
eaf0: 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20 20 20  z, &value);.    
eb00: 69 66 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29  if( negateFlag )
eb10: 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b   value = -value;
eb20: 0a 20 20 20 20 7a 56 20 3d 20 64 75 70 38 62 79  .    zV = dup8by
eb30: 74 65 73 28 76 2c 20 28 63 68 61 72 2a 29 26 76  tes(v, (char*)&v
eb40: 61 6c 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  alue);.    sqlit
eb50: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
eb60: 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d  OP_Real, 0, iMem
eb70: 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 52 45 41 4c  , 0, zV, P4_REAL
eb80: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
eb90: 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73   Generate an ins
eba0: 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69  truction that wi
ebb0: 6c 6c 20 70 75 74 20 74 68 65 20 69 6e 74 65 67  ll put the integ
ebc0: 65 72 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a  er describe by.*
ebd0: 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d  * text z[0..n-1]
ebe0: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a   on the stack..*
ebf0: 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72  *.** The z[] str
ec00: 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c  ing will probabl
ec10: 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65  y not be zero-te
ec20: 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74  rminated.  But t
ec30: 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72  he .** z[n] char
ec40: 61 63 74 65 72 20 69 73 20 67 75 61 72 61 6e 74  acter is guarant
ec50: 65 65 64 20 74 6f 20 62 65 20 73 6f 6d 65 74 68  eed to be someth
ec60: 69 6e 67 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ing that does no
ec70: 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74  t look.** like t
ec80: 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20  he continuation 
ec90: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a  of the number..*
eca0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
ecb0: 64 65 49 6e 74 65 67 65 72 28 56 64 62 65 20 2a  deInteger(Vdbe *
ecc0: 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  v, const char *z
ecd0: 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20 6e 65 67  , int n, int neg
ece0: 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b  Flag, int iMem){
ecf0: 0a 20 20 61 73 73 65 72 74 28 20 7a 20 7c 7c 20  .  assert( z || 
ed00: 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 56  v==0 || sqlite3V
ed10: 64 62 65 44 62 28 76 29 2d 3e 6d 61 6c 6c 6f 63  dbeDb(v)->malloc
ed20: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
ed30: 7a 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  z ){.    int i;.
ed40: 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 64      assert( !isd
ed50: 69 67 69 74 28 7a 5b 6e 5d 29 20 29 3b 0a 20 20  igit(z[n]) );.  
ed60: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 65 74    if( sqlite3Get
ed70: 49 6e 74 33 32 28 7a 2c 20 26 69 29 20 29 7b 0a  Int32(z, &i) ){.
ed80: 20 20 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61        if( negFla
ed90: 67 20 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20 20  g ) i = -i;.    
eda0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
edb0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
edc0: 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20 20  r, i, iMem);.   
edd0: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
ede0: 65 33 46 69 74 73 49 6e 36 34 42 69 74 73 28 7a  e3FitsIn64Bits(z
edf0: 2c 20 6e 65 67 46 6c 61 67 29 20 29 7b 0a 20 20  , negFlag) ){.  
ee00: 20 20 20 20 69 36 34 20 76 61 6c 75 65 3b 0a 20      i64 value;. 
ee10: 20 20 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20       char *zV;. 
ee20: 20 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f 69       sqlite3Atoi
ee30: 36 34 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20  64(z, &value);. 
ee40: 20 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67       if( negFlag
ee50: 20 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75   ) value = -valu
ee60: 65 3b 0a 20 20 20 20 20 20 7a 56 20 3d 20 64 75  e;.      zV = du
ee70: 70 38 62 79 74 65 73 28 76 2c 20 28 63 68 61 72  p8bytes(v, (char
ee80: 2a 29 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 20  *)&value);.     
ee90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
eea0: 70 34 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20  p4(v, OP_Int64, 
eeb0: 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20  0, iMem, 0, zV, 
eec0: 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d  P4_INT64);.    }
eed0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 64 65  else{.      code
eee0: 52 65 61 6c 28 76 2c 20 7a 2c 20 6e 2c 20 6e 65  Real(v, z, n, ne
eef0: 67 46 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a 20 20  gFlag, iMem);.  
ef00: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a    }.  }.}.../*.*
ef10: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
ef20: 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63  that will extrac
ef30: 74 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68  t the iColumn-th
ef40: 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20   column from.** 
ef50: 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 73  table pTab and s
ef60: 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  tore the column 
ef70: 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
ef80: 72 20 69 4d 65 6d 2c 20 6f 72 20 6f 6e 0a 2a 2a  r iMem, or on.**
ef90: 20 74 68 65 20 73 74 61 63 6b 20 69 66 20 69 4d   the stack if iM
efa0: 65 6d 3d 3d 30 2e 20 20 54 68 65 72 65 20 69 73  em==0.  There is
efb0: 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20   an open cursor 
efc0: 74 6f 20 70 54 61 62 20 69 6e 20 0a 2a 2a 20 69  to pTab in .** i
efd0: 54 61 62 6c 65 2e 20 20 49 66 20 69 43 6f 6c 75  Table.  If iColu
efe0: 6d 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 69  mn<0 then code i
eff0: 73 20 67 65 6e 65 72 61 74 65 64 20 74 68 61 74  s generated that
f000: 20 65 78 74 72 61 63 74 73 20 74 68 65 20 72 6f   extracts the ro
f010: 77 69 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  wid..*/.void sql
f020: 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
f030: 6f 6c 75 6d 6e 28 0a 20 20 56 64 62 65 20 2a 76  olumn(.  Vdbe *v
f040: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
f050: 20 56 4d 20 62 65 69 6e 67 20 63 72 65 61 74 65   VM being create
f060: 64 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  d */.  Table *pT
f070: 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72  ab,     /* Descr
f080: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61  iption of the ta
f090: 62 6c 65 20 77 65 20 61 72 65 20 72 65 61 64 69  ble we are readi
f0a0: 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ng from */.  int
f0b0: 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a   iColumn,     /*
f0c0: 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61   Index of the ta
f0d0: 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  ble column */.  
f0e0: 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
f0f0: 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70   /* The cursor p
f100: 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74  ointing to the t
f110: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  able */.  int iR
f120: 65 67 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74  eg         /* St
f130: 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65 72 65  ore results here
f140: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 43 6f   */.){.  if( iCo
f150: 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 69 6e  lumn<0 ){.    in
f160: 74 20 6f 70 20 3d 20 28 70 54 61 62 20 26 26 20  t op = (pTab && 
f170: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 29  IsVirtual(pTab))
f180: 20 3f 20 4f 50 5f 56 52 6f 77 69 64 20 3a 20 4f   ? OP_VRowid : O
f190: 50 5f 52 6f 77 69 64 3b 0a 20 20 20 20 73 71 6c  P_Rowid;.    sql
f1a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f1b0: 2c 20 6f 70 2c 20 69 54 61 62 6c 65 2c 20 69 52  , op, iTable, iR
f1c0: 65 67 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  eg);.  }else if(
f1d0: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
f1e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f1f0: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
f200: 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c  iTable, iColumn,
f210: 20 69 52 65 67 29 3b 0a 20 20 7d 65 6c 73 65 7b   iReg);.  }else{
f220: 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 49 73  .    int op = Is
f230: 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 3f 20  Virtual(pTab) ? 
f240: 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f  OP_VColumn : OP_
f250: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69  Column;.    sqli
f260: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
f270: 20 6f 70 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f   op, iTable, iCo
f280: 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 20  lumn, iReg);.   
f290: 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65   sqlite3ColumnDe
f2a0: 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69  fault(v, pTab, i
f2b0: 43 6f 6c 75 6d 6e 29 3b 0a 23 69 66 6e 64 65 66  Column);.#ifndef
f2c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
f2d0: 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
f2e0: 69 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  if( pTab->aCol[i
f2f0: 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79  Column].affinity
f300: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  ==SQLITE_AFF_REA
f310: 4c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L ){.      sqlit
f320: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
f330: 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 2c  OP_RealAffinity,
f340: 20 69 52 65 67 29 3b 0a 20 20 20 20 7d 0a 23 65   iReg);.    }.#e
f350: 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ndif.  }.}../*.*
f360: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
f370: 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  into the current
f380: 20 56 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74   Vdbe to evaluat
f390: 65 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65  e the given.** e
f3a0: 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 6c 65  xpression and le
f3b0: 61 76 65 73 20 74 68 65 20 72 65 73 75 6c 74 20  aves the result 
f3c0: 69 6e 20 61 20 72 65 67 69 73 74 65 72 20 6f 6e  in a register on
f3d0: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a   on the stack..*
f3e0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 72 67  *.** If the targ
f3f0: 65 74 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  et register numb
f400: 65 72 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  er is negative, 
f410: 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 0a 2a  allocate a new.*
f420: 2a 20 72 65 67 69 73 74 65 72 20 74 6f 20 73 74  * register to st
f430: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 2e 20  ore the result. 
f440: 20 49 66 20 74 68 65 20 74 61 72 67 65 74 20 72   If the target r
f450: 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 0a 2a  egister number.*
f460: 2a 20 69 73 20 7a 65 72 6f 20 74 68 65 6e 20 70  * is zero then p
f470: 75 73 68 20 74 68 65 20 72 65 73 75 6c 74 20 6f  ush the result o
f480: 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 20 20  nto the stack.  
f490: 52 65 74 75 72 6e 20 74 68 65 20 74 61 72 67 65  Return the targe
f4a0: 74 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 6e 75  t.** register nu
f4b0: 6d 62 65 72 20 72 65 67 61 72 64 6c 65 73 73 2e  mber regardless.
f4c0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65  .**.** This code
f4d0: 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20   depends on the 
f4e0: 66 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69  fact that certai
f4f0: 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28  n token values (
f500: 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72  ex: TK_EQ).** ar
f510: 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70  e the same as op
f520: 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a  code values (ex:
f530: 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70   OP_Eq) that imp
f540: 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65  lement the corre
f550: 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72  sponding.** oper
f560: 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20  ation.  Special 
f570: 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65  comments in vdbe
f580: 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63  .c and the mkopc
f590: 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20  odeh.awk script 
f5a0: 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70  in.** the make p
f5b0: 72 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65  rocess cause the
f5c0: 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69  se values to ali
f5d0: 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69  gn.  Assert()s i
f5e0: 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65  n the code.** be
f5f0: 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20  low verify that 
f600: 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20  the numbers are 
f610: 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c  aligned correctl
f620: 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
f630: 33 45 78 70 72 43 6f 64 65 28 50 61 72 73 65 20  3ExprCode(Parse 
f640: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
f650: 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
f660: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
f670: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
f680: 69 6e 74 20 6f 70 3b 0a 20 20 69 6e 74 20 69 6e  int op;.  int in
f690: 52 65 67 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73  Reg = 0;.  int s
f6a0: 74 61 63 6b 43 68 6e 67 20 3d 20 30 3b 0a 20 20  tackChng = 0;.  
f6b0: 69 6e 74 20 6f 72 69 67 54 61 72 67 65 74 20 3d  int origTarget =
f6c0: 20 74 61 72 67 65 74 3b 0a 0a 20 20 61 73 73 65   target;..  asse
f6d0: 72 74 28 20 76 21 3d 30 20 7c 7c 20 70 50 61 72  rt( v!=0 || pPar
f6e0: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
f6f0: 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 76 3d  iled );.  if( v=
f700: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
f710: 20 69 66 28 20 74 61 72 67 65 74 3c 30 20 29 7b   if( target<0 ){
f720: 0a 20 20 20 20 74 61 72 67 65 74 20 3d 20 2b 2b  .    target = ++
f730: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
f740: 7d 65 6c 73 65 20 69 66 28 20 74 61 72 67 65 74  }else if( target
f750: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 63 6b  ==0 ){.    stack
f760: 43 68 6e 67 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20  Chng = 1;.  }.. 
f770: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b   if( pExpr==0 ){
f780: 0a 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c  .    op = TK_NUL
f790: 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  L;.  }else{.    
f7a0: 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
f7b0: 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f 70    }.  switch( op
f7c0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
f7d0: 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20  AGG_COLUMN: {.  
f7e0: 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67      AggInfo *pAg
f7f0: 67 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70  gInfo = pExpr->p
f800: 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73  AggInfo;.      s
f810: 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
f820: 6c 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67 49  l *pCol = &pAggI
f830: 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d  nfo->aCol[pExpr-
f840: 3e 69 41 67 67 5d 3b 0a 20 20 20 20 20 20 69 66  >iAgg];.      if
f850: 28 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  ( !pAggInfo->dir
f860: 65 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20  ectMode ){.     
f870: 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d     assert( pCol-
f880: 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20  >iMem>0 );.     
f890: 20 20 20 69 6e 52 65 67 20 3d 20 70 43 6f 6c 2d     inReg = pCol-
f8a0: 3e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 62  >iMem;.        b
f8b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
f8c0: 65 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e  e if( pAggInfo->
f8d0: 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 29 7b  useSortingIdx ){
f8e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f8f0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
f900: 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66  _Column, pAggInf
f910: 6f 2d 3e 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20  o->sortingIdx,. 
f920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f930: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
f940: 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
f950: 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
f960: 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65     inReg = targe
f970: 74 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  t;.        break
f980: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f990: 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61  /* Otherwise, fa
f9a0: 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65  ll thru into the
f9b0: 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20   TK_COLUMN case 
f9c0: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  */.    }.    cas
f9d0: 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
f9e0: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
f9f0: 69 54 61 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20  iTable<0 ){.    
fa00: 20 20 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79      /* This only
fa10: 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f   happens when co
fa20: 64 69 6e 67 20 63 68 65 63 6b 20 63 6f 6e 73 74  ding check const
fa30: 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  raints */.      
fa40: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
fa50: 2d 3e 63 6b 4f 66 66 73 65 74 3e 30 20 29 3b 0a  ->ckOffset>0 );.
fa60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
fa70: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
fa80: 53 43 6f 70 79 2c 20 2d 28 70 50 61 72 73 65 2d  SCopy, -(pParse-
fa90: 3e 63 6b 4f 66 66 73 65 74 2d 70 45 78 70 72 2d  >ckOffset-pExpr-
faa0: 3e 69 43 6f 6c 75 6d 6e 2d 31 29 29 3b 0a 20 20  >iColumn-1));.  
fab0: 20 20 20 20 20 20 2f 2a 20 69 6e 52 65 67 20 3d        /* inReg =
fac0: 20 2d 28 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66   -(pParse->ckOff
fad0: 73 65 74 2d 70 45 78 70 72 2d 3e 69 43 6f 6c 75  set-pExpr->iColu
fae0: 6d 6e 2d 31 29 3b 20 2a 2f 0a 20 20 20 20 20 20  mn-1); */.      
faf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
fb00: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
fb10: 74 43 6f 6c 75 6d 6e 28 76 2c 20 70 45 78 70 72  tColumn(v, pExpr
fb20: 2d 3e 70 54 61 62 2c 0a 20 20 20 20 20 20 20 20  ->pTab,.        
fb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb40: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
fb50: 69 43 6f 6c 75 6d 6e 2c 20 70 45 78 70 72 2d 3e  iColumn, pExpr->
fb60: 69 54 61 62 6c 65 2c 20 74 61 72 67 65 74 29 3b  iTable, target);
fb70: 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d  .        inReg =
fb80: 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d   target;.      }
fb90: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
fba0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
fbb0: 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
fbc0: 20 63 6f 64 65 49 6e 74 65 67 65 72 28 76 2c 20   codeInteger(v, 
fbd0: 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f  (char*)pExpr->to
fbe0: 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f  ken.z, pExpr->to
fbf0: 6b 65 6e 2e 6e 2c 20 30 2c 20 74 61 72 67 65 74  ken.n, 0, target
fc00: 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d  );.      inReg =
fc10: 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 62   target;.      b
fc20: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
fc30: 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b  case TK_FLOAT: {
fc40: 0a 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28  .      codeReal(
fc50: 76 2c 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d  v, (char*)pExpr-
fc60: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d  >token.z, pExpr-
fc70: 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 2c 20 74 61 72  >token.n, 0, tar
fc80: 67 65 74 29 3b 0a 20 20 20 20 20 20 69 6e 52 65  get);.      inRe
fc90: 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20  g = target;.    
fca0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
fcb0: 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
fcc0: 47 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  G: {.      sqlit
fcd0: 65 33 44 65 71 75 6f 74 65 45 78 70 72 28 70 50  e3DequoteExpr(pP
fce0: 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 29  arse->db, pExpr)
fcf0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
fd00: 64 62 65 41 64 64 4f 70 34 28 76 2c 4f 50 5f 53  dbeAddOp4(v,OP_S
fd10: 74 72 69 6e 67 38 2c 20 30 2c 20 74 61 72 67 65  tring8, 0, targe
fd20: 74 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  t, 0,.          
fd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
fd40: 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65  har*)pExpr->toke
fd50: 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  n.z, pExpr->toke
fd60: 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 69 6e 52 65  n.n);.      inRe
fd70: 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20  g = target;.    
fd80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
fd90: 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a     case TK_NULL:
fda0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
fdb0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
fdc0: 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74  _Null, 0, target
fdd0: 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d  );.      inReg =
fde0: 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 62   target;.      b
fdf0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
fe00: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fe10: 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20  BLOB_LITERAL.   
fe20: 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b   case TK_BLOB: {
fe30: 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  .      int n;.  
fe40: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
fe50: 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  z;.      assert(
fe60: 20 54 4b 5f 42 4c 4f 42 3d 3d 4f 50 5f 48 65 78   TK_BLOB==OP_Hex
fe70: 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 6e 20  Blob );.      n 
fe80: 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  = pExpr->token.n
fe90: 20 2d 20 33 3b 0a 20 20 20 20 20 20 7a 20 3d 20   - 3;.      z = 
fea0: 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f  (char*)pExpr->to
feb0: 6b 65 6e 2e 7a 20 2b 20 32 3b 0a 20 20 20 20 20  ken.z + 2;.     
fec0: 20 61 73 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b   assert( n>=0 );
fed0: 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  .      if( n==0 
fee0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 22  ){.        z = "
fef0: 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ";.      }.     
ff00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ff10: 70 34 28 76 2c 20 6f 70 2c 20 30 2c 20 74 61 72  p4(v, op, 0, tar
ff20: 67 65 74 2c 20 30 2c 20 7a 2c 20 6e 29 3b 0a 20  get, 0, z, n);. 
ff30: 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72       inReg = tar
ff40: 67 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  get;.      break
ff50: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
ff60: 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41     case TK_VARIA
ff70: 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  BLE: {.      sql
ff80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
ff90: 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70  , OP_Variable, p
ffa0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61  Expr->iTable, ta
ffb0: 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28  rget);.      if(
ffc0: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3e   pExpr->token.n>
ffd0: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
ffe0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
fff0: 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 70  (v, -1, (char*)p
10000 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  Expr->token.z, p
10010 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a  Expr->token.n);.
10020 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e        }.      in
10030 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20  Reg = target;.  
10040 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
10050 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47  .    case TK_REG
10060 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 69  ISTER: {.      i
10070 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 54  nReg = pExpr->iT
10080 61 62 6c 65 3b 0a 20 20 20 20 20 20 62 72 65 61  able;.      brea
10090 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
100a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53   SQLITE_OMIT_CAS
100b0 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41  T.    case TK_CA
100c0 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  ST: {.      /* E
100d0 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68  xpressions of th
100e0 65 20 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70  e form:   CAST(p
100f0 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a  Left AS token) *
10100 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66 2c  /.      int aff,
10110 20 74 6f 5f 6f 70 3b 0a 20 20 20 20 20 20 73 71   to_op;.      sq
10120 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
10130 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
10140 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  ft, target);.   
10150 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
10160 41 66 66 69 6e 69 74 79 54 79 70 65 28 26 70 45  AffinityType(&pE
10170 78 70 72 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20  xpr->token);.   
10180 20 20 20 74 6f 5f 6f 70 20 3d 20 61 66 66 20 2d     to_op = aff -
10190 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
101a0 20 2b 20 4f 50 5f 54 6f 54 65 78 74 3b 0a 20 20   + OP_ToText;.  
101b0 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f      assert( to_o
101c0 70 3d 3d 4f 50 5f 54 6f 54 65 78 74 20 20 20 20  p==OP_ToText    
101d0 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41  || aff!=SQLITE_A
101e0 46 46 5f 54 45 58 54 20 20 20 20 29 3b 0a 20 20  FF_TEXT    );.  
101f0 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f      assert( to_o
10200 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20 20 20 20  p==OP_ToBlob    
10210 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41  || aff!=SQLITE_A
10220 46 46 5f 4e 4f 4e 45 20 20 20 20 29 3b 0a 20 20  FF_NONE    );.  
10230 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f      assert( to_o
10240 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65 72 69 63 20  p==OP_ToNumeric 
10250 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41  || aff!=SQLITE_A
10260 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20  FF_NUMERIC );.  
10270 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f      assert( to_o
10280 70 3d 3d 4f 50 5f 54 6f 49 6e 74 20 20 20 20 20  p==OP_ToInt     
10290 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41  || aff!=SQLITE_A
102a0 46 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20  FF_INTEGER );.  
102b0 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f      assert( to_o
102c0 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20 20 20 20  p==OP_ToReal    
102d0 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41  || aff!=SQLITE_A
102e0 46 46 5f 52 45 41 4c 20 20 20 20 29 3b 0a 20 20  FF_REAL    );.  
102f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10300 64 64 4f 70 31 28 76 2c 20 74 6f 5f 6f 70 2c 20  ddOp1(v, to_op, 
10310 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73  target);.      s
10320 74 61 63 6b 43 68 6e 67 20 3d 20 30 3b 0a 20 20  tackChng = 0;.  
10330 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67      inReg = targ
10340 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  et;.      break;
10350 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
10360 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53   SQLITE_OMIT_CAS
10370 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  T */.    case TK
10380 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LT:.    case TK
10390 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LE:.    case TK
103a0 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GT:.    case TK
103b0 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GE:.    case TK
103c0 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _NE:.    case TK
103d0 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  _EQ: {.      ass
103e0 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c  ert( TK_LT==OP_L
103f0 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
10400 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20  t( TK_LE==OP_Le 
10410 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
10420 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b   TK_GT==OP_Gt );
10430 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
10440 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20  K_GE==OP_Ge );. 
10450 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
10460 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20  EQ==OP_Eq );.   
10470 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 45     assert( TK_NE
10480 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20  ==OP_Ne );.     
10490 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
104a0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
104b0 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20  pLeft, 0);.     
104c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
104d0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
104e0 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20  pRight, 0);.    
104f0 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
10500 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
10510 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
10520 74 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20  t, op, 0, 0);.  
10530 20 20 20 20 73 74 61 63 6b 43 68 6e 67 20 3d 20      stackChng = 
10540 2d 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  -1;.      break;
10550 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
10560 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65  TK_AND:.    case
10570 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65   TK_OR:.    case
10580 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61   TK_PLUS:.    ca
10590 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20  se TK_STAR:.    
105a0 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20  case TK_MINUS:. 
105b0 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a     case TK_REM:.
105c0 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41      case TK_BITA
105d0 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ND:.    case TK_
105e0 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73 65 20  BITOR:.    case 
105f0 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63 61  TK_SLASH:.    ca
10600 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20  se TK_LSHIFT:.  
10610 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54    case TK_RSHIFT
10620 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  : .    case TK_C
10630 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20 69  ONCAT: {.      i
10640 6e 74 20 72 31 2c 20 72 32 3b 0a 20 20 20 20 20  nt r1, r2;.     
10650 20 61 73 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d   assert( TK_AND=
10660 3d 4f 50 5f 41 6e 64 20 29 3b 0a 20 20 20 20 20  =OP_And );.     
10670 20 61 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d   assert( TK_OR==
10680 4f 50 5f 4f 72 20 29 3b 0a 20 20 20 20 20 20 61  OP_Or );.      a
10690 73 73 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d  ssert( TK_PLUS==
106a0 4f 50 5f 41 64 64 20 29 3b 0a 20 20 20 20 20 20  OP_Add );.      
106b0 61 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53  assert( TK_MINUS
106c0 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74 20 29 3b  ==OP_Subtract );
106d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
106e0 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e  K_REM==OP_Remain
106f0 64 65 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  der );.      ass
10700 65 72 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d  ert( TK_BITAND==
10710 4f 50 5f 42 69 74 41 6e 64 20 29 3b 0a 20 20 20  OP_BitAnd );.   
10720 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49     assert( TK_BI
10730 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b  TOR==OP_BitOr );
10740 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
10750 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69  K_SLASH==OP_Divi
10760 64 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  de );.      asse
10770 72 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f  rt( TK_LSHIFT==O
10780 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 0a 20  P_ShiftLeft );. 
10790 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
107a0 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74  RSHIFT==OP_Shift
107b0 52 69 67 68 74 20 29 3b 0a 20 20 20 20 20 20 61  Right );.      a
107c0 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54  ssert( TK_CONCAT
107d0 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 0a 20  ==OP_Concat );. 
107e0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
107f0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
10800 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
10810 30 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  0);.      r2 = s
10820 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
10830 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
10840 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ight, 0);.      
10850 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10860 33 28 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31 2c  3(v, op, r2, r1,
10870 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
10880 69 66 28 20 72 31 3d 3d 30 20 29 20 73 74 61 63  if( r1==0 ) stac
10890 6b 43 68 6e 67 2d 2d 3b 0a 20 20 20 20 20 20 69  kChng--;.      i
108a0 66 28 20 72 32 3d 3d 30 20 29 20 73 74 61 63 6b  f( r2==0 ) stack
108b0 43 68 6e 67 2d 2d 3b 0a 20 20 20 20 20 20 69 66  Chng--;.      if
108c0 28 20 74 61 72 67 65 74 3d 3d 30 20 29 20 73 74  ( target==0 ) st
108d0 61 63 6b 43 68 6e 67 2b 2b 3b 0a 20 20 20 20 20  ackChng++;.     
108e0 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b   inReg = target;
108f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
10900 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
10910 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20  UMINUS: {.      
10920 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
10930 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
10940 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20    assert( pLeft 
10950 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  );.      if( pLe
10960 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54  ft->op==TK_FLOAT
10970 20 7c 7c 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54   || pLeft->op==T
10980 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20  K_INTEGER ){.   
10990 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 20 3d 20       Token *p = 
109a0 26 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20  &pLeft->token;. 
109b0 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74         if( pLeft
109c0 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29  ->op==TK_FLOAT )
109d0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 64 65  {.          code
109e0 52 65 61 6c 28 76 2c 20 28 63 68 61 72 2a 29 70  Real(v, (char*)p
109f0 2d 3e 7a 2c 20 70 2d 3e 6e 2c 20 31 2c 20 74 61  ->z, p->n, 1, ta
10a00 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  rget);.        }
10a10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
10a20 63 6f 64 65 49 6e 74 65 67 65 72 28 76 2c 20 28  codeInteger(v, (
10a30 63 68 61 72 2a 29 70 2d 3e 7a 2c 20 70 2d 3e 6e  char*)p->z, p->n
10a40 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 1, target);.  
10a50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10a60 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a  inReg = target;.
10a70 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
10a80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
10a90 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74  Fall through int
10aa0 6f 20 54 4b 5f 4e 4f 54 20 2a 2f 0a 20 20 20 20  o TK_NOT */.    
10ab0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  }.    case TK_BI
10ac0 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54  TNOT:.    case T
10ad0 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61  K_NOT: {.      a
10ae0 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54  ssert( TK_BITNOT
10af0 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 0a 20  ==OP_BitNot );. 
10b00 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
10b10 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 0a 20  NOT==OP_Not );. 
10b20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
10b30 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
10b40 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20  pr->pLeft, 0);. 
10b50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10b60 41 64 64 4f 70 30 28 76 2c 20 6f 70 29 3b 0a 20  AddOp0(v, op);. 
10b70 20 20 20 20 20 73 74 61 63 6b 43 68 6e 67 20 3d       stackChng =
10b80 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
10b90 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
10ba0 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63  TK_ISNULL:.    c
10bb0 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
10bc0 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74  {.      int dest
10bd0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
10be0 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73  TK_ISNULL==OP_Is
10bf0 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61 73  Null );.      as
10c00 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c  sert( TK_NOTNULL
10c10 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a  ==OP_NotNull );.
10c20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10c30 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
10c40 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74  teger, 1, target
10c50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10c60 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
10c70 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30   pExpr->pLeft, 0
10c80 29 3b 0a 20 20 20 20 20 20 64 65 73 74 20 3d 20  );.      dest = 
10c90 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
10ca0 6e 74 41 64 64 72 28 76 29 20 2b 20 32 3b 0a 20  ntAddr(v) + 2;. 
10cb0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10cc0 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 31 2c  AddOp2(v, op, 1,
10cd0 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71   dest);.      sq
10ce0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
10cf0 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61  v, OP_AddImm, ta
10d00 72 67 65 74 2c 20 2d 31 29 3b 0a 20 20 20 20 20  rget, -1);.     
10d10 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 30 3b 0a   stackChng = 0;.
10d20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61        inReg = ta
10d30 72 67 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61  rget;.      brea
10d40 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
10d50 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  e TK_AGG_FUNCTIO
10d60 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e  N: {.      AggIn
10d70 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70  fo *pInfo = pExp
10d80 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20  r->pAggInfo;.   
10d90 20 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20     if( pInfo==0 
10da0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
10db0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
10dc0 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67  e, "misuse of ag
10dd0 67 72 65 67 61 74 65 3a 20 25 54 22 2c 0a 20 20  gregate: %T",.  
10de0 20 20 20 20 20 20 20 20 20 20 26 70 45 78 70 72            &pExpr
10df0 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d  ->span);.      }
10e00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
10e10 52 65 67 20 3d 20 70 49 6e 66 6f 2d 3e 61 46 75  Reg = pInfo->aFu
10e20 6e 63 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e  nc[pExpr->iAgg].
10e30 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iMem;.      }.  
10e40 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
10e50 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e  .    case TK_CON
10e60 53 54 5f 46 55 4e 43 3a 0a 20 20 20 20 63 61 73  ST_FUNC:.    cas
10e70 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  e TK_FUNCTION: {
10e80 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
10e90 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
10ea0 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 69 6e 74  pList;.      int
10eb0 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 20 3f   nExpr = pList ?
10ec0 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20   pList->nExpr : 
10ed0 30 3b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66  0;.      FuncDef
10ee0 20 2a 70 44 65 66 3b 0a 20 20 20 20 20 20 69 6e   *pDef;.      in
10ef0 74 20 6e 49 64 3b 0a 20 20 20 20 20 20 63 6f 6e  t nId;.      con
10f00 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 0a 20 20  st char *zId;.  
10f10 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 4d 61 73      int constMas
10f20 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  k = 0;.      int
10f30 20 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   i;.      sqlite
10f40 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
10f50 64 62 3b 0a 20 20 20 20 20 20 75 38 20 65 6e 63  db;.      u8 enc
10f60 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20   = ENC(db);.    
10f70 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
10f80 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 7a 49 64   = 0;..      zId
10f90 20 3d 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d   = (char*)pExpr-
10fa0 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20  >token.z;.      
10fb0 6e 49 64 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b  nId = pExpr->tok
10fc0 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 70 44 65 66  en.n;.      pDef
10fd0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
10fe0 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64  nction(pParse->d
10ff0 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 45 78  b, zId, nId, nEx
11000 70 72 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20  pr, enc, 0);.   
11010 20 20 20 61 73 73 65 72 74 28 20 70 44 65 66 21     assert( pDef!
11020 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 45 78 70  =0 );.      nExp
11030 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  r = sqlite3ExprC
11040 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
11050 73 65 2c 20 70 4c 69 73 74 2c 20 30 29 3b 0a 23  se, pList, 0);.#
11060 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11070 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
11080 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c        /* Possibl
11090 79 20 6f 76 65 72 6c 6f 61 64 20 74 68 65 20 66  y overload the f
110a0 75 6e 63 74 69 6f 6e 20 69 66 20 74 68 65 20 66  unction if the f
110b0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
110c0 0a 20 20 20 20 20 20 2a 2a 20 61 20 76 69 72 74  .      ** a virt
110d0 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  ual table column
110e0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
110f0 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78 20 66 75   ** For infix fu
11100 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47  nctions (LIKE, G
11110 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20 61 6e 64  LOB, REGEXP, and
11120 20 4d 41 54 43 48 29 20 75 73 65 20 74 68 65 0a   MATCH) use the.
11130 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20        ** second 
11140 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68  argument, not th
11150 65 20 66 69 72 73 74 2c 20 61 73 20 74 68 65 20  e first, as the 
11160 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 65 73 74  argument to test
11170 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65   to.      ** see
11180 20 69 66 20 69 74 20 69 73 20 61 20 63 6f 6c 75   if it is a colu
11190 6d 6e 20 69 6e 20 61 20 76 69 72 74 75 61 6c 20  mn in a virtual 
111a0 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20  table.  This is 
111b0 64 6f 6e 65 20 62 65 63 61 75 73 65 0a 20 20 20  done because.   
111c0 20 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f     ** the left o
111d0 70 65 72 61 6e 64 20 6f 66 20 69 6e 66 69 78 20  perand of infix 
111e0 66 75 6e 63 74 69 6f 6e 73 20 28 74 68 65 20 6f  functions (the o
111f0 70 65 72 61 6e 64 20 77 65 20 77 61 6e 74 20 74  perand we want t
11200 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72  o.      ** contr
11210 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20  ol overloading) 
11220 65 6e 64 73 20 75 70 20 61 73 20 74 68 65 20 73  ends up as the s
11230 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
11240 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66  o the.      ** f
11250 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 65 78  unction.  The ex
11260 70 72 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62  pression "A glob
11270 20 42 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e   B" is equivalen
11280 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22  t to .      ** "
11290 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57 65 20 77  glob(B,A).  We w
112a0 61 6e 74 20 74 6f 20 75 73 65 20 74 68 65 20 41  ant to use the A
112b0 20 69 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 74   in "A glob B" t
112c0 6f 20 74 65 73 74 0a 20 20 20 20 20 20 2a 2a 20  o test.      ** 
112d0 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65  for function ove
112e0 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75 74 20 77  rloading.  But w
112f0 65 20 75 73 65 20 74 68 65 20 42 20 74 65 72 6d  e use the B term
11300 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e   in "glob(B,A)".
11310 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
11320 69 66 28 20 6e 45 78 70 72 3e 3d 32 20 26 26 20  if( nExpr>=2 && 
11330 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20  (pExpr->flags & 
11340 45 50 5f 49 6e 66 69 78 46 75 6e 63 29 20 29 7b  EP_InfixFunc) ){
11350 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20  .        pDef = 
11360 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c  sqlite3VtabOverl
11370 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  oadFunction(db, 
11380 70 44 65 66 2c 20 6e 45 78 70 72 2c 20 70 4c 69  pDef, nExpr, pLi
11390 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b  st->a[1].pExpr);
113a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
113b0 20 6e 45 78 70 72 3e 30 20 29 7b 0a 20 20 20 20   nExpr>0 ){.    
113c0 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
113d0 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75  e3VtabOverloadFu
113e0 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c  nction(db, pDef,
113f0 20 6e 45 78 70 72 2c 20 70 4c 69 73 74 2d 3e 61   nExpr, pList->a
11400 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [0].pExpr);.    
11410 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
11420 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70   for(i=0; i<nExp
11430 72 20 26 26 20 69 3c 33 32 3b 20 69 2b 2b 29 7b  r && i<32; i++){
11440 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
11450 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
11460 6e 74 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  nt(pList->a[i].p
11470 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
11480 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20     constMask |= 
11490 28 31 3c 3c 69 29 3b 0a 20 20 20 20 20 20 20 20  (1<<i);.        
114a0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 44  }.        if( pD
114b0 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20  ef->needCollSeq 
114c0 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  && !pColl ){.   
114d0 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
114e0 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
114f0 71 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d  q(pParse, pList-
11500 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
11510 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
11520 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e        if( pDef->
11530 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20  needCollSeq ){. 
11540 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c         if( !pCol
11550 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72  l ) pColl = pPar
11560 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  se->db->pDfltCol
11570 6c 3b 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l; .        sqli
11580 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
11590 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20   OP_CollSeq, 0, 
115a0 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43  0, 0, (char *)pC
115b0 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
115c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
115d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
115e0 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e  4(v, OP_Function
115f0 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 6e 45 78  , constMask, nEx
11600 70 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  pr, 0,.         
11610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
11620 63 68 61 72 2a 29 70 44 65 66 2c 20 50 34 5f 46  char*)pDef, P4_F
11630 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 73  UNCDEF);.      s
11640 74 61 63 6b 43 68 6e 67 20 3d 20 31 2d 6e 45 78  tackChng = 1-nEx
11650 70 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  pr;.      break;
11660 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
11670 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
11680 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
11690 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65  EXISTS:.    case
116a0 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20   TK_SELECT: {.  
116b0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
116c0 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20  Column==0 ){.   
116d0 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
116e0 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
116f0 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
11700 7d 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20  }.      inReg = 
11710 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
11720 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
11730 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
11740 5f 53 43 6f 70 79 2c 20 70 45 78 70 72 2d 3e 69  _SCopy, pExpr->i
11750 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 56  Column);.      V
11760 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
11770 6c 6f 61 64 20 73 75 62 71 75 65 72 79 20 72 65  load subquery re
11780 73 75 6c 74 22 29 29 3b 20 2a 2f 0a 20 20 20 20  sult")); */.    
11790 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
117a0 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
117b0 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
117c0 0a 20 20 20 20 20 20 63 68 61 72 20 61 66 66 69  .      char affi
117d0 6e 69 74 79 3b 0a 20 20 20 20 20 20 69 6e 74 20  nity;.      int 
117e0 63 6b 4f 66 66 73 65 74 20 3d 20 70 50 61 72 73  ckOffset = pPars
117f0 65 2d 3e 63 6b 4f 66 66 73 65 74 3b 0a 20 20 20  e->ckOffset;.   
11800 20 20 20 69 6e 74 20 65 54 79 70 65 3b 0a 20 20     int eType;.  
11810 20 20 20 20 69 6e 74 20 69 4c 61 62 65 6c 20 3d      int iLabel =
11820 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
11830 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 20  Label(v);..     
11840 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33   eType = sqlite3
11850 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72  FindInIndex(pPar
11860 73 65 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 0a  se, pExpr, 0);..
11870 20 20 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20        /* Figure 
11880 6f 75 74 20 74 68 65 20 61 66 66 69 6e 69 74 79  out the affinity
11890 20 74 6f 20 75 73 65 20 74 6f 20 63 72 65 61 74   to use to creat
118a0 65 20 61 20 6b 65 79 20 66 72 6f 6d 20 74 68 65  e a key from the
118b0 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a   results.      *
118c0 2a 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  * of the express
118d0 69 6f 6e 2e 20 61 66 66 69 6e 69 74 79 53 74 72  ion. affinityStr
118e0 20 73 74 6f 72 65 73 20 61 20 73 74 61 74 69 63   stores a static
118f0 20 73 74 72 69 6e 67 20 73 75 69 74 61 62 6c 65   string suitable
11900 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 50 34   for.      ** P4
11910 20 6f 66 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72   of OP_MakeRecor
11920 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
11930 20 20 61 66 66 69 6e 69 74 79 20 3d 20 63 6f 6d    affinity = com
11940 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28  parisonAffinity(
11950 70 45 78 70 72 29 3b 0a 0a 20 20 20 20 20 20 73  pExpr);..      s
11960 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
11970 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
11980 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  1);.      pParse
11990 2d 3e 63 6b 4f 66 66 73 65 74 20 3d 20 28 63 6b  ->ckOffset = (ck
119a0 4f 66 66 73 65 74 20 3f 20 28 63 6b 4f 66 66 73  Offset ? (ckOffs
119b0 65 74 2b 31 29 20 3a 20 30 29 3b 0a 0a 20 20 20  et+1) : 0);..   
119c0 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 3c     /* Code the <
119d0 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70  expr> from "<exp
119e0 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 20 54 68  r> IN (...)". Th
119f0 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
11a00 65 0a 20 20 20 20 20 20 2a 2a 20 70 45 78 70 72  e.      ** pExpr
11a10 2d 3e 69 54 61 62 6c 65 20 63 6f 6e 74 61 69 6e  ->iTable contain
11a20 73 20 74 68 65 20 76 61 6c 75 65 73 20 74 68 61  s the values tha
11a30 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 28 2e  t make up the (.
11a40 2e 2e 29 20 73 65 74 2e 0a 20 20 20 20 20 20 2a  ..) set..      *
11a50 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  /.      sqlite3E
11a60 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
11a70 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29  pExpr->pLeft, 0)
11a80 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
11a90 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
11aa0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
11ab0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11ac0 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c  2(v, OP_NotNull,
11ad0 20 2d 31 2c 20 61 64 64 72 2b 34 29 3b 20 20 20   -1, addr+4);   
11ae0 20 20 20 20 20 20 20 20 20 2f 2a 20 61 64 64 72           /* addr
11af0 20 2b 20 30 20 2a 2f 0a 20 20 20 20 20 20 73 71   + 0 */.      sq
11b00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
11b10 76 2c 20 4f 50 5f 50 6f 70 2c 20 32 29 3b 0a 20  v, OP_Pop, 2);. 
11b20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11b30 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp0(v, OP_Nul
11b40 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
11b50 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
11b60 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 4c 61 62 65  P_Goto, 0, iLabe
11b70 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  l);.      if( eT
11b80 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f  ype==IN_INDEX_RO
11b90 57 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 69  WID ){.        i
11ba0 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74  nt iAddr = sqlit
11bb0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
11bc0 72 28 76 29 2b 33 3b 0a 20 20 20 20 20 20 20 20  r(v)+3;.        
11bd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11be0 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e  2(v, OP_MustBeIn
11bf0 74 2c 20 31 2c 20 69 41 64 64 72 29 3b 0a 20 20  t, 1, iAddr);.  
11c00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11c10 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f  eAddOp2(v, OP_No
11c20 74 45 78 69 73 74 73 2c 20 70 45 78 70 72 2d 3e  tExists, pExpr->
11c30 69 54 61 62 6c 65 2c 20 69 41 64 64 72 29 3b 0a  iTable, iAddr);.
11c40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
11c50 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11c60 47 6f 74 6f 2c 20 70 45 78 70 72 2d 3e 69 54 61  Goto, pExpr->iTa
11c70 62 6c 65 2c 20 69 4c 61 62 65 6c 29 3b 0a 20 20  ble, iLabel);.  
11c80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11c90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11ca0 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
11cb0 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20 30 2c 0a  ecord, 1, 0, 0,.
11cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 61 66               &af
11ce0 66 69 6e 69 74 79 2c 20 31 29 3b 20 20 20 2f 2a  finity, 1);   /*
11cf0 20 61 64 64 72 20 2b 20 34 20 2a 2f 0a 20 20 20   addr + 4 */.   
11d00 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11d10 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 46 6f 75  AddOp2(v, OP_Fou
11d20 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nd, pExpr->iTabl
11d30 65 2c 20 69 4c 61 62 65 6c 29 3b 0a 20 20 20 20  e, iLabel);.    
11d40 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
11d50 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
11d60 50 5f 41 64 64 49 6d 6d 2c 20 30 2c 20 2d 31 29  P_AddImm, 0, -1)
11d70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11d80 20 20 20 2f 2a 20 61 64 64 72 20 2b 20 36 20 2a     /* addr + 6 *
11d90 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
11da0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
11db0 76 2c 20 69 4c 61 62 65 6c 29 3b 0a 0a 20 20 20  v, iLabel);..   
11dc0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
11dd0 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
11de0 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20  TK_BETWEEN: {.  
11df0 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
11e00 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
11e10 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
11e20 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 49 74  rList_item *pLIt
11e30 65 6d 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  em = pExpr->pLis
11e40 74 2d 3e 61 3b 0a 20 20 20 20 20 20 45 78 70 72  t->a;.      Expr
11e50 20 2a 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65   *pRight = pLIte
11e60 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
11e70 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
11e80 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 30  pParse, pLeft, 0
11e90 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11ea0 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
11eb0 5f 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 73 71  _Copy);.      sq
11ec0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
11ed0 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 30 29  arse, pRight, 0)
11ee0 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
11ef0 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66  are(pParse, pLef
11f00 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 65  t, pRight, OP_Ge
11f10 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
11f20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
11f30 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 29 3b  (v, OP_Pull, 1);
11f40 0a 20 20 20 20 20 20 70 4c 49 74 65 6d 2b 2b 3b  .      pLItem++;
11f50 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20  .      pRight = 
11f60 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20  pLItem->pExpr;. 
11f70 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
11f80 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69  Code(pParse, pRi
11f90 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 63  ght, 0);.      c
11fa0 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
11fb0 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
11fc0 2c 20 4f 50 5f 4c 65 2c 20 30 2c 20 30 29 3b 0a  , OP_Le, 0, 0);.
11fd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11fe0 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 41 6e  eAddOp0(v, OP_An
11ff0 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  d);.      break;
12000 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
12010 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20  TK_UPLUS: {.    
12020 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
12030 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
12040 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
12050 6f 72 69 67 54 61 72 67 65 74 29 3b 0a 20 20 20  origTarget);.   
12060 20 20 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 30     stackChng = 0
12070 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
12080 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
12090 5f 43 41 53 45 3a 20 7b 0a 20 20 20 20 20 20 69  _CASE: {.      i
120a0 6e 74 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65  nt expr_end_labe
120b0 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 75 6d  l;.      int jum
120c0 70 49 6e 73 74 3b 0a 20 20 20 20 20 20 69 6e 74  pInst;.      int
120d0 20 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e   nExpr;.      in
120e0 74 20 69 3b 0a 20 20 20 20 20 20 45 78 70 72 4c  t i;.      ExprL
120f0 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20  ist *pEList;.   
12100 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
12110 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c  st_item *aListel
12120 65 6d 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  em;..      asser
12130 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 29 3b  t(pExpr->pList);
12140 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 28 70  .      assert((p
12150 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  Expr->pList->nEx
12160 70 72 20 25 20 32 29 20 3d 3d 20 30 29 3b 0a 20  pr % 2) == 0);. 
12170 20 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70       assert(pExp
12180 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  r->pList->nExpr 
12190 3e 20 30 29 3b 0a 20 20 20 20 20 20 70 45 4c 69  > 0);.      pELi
121a0 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  st = pExpr->pLis
121b0 74 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65 6c  t;.      aListel
121c0 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a  em = pEList->a;.
121d0 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45        nExpr = pE
121e0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
121f0 20 20 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65     expr_end_labe
12200 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  l = sqlite3VdbeM
12210 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
12220 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c     if( pExpr->pL
12230 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  eft ){.        s
12240 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
12250 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
12260 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  eft, 0);.      }
12270 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
12280 69 3c 6e 45 78 70 72 3b 20 69 3d 69 2b 32 29 7b  i<nExpr; i=i+2){
12290 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
122a0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
122b0 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45   aListelem[i].pE
122c0 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  xpr, 0);.       
122d0 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66   if( pExpr->pLef
122e0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  t ){.          s
122f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
12300 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 2d 31  (v, OP_SCopy, -1
12310 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 75 6d  );.          jum
12320 70 49 6e 73 74 20 3d 20 63 6f 64 65 43 6f 6d 70  pInst = codeComp
12330 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
12340 72 2d 3e 70 4c 65 66 74 2c 20 61 4c 69 73 74 65  r->pLeft, aListe
12350 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 2c 0a 20 20  lem[i].pExpr,.  
12360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f                 O
12380 50 5f 4e 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20  P_Ne, 0, 1);.   
12390 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
123a0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 50  beAddOp1(v, OP_P
123b0 6f 70 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  op, 1);.        
123c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
123d0 20 6a 75 6d 70 49 6e 73 74 20 3d 20 73 71 6c 69   jumpInst = sqli
123e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
123f0 20 4f 50 5f 49 66 4e 6f 74 2c 20 31 2c 20 30 29   OP_IfNot, 1, 0)
12400 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12410 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
12420 6f 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73  ode(pParse, aLis
12430 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72  telem[i+1].pExpr
12440 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
12450 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12460 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
12470 20 30 2c 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62   0, expr_end_lab
12480 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  el);.        sql
12490 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
124a0 28 76 2c 20 6a 75 6d 70 49 6e 73 74 29 3b 0a 20  (v, jumpInst);. 
124b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
124c0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b   pExpr->pLeft ){
124d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
124e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
124f0 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20  _Pop, 1, 0);.   
12500 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
12510 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a  Expr->pRight ){.
12520 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
12530 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
12540 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 74  pExpr->pRight, t
12550 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 65  arget);.      }e
12560 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
12570 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12580 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61  , OP_Null, 0, ta
12590 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rget);.      }. 
125a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
125b0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
125c0 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 29 3b  expr_end_label);
125d0 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74  .      inReg = t
125e0 61 72 67 65 74 3b 0a 20 20 20 20 20 20 62 72 65  arget;.      bre
125f0 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
12600 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
12610 49 47 47 45 52 0a 20 20 20 20 63 61 73 65 20 54  IGGER.    case T
12620 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20  K_RAISE: {.     
12630 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 74 72   if( !pParse->tr
12640 69 67 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 20  igStack ){.     
12650 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
12660 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
12670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12680 20 20 22 52 41 49 53 45 28 29 20 6d 61 79 20 6f    "RAISE() may o
12690 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68  nly be used with
126a0 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72 6f  in a trigger-pro
126b0 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 20 20  gram");.        
126c0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
126d0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  }.      if( pExp
126e0 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 4f 45 5f 49  r->iColumn!=OE_I
126f0 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20  gnore ){.       
12700 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
12710 3e 69 43 6f 6c 75 6d 6e 3d 3d 4f 45 5f 52 6f 6c  >iColumn==OE_Rol
12720 6c 62 61 63 6b 20 7c 7c 0a 20 20 20 20 20 20 20  lback ||.       
12730 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
12740 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 41  >iColumn == OE_A
12750 62 6f 72 74 20 7c 7c 0a 20 20 20 20 20 20 20 20  bort ||.        
12760 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
12770 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 46 61  iColumn == OE_Fa
12780 69 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 73  il );.         s
12790 71 6c 69 74 65 33 44 65 71 75 6f 74 65 45 78 70  qlite3DequoteExp
127a0 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45  r(pParse->db, pE
127b0 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 73  xpr);.         s
127c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
127d0 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c  (v, OP_Halt, SQL
127e0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20  ITE_CONSTRAINT, 
127f0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20  pExpr->iColumn, 
12800 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
12810 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
12820 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  *)pExpr->token.z
12830 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  , pExpr->token.n
12840 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  );.      } else 
12850 7b 0a 20 20 20 20 20 20 20 20 20 61 73 73 65 72  {.         asser
12860 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  t( pExpr->iColum
12870 6e 20 3d 3d 20 4f 45 5f 49 67 6e 6f 72 65 20 29  n == OE_Ignore )
12880 3b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  ;.         sqlit
12890 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
128a0 4f 50 5f 43 6f 6e 74 65 78 74 50 6f 70 2c 20 30  OP_ContextPop, 0
128b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 73  , 0);.         s
128c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
128d0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
128e0 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63  pParse->trigStac
128f0 6b 2d 3e 69 67 6e 6f 72 65 4a 75 6d 70 29 3b 0a  k->ignoreJump);.
12900 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d           VdbeCom
12910 6d 65 6e 74 28 28 76 2c 20 22 72 61 69 73 65 28  ment((v, "raise(
12920 49 47 4e 4f 52 45 29 22 29 29 3b 0a 20 20 20 20  IGNORE)"));.    
12930 20 20 7d 0a 20 20 20 20 20 20 73 74 61 63 6b 43    }.      stackC
12940 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  hng = 0;.      b
12950 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
12960 69 66 0a 20 20 7d 0a 20 20 69 66 28 20 69 6e 52  if.  }.  if( inR
12970 65 67 21 3d 74 61 72 67 65 74 20 29 7b 0a 20 20  eg!=target ){.  
12980 20 20 69 66 28 20 6f 72 69 67 54 61 72 67 65 74    if( origTarget
12990 21 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 73 71  !=-1 ){.      sq
129a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
129b0 76 2c 20 28 69 6e 52 65 67 3e 30 20 3f 20 4f 50  v, (inReg>0 ? OP
129c0 5f 53 43 6f 70 79 20 3a 20 4f 50 5f 4d 6f 76 65  _SCopy : OP_Move
129d0 29 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74  ), inReg, target
129e0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
129f0 20 20 20 20 74 61 72 67 65 74 20 3d 20 69 6e 52      target = inR
12a00 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74  eg;.    }.    st
12a10 61 63 6b 43 68 6e 67 20 3d 20 30 3b 0a 20 20 7d  ackChng = 0;.  }
12a20 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63  .  if( pParse->c
12a30 6b 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 70  kOffset ){.    p
12a40 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74 20  Parse->ckOffset 
12a50 2b 3d 20 73 74 61 63 6b 43 68 6e 67 3b 0a 20 20  += stackChng;.  
12a60 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
12a70 2d 3e 63 6b 4f 66 66 73 65 74 20 29 3b 0a 20 20  ->ckOffset );.  
12a80 7d 0a 20 20 72 65 74 75 72 6e 20 74 61 72 67 65  }.  return targe
12a90 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  t;.}..#ifndef SQ
12aa0 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
12ab0 52 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  R./*.** Generate
12ac0 20 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75   code that evalu
12ad0 74 65 73 20 74 68 65 20 67 69 76 65 6e 20 65 78  tes the given ex
12ae0 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 6c 65 61  pression and lea
12af0 76 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  ves the result.*
12b00 2a 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20  * on the stack. 
12b10 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
12b20 33 45 78 70 72 43 6f 64 65 28 29 2e 0a 2a 2a 0a  3ExprCode()..**.
12b30 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
12b40 6d 69 67 68 74 20 61 6c 73 6f 20 63 61 63 68 65  might also cache
12b50 20 74 68 65 20 72 65 73 75 6c 74 20 61 6e 64 20   the result and 
12b60 6d 6f 64 69 66 79 20 74 68 65 20 70 45 78 70 72  modify the pExpr
12b70 20 74 72 65 65 0a 2a 2a 20 73 6f 20 74 68 61 74   tree.** so that
12b80 20 69 74 20 77 69 6c 6c 20 6d 61 6b 65 20 75 73   it will make us
12b90 65 20 6f 66 20 74 68 65 20 63 61 63 68 65 64 20  e of the cached 
12ba0 72 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71  result on subseq
12bb0 75 65 6e 74 20 65 76 61 6c 75 61 74 69 6f 6e 73  uent evaluations
12bc0 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20  .** rather than 
12bd0 65 76 61 6c 75 61 74 65 20 74 68 65 20 77 68 6f  evaluate the who
12be0 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 67  le expression ag
12bf0 61 69 6e 2e 20 20 54 72 69 76 69 61 6c 20 65 78  ain.  Trivial ex
12c00 70 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a  pressions are.**
12c10 20 6e 6f 74 20 63 61 63 68 65 64 2e 20 20 49 66   not cached.  If
12c20 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
12c30 69 73 20 63 61 63 68 65 64 2c 20 69 74 73 20 72  is cached, its r
12c40 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64 20  esult is stored 
12c50 69 6e 20 61 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20  in a .** memory 
12c60 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  location..*/.voi
12c70 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
12c80 65 41 6e 64 43 61 63 68 65 28 50 61 72 73 65 20  eAndCache(Parse 
12c90 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
12ca0 45 78 70 72 29 7b 0a 20 20 56 64 62 65 20 2a 76  Expr){.  Vdbe *v
12cb0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
12cc0 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b  ;.  VdbeOp *pOp;
12cd0 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 20 20 69  .  int iMem;.  i
12ce0 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72 32 3b  nt addr1, addr2;
12cf0 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
12d00 74 75 72 6e 3b 0a 20 20 61 64 64 72 31 20 3d 20  turn;.  addr1 = 
12d10 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
12d20 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 73 71 6c  ntAddr(v);.  sql
12d30 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
12d40 72 73 65 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  rse, pExpr, 0);.
12d50 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65    addr2 = sqlite
12d60 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
12d70 28 76 29 3b 0a 20 20 69 66 28 20 61 64 64 72 32  (v);.  if( addr2
12d80 3e 61 64 64 72 31 2b 31 0a 20 20 20 7c 7c 20 28  >addr1+1.   || (
12d90 28 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  (pOp = sqlite3Vd
12da0 62 65 47 65 74 4f 70 28 76 2c 20 61 64 64 72 31  beGetOp(v, addr1
12db0 29 29 21 3d 30 20 26 26 20 70 4f 70 2d 3e 6f 70  ))!=0 && pOp->op
12dc0 63 6f 64 65 3d 3d 4f 50 5f 46 75 6e 63 74 69 6f  code==OP_Functio
12dd0 6e 29 20 29 7b 0a 20 20 20 20 69 4d 65 6d 20 3d  n) ){.    iMem =
12de0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
12df0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
12e00 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12e10 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70  AddOp2(v, OP_Cop
12e20 79 2c 20 30 2c 20 69 4d 65 6d 29 3b 0a 20 20 20  y, 0, iMem);.   
12e30 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
12e40 52 45 47 49 53 54 45 52 3b 0a 20 20 7d 0a 7d 0a  REGISTER;.  }.}.
12e50 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65  #endif../*.** Ge
12e60 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
12e70 20 70 75 73 68 65 73 20 74 68 65 20 76 61 6c 75   pushes the valu
12e80 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65  e of every eleme
12e90 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a  nt of the given.
12ea0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
12eb0 73 74 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63  st onto the stac
12ec0 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  k..**.** Return 
12ed0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
12ee0 65 6d 65 6e 74 73 20 70 75 73 68 65 64 20 6f 6e  ements pushed on
12ef0 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2f  to the stack..*/
12f00 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
12f10 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20  CodeExprList(.  
12f20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
12f30 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
12f40 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
12f50 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a  ist *pList,   /*
12f60 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
12f70 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64  list to be coded
12f80 20 2a 2f 0a 20 20 69 6e 74 20 74 61 72 67 65 74   */.  int target
12f90 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72           /* Wher
12fa0 65 20 74 6f 20 77 72 69 74 65 20 72 65 73 75 6c  e to write resul
12fb0 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  ts */.){.  struc
12fc0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
12fd0 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c  *pItem;.  int i,
12fe0 20 6e 2c 20 69 6e 63 72 20 3d 20 31 3b 0a 20 20   n, incr = 1;.  
12ff0 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
13000 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 70  eturn 0;.  n = p
13010 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69  List->nExpr;.  i
13020 66 28 20 74 61 72 67 65 74 3c 30 20 29 7b 0a 20  f( target<0 ){. 
13030 20 20 20 74 61 72 67 65 74 20 3d 20 70 50 61 72     target = pPar
13040 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
13050 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
13060 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 74  n;.  }else if( t
13070 61 72 67 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20  arget==0 ){.    
13080 69 6e 63 72 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  incr = 0;.  }.  
13090 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
130a0 3e 61 2c 20 69 3d 6e 3b 20 69 3e 30 3b 20 69 2d  >a, i=n; i>0; i-
130b0 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
130c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
130d0 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
130e0 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
130f0 20 20 20 20 74 61 72 67 65 74 20 2b 3d 20 69 6e      target += in
13100 63 72 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72  cr; .  }.  retur
13110 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  n n;.}../*.** Ge
13120 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
13130 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73  a boolean expres
13140 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  sion such that a
13150 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a   jump is made.**
13160 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64   to the label "d
13170 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72  est" if the expr
13180 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62  ession is true b
13190 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20  ut execution.** 
131a0 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67  continues straig
131b0 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65  ht thru if the e
131c0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c  xpression is fal
131d0 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
131e0 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c   expression eval
131f0 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e  uates to NULL (n
13200 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20  either true nor 
13210 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20  false), then.** 
13220 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66  take the jump if
13230 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   the jumpIfNull 
13240 66 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a  flag is true..**
13250 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65  .** This code de
13260 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63  pends on the fac
13270 74 20 74 68 61 74 20 63 65 72 74 61 69 6e 20 74  t that certain t
13280 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a  oken values (ex:
13290 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74   TK_EQ).** are t
132a0 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64  he same as opcod
132b0 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50  e values (ex: OP
132c0 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d  _Eq) that implem
132d0 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f  ent the correspo
132e0 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69  nding.** operati
132f0 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d  on.  Special com
13300 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20  ments in vdbe.c 
13310 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65  and the mkopcode
13320 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a  h.awk script in.
13330 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63  ** the make proc
13340 65 73 73 20 63 61 75 73 65 20 74 68 65 73 65 20  ess cause these 
13350 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e  values to align.
13360 20 20 41 73 73 65 72 74 28 29 73 20 69 6e 20 74    Assert()s in t
13370 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77  he code.** below
13380 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
13390 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69   numbers are ali
133a0 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a  gned correctly..
133b0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
133c0 78 70 72 49 66 54 72 75 65 28 50 61 72 73 65 20  xprIfTrue(Parse 
133d0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
133e0 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20  Expr, int dest, 
133f0 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b  int jumpIfNull){
13400 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
13410 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
13420 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  t op = 0;.  int 
13430 63 6b 4f 66 66 73 65 74 20 3d 20 70 50 61 72 73  ckOffset = pPars
13440 65 2d 3e 63 6b 4f 66 66 73 65 74 3b 0a 20 20 69  e->ckOffset;.  i
13450 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72  f( v==0 || pExpr
13460 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
13470 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
13480 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
13490 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
134a0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20   {.      int d2 
134b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
134c0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
134d0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
134e0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
134f0 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 21 6a  r->pLeft, d2, !j
13500 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
13510 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
13520 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
13530 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
13540 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
13550 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
13560 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
13570 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  2);.      break;
13580 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
13590 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 73  TK_OR: {.      s
135a0 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
135b0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
135c0 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
135d0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
135e0 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
135f0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
13600 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
13610 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
13620 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
13630 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
13640 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
13650 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
13660 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
13670 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
13680 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
13690 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
136a0 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
136b0 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
136c0 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
136d0 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
136e0 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
136f0 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 61  TK_EQ: {.      a
13700 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50  ssert( TK_LT==OP
13710 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Lt );.      ass
13720 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c  ert( TK_LE==OP_L
13730 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
13740 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20  t( TK_GT==OP_Gt 
13750 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
13760 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b   TK_GE==OP_Ge );
13770 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
13780 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20  K_EQ==OP_Eq );. 
13790 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
137a0 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20  NE==OP_Ne );.   
137b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
137c0 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
137d0 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20  ->pLeft, 0);.   
137e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
137f0 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
13800 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20  ->pRight, 0);.  
13810 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
13820 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
13830 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  Left, pExpr->pRi
13840 67 68 74 2c 20 6f 70 2c 20 64 65 73 74 2c 20 6a  ght, op, dest, j
13850 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
13860 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
13870 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
13880 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
13890 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
138a0 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c  assert( TK_ISNUL
138b0 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a  L==OP_IsNull );.
138c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
138d0 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74  _NOTNULL==OP_Not
138e0 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 73 71  Null );.      sq
138f0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
13900 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
13910 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  ft, 0);.      sq
13920 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13930 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b  v, op, 1, dest);
13940 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
13950 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
13960 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
13970 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
13980 6f 6e 20 22 78 20 42 45 54 57 45 45 4e 20 79 20  on "x BETWEEN y 
13990 41 4e 44 20 7a 22 20 69 73 20 69 6d 70 6c 65 6d  AND z" is implem
139a0 65 6e 74 65 64 20 61 73 3a 0a 20 20 20 20 20 20  ented as:.      
139b0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 31 20 49 46  **.      ** 1 IF
139c0 20 28 78 20 3c 20 79 29 20 47 4f 54 4f 20 33 0a   (x < y) GOTO 3.
139d0 20 20 20 20 20 20 2a 2a 20 32 20 49 46 20 28 78        ** 2 IF (x
139e0 20 3c 3d 20 7a 29 20 47 4f 54 4f 20 3c 64 65 73   <= z) GOTO <des
139f0 74 3e 0a 20 20 20 20 20 20 2a 2a 20 33 20 2e 2e  t>.      ** 3 ..
13a00 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
13a10 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
13a20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
13a30 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
13a40 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
13a50 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  = pExpr->pList->
13a60 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[0].pExpr;.    
13a70 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
13a80 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  e(pParse, pLeft,
13a90 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
13aa0 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
13ab0 4f 50 5f 43 6f 70 79 29 3b 0a 20 20 20 20 20 20  OP_Copy);.      
13ac0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
13ad0 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20  pParse, pRight, 
13ae0 30 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  0);.      addr =
13af0 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
13b00 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
13b10 68 74 2c 20 4f 50 5f 4c 74 2c 20 30 2c 20 21 6a  ht, OP_Lt, 0, !j
13b20 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20  umpIfNull);..   
13b30 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70     pRight = pExp
13b40 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  r->pList->a[1].p
13b50 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
13b60 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
13b70 73 65 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a  se, pRight, 0);.
13b80 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
13b90 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  e(pParse, pLeft,
13ba0 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20   pRight, OP_Le, 
13bb0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
13bc0 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
13bd0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13be0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29  P_Integer, 0, 0)
13bf0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
13c00 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
13c10 64 64 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ddr);.      sqli
13c20 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13c30 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a   OP_Pop, 1, 0);.
13c40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13c50 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
13c60 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
13c70 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
13c80 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  pExpr, 0);.     
13c90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13ca0 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 6a 75 6d  p2(v, OP_If, jum
13cb0 70 49 66 4e 75 6c 6c 2c 20 64 65 73 74 29 3b 0a  pIfNull, dest);.
13cc0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13cd0 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d   }.  }.  pParse-
13ce0 3e 63 6b 4f 66 66 73 65 74 20 3d 20 63 6b 4f 66  >ckOffset = ckOf
13cf0 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  fset;.}../*.** G
13d00 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
13d10 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65   a boolean expre
13d20 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20  ssion such that 
13d30 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a  a jump is made.*
13d40 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22  * to the label "
13d50 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70  dest" if the exp
13d60 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65  ression is false
13d70 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a   but execution.*
13d80 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61  * continues stra
13d90 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65  ight thru if the
13da0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
13db0 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  rue..**.** If th
13dc0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61  e expression eva
13dd0 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28  luates to NULL (
13de0 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72  neither true nor
13df0 20 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20   false) then.** 
13e00 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75  jump if jumpIfNu
13e10 6c 6c 20 69 73 20 74 72 75 65 20 6f 72 20 66 61  ll is true or fa
13e20 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75  ll through if ju
13e30 6d 70 49 66 4e 75 6c 6c 20 69 73 20 66 61 6c 73  mpIfNull is fals
13e40 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
13e50 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 50 61  e3ExprIfFalse(Pa
13e60 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
13e70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65  r *pExpr, int de
13e80 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  st, int jumpIfNu
13e90 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ll){.  Vdbe *v =
13ea0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
13eb0 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20    int op = 0;.  
13ec0 69 6e 74 20 63 6b 4f 66 66 73 65 74 20 3d 20 70  int ckOffset = p
13ed0 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74 3b  Parse->ckOffset;
13ee0 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70  .  if( v==0 || p
13ef0 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
13f00 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75  ;..  /* The valu
13f10 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61  e of pExpr->op a
13f20 6e 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65  nd op are relate
13f30 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  d as follows:.  
13f40 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45  **.  **       pE
13f50 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20  xpr->op         
13f60 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20     op.  **      
13f70 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20   ---------      
13f80 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20      ----------. 
13f90 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e   **       TK_ISN
13fa0 55 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f  ULL          OP_
13fb0 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20  NotNull.  **    
13fc0 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20     TK_NOTNULL   
13fd0 20 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a        OP_IsNull.
13fe0 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45    **       TK_NE
13ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
14000 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Eq.  **       T
14010 4b 5f 45 51 20 20 20 20 20 20 20 20 20 20 20 20  K_EQ            
14020 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20    OP_Ne.  **    
14030 20 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20     TK_GT        
14040 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a        OP_Le.  **
14050 20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20         TK_LE    
14060 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a            OP_Gt.
14070 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45    **       TK_GE
14080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
14090 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Lt.  **       T
140a0 4b 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20 20  K_LT            
140b0 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a    OP_Ge.  **.  *
140c0 2a 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75  * For other valu
140d0 65 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c  es of pExpr->op,
140e0 20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64   op is undefined
140f0 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a   and unused..  *
14100 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54  * The value of T
14110 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74  K_ and OP_ const
14120 61 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67 65  ants are arrange
14130 64 20 73 75 63 68 20 74 68 61 74 20 77 65 0a 20  d such that we. 
14140 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20   ** can compute 
14150 74 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76  the mapping abov
14160 65 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c  e using the foll
14170 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e  owing expression
14180 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73  ..  ** Assert()s
14190 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
141a0 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20   computation is 
141b0 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20  correct..  */.  
141c0 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70  op = ((pExpr->op
141d0 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e  +(TK_ISNULL&1))^
141e0 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29  1)-(TK_ISNULL&1)
141f0 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63  ;..  /* Verify c
14200 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74  orrect alignment
14210 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20   of TK_ and OP_ 
14220 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20  constants.  */. 
14230 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
14240 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c  op!=TK_ISNULL ||
14250 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20   op==OP_NotNull 
14260 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
14270 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55  pr->op!=TK_NOTNU
14280 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e  LL || op==OP_IsN
14290 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ull );.  assert(
142a0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e   pExpr->op!=TK_N
142b0 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29  E || op==OP_Eq )
142c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
142d0 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20  r->op!=TK_EQ || 
142e0 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61  op==OP_Ne );.  a
142f0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
14300 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_LT || op==O
14310 50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Ge );.  assert
14320 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
14330 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20  LE || op==OP_Gt 
14340 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
14350 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c  pr->op!=TK_GT ||
14360 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20   op==OP_Le );.  
14370 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
14380 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_GE || op==
14390 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74  OP_Lt );..  swit
143a0 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
143b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
143c0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
143d0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
143e0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
143f0 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
14400 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
14410 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
14420 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
14430 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
14440 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
14450 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
14460 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20  case TK_OR: {.  
14470 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
14480 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
14490 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  l(v);.      sqli
144a0 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
144b0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
144c0 66 74 2c 20 64 32 2c 20 21 6a 75 6d 70 49 66 4e  ft, d2, !jumpIfN
144d0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
144e0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
144f0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
14500 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
14510 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
14520 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
14530 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20  eLabel(v, d2);. 
14540 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14550 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  }.    case TK_NO
14560 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
14570 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
14580 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
14590 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
145a0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
145b0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
145c0 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
145d0 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
145e0 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
145f0 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73  e TK_GE:.    cas
14600 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
14610 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20  e TK_EQ: {.     
14620 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
14630 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
14640 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20  pLeft, 0);.     
14650 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
14660 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
14670 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20  pRight, 0);.    
14680 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
14690 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
146a0 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
146b0 74 2c 20 6f 70 2c 20 64 65 73 74 2c 20 6a 75 6d  t, op, dest, jum
146c0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
146d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
146e0 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
146f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
14700 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71  NULL: {.      sq
14710 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
14720 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
14730 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  ft, 0);.      sq
14740 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14750 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b  v, op, 1, dest);
14760 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14770 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
14780 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
14790 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
147a0 6f 6e 20 69 73 20 22 78 20 42 45 54 57 45 45 4e  on is "x BETWEEN
147b0 20 79 20 41 4e 44 20 7a 22 2e 20 49 74 20 69 73   y AND z". It is
147c0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 3a   implemented as:
147d0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
147e0 2a 2a 20 31 20 49 46 20 28 78 20 3e 3d 20 79 29  ** 1 IF (x >= y)
147f0 20 47 4f 54 4f 20 33 0a 20 20 20 20 20 20 2a 2a   GOTO 3.      **
14800 20 32 20 47 4f 54 4f 20 3c 64 65 73 74 3e 0a 20   2 GOTO <dest>. 
14810 20 20 20 20 20 2a 2a 20 33 20 49 46 20 28 78 20       ** 3 IF (x 
14820 3e 20 7a 29 20 47 4f 54 4f 20 3c 64 65 73 74 3e  > z) GOTO <dest>
14830 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
14840 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
14850 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
14860 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
14870 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
14880 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
14890 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [0].pExpr;.     
148a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
148b0 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
148c0 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
148d0 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
148e0 50 5f 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 73  P_Copy);.      s
148f0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
14900 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 30  Parse, pRight, 0
14910 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
14920 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
14930 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
14940 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
14950 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
14960 68 74 2c 20 4f 50 5f 47 65 2c 20 61 64 64 72 2b  ht, OP_Ge, addr+
14970 33 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  3, !jumpIfNull);
14980 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ..      sqlite3V
14990 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
149a0 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  Pop, 1, 0);.    
149b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
149c0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
149d0 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  0, dest);.      
149e0 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
149f0 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
14a00 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
14a10 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
14a20 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20   pRight, 0);.   
14a30 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
14a40 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52  Parse, pLeft, pR
14a50 69 67 68 74 2c 20 4f 50 5f 47 74 2c 20 64 65 73  ight, OP_Gt, des
14a60 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
14a70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14a80 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
14a90 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
14aa0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
14ab0 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  pExpr, 0);.     
14ac0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14ad0 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p2(v, OP_IfNot, 
14ae0 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73 74  jumpIfNull, dest
14af0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
14b00 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72      }.  }.  pPar
14b10 73 65 2d 3e 63 6b 4f 66 66 73 65 74 20 3d 20 63  se->ckOffset = c
14b20 6b 4f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  kOffset;.}../*.*
14b30 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d 70  * Do a deep comp
14b40 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78  arison of two ex
14b50 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e 20  pression trees. 
14b60 20 52 65 74 75 72 6e 20 54 52 55 45 20 28 6e 6f   Return TRUE (no
14b70 6e 2d 7a 65 72 6f 29 0a 2a 2a 20 69 66 20 74 68  n-zero).** if th
14b80 65 79 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c  ey are identical
14b90 20 61 6e 64 20 72 65 74 75 72 6e 20 46 41 4c 53   and return FALS
14ba0 45 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72  E if they differ
14bb0 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a   in any way..**.
14bc0 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 69  ** Sometimes thi
14bd0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
14be0 65 74 75 72 6e 20 46 41 4c 53 45 20 65 76 65 6e  eturn FALSE even
14bf0 20 69 66 20 74 68 65 20 74 77 6f 20 65 78 70 72   if the two expr
14c00 65 73 73 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c  essions.** reall
14c10 79 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74  y are equivalent
14c20 2e 20 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20  .  If we cannot 
14c30 70 72 6f 76 65 20 74 68 61 74 20 74 68 65 20 65  prove that the e
14c40 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a  xpressions are.*
14c50 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 77 65 20  * identical, we 
14c60 72 65 74 75 72 6e 20 46 41 4c 53 45 20 6a 75 73  return FALSE jus
14c70 74 20 74 6f 20 62 65 20 73 61 66 65 2e 20 20 53  t to be safe.  S
14c80 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  o if this routin
14c90 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 66 61 6c  e.** returns fal
14ca0 73 65 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20  se, then you do 
14cb0 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20  not really know 
14cc0 66 6f 72 20 63 65 72 74 61 69 6e 20 69 66 20 74  for certain if t
14cd0 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73  he two.** expres
14ce0 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61  sions are the sa
14cf0 6d 65 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20  me.  But if you 
14d00 67 65 74 20 61 20 54 52 55 45 20 72 65 74 75 72  get a TRUE retur
14d10 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63  n, then you.** c
14d20 61 6e 20 62 65 20 73 75 72 65 20 74 68 65 20 65  an be sure the e
14d30 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74  xpressions are t
14d40 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74 68 65  he same.  In the
14d50 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a 2a 2a   places where.**
14d60 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
14d70 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73 20 6e   used, it does n
14d80 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74 20 61  ot hurt to get a
14d90 6e 20 65 78 74 72 61 20 46 41 4c 53 45 20 2d 20  n extra FALSE - 
14da0 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67  that.** just mig
14db0 68 74 20 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d  ht result in som
14dc0 65 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65  e slightly slowe
14dd0 72 20 63 6f 64 65 2e 20 20 42 75 74 20 72 65 74  r code.  But ret
14de0 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63  urning.** an inc
14df0 6f 72 72 65 63 74 20 54 52 55 45 20 63 6f 75 6c  orrect TRUE coul
14e00 64 20 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66  d lead to a malf
14e10 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  unction..*/.int 
14e20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
14e30 72 65 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70  re(Expr *pA, Exp
14e40 72 20 2a 70 42 29 7b 0a 20 20 69 6e 74 20 69 3b  r *pB){.  int i;
14e50 0a 20 20 69 66 28 20 70 41 3d 3d 30 7c 7c 70 42  .  if( pA==0||pB
14e60 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
14e70 6e 20 70 42 3d 3d 70 41 3b 0a 20 20 7d 0a 20 20  n pB==pA;.  }.  
14e80 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e  if( pA->op!=pB->
14e90 6f 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  op ) return 0;. 
14ea0 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20   if( (pA->flags 
14eb0 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 21 3d  & EP_Distinct)!=
14ec0 28 70 42 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  (pB->flags & EP_
14ed0 44 69 73 74 69 6e 63 74 29 20 29 20 72 65 74 75  Distinct) ) retu
14ee0 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c  rn 0;.  if( !sql
14ef0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
14f00 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70  pA->pLeft, pB->p
14f10 4c 65 66 74 29 20 29 20 72 65 74 75 72 6e 20 30  Left) ) return 0
14f20 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
14f30 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e  ExprCompare(pA->
14f40 70 52 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67  pRight, pB->pRig
14f50 68 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ht) ) return 0;.
14f60 20 20 69 66 28 20 70 41 2d 3e 70 4c 69 73 74 20    if( pA->pList 
14f70 29 7b 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 70  ){.    if( pB->p
14f80 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
14f90 20 30 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e   0;.    if( pA->
14fa0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 42  pList->nExpr!=pB
14fb0 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  ->pList->nExpr )
14fc0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 66   return 0;.    f
14fd0 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 70 4c  or(i=0; i<pA->pL
14fe0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
14ff0 7b 0a 20 20 20 20 20 20 69 66 28 20 21 73 71 6c  {.      if( !sql
15000 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
15010 70 41 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  pA->pList->a[i].
15020 70 45 78 70 72 2c 20 70 42 2d 3e 70 4c 69 73 74  pExpr, pB->pList
15030 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b  ->a[i].pExpr) ){
15040 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
15050 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
15060 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 2d  .  }else if( pB-
15070 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 72 65  >pList ){.    re
15080 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
15090 28 20 70 41 2d 3e 70 53 65 6c 65 63 74 20 7c 7c  ( pA->pSelect ||
150a0 20 70 42 2d 3e 70 53 65 6c 65 63 74 20 29 20 72   pB->pSelect ) r
150b0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
150c0 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69  A->iTable!=pB->i
150d0 54 61 62 6c 65 20 7c 7c 20 70 41 2d 3e 69 43 6f  Table || pA->iCo
150e0 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d  lumn!=pB->iColum
150f0 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  n ) return 0;.  
15100 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43  if( pA->op!=TK_C
15110 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 74 6f 6b  OLUMN && pA->tok
15120 65 6e 2e 7a 20 29 7b 0a 20 20 20 20 69 66 28 20  en.z ){.    if( 
15130 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29  pB->token.z==0 )
15140 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69   return 0;.    i
15150 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d  f( pB->token.n!=
15160 70 41 2d 3e 74 6f 6b 65 6e 2e 6e 20 29 20 72 65  pA->token.n ) re
15170 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20  turn 0;.    if( 
15180 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
15190 28 63 68 61 72 2a 29 70 41 2d 3e 74 6f 6b 65 6e  (char*)pA->token
151a0 2e 7a 2c 28 63 68 61 72 2a 29 70 42 2d 3e 74 6f  .z,(char*)pB->to
151b0 6b 65 6e 2e 7a 2c 70 42 2d 3e 74 6f 6b 65 6e 2e  ken.z,pB->token.
151c0 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  n)!=0 ){.      r
151d0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
151e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
151f0 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  .../*.** Add a n
15200 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
15210 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  e pAggInfo->aCol
15220 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72  [] array.  Retur
15230 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a  n the index of.*
15240 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e  * the new elemen
15250 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67  t.  Return a neg
15260 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20  ative number if 
15270 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f  malloc fails..*/
15280 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41  .static int addA
15290 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c  ggInfoColumn(sql
152a0 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66  ite3 *db, AggInf
152b0 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74  o *pInfo){.  int
152c0 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f   i;.  pInfo->aCo
152d0 6c 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79  l = sqlite3Array
152e0 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20  Allocate(.      
152f0 20 64 62 2c 0a 20 20 20 20 20 20 20 70 49 6e 66   db,.       pInf
15300 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20  o->aCol,.       
15310 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43  sizeof(pInfo->aC
15320 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 33  ol[0]),.       3
15330 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d  ,.       &pInfo-
15340 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  >nColumn,.      
15350 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e   &pInfo->nColumn
15360 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 20 26 69  Alloc,.       &i
15370 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  .  );.  return i
15380 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41  ;.}    ../*.** A
15390 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
153a0 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f   to the pAggInfo
153b0 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e  ->aFunc[] array.
153c0 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64    Return the ind
153d0 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ex of.** the new
153e0 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72   element.  Retur
153f0 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  n a negative num
15400 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61  ber if malloc fa
15410 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
15420 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e  nt addAggInfoFun
15430 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41  c(sqlite3 *db, A
15440 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a  ggInfo *pInfo){.
15450 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f    int i;.  pInfo
15460 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69 74 65  ->aFunc = sqlite
15470 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a  3ArrayAllocate(.
15480 20 20 20 20 20 20 20 64 62 2c 20 0a 20 20 20 20         db, .    
15490 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c     pInfo->aFunc,
154a0 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70  .       sizeof(p
154b0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c  Info->aFunc[0]),
154c0 0a 20 20 20 20 20 20 20 33 2c 0a 20 20 20 20 20  .       3,.     
154d0 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c    &pInfo->nFunc,
154e0 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e  .       &pInfo->
154f0 6e 46 75 6e 63 41 6c 6c 6f 63 2c 0a 20 20 20 20  nFuncAlloc,.    
15500 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74     &i.  );.  ret
15510 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a  urn i;.}    ../*
15520 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 78  .** This is an x
15530 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b 45 78 70  Func for walkExp
15540 72 54 72 65 65 28 29 20 75 73 65 64 20 74 6f 20  rTree() used to 
15550 69 6d 70 6c 65 6d 65 6e 74 20 0a 2a 2a 20 73 71  implement .** sq
15560 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
15570 41 67 67 72 65 67 61 74 65 73 28 29 2e 20 20 53  Aggregates().  S
15580 65 65 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  ee sqlite3ExprAn
15590 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 0a  alyzeAggregates.
155a0 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ** for additiona
155b0 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
155c0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
155d0 65 20 61 6e 61 6c 79 7a 65 73 20 74 68 65 20 61  e analyzes the a
155e0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
155f0 6e 20 61 74 20 70 45 78 70 72 2e 0a 2a 2f 0a 73  n at pExpr..*/.s
15600 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a  tatic int analyz
15610 65 41 67 67 72 65 67 61 74 65 28 76 6f 69 64 20  eAggregate(void 
15620 2a 70 41 72 67 2c 20 45 78 70 72 20 2a 70 45 78  *pArg, Expr *pEx
15630 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  pr){.  int i;.  
15640 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
15650 20 3d 20 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20   = (NameContext 
15660 2a 29 70 41 72 67 3b 0a 20 20 50 61 72 73 65 20  *)pArg;.  Parse 
15670 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  *pParse = pNC->p
15680 50 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73 74  Parse;.  SrcList
15690 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43   *pSrcList = pNC
156a0 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 41 67  ->pSrcList;.  Ag
156b0 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20  gInfo *pAggInfo 
156c0 3d 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b  = pNC->pAggInfo;
156d0 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
156e0 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
156f0 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
15700 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
15710 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  UMN: {.      /* 
15720 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
15730 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e  the column is in
15740 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c   one of the tabl
15750 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20  es in the FROM. 
15760 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f       ** clause o
15770 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
15780 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69  query */.      i
15790 66 28 20 70 53 72 63 4c 69 73 74 20 29 7b 0a 20  f( pSrcList ){. 
157a0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72         struct Sr
157b0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
157c0 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b  m = pSrcList->a;
157d0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
157e0 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53  ; i<pSrcList->nS
157f0 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
15800 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  ){.          str
15810 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
15820 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20  *pCol;.         
15830 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62   if( pExpr->iTab
15840 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73  le==pItem->iCurs
15850 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  or ){.          
15860 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
15870 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20   this point, it 
15880 6d 65 61 6e 73 20 74 68 61 74 20 70 45 78 70 72  means that pExpr
15890 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
158a0 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  le.            *
158b0 2a 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65  * that is in the
158c0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
158d0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75  the aggregate qu
158e0 65 72 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20  ery.  .         
158f0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
15900 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74    ** Make an ent
15910 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ry for the colum
15920 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61  n in pAggInfo->a
15930 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20  Col[] if there. 
15940 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73             ** is
15950 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68   not an entry th
15960 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20  ere already..   
15970 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
15980 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20          int k;. 
15990 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20             pCol 
159a0 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  = pAggInfo->aCol
159b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
159c0 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66  r(k=0; k<pAggInf
159d0 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c  o->nColumn; k++,
159e0 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   pCol++){.      
159f0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
15a00 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d  ->iTable==pExpr-
15a10 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20  >iTable &&.     
15a20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
15a30 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70  l->iColumn==pExp
15a40 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  r->iColumn ){.  
15a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
15a60 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
15a70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
15a80 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
15a90 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d  f( (k>=pAggInfo-
15aa0 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20  >nColumn).      
15ab0 20 20 20 20 20 20 20 26 26 20 28 6b 20 3d 20 61         && (k = a
15ac0 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28  ddAggInfoColumn(
15ad0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67  pParse->db, pAgg
15ae0 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20  Info))>=0 .     
15af0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
15b00 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26          pCol = &
15b10 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b  pAggInfo->aCol[k
15b20 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
15b30 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45   pCol->pTab = pE
15b40 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  xpr->pTab;.     
15b50 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
15b60 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69  Table = pExpr->i
15b70 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
15b80 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75       pCol->iColu
15b90 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  mn = pExpr->iCol
15ba0 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  umn;.           
15bb0 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20     pCol->iMem = 
15bc0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
15bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
15be0 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
15bf0 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  n = -1;.        
15c00 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70        pCol->pExp
15c10 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  r = pExpr;.     
15c20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 41 67           if( pAg
15c30 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20  gInfo->pGroupBy 
15c40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
15c50 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20     int j, n;.   
15c60 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
15c70 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67  rList *pGB = pAg
15c80 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b  gInfo->pGroupBy;
15c90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15ca0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
15cb0 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70  _item *pTerm = p
15cc0 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20  GB->a;.         
15cd0 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e         n = pGB->
15ce0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  nExpr;.         
15cf0 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
15d00 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b  j<n; j++, pTerm+
15d10 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
15d20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
15d30 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
15d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d50 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
15d60 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54  COLUMN && pE->iT
15d70 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61  able==pExpr->iTa
15d80 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20  ble &&.         
15d90 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 2d               pE-
15da0 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d  >iColumn==pExpr-
15db0 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
15dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15dd0 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
15de0 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  umn = j;.       
15df0 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
15e00 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
15e10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15e20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15e30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15e40 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
15e50 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c  ->iSorterColumn<
15e60 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
15e70 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
15e80 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49  erColumn = pAggI
15e90 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c  nfo->nSortingCol
15ea0 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  umn++;.         
15eb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
15ec0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
15ed0 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77   /* There is now
15ee0 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45   an entry for pE
15ef0 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  xpr in pAggInfo-
15f00 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a  >aCol[] (either.
15f10 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62              ** b
15f20 65 63 61 75 73 65 20 69 74 20 77 61 73 20 74 68  ecause it was th
15f30 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65  ere before or be
15f40 63 61 75 73 65 20 77 65 20 6a 75 73 74 20 63 72  cause we just cr
15f50 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20  eated it)..     
15f60 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72         ** Conver
15f70 74 20 74 68 65 20 70 45 78 70 72 20 74 6f 20 62  t the pExpr to b
15f80 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  e a TK_AGG_COLUM
15f90 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74  N referring to t
15fa0 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  hat.            
15fb0 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  ** pAggInfo->aCo
15fc0 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20  l[] entry..     
15fd0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
15fe0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67        pExpr->pAg
15ff0 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f  gInfo = pAggInfo
16000 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
16010 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47  xpr->op = TK_AGG
16020 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20  _COLUMN;.       
16030 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67       pExpr->iAgg
16040 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20   = k;.          
16050 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
16060 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45     } /* endif pE
16070 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74  xpr->iTable==pIt
16080 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20  em->iCursor */. 
16090 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20         } /* end 
160a0 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63 4c 69  loop over pSrcLi
160b0 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  st */.      }.  
160c0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
160d0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
160e0 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a  AGG_FUNCTION: {.
160f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 4e 43        /* The pNC
16100 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 74 65 73 74  ->nDepth==0 test
16110 20 63 61 75 73 65 73 20 61 67 67 72 65 67 61 74   causes aggregat
16120 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 73  e functions in s
16130 75 62 71 75 65 72 69 65 73 0a 20 20 20 20 20 20  ubqueries.      
16140 2a 2a 20 74 6f 20 62 65 20 69 67 6e 6f 72 65 64  ** to be ignored
16150 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4e   */.      if( pN
16160 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 29 7b 0a  C->nDepth==0 ){.
16170 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
16180 20 74 6f 20 73 65 65 20 69 66 20 70 45 78 70 72   to see if pExpr
16190 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20   is a duplicate 
161a0 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65  of another aggre
161b0 67 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  gate .        **
161c0 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69   function that i
161d0 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
161e0 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74   pAggInfo struct
161f0 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ure.        */. 
16200 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
16210 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65  gInfo_func *pIte
16220 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  m = pAggInfo->aF
16230 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  unc;.        for
16240 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f  (i=0; i<pAggInfo
16250 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49  ->nFunc; i++, pI
16260 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
16270 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
16280 72 43 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e  rCompare(pItem->
16290 70 45 78 70 72 2c 20 70 45 78 70 72 29 20 29 7b  pExpr, pExpr) ){
162a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
162b0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
162c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
162d0 20 20 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66    if( i>=pAggInf
162e0 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20  o->nFunc ){.    
162f0 20 20 20 20 20 20 2f 2a 20 70 45 78 70 72 20 69        /* pExpr i
16300 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b  s original.  Mak
16310 65 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  e a new entry in
16320 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
16330 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  [].          */.
16340 20 20 20 20 20 20 20 20 20 20 75 38 20 65 6e 63            u8 enc
16350 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64   = ENC(pParse->d
16360 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20  b);.          i 
16370 3d 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63  = addAggInfoFunc
16380 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67  (pParse->db, pAg
16390 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  gInfo);.        
163a0 20 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20    if( i>=0 ){.  
163b0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 20            pItem 
163c0 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  = &pAggInfo->aFu
163d0 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  nc[i];.         
163e0 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20     pItem->pExpr 
163f0 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
16400 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d       pItem->iMem
16410 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
16420 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  m;.            p
16430 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71  Item->pFunc = sq
16440 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
16450 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20  n(pParse->db,.  
16460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16470 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74   (char*)pExpr->t
16480 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74  oken.z, pExpr->t
16490 6f 6b 65 6e 2e 6e 2c 0a 20 20 20 20 20 20 20 20  oken.n,.        
164a0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
164b0 2d 3e 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d  ->pList ? pExpr-
164c0 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20  >pList->nExpr : 
164d0 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20  0, enc, 0);.    
164e0 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
164f0 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69  r->flags & EP_Di
16500 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20  stinct ){.      
16510 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
16520 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73  Distinct = pPars
16530 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
16540 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
16550 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
16560 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d  m->iDistinct = -
16570 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
16580 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
16590 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
165a0 2a 20 4d 61 6b 65 20 70 45 78 70 72 20 70 6f 69  * Make pExpr poi
165b0 6e 74 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70  nt to the approp
165c0 72 69 61 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e  riate pAggInfo->
165d0 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20  aFunc[] entry.  
165e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
165f0 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 69   pExpr->iAgg = i
16600 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
16610 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67  >pAggInfo = pAgg
16620 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 72 65  Info;.        re
16630 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
16640 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
16650 52 65 63 75 72 73 69 76 65 6c 79 20 77 61 6c 6b  Recursively walk
16660 20 73 75 62 71 75 65 72 69 65 73 20 6c 6f 6f 6b   subqueries look
16670 69 6e 67 20 66 6f 72 20 54 4b 5f 43 4f 4c 55 4d  ing for TK_COLUM
16680 4e 20 6e 6f 64 65 73 20 74 68 61 74 20 6e 65 65  N nodes that nee
16690 64 0a 20 20 2a 2a 20 74 6f 20 62 65 20 63 68 61  d.  ** to be cha
166a0 6e 67 65 64 20 74 6f 20 54 4b 5f 41 47 47 5f 43  nged to TK_AGG_C
166b0 4f 4c 55 4d 4e 2e 20 20 42 75 74 20 69 6e 63 72  OLUMN.  But incr
166c0 65 6d 65 6e 74 20 6e 44 65 70 74 68 20 73 6f 20  ement nDepth so 
166d0 74 68 61 74 0a 20 20 2a 2a 20 54 4b 5f 41 47 47  that.  ** TK_AGG
166e0 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20  _FUNCTION nodes 
166f0 69 6e 20 73 75 62 71 75 65 72 69 65 73 20 77 69  in subqueries wi
16700 6c 6c 20 62 65 20 75 6e 63 68 61 6e 67 65 64 2e  ll be unchanged.
16710 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  .  */.  if( pExp
16720 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  r->pSelect ){.  
16730 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2b 2b 3b    pNC->nDepth++;
16740 0a 20 20 20 20 77 61 6c 6b 53 65 6c 65 63 74 45  .    walkSelectE
16750 78 70 72 28 70 45 78 70 72 2d 3e 70 53 65 6c 65  xpr(pExpr->pSele
16760 63 74 2c 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  ct, analyzeAggre
16770 67 61 74 65 2c 20 70 4e 43 29 3b 0a 20 20 20 20  gate, pNC);.    
16780 70 4e 43 2d 3e 6e 44 65 70 74 68 2d 2d 3b 0a 20  pNC->nDepth--;. 
16790 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
167a0 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  ../*.** Analyze 
167b0 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
167c0 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  sion looking for
167d0 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
167e0 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
167f0 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e  variables that n
16800 65 65 64 20 74 6f 20 62 65 20 61 64 64 65 64 20  eed to be added 
16810 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61  to the pParse->a
16820 41 67 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 20  Agg[] array..** 
16830 4d 61 6b 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  Make additional 
16840 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65 20 70  entries to the p
16850 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72  Parse->aAgg[] ar
16860 72 61 79 20 61 73 20 6e 65 63 65 73 73 61 72 79  ray as necessary
16870 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
16880 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  tine should only
16890 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72   be called after
168a0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
168b0 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c  has been.** anal
168c0 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 45  yzed by sqlite3E
168d0 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28  xprResolveNames(
168e0 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 72 72 6f  )..**.** If erro
168f0 72 73 20 61 72 65 20 73 65 65 6e 2c 20 6c 65 61  rs are seen, lea
16900 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
16910 61 67 65 20 69 6e 20 7a 45 72 72 4d 73 67 20 61  age in zErrMsg a
16920 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65  nd return.** the
16930 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
16940 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
16950 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
16960 65 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65  egates(NameConte
16970 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70  xt *pNC, Expr *p
16980 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 6e 45 72  Expr){.  int nEr
16990 72 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d  r = pNC->pParse-
169a0 3e 6e 45 72 72 3b 0a 20 20 77 61 6c 6b 45 78 70  >nErr;.  walkExp
169b0 72 54 72 65 65 28 70 45 78 70 72 2c 20 61 6e 61  rTree(pExpr, ana
169c0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 2c 20 70  lyzeAggregate, p
169d0 4e 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e  NC);.  return pN
169e0 43 2d 3e 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  C->pParse->nErr 
169f0 2d 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  - nErr;.}../*.**
16a00 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70   Call sqlite3Exp
16a10 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
16a20 65 73 28 29 20 66 6f 72 20 65 76 65 72 79 20 65  es() for every e
16a30 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a  xpression in an.
16a40 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
16a50 73 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  st.  Return the 
16a60 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
16a70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
16a80 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68  ror is found, th
16a90 65 20 61 6e 61 6c 79 73 69 73 20 69 73 20 63 75  e analysis is cu
16aa0 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 69 6e 74 20  t short..*/.int 
16ab0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
16ac0 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f  zeAggList(NameCo
16ad0 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72  ntext *pNC, Expr
16ae0 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
16af0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
16b00 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
16b10 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 45 72 72  nt i;.  int nErr
16b20 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4c 69 73   = 0;.  if( pLis
16b30 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49 74  t ){.    for(pIt
16b40 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
16b50 3b 20 6e 45 72 72 3d 3d 30 20 26 26 20 69 3c 70  ; nErr==0 && i<p
16b60 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
16b70 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
16b80 20 20 6e 45 72 72 20 2b 3d 20 73 71 6c 69 74 65    nErr += sqlite
16b90 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
16ba0 65 67 61 74 65 73 28 70 4e 43 2c 20 70 49 74 65  egates(pNC, pIte
16bb0 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d  m->pExpr);.    }
16bc0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45  .  }.  return nE
16bd0 72 72 3b 0a 7d 0a                                rr;.}.