/ Hex Artifact Content
Login

Artifact 99efbe91c16bc8a8dde1bb2d208a1246c07180d6:


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 35 20 32 30 30 38 2f 30 31 2f 30 36 20  .335 2008/01/06 
0220: 30 30 3a 32 35 3a 32 32 20 64 72 68 20 45 78 70  00:25:22 drh Exp
0230: 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22   $.*/.#include "
0240: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e  sqliteInt.h".#in
0250: 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a  clude <ctype.h>.
0260: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0270: 65 20 27 61 66 66 69 6e 69 74 79 27 20 6f 66 20  e 'affinity' of 
0280: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
0290: 45 78 70 72 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a  Expr if any..**.
02a0: 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61  ** If pExpr is a
02b0: 20 63 6f 6c 75 6d 6e 2c 20 61 20 72 65 66 65 72   column, a refer
02c0: 65 6e 63 65 20 74 6f 20 61 20 63 6f 6c 75 6d 6e  ence to a column
02d0: 20 76 69 61 20 61 6e 20 27 41 53 27 20 61 6c 69   via an 'AS' ali
02e0: 61 73 2c 0a 2a 2a 20 6f 72 20 61 20 73 75 62 2d  as,.** or a sub-
02f0: 73 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f  select with a co
0300: 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 65 74 75  lumn as the retu
0310: 72 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  rn value, then t
0320: 68 65 20 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20  he .** affinity 
0330: 6f 66 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69  of that column i
0340: 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
0350: 72 77 69 73 65 2c 20 30 78 30 30 20 69 73 20 72  rwise, 0x00 is r
0360: 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 69 6e 64 69  eturned,.** indi
0370: 63 61 74 69 6e 67 20 6e 6f 20 61 66 66 69 6e 69  cating no affini
0380: 74 79 20 66 6f 72 20 74 68 65 20 65 78 70 72 65  ty for the expre
0390: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65  ssion..**.** i.e
03a0: 2e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  . the WHERE clau
03b0: 73 65 20 65 78 70 72 65 73 73 73 69 6f 6e 73 20  se expresssions 
03c0: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
03d0: 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6c 6c 0a   statements all.
03e0: 2a 2a 20 68 61 76 65 20 61 6e 20 61 66 66 69 6e  ** have an affin
03f0: 69 74 79 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54  ity:.**.** CREAT
0400: 45 20 54 41 42 4c 45 20 74 31 28 61 29 3b 0a 2a  E TABLE t1(a);.*
0410: 2a 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  * SELECT * FROM 
0420: 74 31 20 57 48 45 52 45 20 61 3b 0a 2a 2a 20 53  t1 WHERE a;.** S
0430: 45 4c 45 43 54 20 61 20 41 53 20 62 20 46 52 4f  ELECT a AS b FRO
0440: 4d 20 74 31 20 57 48 45 52 45 20 62 3b 0a 2a 2a  M t1 WHERE b;.**
0450: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0460: 31 20 57 48 45 52 45 20 28 73 65 6c 65 63 74 20  1 WHERE (select 
0470: 61 20 66 72 6f 6d 20 74 31 29 3b 0a 2a 2f 0a 63  a from t1);.*/.c
0480: 68 61 72 20 73 71 6c 69 74 65 33 45 78 70 72 41  har sqlite3ExprA
0490: 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45  ffinity(Expr *pE
04a0: 78 70 72 29 7b 0a 20 20 69 6e 74 20 6f 70 20 3d  xpr){.  int op =
04b0: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
04c0: 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
04d0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  ){.    return sq
04e0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
04f0: 79 28 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  y(pExpr->pSelect
0500: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
0510: 45 78 70 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  Expr);.  }.#ifnd
0520: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
0530: 41 53 54 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  AST.  if( op==TK
0540: 5f 43 41 53 54 20 29 7b 0a 20 20 20 20 72 65 74  _CAST ){.    ret
0550: 75 72 6e 20 73 71 6c 69 74 65 33 41 66 66 69 6e  urn sqlite3Affin
0560: 69 74 79 54 79 70 65 28 26 70 45 78 70 72 2d 3e  ityType(&pExpr->
0570: 74 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64  token);.  }.#end
0580: 69 66 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70  if.  return pExp
0590: 72 2d 3e 61 66 66 69 6e 69 74 79 3b 0a 7d 0a 0a  r->affinity;.}..
05a0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f  /*.** Set the co
05b0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
05c0: 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20   for expression 
05d0: 70 45 78 70 72 20 74 6f 20 62 65 20 74 68 65 20  pExpr to be the 
05e0: 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71  collating.** seq
05f0: 75 65 6e 63 65 20 6e 61 6d 65 64 20 62 79 20 70  uence named by p
0600: 54 6f 6b 65 6e 2e 20 20 20 52 65 74 75 72 6e 20  Token.   Return 
0610: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
0620: 20 72 65 76 69 73 65 64 20 65 78 70 72 65 73 73   revised express
0630: 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c  ion..** The coll
0640: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  ating sequence i
0650: 73 20 6d 61 72 6b 65 64 20 61 73 20 22 65 78 70  s marked as "exp
0660: 6c 69 63 69 74 22 20 75 73 69 6e 67 20 74 68 65  licit" using the
0670: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 0a 2a   EP_ExpCollate.*
0680: 2a 20 66 6c 61 67 2e 20 20 41 6e 20 65 78 70 6c  * flag.  An expl
0690: 69 63 69 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73  icit collating s
06a0: 65 71 75 65 6e 63 65 20 77 69 6c 6c 20 6f 76 65  equence will ove
06b0: 72 72 69 64 65 20 69 6d 70 6c 69 63 69 74 0a 2a  rride implicit.*
06c0: 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * collating sequ
06d0: 65 6e 63 65 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a  ences..*/.Expr *
06e0: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 43 6f  sqlite3ExprSetCo
06f0: 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ll(Parse *pParse
0700: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 54  , Expr *pExpr, T
0710: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
0720: 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 3b 0a 20 20 20 20 20  Dest dest;.     
dc20: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
dc30: 69 73 74 3b 0a 0a 20 20 20 20 20 20 20 20 73 71  ist;..        sq
dc40: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
dc50: 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 53  nit(&dest, SRT_S
dc60: 65 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  et, pExpr->iTabl
dc70: 65 29 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74  e);.        dest
dc80: 2e 61 66 66 69 6e 69 74 79 20 3d 20 28 69 6e 74  .affinity = (int
dc90: 29 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20  )affinity;.     
dca0: 20 20 20 61 73 73 65 72 74 28 20 28 70 45 78 70     assert( (pExp
dcb0: 72 2d 3e 69 54 61 62 6c 65 26 30 78 30 30 30 30  r->iTable&0x0000
dcc0: 46 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54  FFFF)==pExpr->iT
dcd0: 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20  able );.        
dce0: 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
dcf0: 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
dd00: 3e 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 2c  >pSelect, &dest,
dd10: 20 30 2c 20 30 2c 20 30 2c 20 30 29 20 29 7b 0a   0, 0, 0, 0) ){.
dd20: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
dd30: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
dd40: 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78      pEList = pEx
dd50: 70 72 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  pr->pSelect->pEL
dd60: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ist;.        if(
dd70: 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
dd80: 74 2d 3e 6e 45 78 70 72 3e 30 20 29 7b 20 0a 20  t->nExpr>0 ){ . 
dd90: 20 20 20 20 20 20 20 20 20 6b 65 79 49 6e 66 6f           keyInfo
dda0: 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69  .aColl[0] = sqli
ddb0: 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
ddc0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
ddd0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20  pExpr->pLeft,.  
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 4c 69              pELi
ddf0: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  st->a[0].pExpr);
de00: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
de10: 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70 72   }else if( pExpr
de20: 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ->pList ){.     
de30: 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20     /* Case 2:   
de40: 20 20 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c    expr IN (exprl
de50: 69 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ist).        **.
de60: 20 20 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 65          ** For e
de70: 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  ach expression, 
de80: 62 75 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b  build an index k
de90: 65 79 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c  ey from the eval
dea0: 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20  uation and.     
deb0: 20 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69     ** store it i
dec0: 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  n the temporary 
ded0: 74 61 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e  table. If <expr>
dee0: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68   is a column, th
def0: 65 6e 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a  en use.        *
df00: 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61  * that columns a
df10: 66 66 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69  ffinity when bui
df20: 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73  lding index keys
df30: 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e  . If <expr> is n
df40: 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  ot.        ** a 
df50: 63 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65  column, use nume
df60: 72 69 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20  ric affinity..  
df70: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
df80: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
df90: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
dfa0: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a  = pExpr->pList;.
dfb0: 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45          struct E
dfc0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
dfd0: 74 65 6d 3b 0a 0a 20 20 20 20 20 20 20 20 69 66  tem;..        if
dfe0: 28 20 21 61 66 66 69 6e 69 74 79 20 29 7b 0a 20  ( !affinity ){. 
dff0: 20 20 20 20 20 20 20 20 20 61 66 66 69 6e 69 74           affinit
e000: 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  y = SQLITE_AFF_N
e010: 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ONE;.        }. 
e020: 20 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61         keyInfo.a
e030: 43 6f 6c 6c 5b 30 5d 20 3d 20 70 45 78 70 72 2d  Coll[0] = pExpr-
e040: 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 0a  >pLeft->pColl;..
e050: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
e060: 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70  through each exp
e070: 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72  ression in <expr
e080: 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20  list>. */.      
e090: 20 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e    for(i=pList->n
e0a0: 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73  Expr, pItem=pLis
e0b0: 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  t->a; i>0; i--, 
e0c0: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
e0d0: 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20      Expr *pE2 = 
e0e0: 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20  pItem->pExpr;.. 
e0f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
e100: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
e110: 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74 68   not constant th
e120: 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20  en we will need 
e130: 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  to.          ** 
e140: 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 73 74  disable the test
e150: 20 74 68 61 74 20 77 61 73 20 67 65 6e 65 72 61   that was genera
e160: 74 65 64 20 61 62 6f 76 65 20 74 68 61 74 20 6d  ted above that m
e170: 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20 20  akes sure.      
e180: 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65      ** this code
e190: 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f   only executes o
e1a0: 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f  nce.  Because fo
e1b0: 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74  r a non-constant
e1c0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78  .          ** ex
e1d0: 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64  pression we need
e1e0: 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63   to rerun this c
e1f0: 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20  ode each time.. 
e200: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
e210: 20 20 20 20 20 20 69 66 28 20 74 65 73 74 41 64        if( testAd
e220: 64 72 3e 30 20 26 26 20 21 73 71 6c 69 74 65 33  dr>0 && !sqlite3
e230: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
e240: 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  E2) ){.         
e250: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
e260: 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 74 65  angeToNoop(v, te
e270: 73 74 41 64 64 72 2d 31 2c 20 33 29 3b 0a 20 20  stAddr-1, 3);.  
e280: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 41 64            testAd
e290: 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  dr = 0;.        
e2a0: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f    }..          /
e2b0: 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65  * Evaluate the e
e2c0: 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e  xpression and in
e2d0: 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65  sert it into the
e2e0: 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
e2f0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e300: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
e310: 20 70 45 32 2c 20 30 29 3b 0a 20 20 20 20 20 20   pE2, 0);.      
e320: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e330: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
e340: 52 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20 30 2c  Record, 1, 0, 0,
e350: 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a   &affinity, 1);.
e360: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
e370: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
e380: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 45 78  P_IdxInsert, pEx
e390: 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20  pr->iTable);.   
e3a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
e3b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e3c0: 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72  ChangeP4(v, addr
e3d0: 2c 20 28 76 6f 69 64 20 2a 29 26 6b 65 79 49 6e  , (void *)&keyIn
e3e0: 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
e3f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
e400: 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b    }..    case TK
e410: 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73  _EXISTS:.    cas
e420: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
e430: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 73       /* This has
e440: 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72 20   to be a scalar 
e450: 53 45 4c 45 43 54 2e 20 20 47 65 6e 65 72 61 74  SELECT.  Generat
e460: 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74 68  e code to put th
e470: 65 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65  e.      ** value
e480: 20 6f 66 20 74 68 69 73 20 73 65 6c 65 63 74 20   of this select 
e490: 69 6e 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  in a memory cell
e4a0: 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68 65 20   and record the 
e4b0: 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a 20  number.      ** 
e4c0: 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  of the memory ce
e4d0: 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20  ll in iColumn.. 
e4e0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74       */.      st
e4f0: 61 74 69 63 20 63 6f 6e 73 74 20 54 6f 6b 65 6e  atic const Token
e500: 20 6f 6e 65 20 3d 20 7b 20 28 75 38 2a 29 22 31   one = { (u8*)"1
e510: 22 2c 20 30 2c 20 31 20 7d 3b 0a 20 20 20 20 20  ", 0, 1 };.     
e520: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20   Select *pSel;. 
e530: 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
e540: 64 65 73 74 3b 0a 0a 20 20 20 20 20 20 70 53 65  dest;..      pSe
e550: 6c 20 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  l = pExpr->pSele
e560: 63 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ct;.      sqlite
e570: 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
e580: 26 64 65 73 74 2c 20 30 2c 20 2b 2b 70 50 61 72  &dest, 0, ++pPar
e590: 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20  se->nMem);.     
e5a0: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
e5b0: 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20  TK_SELECT ){.   
e5c0: 20 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20       dest.eDest 
e5d0: 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20  = SRT_Mem;.     
e5e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e5f0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
e600: 20 30 2c 20 64 65 73 74 2e 69 50 61 72 6d 29 3b   0, dest.iParm);
e610: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
e620: 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 73  ment((v, "Init s
e630: 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 22 29  ubquery result")
e640: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
e650: 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44 65          dest.eDe
e660: 73 74 20 3d 20 53 52 54 5f 45 78 69 73 74 73 3b  st = SRT_Exists;
e670: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e680: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
e690: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 64 65 73  _Integer, 0, des
e6a0: 74 2e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  t.iParm);.      
e6b0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
e6c0: 2c 20 22 49 6e 69 74 20 45 58 49 53 54 53 20 72  , "Init EXISTS r
e6d0: 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20  esult"));.      
e6e0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
e6f0: 78 70 72 44 65 6c 65 74 65 28 70 53 65 6c 2d 3e  xprDelete(pSel->
e700: 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70  pLimit);.      p
e710: 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71  Sel->pLimit = sq
e720: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
e730: 65 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30  e, TK_INTEGER, 0
e740: 2c 20 30 2c 20 26 6f 6e 65 29 3b 0a 20 20 20 20  , 0, &one);.    
e750: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
e760: 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
e770: 2c 20 26 64 65 73 74 2c 20 30 2c 20 30 2c 20 30  , &dest, 0, 0, 0
e780: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
e790: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
e7a0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
e7b0: 6c 75 6d 6e 20 3d 20 64 65 73 74 2e 69 50 61 72  lumn = dest.iPar
e7c0: 6d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  m;.      break;.
e7d0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
e7e0: 20 74 65 73 74 41 64 64 72 20 29 7b 0a 20 20 20   testAddr ){.   
e7f0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
e800: 48 65 72 65 28 76 2c 20 74 65 73 74 41 64 64 72  Here(v, testAddr
e810: 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
e820: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
e830: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
e840: 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 75 70  RY */../*.** Dup
e850: 6c 69 63 61 74 65 20 61 6e 20 38 2d 62 79 74 65  licate an 8-byte
e860: 20 76 61 6c 75 65 0a 2a 2f 0a 73 74 61 74 69 63   value.*/.static
e870: 20 63 68 61 72 20 2a 64 75 70 38 62 79 74 65 73   char *dup8bytes
e880: 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20  (Vdbe *v, const 
e890: 63 68 61 72 20 2a 69 6e 29 7b 0a 20 20 63 68 61  char *in){.  cha
e8a0: 72 20 2a 6f 75 74 20 3d 20 73 71 6c 69 74 65 33  r *out = sqlite3
e8b0: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 73 71 6c 69  DbMallocRaw(sqli
e8c0: 74 65 33 56 64 62 65 44 62 28 76 29 2c 20 38 29  te3VdbeDb(v), 8)
e8d0: 3b 0a 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20  ;.  if( out ){. 
e8e0: 20 20 20 6d 65 6d 63 70 79 28 6f 75 74 2c 20 69     memcpy(out, i
e8f0: 6e 2c 20 38 29 3b 0a 20 20 7d 0a 20 20 72 65 74  n, 8);.  }.  ret
e900: 75 72 6e 20 6f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn out;.}../*.*
e910: 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e  * Generate an in
e920: 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77  struction that w
e930: 69 6c 6c 20 70 75 74 20 74 68 65 20 66 6c 6f 61  ill put the floa
e940: 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61  ting point.** va
e950: 6c 75 65 20 64 65 73 63 72 69 62 65 64 20 62 79  lue described by
e960: 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 6f 6e 20 74 68   z[0..n-1] on th
e970: 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  e stack..**.** T
e980: 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69  he z[] string wi
e990: 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20  ll probably not 
e9a0: 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74  be zero-terminat
e9b0: 65 64 2e 20 20 42 75 74 20 74 68 65 20 0a 2a 2a  ed.  But the .**
e9c0: 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65 72 20   z[n] character 
e9d0: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
e9e0: 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 20 74 68   be something th
e9f0: 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b  at does not look
ea00: 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e  .** like the con
ea10: 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65  tinuation of the
ea20: 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74   number..*/.stat
ea30: 69 63 20 76 6f 69 64 20 63 6f 64 65 52 65 61 6c  ic void codeReal
ea40: 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20  (Vdbe *v, const 
ea50: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20  char *z, int n, 
ea60: 69 6e 74 20 6e 65 67 61 74 65 46 6c 61 67 2c 20  int negateFlag, 
ea70: 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 61 73 73  int iMem){.  ass
ea80: 65 72 74 28 20 7a 20 7c 7c 20 76 3d 3d 30 20 7c  ert( z || v==0 |
ea90: 7c 20 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  | sqlite3VdbeDb(
eaa0: 76 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  v)->mallocFailed
eab0: 20 29 3b 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20   );.  if( z ){. 
eac0: 20 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b     double value;
ead0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20  .    char *zV;. 
eae0: 20 20 20 61 73 73 65 72 74 28 20 21 69 73 64 69     assert( !isdi
eaf0: 67 69 74 28 7a 5b 6e 5d 29 20 29 3b 0a 20 20 20  git(z[n]) );.   
eb00: 20 73 71 6c 69 74 65 33 41 74 6f 46 28 7a 2c 20   sqlite3AtoF(z, 
eb10: 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 69 66 28  &value);.    if(
eb20: 20 6e 65 67 61 74 65 46 6c 61 67 20 29 20 76 61   negateFlag ) va
eb30: 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20 20  lue = -value;.  
eb40: 20 20 7a 56 20 3d 20 64 75 70 38 62 79 74 65 73    zV = dup8bytes
eb50: 28 76 2c 20 28 63 68 61 72 2a 29 26 76 61 6c 75  (v, (char*)&valu
eb60: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  e);.    sqlite3V
eb70: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
eb80: 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30  Real, 0, iMem, 0
eb90: 2c 20 7a 56 2c 20 50 34 5f 52 45 41 4c 29 3b 0a  , zV, P4_REAL);.
eba0: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65    }.}.../*.** Ge
ebb0: 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75  nerate an instru
ebc0: 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20  ction that will 
ebd0: 70 75 74 20 74 68 65 20 69 6e 74 65 67 65 72 20  put the integer 
ebe0: 64 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20 74  describe by.** t
ebf0: 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 6f 6e  ext z[0..n-1] on
ec00: 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a   the stack..**.*
ec10: 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67  * The z[] string
ec20: 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e   will probably n
ec30: 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69  ot be zero-termi
ec40: 6e 61 74 65 64 2e 20 20 42 75 74 20 74 68 65 20  nated.  But the 
ec50: 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74  .** z[n] charact
ec60: 65 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  er is guaranteed
ec70: 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67   to be something
ec80: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c   that does not l
ec90: 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20  ook.** like the 
eca0: 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20  continuation of 
ecb0: 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73  the number..*/.s
ecc0: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49  tatic void codeI
ecd0: 6e 74 65 67 65 72 28 56 64 62 65 20 2a 76 2c 20  nteger(Vdbe *v, 
ece0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
ecf0: 6e 74 20 6e 2c 20 69 6e 74 20 6e 65 67 46 6c 61  nt n, int negFla
ed00: 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20  g, int iMem){.  
ed10: 61 73 73 65 72 74 28 20 7a 20 7c 7c 20 76 3d 3d  assert( z || v==
ed20: 30 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65  0 || sqlite3Vdbe
ed30: 44 62 28 76 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69  Db(v)->mallocFai
ed40: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 7a 20 29  led );.  if( z )
ed50: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
ed60: 20 61 73 73 65 72 74 28 20 21 69 73 64 69 67 69   assert( !isdigi
ed70: 74 28 7a 5b 6e 5d 29 20 29 3b 0a 20 20 20 20 69  t(z[n]) );.    i
ed80: 66 28 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74  f( sqlite3GetInt
ed90: 33 32 28 7a 2c 20 26 69 29 20 29 7b 0a 20 20 20  32(z, &i) ){.   
eda0: 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29     if( negFlag )
edb0: 20 69 20 3d 20 2d 69 3b 0a 20 20 20 20 20 20 73   i = -i;.      s
edc0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
edd0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
ede0: 69 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 7d 65  i, iMem);.    }e
edf0: 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 46  lse if( sqlite3F
ee00: 69 74 73 49 6e 36 34 42 69 74 73 28 7a 2c 20 6e  itsIn64Bits(z, n
ee10: 65 67 46 6c 61 67 29 20 29 7b 0a 20 20 20 20 20  egFlag) ){.     
ee20: 20 69 36 34 20 76 61 6c 75 65 3b 0a 20 20 20 20   i64 value;.    
ee30: 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20 20 20 20    char *zV;.    
ee40: 20 20 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28    sqlite3Atoi64(
ee50: 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20 20 20  z, &value);.    
ee60: 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 20    if( negFlag ) 
ee70: 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a  value = -value;.
ee80: 20 20 20 20 20 20 7a 56 20 3d 20 64 75 70 38 62        zV = dup8b
ee90: 79 74 65 73 28 76 2c 20 28 63 68 61 72 2a 29 26  ytes(v, (char*)&
eea0: 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 73 71  value);.      sq
eeb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
eec0: 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20  v, OP_Int64, 0, 
eed0: 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f  iMem, 0, zV, P4_
eee0: 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65 6c 73  INT64);.    }els
eef0: 65 7b 0a 20 20 20 20 20 20 63 6f 64 65 52 65 61  e{.      codeRea
ef00: 6c 28 76 2c 20 7a 2c 20 6e 2c 20 6e 65 67 46 6c  l(v, z, n, negFl
ef10: 61 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 7d  ag, iMem);.    }
ef20: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  .  }.}.../*.** G
ef30: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
ef40: 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20 74  t will extract t
ef50: 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f  he iColumn-th co
ef60: 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62  lumn from.** tab
ef70: 6c 65 20 70 54 61 62 20 61 6e 64 20 73 74 6f 72  le pTab and stor
ef80: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c  e the column val
ef90: 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  ue in register i
efa0: 4d 65 6d 2c 20 6f 72 20 6f 6e 0a 2a 2a 20 74 68  Mem, or on.** th
efb0: 65 20 73 74 61 63 6b 20 69 66 20 69 4d 65 6d 3d  e stack if iMem=
efc0: 3d 30 2e 20 20 54 68 65 72 65 20 69 73 20 61 6e  =0.  There is an
efd0: 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 6f 20   open cursor to 
efe0: 70 54 61 62 20 69 6e 20 0a 2a 2a 20 69 54 61 62  pTab in .** iTab
eff0: 6c 65 2e 20 20 49 66 20 69 43 6f 6c 75 6d 6e 3c  le.  If iColumn<
f000: 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73 20 67  0 then code is g
f010: 65 6e 65 72 61 74 65 64 20 74 68 61 74 20 65 78  enerated that ex
f020: 74 72 61 63 74 73 20 74 68 65 20 72 6f 77 69 64  tracts the rowid
f030: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
f040: 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
f050: 6d 6e 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20  mn(.  Vdbe *v,  
f060: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 4d         /* The VM
f070: 20 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 2a   being created *
f080: 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
f090: 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74       /* Descript
f0a0: 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ion of the table
f0b0: 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
f0c0: 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43  from */.  int iC
f0d0: 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e  olumn,     /* In
f0e0: 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65  dex of the table
f0f0: 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74   column */.  int
f100: 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a   iTable,      /*
f110: 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e   The cursor poin
f120: 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61 62 6c  ting to the tabl
f130: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 20  e */.  int iReg 
f140: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65          /* Store
f150: 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
f160: 0a 29 7b 0a 20 20 69 66 28 20 69 43 6f 6c 75 6d  .){.  if( iColum
f170: 6e 3c 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f  n<0 ){.    int o
f180: 70 20 3d 20 28 70 54 61 62 20 26 26 20 49 73 56  p = (pTab && IsV
f190: 69 72 74 75 61 6c 28 70 54 61 62 29 29 20 3f 20  irtual(pTab)) ? 
f1a0: 4f 50 5f 56 52 6f 77 69 64 20 3a 20 4f 50 5f 52  OP_VRowid : OP_R
f1b0: 6f 77 69 64 3b 0a 20 20 20 20 73 71 6c 69 74 65  owid;.    sqlite
f1c0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
f1d0: 70 2c 20 69 54 61 62 6c 65 2c 20 69 52 65 67 29  p, iTable, iReg)
f1e0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54  ;.  }else if( pT
f1f0: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ab==0 ){.    sql
f200: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
f210: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61  , OP_Column, iTa
f220: 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52  ble, iColumn, iR
f230: 65 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  eg);.  }else{.  
f240: 20 20 69 6e 74 20 6f 70 20 3d 20 49 73 56 69 72    int op = IsVir
f250: 74 75 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f  tual(pTab) ? OP_
f260: 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c  VColumn : OP_Col
f270: 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  umn;.    sqlite3
f280: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70  VdbeAddOp3(v, op
f290: 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d  , iTable, iColum
f2a0: 6e 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 73 71  n, iReg);.    sq
f2b0: 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75  lite3ColumnDefau
f2c0: 6c 74 28 76 2c 20 70 54 61 62 2c 20 69 43 6f 6c  lt(v, pTab, iCol
f2d0: 75 6d 6e 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  umn);.#ifndef SQ
f2e0: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
f2f0: 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 69 66 28  NG_POINT.    if(
f300: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
f310: 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53  umn].affinity==S
f320: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 29  QLITE_AFF_REAL )
f330: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
f340: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
f350: 52 65 61 6c 41 66 66 69 6e 69 74 79 2c 20 69 52  RealAffinity, iR
f360: 65 67 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eg);.    }.#endi
f370: 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  f.  }.}../*.** G
f380: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
f390: 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 56 64  o the current Vd
f3a0: 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  be to evaluate t
f3b0: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72  he given.** expr
f3c0: 65 73 73 69 6f 6e 20 61 6e 64 20 6c 65 61 76 65  ession and leave
f3d0: 73 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20  s the result in 
f3e0: 61 20 72 65 67 69 73 74 65 72 20 6f 6e 20 6f 6e  a register on on
f3f0: 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a   the stack..**.*
f400: 2a 20 49 66 20 74 68 65 20 74 61 72 67 65 74 20  * If the target 
f410: 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20  register number 
f420: 69 73 20 6e 65 67 61 74 69 76 65 2c 20 61 6c 6c  is negative, all
f430: 6f 63 61 74 65 20 61 20 6e 65 77 0a 2a 2a 20 72  ocate a new.** r
f440: 65 67 69 73 74 65 72 20 74 6f 20 73 74 6f 72 65  egister to store
f450: 20 74 68 65 20 72 65 73 75 6c 74 2e 20 20 49 66   the result.  If
f460: 20 74 68 65 20 74 61 72 67 65 74 20 72 65 67 69   the target regi
f470: 73 74 65 72 20 6e 75 6d 62 65 72 0a 2a 2a 20 69  ster number.** i
f480: 73 20 7a 65 72 6f 20 74 68 65 6e 20 70 75 73 68  s zero then push
f490: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 6e 74 6f   the result onto
f4a0: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 52 65 74   the stack.  Ret
f4b0: 75 72 6e 20 74 68 65 20 74 61 72 67 65 74 0a 2a  urn the target.*
f4c0: 2a 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  * register numbe
f4d0: 72 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 2a 2a  r regardless..**
f4e0: 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65  .** This code de
f4f0: 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63  pends on the fac
f500: 74 20 74 68 61 74 20 63 65 72 74 61 69 6e 20 74  t that certain t
f510: 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a  oken values (ex:
f520: 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74   TK_EQ).** are t
f530: 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64  he same as opcod
f540: 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50  e values (ex: OP
f550: 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d  _Eq) that implem
f560: 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f  ent the correspo
f570: 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69  nding.** operati
f580: 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d  on.  Special com
f590: 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20  ments in vdbe.c 
f5a0: 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65  and the mkopcode
f5b0: 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a  h.awk script in.
f5c0: 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63  ** the make proc
f5d0: 65 73 73 20 63 61 75 73 65 20 74 68 65 73 65 20  ess cause these 
f5e0: 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e  values to align.
f5f0: 20 20 41 73 73 65 72 74 28 29 73 20 69 6e 20 74    Assert()s in t
f600: 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77  he code.** below
f610: 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
f620: 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69   numbers are ali
f630: 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a  gned correctly..
f640: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
f650: 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70 50  prCode(Parse *pP
f660: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
f670: 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
f680: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
f690: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
f6a0: 20 6f 70 3b 0a 20 20 69 6e 74 20 69 6e 52 65 67   op;.  int inReg
f6b0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73 74 61 63   = 0;.  int stac
f6c0: 6b 43 68 6e 67 20 3d 20 30 3b 0a 20 20 69 6e 74  kChng = 0;.  int
f6d0: 20 6f 72 69 67 54 61 72 67 65 74 20 3d 20 74 61   origTarget = ta
f6e0: 72 67 65 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  rget;..  assert(
f6f0: 20 76 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d   v!=0 || pParse-
f700: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
f710: 64 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  d );.  if( v==0 
f720: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
f730: 28 20 74 61 72 67 65 74 3c 30 20 29 7b 0a 20 20  ( target<0 ){.  
f740: 20 20 74 61 72 67 65 74 20 3d 20 2b 2b 70 50 61    target = ++pPa
f750: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 65 6c  rse->nMem;.  }el
f760: 73 65 20 69 66 28 20 74 61 72 67 65 74 3d 3d 30  se if( target==0
f770: 20 29 7b 0a 20 20 20 20 73 74 61 63 6b 43 68 6e   ){.    stackChn
f780: 67 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 69 66  g = 1;.  }..  if
f790: 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20  ( pExpr==0 ){.  
f7a0: 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a    op = TK_NULL;.
f7b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20    }else{.    op 
f7c0: 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d  = pExpr->op;.  }
f7d0: 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
f7e0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
f7f0: 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
f800: 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
f810: 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67  fo = pExpr->pAgg
f820: 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75  Info;.      stru
f830: 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
f840: 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f  pCol = &pAggInfo
f850: 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41  ->aCol[pExpr->iA
f860: 67 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21  gg];.      if( !
f870: 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
f880: 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Mode ){.        
f890: 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d  assert( pCol->iM
f8a0: 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  em>0 );.        
f8b0: 69 6e 52 65 67 20 3d 20 70 43 6f 6c 2d 3e 69 4d  inReg = pCol->iM
f8c0: 65 6d 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  em;.        brea
f8d0: 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  k;.      }else i
f8e0: 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65  f( pAggInfo->use
f8f0: 53 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a 20 20  SortingIdx ){.  
f900: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f910: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
f920: 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e  lumn, pAggInfo->
f930: 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20 20 20  sortingIdx,.    
f940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f950: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
f960: 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74  iSorterColumn, t
f970: 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
f980: 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a  inReg = target;.
f990: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
f9a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
f9b0: 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20  Otherwise, fall 
f9c0: 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b  thru into the TK
f9d0: 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f 0a  _COLUMN case */.
f9e0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
f9f0: 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
fa00: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61    if( pExpr->iTa
fa10: 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ble<0 ){.       
fa20: 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61   /* This only ha
fa30: 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 64 69 6e  ppens when codin
fa40: 67 20 63 68 65 63 6b 20 63 6f 6e 73 74 72 61 69  g check constrai
fa50: 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  nts */.        a
fa60: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 63  ssert( pParse->c
fa70: 6b 4f 66 66 73 65 74 3e 30 20 29 3b 0a 20 20 20  kOffset>0 );.   
fa80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fa90: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53 43 6f  AddOp1(v, OP_SCo
faa0: 70 79 2c 20 2d 28 70 50 61 72 73 65 2d 3e 63 6b  py, -(pParse->ck
fab0: 4f 66 66 73 65 74 2d 70 45 78 70 72 2d 3e 69 43  Offset-pExpr->iC
fac0: 6f 6c 75 6d 6e 2d 31 29 29 3b 0a 20 20 20 20 20  olumn-1));.     
fad0: 20 20 20 2f 2a 20 69 6e 52 65 67 20 3d 20 2d 28     /* inReg = -(
fae0: 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74  pParse->ckOffset
faf0: 2d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d  -pExpr->iColumn-
fb00: 31 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c  1); */.      }el
fb10: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
fb20: 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
fb30: 6c 75 6d 6e 28 76 2c 20 70 45 78 70 72 2d 3e 70  lumn(v, pExpr->p
fb40: 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Tab,.           
fb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb60: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
fb70: 6c 75 6d 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61  lumn, pExpr->iTa
fb80: 62 6c 65 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  ble, target);.  
fb90: 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61        inReg = ta
fba0: 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rget;.      }.  
fbb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
fbc0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
fbd0: 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f  EGER: {.      co
fbe0: 64 65 49 6e 74 65 67 65 72 28 76 2c 20 28 63 68  deInteger(v, (ch
fbf0: 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  ar*)pExpr->token
fc00: 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  .z, pExpr->token
fc10: 2e 6e 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  .n, 0, target);.
fc20: 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61        inReg = ta
fc30: 72 67 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61  rget;.      brea
fc40: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
fc50: 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  e TK_FLOAT: {.  
fc60: 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20      codeReal(v, 
fc70: 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f  (char*)pExpr->to
fc80: 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f  ken.z, pExpr->to
fc90: 6b 65 6e 2e 6e 2c 20 30 2c 20 74 61 72 67 65 74  ken.n, 0, target
fca0: 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d  );.      inReg =
fcb0: 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 62   target;.      b
fcc0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
fcd0: 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20  case TK_STRING: 
fce0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
fcf0: 65 71 75 6f 74 65 45 78 70 72 28 70 50 61 72 73  equoteExpr(pPars
fd00: 65 2d 3e 64 62 2c 20 70 45 78 70 72 29 3b 0a 20  e->db, pExpr);. 
fd10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fd20: 41 64 64 4f 70 34 28 76 2c 4f 50 5f 53 74 72 69  AddOp4(v,OP_Stri
fd30: 6e 67 38 2c 20 30 2c 20 74 61 72 67 65 74 2c 20  ng8, 0, target, 
fd40: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
fd50: 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
fd60: 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  *)pExpr->token.z
fd70: 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  , pExpr->token.n
fd80: 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d  );.      inReg =
fd90: 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 62   target;.      b
fda0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
fdb0: 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a  case TK_NULL: {.
fdc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fdd0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
fde0: 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  ll, 0, target);.
fdf0: 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61        inReg = ta
fe00: 72 67 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61  rget;.      brea
fe10: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
fe20: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f   SQLITE_OMIT_BLO
fe30: 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61  B_LITERAL.    ca
fe40: 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20  se TK_BLOB: {.  
fe50: 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20      int n;.     
fe60: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
fe70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
fe80: 5f 42 4c 4f 42 3d 3d 4f 50 5f 48 65 78 42 6c 6f  _BLOB==OP_HexBlo
fe90: 62 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 70  b );.      n = p
fea0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 2d 20  Expr->token.n - 
feb0: 33 3b 0a 20 20 20 20 20 20 7a 20 3d 20 28 63 68  3;.      z = (ch
fec0: 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  ar*)pExpr->token
fed0: 2e 7a 20 2b 20 32 3b 0a 20 20 20 20 20 20 61 73  .z + 2;.      as
fee0: 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a 20 20  sert( n>=0 );.  
fef0: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a      if( n==0 ){.
ff00: 20 20 20 20 20 20 20 20 7a 20 3d 20 22 22 3b 0a          z = "";.
ff10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
ff20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
ff30: 76 2c 20 6f 70 2c 20 30 2c 20 74 61 72 67 65 74  v, op, 0, target
ff40: 2c 20 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20  , 0, z, n);.    
ff50: 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74    inReg = target
ff60: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
ff70: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
ff80: 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45  case TK_VARIABLE
ff90: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
ffa0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
ffb0: 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70  P_Variable, pExp
ffc0: 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65  r->iTable, targe
ffd0: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  t);.      if( pE
ffe0: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3e 31 20 29  xpr->token.n>1 )
fff0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
10000 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
10010 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 45 78 70   -1, (char*)pExp
10020 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70  r->token.z, pExp
10030 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20  r->token.n);.   
10040 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67     }.      inReg
10050 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20   = target;.     
10060 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
10070 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54    case TK_REGIST
10080 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65  ER: {.      inRe
10090 67 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  g = pExpr->iTabl
100a0 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e;.      break;.
100b0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
100c0 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20  LITE_OMIT_CAST. 
100d0 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a     case TK_CAST:
100e0 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72   {.      /* Expr
100f0 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66  essions of the f
10100 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66  orm:   CAST(pLef
10110 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20  t AS token) */. 
10120 20 20 20 20 20 69 6e 74 20 61 66 66 2c 20 74 6f       int aff, to
10130 5f 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  _op;.      sqlit
10140 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
10150 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
10160 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
10170 61 66 66 20 3d 20 73 71 6c 69 74 65 33 41 66 66  aff = sqlite3Aff
10180 69 6e 69 74 79 54 79 70 65 28 26 70 45 78 70 72  inityType(&pExpr
10190 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  ->token);.      
101a0 74 6f 5f 6f 70 20 3d 20 61 66 66 20 2d 20 53 51  to_op = aff - SQ
101b0 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 2b 20  LITE_AFF_TEXT + 
101c0 4f 50 5f 54 6f 54 65 78 74 3b 0a 20 20 20 20 20  OP_ToText;.     
101d0 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
101e0 4f 50 5f 54 6f 54 65 78 74 20 20 20 20 7c 7c 20  OP_ToText    || 
101f0 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
10200 54 45 58 54 20 20 20 20 29 3b 0a 20 20 20 20 20  TEXT    );.     
10210 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
10220 4f 50 5f 54 6f 42 6c 6f 62 20 20 20 20 7c 7c 20  OP_ToBlob    || 
10230 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
10240 4e 4f 4e 45 20 20 20 20 29 3b 0a 20 20 20 20 20  NONE    );.     
10250 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
10260 4f 50 5f 54 6f 4e 75 6d 65 72 69 63 20 7c 7c 20  OP_ToNumeric || 
10270 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
10280 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 20  NUMERIC );.     
10290 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
102a0 4f 50 5f 54 6f 49 6e 74 20 20 20 20 20 7c 7c 20  OP_ToInt     || 
102b0 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
102c0 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 20  INTEGER );.     
102d0 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
102e0 4f 50 5f 54 6f 52 65 61 6c 20 20 20 20 7c 7c 20  OP_ToReal    || 
102f0 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
10300 52 45 41 4c 20 20 20 20 29 3b 0a 20 20 20 20 20  REAL    );.     
10310 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10320 70 31 28 76 2c 20 74 6f 5f 6f 70 2c 20 74 61 72  p1(v, to_op, tar
10330 67 65 74 29 3b 0a 20 20 20 20 20 20 73 74 61 63  get);.      stac
10340 6b 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20  kChng = 0;.     
10350 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b   inReg = target;
10360 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
10370 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
10380 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a  LITE_OMIT_CAST *
10390 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  /.    case TK_LT
103a0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
103b0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
103c0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
103d0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
103e0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
103f0 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
10400 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29  ( TK_LT==OP_Lt )
10410 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
10420 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a  TK_LE==OP_Le );.
10430 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
10440 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20  _GT==OP_Gt );.  
10450 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
10460 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20  E==OP_Ge );.    
10470 20 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d    assert( TK_EQ=
10480 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20  =OP_Eq );.      
10490 61 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f  assert( TK_NE==O
104a0 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 73 71  P_Ne );.      sq
104b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
104c0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
104d0 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  ft, 0);.      sq
104e0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
104f0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
10500 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 63  ght, 0);.      c
10510 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
10520 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
10530 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
10540 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  op, 0, 0);.     
10550 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 2d 31 3b   stackChng = -1;
10560 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
10570 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
10580 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  AND:.    case TK
10590 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _OR:.    case TK
105a0 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20  _PLUS:.    case 
105b0 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73  TK_STAR:.    cas
105c0 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20  e TK_MINUS:.    
105d0 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20  case TK_REM:.   
105e0 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a   case TK_BITAND:
105f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
10600 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OR:.    case TK_
10610 53 4c 41 53 48 3a 0a 20 20 20 20 63 61 73 65 20  SLASH:.    case 
10620 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20 63  TK_LSHIFT:.    c
10630 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a  ase TK_RSHIFT: .
10640 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43      case TK_CONC
10650 41 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  AT: {.      int 
10660 72 31 2c 20 72 32 3b 0a 20 20 20 20 20 20 61 73  r1, r2;.      as
10670 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50  sert( TK_AND==OP
10680 5f 41 6e 64 20 29 3b 0a 20 20 20 20 20 20 61 73  _And );.      as
10690 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f  sert( TK_OR==OP_
106a0 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Or );.      asse
106b0 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f  rt( TK_PLUS==OP_
106c0 41 64 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Add );.      ass
106d0 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f  ert( TK_MINUS==O
106e0 50 5f 53 75 62 74 72 61 63 74 20 29 3b 0a 20 20  P_Subtract );.  
106f0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52      assert( TK_R
10700 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72  EM==OP_Remainder
10710 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
10720 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f  ( TK_BITAND==OP_
10730 42 69 74 41 6e 64 20 29 3b 0a 20 20 20 20 20 20  BitAnd );.      
10740 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4f 52  assert( TK_BITOR
10750 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 0a 20 20  ==OP_BitOr );.  
10760 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53      assert( TK_S
10770 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20  LASH==OP_Divide 
10780 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
10790 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53   TK_LSHIFT==OP_S
107a0 68 69 66 74 4c 65 66 74 20 29 3b 0a 20 20 20 20  hiftLeft );.    
107b0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 53 48    assert( TK_RSH
107c0 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67  IFT==OP_ShiftRig
107d0 68 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ht );.      asse
107e0 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f  rt( TK_CONCAT==O
107f0 50 5f 43 6f 6e 63 61 74 20 29 3b 0a 20 20 20 20  P_Concat );.    
10800 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
10810 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
10820 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29 3b  Expr->pLeft, 0);
10830 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
10840 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
10850 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
10860 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  t, 0);.      sql
10870 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
10880 2c 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74 61  , op, r2, r1, ta
10890 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28  rget);.      if(
108a0 20 72 31 3d 3d 30 20 29 20 73 74 61 63 6b 43 68   r1==0 ) stackCh
108b0 6e 67 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20  ng--;.      if( 
108c0 72 32 3d 3d 30 20 29 20 73 74 61 63 6b 43 68 6e  r2==0 ) stackChn
108d0 67 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 74  g--;.      if( t
108e0 61 72 67 65 74 3d 3d 30 20 29 20 73 74 61 63 6b  arget==0 ) stack
108f0 43 68 6e 67 2b 2b 3b 0a 20 20 20 20 20 20 69 6e  Chng++;.      in
10900 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20  Reg = target;.  
10910 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
10920 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49  .    case TK_UMI
10930 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  NUS: {.      Exp
10940 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
10950 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 61  ->pLeft;.      a
10960 73 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a  ssert( pLeft );.
10970 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d        if( pLeft-
10980 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 7c 7c  >op==TK_FLOAT ||
10990 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49   pLeft->op==TK_I
109a0 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20  NTEGER ){.      
109b0 20 20 54 6f 6b 65 6e 20 2a 70 20 3d 20 26 70 4c    Token *p = &pL
109c0 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20  eft->token;.    
109d0 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f      if( pLeft->o
109e0 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20  p==TK_FLOAT ){. 
109f0 20 20 20 20 20 20 20 20 20 63 6f 64 65 52 65 61           codeRea
10a00 6c 28 76 2c 20 28 63 68 61 72 2a 29 70 2d 3e 7a  l(v, (char*)p->z
10a10 2c 20 70 2d 3e 6e 2c 20 31 2c 20 74 61 72 67 65  , p->n, 1, targe
10a20 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  t);.        }els
10a30 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 64  e{.          cod
10a40 65 49 6e 74 65 67 65 72 28 76 2c 20 28 63 68 61  eInteger(v, (cha
10a50 72 2a 29 70 2d 3e 7a 2c 20 70 2d 3e 6e 2c 20 31  r*)p->z, p->n, 1
10a60 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
10a70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 6e 52     }.        inR
10a80 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20  eg = target;.   
10a90 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10aa0 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c    }.      /* Fal
10ab0 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 54  l through into T
10ac0 4b 5f 4e 4f 54 20 2a 2f 0a 20 20 20 20 7d 0a 20  K_NOT */.    }. 
10ad0 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f     case TK_BITNO
10ae0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  T:.    case TK_N
10af0 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  OT: {.      asse
10b00 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f  rt( TK_BITNOT==O
10b10 50 5f 42 69 74 4e 6f 74 20 29 3b 0a 20 20 20 20  P_BitNot );.    
10b20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54    assert( TK_NOT
10b30 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 0a 20 20 20 20  ==OP_Not );.    
10b40 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
10b50 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
10b60 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20  >pLeft, 0);.    
10b70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10b80 4f 70 30 28 76 2c 20 6f 70 29 3b 0a 20 20 20 20  Op0(v, op);.    
10b90 20 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 30 3b    stackChng = 0;
10ba0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
10bb0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
10bc0 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
10bd0 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
10be0 20 20 20 20 20 69 6e 74 20 64 65 73 74 3b 0a 20       int dest;. 
10bf0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
10c00 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c  ISNULL==OP_IsNul
10c10 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  l );.      asser
10c20 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f  t( TK_NOTNULL==O
10c30 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20  P_NotNull );.   
10c40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10c50 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
10c60 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a  er, 1, target);.
10c70 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
10c80 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
10c90 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a  xpr->pLeft, 0);.
10ca0 20 20 20 20 20 20 64 65 73 74 20 3d 20 73 71 6c        dest = sql
10cb0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
10cc0 64 64 72 28 76 29 20 2b 20 32 3b 0a 20 20 20 20  ddr(v) + 2;.    
10cd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10ce0 4f 70 32 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65  Op2(v, op, 1, de
10cf0 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
10d00 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
10d10 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65  OP_AddImm, targe
10d20 74 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 73 74  t, -1);.      st
10d30 61 63 6b 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20  ackChng = 0;.   
10d40 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65     inReg = targe
10d50 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  t;.      break;.
10d60 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
10d70 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20  K_AGG_FUNCTION: 
10d80 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20  {.      AggInfo 
10d90 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e  *pInfo = pExpr->
10da0 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
10db0 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a  if( pInfo==0 ){.
10dc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
10dd0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
10de0 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72 65  "misuse of aggre
10df0 67 61 74 65 3a 20 25 54 22 2c 0a 20 20 20 20 20  gate: %T",.     
10e00 20 20 20 20 20 20 20 26 70 45 78 70 72 2d 3e 73         &pExpr->s
10e10 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pan);.      }els
10e20 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  e{.        inReg
10e30 20 3d 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b   = pInfo->aFunc[
10e40 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65  pExpr->iAgg].iMe
10e50 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
10e60 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
10e70 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f    case TK_CONST_
10e80 46 55 4e 43 3a 0a 20 20 20 20 63 61 73 65 20 54  FUNC:.    case T
10e90 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  K_FUNCTION: {.  
10ea0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
10eb0 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  ist = pExpr->pLi
10ec0 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45  st;.      int nE
10ed0 78 70 72 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c  xpr = pList ? pL
10ee0 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a  ist->nExpr : 0;.
10ef0 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
10f00 44 65 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  Def;.      int n
10f10 49 64 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  Id;.      const 
10f20 63 68 61 72 20 2a 7a 49 64 3b 0a 20 20 20 20 20  char *zId;.     
10f30 20 69 6e 74 20 63 6f 6e 73 74 4d 61 73 6b 20 3d   int constMask =
10f40 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   0;.      int i;
10f50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a  .      sqlite3 *
10f60 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
10f70 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20  .      u8 enc = 
10f80 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 20 20 43  ENC(db);.      C
10f90 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
10fa0 30 3b 0a 0a 20 20 20 20 20 20 7a 49 64 20 3d 20  0;..      zId = 
10fb0 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f  (char*)pExpr->to
10fc0 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 6e 49 64  ken.z;.      nId
10fd0 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e   = pExpr->token.
10fe0 6e 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20  n;.      pDef = 
10ff0 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
11000 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ion(pParse->db, 
11010 7a 49 64 2c 20 6e 49 64 2c 20 6e 45 78 70 72 2c  zId, nId, nExpr,
11020 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20   enc, 0);.      
11030 61 73 73 65 72 74 28 20 70 44 65 66 21 3d 30 20  assert( pDef!=0 
11040 29 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d  );.      nExpr =
11050 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
11060 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
11070 20 70 4c 69 73 74 2c 20 30 29 3b 0a 23 69 66 6e   pList, 0);.#ifn
11080 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11090 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
110a0 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f     /* Possibly o
110b0 76 65 72 6c 6f 61 64 20 74 68 65 20 66 75 6e 63  verload the func
110c0 74 69 6f 6e 20 69 66 20 74 68 65 20 66 69 72 73  tion if the firs
110d0 74 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 20 20  t argument is.  
110e0 20 20 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c      ** a virtual
110f0 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20   table column.. 
11100 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
11110 20 46 6f 72 20 69 6e 66 69 78 20 66 75 6e 63 74   For infix funct
11120 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42  ions (LIKE, GLOB
11130 2c 20 52 45 47 45 58 50 2c 20 61 6e 64 20 4d 41  , REGEXP, and MA
11140 54 43 48 29 20 75 73 65 20 74 68 65 0a 20 20 20  TCH) use the.   
11150 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67     ** second arg
11160 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66  ument, not the f
11170 69 72 73 74 2c 20 61 73 20 74 68 65 20 61 72 67  irst, as the arg
11180 75 6d 65 6e 74 20 74 6f 20 74 65 73 74 20 74 6f  ument to test to
11190 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66  .      ** see if
111a0 20 69 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20   it is a column 
111b0 69 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  in a virtual tab
111c0 6c 65 2e 20 20 54 68 69 73 20 69 73 20 64 6f 6e  le.  This is don
111d0 65 20 62 65 63 61 75 73 65 0a 20 20 20 20 20 20  e because.      
111e0 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72  ** the left oper
111f0 61 6e 64 20 6f 66 20 69 6e 66 69 78 20 66 75 6e  and of infix fun
11200 63 74 69 6f 6e 73 20 28 74 68 65 20 6f 70 65 72  ctions (the oper
11210 61 6e 64 20 77 65 20 77 61 6e 74 20 74 6f 0a 20  and we want to. 
11220 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20       ** control 
11230 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64  overloading) end
11240 73 20 75 70 20 61 73 20 74 68 65 20 73 65 63 6f  s up as the seco
11250 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
11260 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  he.      ** func
11270 74 69 6f 6e 2e 20 20 54 68 65 20 65 78 70 72 65  tion.  The expre
11280 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22  ssion "A glob B"
11290 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
112a0 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f  o .      ** "glo
112b0 62 28 42 2c 41 29 2e 20 20 57 65 20 77 61 6e 74  b(B,A).  We want
112c0 20 74 6f 20 75 73 65 20 74 68 65 20 41 20 69 6e   to use the A in
112d0 20 22 41 20 67 6c 6f 62 20 42 22 20 74 6f 20 74   "A glob B" to t
112e0 65 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  est.      ** for
112f0 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f   function overlo
11300 61 64 69 6e 67 2e 20 20 42 75 74 20 77 65 20 75  ading.  But we u
11310 73 65 20 74 68 65 20 42 20 74 65 72 6d 20 69 6e  se the B term in
11320 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20   "glob(B,A)"..  
11330 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
11340 20 6e 45 78 70 72 3e 3d 32 20 26 26 20 28 70 45   nExpr>=2 && (pE
11350 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
11360 49 6e 66 69 78 46 75 6e 63 29 20 29 7b 0a 20 20  InfixFunc) ){.  
11370 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c        pDef = sql
11380 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64  ite3VtabOverload
11390 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65  Function(db, pDe
113a0 66 2c 20 6e 45 78 70 72 2c 20 70 4c 69 73 74 2d  f, nExpr, pList-
113b0 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[1].pExpr);.  
113c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 45      }else if( nE
113d0 78 70 72 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  xpr>0 ){.       
113e0 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56   pDef = sqlite3V
113f0 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74  tabOverloadFunct
11400 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 45  ion(db, pDef, nE
11410 78 70 72 2c 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  xpr, pList->a[0]
11420 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  .pExpr);.      }
11430 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f  .#endif.      fo
11440 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 20 26  r(i=0; i<nExpr &
11450 26 20 69 3c 33 32 3b 20 69 2b 2b 29 7b 0a 20 20  & i<32; i++){.  
11460 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
11470 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
11480 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
11490 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
114a0 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 28 31 3c  constMask |= (1<
114b0 3c 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  <i);.        }. 
114c0 20 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d         if( pDef-
114d0 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 26 26 20  >needCollSeq && 
114e0 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
114f0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
11500 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
11510 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b  Parse, pList->a[
11520 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
11530 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
11540 20 20 20 69 66 28 20 70 44 65 66 2d 3e 6e 65 65     if( pDef->nee
11550 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20  dCollSeq ){.    
11560 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
11570 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d   pColl = pParse-
11580 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20  >db->pDfltColl; 
11590 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
115a0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
115b0 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20  _CollSeq, 0, 0, 
115c0 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c  0, (char *)pColl
115d0 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
115e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
115f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
11600 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 63  , OP_Function, c
11610 6f 6e 73 74 4d 61 73 6b 2c 20 6e 45 78 70 72 2c  onstMask, nExpr,
11620 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
11630 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
11640 72 2a 29 70 44 65 66 2c 20 50 34 5f 46 55 4e 43  r*)pDef, P4_FUNC
11650 44 45 46 29 3b 0a 20 20 20 20 20 20 73 74 61 63  DEF);.      stac
11660 6b 43 68 6e 67 20 3d 20 31 2d 6e 45 78 70 72 3b  kChng = 1-nExpr;
11670 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11680 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
11690 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
116a0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49  .    case TK_EXI
116b0 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  STS:.    case TK
116c0 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20  _SELECT: {.     
116d0 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
116e0 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  umn==0 ){.      
116f0 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62    sqlite3CodeSub
11700 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
11710 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
11720 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78       inReg = pEx
11730 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
11740 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 56 64 62     /* sqlite3Vdb
11750 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53 43  eAddOp1(v, OP_SC
11760 6f 70 79 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  opy, pExpr->iCol
11770 75 6d 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65  umn);.      Vdbe
11780 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6c 6f 61  Comment((v, "loa
11790 64 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c  d subquery resul
117a0 74 22 29 29 3b 20 2a 2f 0a 20 20 20 20 20 20 62  t")); */.      b
117b0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
117c0 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
117d0 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
117e0 20 20 20 20 63 68 61 72 20 61 66 66 69 6e 69 74      char affinit
117f0 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6b 4f  y;.      int ckO
11800 66 66 73 65 74 20 3d 20 70 50 61 72 73 65 2d 3e  ffset = pParse->
11810 63 6b 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  ckOffset;.      
11820 69 6e 74 20 65 54 79 70 65 3b 0a 20 20 20 20 20  int eType;.     
11830 20 69 6e 74 20 69 4c 61 62 65 6c 20 3d 20 73 71   int iLabel = sq
11840 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
11850 65 6c 28 76 29 3b 0a 0a 20 20 20 20 20 20 65 54  el(v);..      eT
11860 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ype = sqlite3Fin
11870 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c  dInIndex(pParse,
11880 20 70 45 78 70 72 2c 20 30 29 3b 0a 0a 20 20 20   pExpr, 0);..   
11890 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
118a0 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f   the affinity to
118b0 20 75 73 65 20 74 6f 20 63 72 65 61 74 65 20 61   use to create a
118c0 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 72 65   key from the re
118d0 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 6f  sults.      ** o
118e0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
118f0 2e 20 61 66 66 69 6e 69 74 79 53 74 72 20 73 74  . affinityStr st
11900 6f 72 65 73 20 61 20 73 74 61 74 69 63 20 73 74  ores a static st
11910 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f  ring suitable fo
11920 72 0a 20 20 20 20 20 20 2a 2a 20 50 34 20 6f 66  r.      ** P4 of
11930 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a   OP_MakeRecord..
11940 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
11950 66 66 69 6e 69 74 79 20 3d 20 63 6f 6d 70 61 72  ffinity = compar
11960 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78  isonAffinity(pEx
11970 70 72 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  pr);..      sqli
11980 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
11990 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 29 3b   OP_Integer, 1);
119a0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63  .      pParse->c
119b0 6b 4f 66 66 73 65 74 20 3d 20 28 63 6b 4f 66 66  kOffset = (ckOff
119c0 73 65 74 20 3f 20 28 63 6b 4f 66 66 73 65 74 2b  set ? (ckOffset+
119d0 31 29 20 3a 20 30 29 3b 0a 0a 20 20 20 20 20 20  1) : 0);..      
119e0 2f 2a 20 43 6f 64 65 20 74 68 65 20 3c 65 78 70  /* Code the <exp
119f0 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20  r> from "<expr> 
11a00 49 4e 20 28 2e 2e 2e 29 22 2e 20 54 68 65 20 74  IN (...)". The t
11a10 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 20  emporary table. 
11a20 20 20 20 20 20 2a 2a 20 70 45 78 70 72 2d 3e 69       ** pExpr->i
11a30 54 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74  Table contains t
11a40 68 65 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d  he values that m
11a50 61 6b 65 20 75 70 20 74 68 65 20 28 2e 2e 2e 29  ake up the (...)
11a60 20 73 65 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   set..      */. 
11a70 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
11a80 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
11a90 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20  pr->pLeft, 0);. 
11aa0 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
11ab0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
11ac0 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
11ad0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11ae0 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31  , OP_NotNull, -1
11af0 2c 20 61 64 64 72 2b 34 29 3b 20 20 20 20 20 20  , addr+4);      
11b00 20 20 20 20 20 20 2f 2a 20 61 64 64 72 20 2b 20        /* addr + 
11b10 30 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  0 */.      sqlit
11b20 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
11b30 4f 50 5f 50 6f 70 2c 20 32 29 3b 0a 20 20 20 20  OP_Pop, 2);.    
11b40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11b50 4f 70 30 28 76 2c 20 4f 50 5f 4e 75 6c 6c 29 3b  Op0(v, OP_Null);
11b60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11b70 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
11b80 6f 74 6f 2c 20 30 2c 20 69 4c 61 62 65 6c 29 3b  oto, 0, iLabel);
11b90 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
11ba0 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  ==IN_INDEX_ROWID
11bb0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
11bc0 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56  iAddr = sqlite3V
11bd0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
11be0 29 2b 33 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  )+3;.        sql
11bf0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11c00 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
11c10 31 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20  1, iAddr);.     
11c20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11c30 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 45 78  dOp2(v, OP_NotEx
11c40 69 73 74 73 2c 20 70 45 78 70 72 2d 3e 69 54 61  ists, pExpr->iTa
11c50 62 6c 65 2c 20 69 41 64 64 72 29 3b 0a 20 20 20  ble, iAddr);.   
11c60 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11c70 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
11c80 6f 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  o, pExpr->iTable
11c90 2c 20 69 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20  , iLabel);.     
11ca0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11cb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11cc0 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
11cd0 72 64 2c 20 31 2c 20 30 2c 20 30 2c 0a 20 20 20  rd, 1, 0, 0,.   
11ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cf0 20 20 20 20 20 20 20 20 20 20 26 61 66 66 69 6e            &affin
11d00 69 74 79 2c 20 31 29 3b 20 20 20 2f 2a 20 61 64  ity, 1);   /* ad
11d10 64 72 20 2b 20 34 20 2a 2f 0a 20 20 20 20 20 20  dr + 4 */.      
11d20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11d30 4f 70 32 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  Op2(v, OP_Found,
11d40 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
11d50 69 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 7d  iLabel);.      }
11d60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11d70 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
11d80 64 64 49 6d 6d 2c 20 30 2c 20 2d 31 29 3b 20 20  ddImm, 0, -1);  
11d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11da0 2f 2a 20 61 64 64 72 20 2b 20 36 20 2a 2f 0a 20  /* addr + 6 */. 
11db0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11dc0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
11dd0 69 4c 61 62 65 6c 29 3b 0a 0a 20 20 20 20 20 20  iLabel);..      
11de0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
11df0 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  dif.    case TK_
11e00 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
11e10 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
11e20 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
11e30 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
11e40 73 74 5f 69 74 65 6d 20 2a 70 4c 49 74 65 6d 20  st_item *pLItem 
11e50 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  = pExpr->pList->
11e60 61 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  a;.      Expr *p
11e70 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e  Right = pLItem->
11e80 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c  pExpr;.      sql
11e90 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
11ea0 72 73 65 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a  rse, pLeft, 0);.
11eb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11ec0 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 43 6f  eAddOp0(v, OP_Co
11ed0 70 79 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  py);.      sqlit
11ee0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
11ef0 65 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20  e, pRight, 0);. 
11f00 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
11f10 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
11f20 70 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c 20 30  pRight, OP_Ge, 0
11f30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
11f40 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
11f50 20 4f 50 5f 50 75 6c 6c 2c 20 31 29 3b 0a 20 20   OP_Pull, 1);.  
11f60 20 20 20 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20 20      pLItem++;.  
11f70 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c 49      pRight = pLI
11f80 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  tem->pExpr;.    
11f90 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
11fa0 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  e(pParse, pRight
11fb0 2c 20 30 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  , 0);.      code
11fc0 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
11fd0 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f  pLeft, pRight, O
11fe0 50 5f 4c 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  P_Le, 0, 0);.   
11ff0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12000 64 4f 70 30 28 76 2c 20 4f 50 5f 41 6e 64 29 3b  dOp0(v, OP_And);
12010 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
12020 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
12030 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 69  UPLUS: {.      i
12040 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
12050 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
12060 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 6f 72 69  Expr->pLeft, ori
12070 67 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20  gTarget);.      
12080 73 74 61 63 6b 43 68 6e 67 20 3d 20 30 3b 0a 20  stackChng = 0;. 
12090 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
120a0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41  }.    case TK_CA
120b0 53 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  SE: {.      int 
120c0 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 3b 0a  expr_end_label;.
120d0 20 20 20 20 20 20 69 6e 74 20 6a 75 6d 70 49 6e        int jumpIn
120e0 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45  st;.      int nE
120f0 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  xpr;.      int i
12100 3b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  ;.      ExprList
12110 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20   *pEList;.      
12120 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
12130 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b  item *aListelem;
12140 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  ..      assert(p
12150 45 78 70 72 2d 3e 70 4c 69 73 74 29 3b 0a 20 20  Expr->pList);.  
12160 20 20 20 20 61 73 73 65 72 74 28 28 70 45 78 70      assert((pExp
12170 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  r->pList->nExpr 
12180 25 20 32 29 20 3d 3d 20 30 29 3b 0a 20 20 20 20  % 2) == 0);.    
12190 20 20 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e    assert(pExpr->
121a0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30  pList->nExpr > 0
121b0 29 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20  );.      pEList 
121c0 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a  = pExpr->pList;.
121d0 20 20 20 20 20 20 61 4c 69 73 74 65 6c 65 6d 20        aListelem 
121e0 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  = pEList->a;.   
121f0 20 20 20 6e 45 78 70 72 20 3d 20 70 45 4c 69 73     nExpr = pELis
12200 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
12210 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 20 3d  expr_end_label =
12220 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
12230 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
12240 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  if( pExpr->pLeft
12250 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
12260 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
12270 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
12280 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
12290 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
122a0 45 78 70 72 3b 20 69 3d 69 2b 32 29 7b 0a 20 20  Expr; i=i+2){.  
122b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
122c0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61 4c  rCode(pParse, aL
122d0 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72  istelem[i].pExpr
122e0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
122f0 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29  ( pExpr->pLeft )
12300 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
12310 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
12320 20 4f 50 5f 53 43 6f 70 79 2c 20 2d 31 29 3b 0a   OP_SCopy, -1);.
12330 20 20 20 20 20 20 20 20 20 20 6a 75 6d 70 49 6e            jumpIn
12340 73 74 20 3d 20 63 6f 64 65 43 6f 6d 70 61 72 65  st = codeCompare
12350 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
12360 70 4c 65 66 74 2c 20 61 4c 69 73 74 65 6c 65 6d  pLeft, aListelem
12370 5b 69 5d 2e 70 45 78 70 72 2c 0a 20 20 20 20 20  [i].pExpr,.     
12380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12390 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e              OP_N
123a0 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 20 20  e, 0, 1);.      
123b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
123c0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 50 6f 70 2c  ddOp1(v, OP_Pop,
123d0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   1);.        }el
123e0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6a 75  se{.          ju
123f0 6d 70 49 6e 73 74 20 3d 20 73 71 6c 69 74 65 33  mpInst = sqlite3
12400 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12410 5f 49 66 4e 6f 74 2c 20 31 2c 20 30 29 3b 0a 20  _IfNot, 1, 0);. 
12420 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12430 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
12440 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c  (pParse, aListel
12450 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74  em[i+1].pExpr, t
12460 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
12470 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12480 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
12490 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 29   expr_end_label)
124a0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
124b0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
124c0 20 6a 75 6d 70 49 6e 73 74 29 3b 0a 20 20 20 20   jumpInst);.    
124d0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
124e0 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20  xpr->pLeft ){.  
124f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12500 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50 6f  eAddOp2(v, OP_Po
12510 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 1, 0);.      
12520 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  }.      if( pExp
12530 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20  r->pRight ){.   
12540 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
12550 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
12560 70 72 2d 3e 70 52 69 67 68 74 2c 20 74 61 72 67  pr->pRight, targ
12570 65 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  et);.      }else
12580 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
12590 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
125a0 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65  P_Null, 0, targe
125b0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
125c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
125d0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 78 70  olveLabel(v, exp
125e0 72 5f 65 6e 64 5f 6c 61 62 65 6c 29 3b 0a 20 20  r_end_label);.  
125f0 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67      inReg = targ
12600 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  et;.      break;
12610 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
12620 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
12630 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  ER.    case TK_R
12640 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 69 66  AISE: {.      if
12650 28 20 21 70 50 61 72 73 65 2d 3e 74 72 69 67 53  ( !pParse->trigS
12660 74 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  tack ){.        
12670 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
12680 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
12690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
126a0 52 41 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79  RAISE() may only
126b0 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20   be used within 
126c0 61 20 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61  a trigger-progra
126d0 6d 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  m");.        ret
126e0 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
126f0 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
12700 69 43 6f 6c 75 6d 6e 21 3d 4f 45 5f 49 67 6e 6f  iColumn!=OE_Igno
12710 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 61  re ){.         a
12720 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43  ssert( pExpr->iC
12730 6f 6c 75 6d 6e 3d 3d 4f 45 5f 52 6f 6c 6c 62 61  olumn==OE_Rollba
12740 63 6b 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  ck ||.          
12750 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
12760 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 41 62 6f 72  olumn == OE_Abor
12770 74 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  t ||.           
12780 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
12790 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 46 61 69 6c 20  lumn == OE_Fail 
127a0 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  );.         sqli
127b0 74 65 33 44 65 71 75 6f 74 65 45 78 70 72 28 70  te3DequoteExpr(p
127c0 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72  Parse->db, pExpr
127d0 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  );.         sqli
127e0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
127f0 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45   OP_Halt, SQLITE
12800 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 70 45 78  _CONSTRAINT, pEx
12810 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 30 2c 0a  pr->iColumn, 0,.
12820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12830 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
12840 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  Expr->token.z, p
12850 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a  Expr->token.n);.
12860 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
12870 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
12880 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
12890 3d 20 4f 45 5f 49 67 6e 6f 72 65 20 29 3b 0a 20  = OE_Ignore );. 
128a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
128b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
128c0 43 6f 6e 74 65 78 74 50 6f 70 2c 20 30 2c 20 30  ContextPop, 0, 0
128d0 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  );.         sqli
128e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
128f0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61   OP_Goto, 0, pPa
12900 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 2d 3e  rse->trigStack->
12910 69 67 6e 6f 72 65 4a 75 6d 70 29 3b 0a 20 20 20  ignoreJump);.   
12920 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
12930 74 28 28 76 2c 20 22 72 61 69 73 65 28 49 47 4e  t((v, "raise(IGN
12940 4f 52 45 29 22 29 29 3b 0a 20 20 20 20 20 20 7d  ORE)"));.      }
12950 0a 20 20 20 20 20 20 73 74 61 63 6b 43 68 6e 67  .      stackChng
12960 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
12970 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
12980 20 20 7d 0a 20 20 69 66 28 20 69 6e 52 65 67 21    }.  if( inReg!
12990 3d 74 61 72 67 65 74 20 29 7b 0a 20 20 20 20 69  =target ){.    i
129a0 66 28 20 6f 72 69 67 54 61 72 67 65 74 21 3d 2d  f( origTarget!=-
129b0 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 ){.      sqlit
129c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
129d0 28 69 6e 52 65 67 3e 30 20 3f 20 4f 50 5f 53 43  (inReg>0 ? OP_SC
129e0 6f 70 79 20 3a 20 4f 50 5f 4d 6f 76 65 29 2c 20  opy : OP_Move), 
129f0 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a  inReg, target);.
12a00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12a10 20 74 61 72 67 65 74 20 3d 20 69 6e 52 65 67 3b   target = inReg;
12a20 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 63 6b  .    }.    stack
12a30 43 68 6e 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Chng = 0;.  }.  
12a40 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66  if( pParse->ckOf
12a50 66 73 65 74 20 29 7b 0a 20 20 20 20 70 50 61 72  fset ){.    pPar
12a60 73 65 2d 3e 63 6b 4f 66 66 73 65 74 20 2b 3d 20  se->ckOffset += 
12a70 73 74 61 63 6b 43 68 6e 67 3b 0a 20 20 20 20 61  stackChng;.    a
12a80 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 63  ssert( pParse->c
12a90 6b 4f 66 66 73 65 74 20 29 3b 0a 20 20 7d 0a 20  kOffset );.  }. 
12aa0 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
12ab0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
12ac0 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 2f  E_OMIT_TRIGGER./
12ad0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
12ae0 64 65 20 74 68 61 74 20 65 76 61 6c 75 74 65 73  de that evalutes
12af0 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
12b00 73 73 69 6f 6e 20 61 6e 64 20 6c 65 61 76 65 73  ssion and leaves
12b10 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 6f   the result.** o
12b20 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 53 65  n the stack.  Se
12b30 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 45 78  e also sqlite3Ex
12b40 70 72 43 6f 64 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  prCode()..**.** 
12b50 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  This routine mig
12b60 68 74 20 61 6c 73 6f 20 63 61 63 68 65 20 74 68  ht also cache th
12b70 65 20 72 65 73 75 6c 74 20 61 6e 64 20 6d 6f 64  e result and mod
12b80 69 66 79 20 74 68 65 20 70 45 78 70 72 20 74 72  ify the pExpr tr
12b90 65 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74  ee.** so that it
12ba0 20 77 69 6c 6c 20 6d 61 6b 65 20 75 73 65 20 6f   will make use o
12bb0 66 20 74 68 65 20 63 61 63 68 65 64 20 72 65 73  f the cached res
12bc0 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75 65 6e  ult on subsequen
12bd0 74 20 65 76 61 6c 75 61 74 69 6f 6e 73 0a 2a 2a  t evaluations.**
12be0 20 72 61 74 68 65 72 20 74 68 61 6e 20 65 76 61   rather than eva
12bf0 6c 75 61 74 65 20 74 68 65 20 77 68 6f 6c 65 20  luate the whole 
12c00 65 78 70 72 65 73 73 69 6f 6e 20 61 67 61 69 6e  expression again
12c10 2e 20 20 54 72 69 76 69 61 6c 20 65 78 70 72 65  .  Trivial expre
12c20 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 6e 6f  ssions are.** no
12c30 74 20 63 61 63 68 65 64 2e 20 20 49 66 20 74 68  t cached.  If th
12c40 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
12c50 63 61 63 68 65 64 2c 20 69 74 73 20 72 65 73 75  cached, its resu
12c60 6c 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  lt is stored in 
12c70 61 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6c 6f 63  a .** memory loc
12c80 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
12c90 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 6e  qlite3ExprCodeAn
12ca0 64 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50  dCache(Parse *pP
12cb0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
12cc0 72 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  r){.  Vdbe *v = 
12cd0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
12ce0 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
12cf0 69 6e 74 20 69 4d 65 6d 3b 0a 20 20 69 6e 74 20  int iMem;.  int 
12d00 61 64 64 72 31 2c 20 61 64 64 72 32 3b 0a 20 20  addr1, addr2;.  
12d10 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
12d20 6e 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  n;.  addr1 = sql
12d30 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
12d40 64 64 72 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  ddr(v);.  sqlite
12d50 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
12d60 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 61  , pExpr, 0);.  a
12d70 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr2 = sqlite3Vd
12d80 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
12d90 3b 0a 20 20 69 66 28 20 61 64 64 72 32 3e 61 64  ;.  if( addr2>ad
12da0 64 72 31 2b 31 0a 20 20 20 7c 7c 20 28 28 70 4f  dr1+1.   || ((pO
12db0 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47  p = sqlite3VdbeG
12dc0 65 74 4f 70 28 76 2c 20 61 64 64 72 31 29 29 21  etOp(v, addr1))!
12dd0 3d 30 20 26 26 20 70 4f 70 2d 3e 6f 70 63 6f 64  =0 && pOp->opcod
12de0 65 3d 3d 4f 50 5f 46 75 6e 63 74 69 6f 6e 29 20  e==OP_Function) 
12df0 29 7b 0a 20 20 20 20 69 4d 65 6d 20 3d 20 70 45  ){.    iMem = pE
12e00 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2b 2b  xpr->iTable = ++
12e10 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
12e20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12e30 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
12e40 30 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 70 45  0, iMem);.    pE
12e50 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47  xpr->op = TK_REG
12e60 49 53 54 45 52 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  ISTER;.  }.}.#en
12e70 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  dif../*.** Gener
12e80 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 70 75  ate code that pu
12e90 73 68 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f  shes the value o
12ea0 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20  f every element 
12eb0 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  of the given.** 
12ec0 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
12ed0 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a  onto the stack..
12ee0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
12ef0 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   number of eleme
12f00 6e 74 73 20 70 75 73 68 65 64 20 6f 6e 74 6f 20  nts pushed onto 
12f10 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a 69 6e  the stack..*/.in
12f20 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
12f30 65 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72  eExprList(.  Par
12f40 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
12f50 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
12f60 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
12f70 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68   *pList,   /* Th
12f80 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
12f90 74 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  t to be coded */
12fa0 0a 20 20 69 6e 74 20 74 61 72 67 65 74 20 20 20  .  int target   
12fb0 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
12fc0 6f 20 77 72 69 74 65 20 72 65 73 75 6c 74 73 20  o write results 
12fd0 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45  */.){.  struct E
12fe0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
12ff0 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 2c  tem;.  int i, n,
13000 20 69 6e 63 72 20 3d 20 31 3b 0a 20 20 69 66 28   incr = 1;.  if(
13010 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
13020 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 70 4c 69 73  rn 0;.  n = pLis
13030 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20  t->nExpr;.  if( 
13040 74 61 72 67 65 74 3c 30 20 29 7b 0a 20 20 20 20  target<0 ){.    
13050 74 61 72 67 65 74 20 3d 20 70 50 61 72 73 65 2d  target = pParse-
13060 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
13070 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 3b 0a  rse->nMem += n;.
13080 20 20 7d 65 6c 73 65 20 69 66 28 20 74 61 72 67    }else if( targ
13090 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 63  et==0 ){.    inc
130a0 72 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72  r = 0;.  }.  for
130b0 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
130c0 20 69 3d 6e 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20   i=n; i>0; i--, 
130d0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71  pItem++){.    sq
130e0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
130f0 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78  arse, pItem->pEx
13100 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
13110 20 74 61 72 67 65 74 20 2b 3d 20 69 6e 63 72 3b   target += incr;
13120 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e   .  }.  return n
13130 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
13140 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62  ate code for a b
13150 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f  oolean expressio
13160 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75  n such that a ju
13170 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f  mp is made.** to
13180 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74   the label "dest
13190 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  " if the express
131a0 69 6f 6e 20 69 73 20 74 72 75 65 20 62 75 74 20  ion is true but 
131b0 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e  execution.** con
131c0 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20  tinues straight 
131d0 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72  thru if the expr
131e0 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e  ession is false.
131f0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
13200 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74  pression evaluat
13210 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74  es to NULL (neit
13220 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c  her true nor fal
13230 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b  se), then.** tak
13240 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68  e the jump if th
13250 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61  e jumpIfNull fla
13260 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a  g is true..**.**
13270 20 54 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e   This code depen
13280 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74  ds on the fact t
13290 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b 65  hat certain toke
132a0 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54 4b  n values (ex: TK
132b0 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65 20  _EQ).** are the 
132c0 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20 76  same as opcode v
132d0 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45 71  alues (ex: OP_Eq
132e0 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  ) that implement
132f0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
13300 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e  ng.** operation.
13310 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e    Special commen
13320 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e 64  ts in vdbe.c and
13330 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61   the mkopcodeh.a
13340 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20  wk script in.** 
13350 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73 73  the make process
13360 20 63 61 75 73 65 20 74 68 65 73 65 20 76 61 6c   cause these val
13370 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41  ues to align.  A
13380 73 73 65 72 74 28 29 73 20 69 6e 20 74 68 65 20  ssert()s in the 
13390 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65  code.** below ve
133a0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e 75  rify that the nu
133b0 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e 65  mbers are aligne
133c0 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a  d correctly..*/.
133d0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
133e0 49 66 54 72 75 65 28 50 61 72 73 65 20 2a 70 50  IfTrue(Parse *pP
133f0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
13400 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74  r, int dest, int
13410 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20   jumpIfNull){.  
13420 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
13430 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f  ->pVdbe;.  int o
13440 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63 6b 4f  p = 0;.  int ckO
13450 66 66 73 65 74 20 3d 20 70 50 61 72 73 65 2d 3e  ffset = pParse->
13460 63 6b 4f 66 66 73 65 74 3b 0a 20 20 69 66 28 20  ckOffset;.  if( 
13470 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30  v==0 || pExpr==0
13480 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6f 70 20   ) return;.  op 
13490 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73  = pExpr->op;.  s
134a0 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
134b0 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a   case TK_AND: {.
134c0 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73        int d2 = s
134d0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
134e0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71  bel(v);.      sq
134f0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
13500 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
13510 70 4c 65 66 74 2c 20 64 32 2c 20 21 6a 75 6d 70  pLeft, d2, !jump
13520 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
13530 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
13540 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
13550 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
13560 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
13570 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
13580 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b  lveLabel(v, d2);
13590 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
135a0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
135b0 4f 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  OR: {.      sqli
135c0 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
135d0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
135e0 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
135f0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
13600 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
13610 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
13620 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
13630 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
13640 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
13650 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20  case TK_NOT: {. 
13660 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
13670 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
13680 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
13690 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
136a0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
136b0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
136c0 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
136d0 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
136e0 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
136f0 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GE:.    case TK_
13700 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
13710 45 51 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  EQ: {.      asse
13720 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74  rt( TK_LT==OP_Lt
13730 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
13740 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29  ( TK_LE==OP_Le )
13750 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13760 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a  TK_GT==OP_Gt );.
13770 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
13780 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20  _GE==OP_Ge );.  
13790 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 45      assert( TK_E
137a0 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20  Q==OP_Eq );.    
137b0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d    assert( TK_NE=
137c0 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20  =OP_Ne );.      
137d0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
137e0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
137f0 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Left, 0);.      
13800 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
13810 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
13820 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20  Right, 0);.     
13830 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
13840 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
13850 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
13860 2c 20 6f 70 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , op, dest, jump
13870 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
13880 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
13890 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
138a0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
138b0 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ULL: {.      ass
138c0 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d  ert( TK_ISNULL==
138d0 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20  OP_IsNull );.   
138e0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
138f0 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c  TNULL==OP_NotNul
13900 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  l );.      sqlit
13910 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
13920 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
13930 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
13940 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13950 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20 20  op, 1, dest);.  
13960 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
13970 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
13980 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  WEEN: {.      /*
13990 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
139a0 22 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44  "x BETWEEN y AND
139b0 20 7a 22 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74   z" is implement
139c0 65 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a  ed as:.      **.
139d0 20 20 20 20 20 20 2a 2a 20 31 20 49 46 20 28 78        ** 1 IF (x
139e0 20 3c 20 79 29 20 47 4f 54 4f 20 33 0a 20 20 20   < y) GOTO 3.   
139f0 20 20 20 2a 2a 20 32 20 49 46 20 28 78 20 3c 3d     ** 2 IF (x <=
13a00 20 7a 29 20 47 4f 54 4f 20 3c 64 65 73 74 3e 0a   z) GOTO <dest>.
13a10 20 20 20 20 20 20 2a 2a 20 33 20 2e 2e 2e 0a 20        ** 3 .... 
13a20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
13a30 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 45 78  t addr;.      Ex
13a40 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
13a50 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
13a60 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
13a70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30  Expr->pList->a[0
13a80 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73  ].pExpr;.      s
13a90 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
13aa0 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 30 29  Parse, pLeft, 0)
13ab0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
13ac0 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
13ad0 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 73 71 6c  Copy);.      sql
13ae0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
13af0 72 73 65 2c 20 70 52 69 67 68 74 2c 20 30 29 3b  rse, pRight, 0);
13b00 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 63 6f  .      addr = co
13b10 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
13b20 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
13b30 20 4f 50 5f 4c 74 2c 20 30 2c 20 21 6a 75 6d 70   OP_Lt, 0, !jump
13b40 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20 20 20  IfNull);..      
13b50 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
13b60 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
13b70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
13b80 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
13b90 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20   pRight, 0);.   
13ba0 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
13bb0 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52  Parse, pLeft, pR
13bc0 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 64 65 73  ight, OP_Le, des
13bd0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
13be0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
13bf0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
13c00 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20  nteger, 0, 0);. 
13c10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13c20 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
13c30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13c40 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13c50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20  _Pop, 1, 0);.   
13c60 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
13c70 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
13c80 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
13c90 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
13ca0 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  pr, 0);.      sq
13cb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13cc0 76 2c 20 4f 50 5f 49 66 2c 20 6a 75 6d 70 49 66  v, OP_If, jumpIf
13cd0 4e 75 6c 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20  Null, dest);.   
13ce0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
13cf0 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 63 6b    }.  pParse->ck
13d00 4f 66 66 73 65 74 20 3d 20 63 6b 4f 66 66 73 65  Offset = ckOffse
13d10 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  t;.}../*.** Gene
13d20 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
13d30 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69  boolean expressi
13d40 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a  on such that a j
13d50 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74  ump is made.** t
13d60 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73  o the label "des
13d70 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73  t" if the expres
13d80 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62 75  sion is false bu
13d90 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63  t execution.** c
13da0 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68  ontinues straigh
13db0 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78  t thru if the ex
13dc0 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65  pression is true
13dd0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
13de0 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61  xpression evalua
13df0 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69  tes to NULL (nei
13e00 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61  ther true nor fa
13e10 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d  lse) then.** jum
13e20 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20  p if jumpIfNull 
13e30 69 73 20 74 72 75 65 20 6f 72 20 66 61 6c 6c 20  is true or fall 
13e40 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49  through if jumpI
13e50 66 4e 75 6c 6c 20 69 73 20 66 61 6c 73 65 2e 0a  fNull is false..
13e60 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
13e70 78 70 72 49 66 46 61 6c 73 65 28 50 61 72 73 65  xprIfFalse(Parse
13e80 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
13e90 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c  pExpr, int dest,
13ea0 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
13eb0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
13ec0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
13ed0 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74  nt op = 0;.  int
13ee0 20 63 6b 4f 66 66 73 65 74 20 3d 20 70 50 61 72   ckOffset = pPar
13ef0 73 65 2d 3e 63 6b 4f 66 66 73 65 74 3b 0a 20 20  se->ckOffset;.  
13f00 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70  if( v==0 || pExp
13f10 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  r==0 ) return;..
13f20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f    /* The value o
13f30 66 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20  f pExpr->op and 
13f40 6f 70 20 61 72 65 20 72 65 6c 61 74 65 64 20 61  op are related a
13f50 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a  s follows:.  **.
13f60 20 20 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72    **       pExpr
13f70 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20 20  ->op            
13f80 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d  op.  **       --
13f90 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20  -------         
13fa0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a   ----------.  **
13fb0 20 20 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c         TK_ISNULL
13fc0 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74            OP_Not
13fd0 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20  Null.  **       
13fe0 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20  TK_NOTNULL      
13ff0 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a     OP_IsNull.  *
14000 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20  *       TK_NE   
14010 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71             OP_Eq
14020 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45  .  **       TK_E
14030 51 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  Q              O
14040 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Ne.  **       
14050 54 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20 20  TK_GT           
14060 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20     OP_Le.  **   
14070 20 20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20      TK_LE       
14080 20 20 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a         OP_Gt.  *
14090 2a 20 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20  *       TK_GE   
140a0 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74             OP_Lt
140b0 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c  .  **       TK_L
140c0 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  T              O
140d0 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46  P_Ge.  **.  ** F
140e0 6f 72 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20  or other values 
140f0 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70  of pExpr->op, op
14100 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e   is undefined an
14110 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54  d unused..  ** T
14120 68 65 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20  he value of TK_ 
14130 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74  and OP_ constant
14140 73 20 61 72 65 20 61 72 72 61 6e 67 65 64 20 73  s are arranged s
14150 75 63 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a  uch that we.  **
14160 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65   can compute the
14170 20 6d 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75   mapping above u
14180 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  sing the followi
14190 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20  ng expression.. 
141a0 20 2a 2a 20 41 73 73 65 72 74 28 29 73 20 76 65   ** Assert()s ve
141b0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63 6f  rify that the co
141c0 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72  mputation is cor
141d0 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20  rect..  */.  op 
141e0 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54  = ((pExpr->op+(T
141f0 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d  K_ISNULL&1))^1)-
14200 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a  (TK_ISNULL&1);..
14210 20 20 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72    /* Verify corr
14220 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66  ect alignment of
14230 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e   TK_ and OP_ con
14240 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73  stants.  */.  as
14250 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
14260 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70  =TK_ISNULL || op
14270 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a  ==OP_NotNull );.
14280 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
14290 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20  >op!=TK_NOTNULL 
142a0 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c  || op==OP_IsNull
142b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
142c0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c  xpr->op!=TK_NE |
142d0 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20  | op==OP_Eq );. 
142e0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
142f0 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d  op!=TK_EQ || op=
14300 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65  =OP_Ne );.  asse
14310 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
14320 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47  K_LT || op==OP_G
14330 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
14340 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20  Expr->op!=TK_LE 
14350 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a  || op==OP_Gt );.
14360 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
14370 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70  >op!=TK_GT || op
14380 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73  ==OP_Le );.  ass
14390 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
143a0 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_GE || op==OP_
143b0 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28  Lt );..  switch(
143c0 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
143d0 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b    case TK_AND: {
143e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
143f0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
14400 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
14410 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
14420 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14430 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
14440 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
14450 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
14460 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
14470 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
14480 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20  e TK_OR: {.     
14490 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65   int d2 = sqlite
144a0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
144b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
144c0 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
144d0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
144e0 20 64 32 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c   d2, !jumpIfNull
144f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14500 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
14510 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
14520 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
14530 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
14540 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
14550 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20  bel(v, d2);.    
14560 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
14570 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
14580 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
14590 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
145a0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
145b0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
145c0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
145d0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
145e0 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LT:.    case T
145f0 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LE:.    case T
14600 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GT:.    case T
14610 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GE:.    case T
14620 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_NE:.    case T
14630 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 73 71  K_EQ: {.      sq
14640 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
14650 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
14660 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  ft, 0);.      sq
14670 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
14680 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
14690 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 63  ght, 0);.      c
146a0 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
146b0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
146c0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
146d0 6f 70 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  op, dest, jumpIf
146e0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
146f0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
14700 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20  se TK_ISNULL:.  
14710 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
14720 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L: {.      sqlit
14730 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
14740 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
14750 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
14760 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14770 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20 20  op, 1, dest);.  
14780 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
14790 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
147a0 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  WEEN: {.      /*
147b0 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
147c0 69 73 20 22 78 20 42 45 54 57 45 45 4e 20 79 20  is "x BETWEEN y 
147d0 41 4e 44 20 7a 22 2e 20 49 74 20 69 73 20 69 6d  AND z". It is im
147e0 70 6c 65 6d 65 6e 74 65 64 20 61 73 3a 0a 20 20  plemented as:.  
147f0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
14800 31 20 49 46 20 28 78 20 3e 3d 20 79 29 20 47 4f  1 IF (x >= y) GO
14810 54 4f 20 33 0a 20 20 20 20 20 20 2a 2a 20 32 20  TO 3.      ** 2 
14820 47 4f 54 4f 20 3c 64 65 73 74 3e 0a 20 20 20 20  GOTO <dest>.    
14830 20 20 2a 2a 20 33 20 49 46 20 28 78 20 3e 20 7a    ** 3 IF (x > z
14840 29 20 47 4f 54 4f 20 3c 64 65 73 74 3e 0a 20 20  ) GOTO <dest>.  
14850 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
14860 20 61 64 64 72 3b 0a 20 20 20 20 20 20 45 78 70   addr;.      Exp
14870 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
14880 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 45  ->pLeft;.      E
14890 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 45  xpr *pRight = pE
148a0 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d  xpr->pList->a[0]
148b0 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  .pExpr;.      sq
148c0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
148d0 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 30 29 3b  arse, pLeft, 0);
148e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
148f0 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 43  beAddOp0(v, OP_C
14900 6f 70 79 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  opy);.      sqli
14910 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
14920 73 65 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a  se, pRight, 0);.
14930 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
14940 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
14950 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 63 6f  ddr(v);.      co
14960 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
14970 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
14980 20 4f 50 5f 47 65 2c 20 61 64 64 72 2b 33 2c 20   OP_Ge, addr+3, 
14990 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 0a 20  !jumpIfNull);.. 
149a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
149b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50 6f 70  AddOp2(v, OP_Pop
149c0 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 1, 0);.      s
149d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
149e0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
149f0 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 52 69  dest);.      pRi
14a00 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  ght = pExpr->pLi
14a10 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a  st->a[1].pExpr;.
14a20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
14a30 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52  rCode(pParse, pR
14a40 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ight, 0);.      
14a50 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
14a60 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  se, pLeft, pRigh
14a70 74 2c 20 4f 50 5f 47 74 2c 20 64 65 73 74 2c 20  t, OP_Gt, dest, 
14a80 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
14a90 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
14aa0 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
14ab0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
14ac0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
14ad0 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  pr, 0);.      sq
14ae0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14af0 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 6a 75 6d  v, OP_IfNot, jum
14b00 70 49 66 4e 75 6c 6c 2c 20 64 65 73 74 29 3b 0a  pIfNull, dest);.
14b10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14b20 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d   }.  }.  pParse-
14b30 3e 63 6b 4f 66 66 73 65 74 20 3d 20 63 6b 4f 66  >ckOffset = ckOf
14b40 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  fset;.}../*.** D
14b50 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69  o a deep compari
14b60 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65  son of two expre
14b70 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65  ssion trees.  Re
14b80 74 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a  turn TRUE (non-z
14b90 65 72 6f 29 0a 2a 2a 20 69 66 20 74 68 65 79 20  ero).** if they 
14ba0 61 72 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e  are identical an
14bb0 64 20 72 65 74 75 72 6e 20 46 41 4c 53 45 20 69  d return FALSE i
14bc0 66 20 74 68 65 79 20 64 69 66 66 65 72 20 69 6e  f they differ in
14bd0 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20   any way..**.** 
14be0 53 6f 6d 65 74 69 6d 65 73 20 74 68 69 73 20 72  Sometimes this r
14bf0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
14c00 72 6e 20 46 41 4c 53 45 20 65 76 65 6e 20 69 66  rn FALSE even if
14c10 20 74 68 65 20 74 77 6f 20 65 78 70 72 65 73 73   the two express
14c20 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61  ions.** really a
14c30 72 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20  re equivalent.  
14c40 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f  If we cannot pro
14c50 76 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72  ve that the expr
14c60 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69  essions are.** i
14c70 64 65 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74  dentical, we ret
14c80 75 72 6e 20 46 41 4c 53 45 20 6a 75 73 74 20 74  urn FALSE just t
14c90 6f 20 62 65 20 73 61 66 65 2e 20 20 53 6f 20 69  o be safe.  So i
14ca0 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  f this routine.*
14cb0 2a 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 2c  * returns false,
14cc0 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f 74   then you do not
14cd0 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72   really know for
14ce0 20 63 65 72 74 61 69 6e 20 69 66 20 74 68 65 20   certain if the 
14cf0 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  two.** expressio
14d00 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e  ns are the same.
14d10 20 20 42 75 74 20 69 66 20 79 6f 75 20 67 65 74    But if you get
14d20 20 61 20 54 52 55 45 20 72 65 74 75 72 6e 2c 20   a TRUE return, 
14d30 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20  then you.** can 
14d40 62 65 20 73 75 72 65 20 74 68 65 20 65 78 70 72  be sure the expr
14d50 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20  essions are the 
14d60 73 61 6d 65 2e 20 20 49 6e 20 74 68 65 20 70 6c  same.  In the pl
14d70 61 63 65 73 20 77 68 65 72 65 0a 2a 2a 20 74 68  aces where.** th
14d80 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
14d90 65 64 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  ed, it does not 
14da0 68 75 72 74 20 74 6f 20 67 65 74 20 61 6e 20 65  hurt to get an e
14db0 78 74 72 61 20 46 41 4c 53 45 20 2d 20 74 68 61  xtra FALSE - tha
14dc0 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20  t.** just might 
14dd0 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73  result in some s
14de0 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63  lightly slower c
14df0 6f 64 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e  ode.  But return
14e00 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72  ing.** an incorr
14e10 65 63 74 20 54 52 55 45 20 63 6f 75 6c 64 20 6c  ect TRUE could l
14e20 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e 63  ead to a malfunc
14e30 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
14e40 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
14e50 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a  Expr *pA, Expr *
14e60 70 42 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  pB){.  int i;.  
14e70 69 66 28 20 70 41 3d 3d 30 7c 7c 70 42 3d 3d 30  if( pA==0||pB==0
14e80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
14e90 42 3d 3d 70 41 3b 0a 20 20 7d 0a 20 20 69 66 28  B==pA;.  }.  if(
14ea0 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20   pA->op!=pB->op 
14eb0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
14ec0 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45  ( (pA->flags & E
14ed0 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70 42  P_Distinct)!=(pB
14ee0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73  ->flags & EP_Dis
14ef0 74 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e 20  tinct) ) return 
14f00 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  0;.  if( !sqlite
14f10 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d  3ExprCompare(pA-
14f20 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66  >pLeft, pB->pLef
14f30 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  t) ) return 0;. 
14f40 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
14f50 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69  rCompare(pA->pRi
14f60 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 29  ght, pB->pRight)
14f70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
14f80 66 28 20 70 41 2d 3e 70 4c 69 73 74 20 29 7b 0a  f( pA->pList ){.
14f90 20 20 20 20 69 66 28 20 70 42 2d 3e 70 4c 69 73      if( pB->pLis
14fa0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
14fb0 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 70 4c 69  .    if( pA->pLi
14fc0 73 74 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 70  st->nExpr!=pB->p
14fd0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 20 72 65  List->nExpr ) re
14fe0 74 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f 72 28  turn 0;.    for(
14ff0 69 3d 30 3b 20 69 3c 70 41 2d 3e 70 4c 69 73 74  i=0; i<pA->pList
15000 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
15010 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65       if( !sqlite
15020 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d  3ExprCompare(pA-
15030 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  >pList->a[i].pEx
15040 70 72 2c 20 70 42 2d 3e 70 4c 69 73 74 2d 3e 61  pr, pB->pList->a
15050 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  [i].pExpr) ){.  
15060 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
15070 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15080 7d 65 6c 73 65 20 69 66 28 20 70 42 2d 3e 70 4c  }else if( pB->pL
15090 69 73 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ist ){.    retur
150a0 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 0;.  }.  if( p
150b0 41 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 70 42  A->pSelect || pB
150c0 2d 3e 70 53 65 6c 65 63 74 20 29 20 72 65 74 75  ->pSelect ) retu
150d0 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e  rn 0;.  if( pA->
150e0 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62  iTable!=pB->iTab
150f0 6c 65 20 7c 7c 20 70 41 2d 3e 69 43 6f 6c 75 6d  le || pA->iColum
15100 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29  n!=pB->iColumn )
15110 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
15120 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55   pA->op!=TK_COLU
15130 4d 4e 20 26 26 20 70 41 2d 3e 74 6f 6b 65 6e 2e  MN && pA->token.
15140 7a 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 2d  z ){.    if( pB-
15150 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 20 72 65  >token.z==0 ) re
15160 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20  turn 0;.    if( 
15170 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 70 41 2d  pB->token.n!=pA-
15180 3e 74 6f 6b 65 6e 2e 6e 20 29 20 72 65 74 75 72  >token.n ) retur
15190 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  n 0;.    if( sql
151a0 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68  ite3StrNICmp((ch
151b0 61 72 2a 29 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 2c  ar*)pA->token.z,
151c0 28 63 68 61 72 2a 29 70 42 2d 3e 74 6f 6b 65 6e  (char*)pB->token
151d0 2e 7a 2c 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 29 21  .z,pB->token.n)!
151e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
151f0 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 0;.    }.  }.
15200 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 0a    return 1;.}...
15210 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
15220 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70  element to the p
15230 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  AggInfo->aCol[] 
15240 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74  array.  Return t
15250 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74  he index of.** t
15260 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20  he new element. 
15270 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69   Return a negati
15280 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c  ve number if mal
15290 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  loc fails..*/.st
152a0 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49  atic int addAggI
152b0 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65  nfoColumn(sqlite
152c0 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a  3 *db, AggInfo *
152d0 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b  pInfo){.  int i;
152e0 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d  .  pInfo->aCol =
152f0 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c   sqlite3ArrayAll
15300 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64 62  ocate(.       db
15310 2c 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  ,.       pInfo->
15320 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a  aCol,.       siz
15330 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b  eof(pInfo->aCol[
15340 30 5d 29 2c 0a 20 20 20 20 20 20 20 33 2c 0a 20  0]),.       3,. 
15350 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43        &pInfo->nC
15360 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26 70  olumn,.       &p
15370 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 41 6c 6c  Info->nColumnAll
15380 6f 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20  oc,.       &i.  
15390 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d  );.  return i;.}
153a0 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20      ../*.** Add 
153b0 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
153c0 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61   the pAggInfo->a
153d0 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20 52  Func[] array.  R
153e0 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
153f0 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c  of.** the new el
15400 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61  ement.  Return a
15410 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
15420 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
15430 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15440 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 73  addAggInfoFunc(s
15450 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49  qlite3 *db, AggI
15460 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69  nfo *pInfo){.  i
15470 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61  nt i;.  pInfo->a
15480 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 41 72  Func = sqlite3Ar
15490 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20  rayAllocate(.   
154a0 20 20 20 20 64 62 2c 20 0a 20 20 20 20 20 20 20      db, .       
154b0 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20  pInfo->aFunc,.  
154c0 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66       sizeof(pInf
154d0 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20  o->aFunc[0]),.  
154e0 20 20 20 20 20 33 2c 0a 20 20 20 20 20 20 20 26       3,.       &
154f0 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20  pInfo->nFunc,.  
15500 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75       &pInfo->nFu
15510 6e 63 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 20  ncAlloc,.       
15520 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e  &i.  );.  return
15530 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a   i;.}    ../*.**
15540 20 54 68 69 73 20 69 73 20 61 6e 20 78 46 75 6e   This is an xFun
15550 63 20 66 6f 72 20 77 61 6c 6b 45 78 70 72 54 72  c for walkExprTr
15560 65 65 28 29 20 75 73 65 64 20 74 6f 20 69 6d 70  ee() used to imp
15570 6c 65 6d 65 6e 74 20 0a 2a 2a 20 73 71 6c 69 74  lement .** sqlit
15580 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
15590 72 65 67 61 74 65 73 28 29 2e 20 20 53 65 65 20  regates().  See 
155a0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
155b0 7a 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a 20  zeAggregates.** 
155c0 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
155d0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nformation..**.*
155e0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
155f0 6e 61 6c 79 7a 65 73 20 74 68 65 20 61 67 67 72  nalyzes the aggr
15600 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 61  egate function a
15610 74 20 70 45 78 70 72 2e 0a 2a 2f 0a 73 74 61 74  t pExpr..*/.stat
15620 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67  ic int analyzeAg
15630 67 72 65 67 61 74 65 28 76 6f 69 64 20 2a 70 41  gregate(void *pA
15640 72 67 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  rg, Expr *pExpr)
15650 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d  {.  int i;.  Nam
15660 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20  eContext *pNC = 
15670 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 29 70  (NameContext *)p
15680 41 72 67 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  Arg;.  Parse *pP
15690 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
156a0 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  se;.  SrcList *p
156b0 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70  SrcList = pNC->p
156c0 53 72 63 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e  SrcList;.  AggIn
156d0 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70  fo *pAggInfo = p
156e0 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 0a 20  NC->pAggInfo;.. 
156f0 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
15700 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
15710 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  K_AGG_COLUMN:.  
15720 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
15730 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65  : {.      /* Che
15740 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
15750 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e   column is in on
15760 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20  e of the tables 
15770 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 20 20  in the FROM.    
15780 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74    ** clause of t
15790 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65  he aggregate que
157a0 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ry */.      if( 
157b0 70 53 72 63 4c 69 73 74 20 29 7b 0a 20 20 20 20  pSrcList ){.    
157c0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
157d0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
157e0 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20   pSrcList->a;.  
157f0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
15800 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pSrcList->nSrc;
15810 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
15820 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
15830 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
15840 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ol;.          if
15850 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ( pExpr->iTable=
15860 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  =pItem->iCursor 
15870 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
15880 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
15890 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61  is point, it mea
158a0 6e 73 20 74 68 61 74 20 70 45 78 70 72 20 72 65  ns that pExpr re
158b0 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 0a  fers to a table.
158c0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
158d0 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 46 52  hat is in the FR
158e0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
158f0 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
15900 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  .  .            
15910 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  **.            *
15920 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20  * Make an entry 
15930 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  for the column i
15940 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  n pAggInfo->aCol
15950 5b 5d 20 69 66 20 74 68 65 72 65 0a 20 20 20 20  [] if there.    
15960 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f          ** is no
15970 74 20 61 6e 20 65 6e 74 72 79 20 74 68 65 72 65  t an entry there
15980 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 20 20   already..      
15990 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
159a0 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20       int k;.    
159b0 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 70          pCol = p
159c0 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20  AggInfo->aCol;. 
159d0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b             for(k
159e0 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; k<pAggInfo->
159f0 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43  nColumn; k++, pC
15a00 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  ol++){.         
15a10 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69       if( pCol->i
15a20 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54  Table==pExpr->iT
15a30 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20  able &&.        
15a40 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
15a50 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e  iColumn==pExpr->
15a60 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
15a70 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
15a80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
15a90 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
15aa0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
15ab0 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  (k>=pAggInfo->nC
15ac0 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20 20 20  olumn).         
15ad0 20 20 20 20 26 26 20 28 6b 20 3d 20 61 64 64 41      && (k = addA
15ae0 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50 61  ggInfoColumn(pPa
15af0 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66  rse->db, pAggInf
15b00 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20 20 20 20  o))>=0 .        
15b10 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
15b20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 41 67       pCol = &pAg
15b30 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a  gInfo->aCol[k];.
15b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
15b50 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78 70 72  ol->pTab = pExpr
15b60 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
15b70 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61 62        pCol->iTab
15b80 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  le = pExpr->iTab
15b90 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  le;.            
15ba0 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20    pCol->iColumn 
15bb0 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
15bc0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
15bd0 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70  pCol->iMem = ++p
15be0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
15bf0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
15c00 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d  >iSorterColumn =
15c10 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20   -1;.           
15c20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20 3d     pCol->pExpr =
15c30 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20   pExpr;.        
15c40 20 20 20 20 20 20 69 66 28 20 70 41 67 67 49 6e        if( pAggIn
15c50 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a  fo->pGroupBy ){.
15c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c70 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20  int j, n;.      
15c80 20 20 20 20 20 20 20 20 20 20 45 78 70 72 4c 69            ExprLi
15c90 73 74 20 2a 70 47 42 20 3d 20 70 41 67 67 49 6e  st *pGB = pAggIn
15ca0 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20  fo->pGroupBy;.  
15cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
15cc0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
15cd0 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47 42 2d  em *pTerm = pGB-
15ce0 3e 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  >a;.            
15cf0 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45 78      n = pGB->nEx
15d00 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
15d10 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
15d20 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j++, pTerm++){
15d30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15d40 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 54     Expr *pE = pT
15d50 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
15d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
15d70 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pE->op==TK_COL
15d80 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61 62 6c  UMN && pE->iTabl
15d90 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  e==pExpr->iTable
15da0 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
15db0 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e 69 43            pE->iC
15dc0 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43  olumn==pExpr->iC
15dd0 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
15de0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
15df0 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
15e00 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   = j;.          
15e10 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
15e20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15e30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
15e40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
15e50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
15e60 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69       if( pCol->i
15e70 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20 29  SorterColumn<0 )
15e80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
15e90 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
15ea0 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66 6f  olumn = pAggInfo
15eb0 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e  ->nSortingColumn
15ec0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
15ed0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
15ee0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  }.            /*
15ef0 20 54 68 65 72 65 20 69 73 20 6e 6f 77 20 61 6e   There is now an
15f00 20 65 6e 74 72 79 20 66 6f 72 20 70 45 78 70 72   entry for pExpr
15f10 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   in pAggInfo->aC
15f20 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20 20 20  ol[] (either.   
15f30 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63 61           ** beca
15f40 75 73 65 20 69 74 20 77 61 73 20 74 68 65 72 65  use it was there
15f50 20 62 65 66 6f 72 65 20 6f 72 20 62 65 63 61 75   before or becau
15f60 73 65 20 77 65 20 6a 75 73 74 20 63 72 65 61 74  se we just creat
15f70 65 64 20 69 74 29 2e 0a 20 20 20 20 20 20 20 20  ed it)..        
15f80 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20 74      ** Convert t
15f90 68 65 20 70 45 78 70 72 20 74 6f 20 62 65 20 61  he pExpr to be a
15fa0 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 72   TK_AGG_COLUMN r
15fb0 65 66 65 72 72 69 6e 67 20 74 6f 20 74 68 61 74  eferring to that
15fc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
15fd0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
15fe0 20 65 6e 74 72 79 2e 0a 20 20 20 20 20 20 20 20   entry..        
15ff0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
16000 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e     pExpr->pAggIn
16010 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20  fo = pAggInfo;. 
16020 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
16030 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f  ->op = TK_AGG_CO
16040 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20  LUMN;.          
16050 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20    pExpr->iAgg = 
16060 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  k;.            b
16070 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
16080 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45 78 70 72  } /* endif pExpr
16090 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d  ->iTable==pItem-
160a0 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20  >iCursor */.    
160b0 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f      } /* end loo
160c0 70 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20  p over pSrcList 
160d0 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
160e0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
160f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
16100 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
16110 20 20 20 2f 2a 20 54 68 65 20 70 4e 43 2d 3e 6e     /* The pNC->n
16120 44 65 70 74 68 3d 3d 30 20 74 65 73 74 20 63 61  Depth==0 test ca
16130 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
16140 75 6e 63 74 69 6f 6e 73 20 69 6e 20 73 75 62 71  unctions in subq
16150 75 65 72 69 65 73 0a 20 20 20 20 20 20 2a 2a 20  ueries.      ** 
16160 74 6f 20 62 65 20 69 67 6e 6f 72 65 64 20 2a 2f  to be ignored */
16170 0a 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e  .      if( pNC->
16180 6e 44 65 70 74 68 3d 3d 30 20 29 7b 0a 20 20 20  nDepth==0 ){.   
16190 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
161a0 20 73 65 65 20 69 66 20 70 45 78 70 72 20 69 73   see if pExpr is
161b0 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20   a duplicate of 
161c0 61 6e 6f 74 68 65 72 20 61 67 67 72 65 67 61 74  another aggregat
161d0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75  e .        ** fu
161e0 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20 61  nction that is a
161f0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 41  lready in the pA
16200 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  ggInfo structure
16210 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
16220 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
16230 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d  fo_func *pItem =
16240 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
16250 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
16260 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
16270 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Func; i++, pItem
16280 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
16290 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
162a0 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78  mpare(pItem->pEx
162b0 70 72 2c 20 70 45 78 70 72 29 20 29 7b 0a 20 20  pr, pExpr) ){.  
162c0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
162d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
162e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
162f0 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e  f( i>=pAggInfo->
16300 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  nFunc ){.       
16310 20 20 20 2f 2a 20 70 45 78 70 72 20 69 73 20 6f     /* pExpr is o
16320 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61  riginal.  Make a
16330 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 41   new entry in pA
16340 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a  ggInfo->aFunc[].
16350 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
16360 20 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20         u8 enc = 
16370 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b  ENC(pParse->db);
16380 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 61  .          i = a
16390 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 70 50  ddAggInfoFunc(pP
163a0 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e  arse->db, pAggIn
163b0 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  fo);.          i
163c0 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20  f( i>=0 ){.     
163d0 20 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20 26         pItem = &
163e0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
163f0 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i];.            
16400 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70  pItem->pExpr = p
16410 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
16420 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20    pItem->iMem = 
16430 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
16440 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
16450 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74  m->pFunc = sqlit
16460 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70  e3FindFunction(p
16470 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20  Parse->db,.     
16480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
16490 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65  har*)pExpr->toke
164a0 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  n.z, pExpr->toke
164b0 6e 2e 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  n.n,.           
164c0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
164d0 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e 70 4c  List ? pExpr->pL
164e0 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20  ist->nExpr : 0, 
164f0 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  enc, 0);.       
16500 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
16510 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69  flags & EP_Disti
16520 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nct ){.         
16530 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73       pItem->iDis
16540 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e  tinct = pParse->
16550 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
16560 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16570 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
16580 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a  iDistinct = -1;.
16590 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
165a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
165b0 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d    }.        /* M
165c0 61 6b 65 20 70 45 78 70 72 20 70 6f 69 6e 74 20  ake pExpr point 
165d0 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  to the appropria
165e0 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  te pAggInfo->aFu
165f0 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20 20  nc[] entry.     
16600 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 45     */.        pE
16610 78 70 72 2d 3e 69 41 67 67 20 3d 20 69 3b 0a 20  xpr->iAgg = i;. 
16620 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41         pExpr->pA
16630 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66  ggInfo = pAggInf
16640 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  o;.        retur
16650 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
16660 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63   }.  }..  /* Rec
16670 75 72 73 69 76 65 6c 79 20 77 61 6c 6b 20 73 75  ursively walk su
16680 62 71 75 65 72 69 65 73 20 6c 6f 6f 6b 69 6e 67  bqueries looking
16690 20 66 6f 72 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e   for TK_COLUMN n
166a0 6f 64 65 73 20 74 68 61 74 20 6e 65 65 64 0a 20  odes that need. 
166b0 20 2a 2a 20 74 6f 20 62 65 20 63 68 61 6e 67 65   ** to be change
166c0 64 20 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  d to TK_AGG_COLU
166d0 4d 4e 2e 20 20 42 75 74 20 69 6e 63 72 65 6d 65  MN.  But increme
166e0 6e 74 20 6e 44 65 70 74 68 20 73 6f 20 74 68 61  nt nDepth so tha
166f0 74 0a 20 20 2a 2a 20 54 4b 5f 41 47 47 5f 46 55  t.  ** TK_AGG_FU
16700 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20  NCTION nodes in 
16710 73 75 62 71 75 65 72 69 65 73 20 77 69 6c 6c 20  subqueries will 
16720 62 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20  be unchanged..  
16730 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  */.  if( pExpr->
16740 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 70  pSelect ){.    p
16750 4e 43 2d 3e 6e 44 65 70 74 68 2b 2b 3b 0a 20 20  NC->nDepth++;.  
16760 20 20 77 61 6c 6b 53 65 6c 65 63 74 45 78 70 72    walkSelectExpr
16770 28 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c  (pExpr->pSelect,
16780 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
16790 65 2c 20 70 4e 43 29 3b 0a 20 20 20 20 70 4e 43  e, pNC);.    pNC
167a0 2d 3e 6e 44 65 70 74 68 2d 2d 3b 0a 20 20 7d 0a  ->nDepth--;.  }.
167b0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
167c0 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65  *.** Analyze the
167d0 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
167e0 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67  n looking for ag
167f0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
16800 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72  s and.** for var
16810 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64  iables that need
16820 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
16830 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67  the pParse->aAgg
16840 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b  [] array..** Mak
16850 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74  e additional ent
16860 72 69 65 73 20 74 6f 20 74 68 65 20 70 50 61 72  ries to the pPar
16870 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79  se->aAgg[] array
16880 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   as necessary..*
16890 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
168a0 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
168b0 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68   called after th
168c0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73  e expression has
168d0 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65   been.** analyze
168e0 64 20 62 79 20 73 71 6c 69 74 65 33 45 78 70 72  d by sqlite3Expr
168f0 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29 2e 0a  ResolveNames()..
16900 2a 2a 0a 2a 2a 20 49 66 20 65 72 72 6f 72 73 20  **.** If errors 
16910 61 72 65 20 73 65 65 6e 2c 20 6c 65 61 76 65 20  are seen, leave 
16920 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
16930 20 69 6e 20 7a 45 72 72 4d 73 67 20 61 6e 64 20   in zErrMsg and 
16940 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75  return.** the nu
16950 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a  mber of errors..
16960 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
16970 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
16980 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20  tes(NameContext 
16990 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70  *pNC, Expr *pExp
169a0 72 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d  r){.  int nErr =
169b0 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 6e 45   pNC->pParse->nE
169c0 72 72 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72  rr;.  walkExprTr
169d0 65 65 28 70 45 78 70 72 2c 20 61 6e 61 6c 79 7a  ee(pExpr, analyz
169e0 65 41 67 67 72 65 67 61 74 65 2c 20 70 4e 43 29  eAggregate, pNC)
169f0 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 43 2d 3e  ;.  return pNC->
16a00 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 2d 20 6e  pParse->nErr - n
16a10 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61  Err;.}../*.** Ca
16a20 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  ll sqlite3ExprAn
16a30 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
16a40 29 20 66 6f 72 20 65 76 65 72 79 20 65 78 70 72  ) for every expr
16a50 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20  ession in an.** 
16a60 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
16a70 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
16a80 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a  ber of errors..*
16a90 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
16aa0 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 20 61   is found, the a
16ab0 6e 61 6c 79 73 69 73 20 69 73 20 63 75 74 20 73  nalysis is cut s
16ac0 68 6f 72 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  hort..*/.int sql
16ad0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
16ae0 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65  ggList(NameConte
16af0 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73  xt *pNC, ExprLis
16b00 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74 72  t *pList){.  str
16b10 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
16b20 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
16b30 69 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20  i;.  int nErr = 
16b40 30 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  0;.  if( pList )
16b50 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d  {.    for(pItem=
16b60 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 6e  pList->a, i=0; n
16b70 45 72 72 3d 3d 30 20 26 26 20 69 3c 70 4c 69 73  Err==0 && i<pLis
16b80 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  t->nExpr; i++, p
16b90 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 6e  Item++){.      n
16ba0 45 72 72 20 2b 3d 20 73 71 6c 69 74 65 33 45 78  Err += sqlite3Ex
16bb0 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
16bc0 74 65 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e  tes(pNC, pItem->
16bd0 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
16be0 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b  }.  return nErr;
16bf0 0a 7d 0a                                         .}.