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

Artifact f1bee4f35fef3078fdbf9075f2b18e41202ccb09:


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 39 20 32 30 30 38 2f 30 31 2f 30 39 20  .339 2008/01/09 
0220: 30 32 3a 31 35 3a 33 39 20 64 72 68 20 45 78 70  02:15:39 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 35 20 76 61 6c 75 65 20 74 68 61 74 20 73   P5 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 2f 0a 73 74 61 74 69 63  Expr2..*/.static
1340: 20 75 38 20 62 69 6e 61 72 79 43 6f 6d 70 61 72   u8 binaryCompar
1350: 65 50 35 28 45 78 70 72 20 2a 70 45 78 70 72 31  eP5(Expr *pExpr1
1360: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 32 2c 20  , Expr *pExpr2, 
1370: 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b  int jumpIfNull){
1380: 0a 20 20 75 38 20 61 66 66 20 3d 20 28 63 68 61  .  u8 aff = (cha
1390: 72 29 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  r)sqlite3ExprAff
13a0: 69 6e 69 74 79 28 70 45 78 70 72 32 29 3b 0a 20  inity(pExpr2);. 
13b0: 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f   aff = sqlite3Co
13c0: 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45  mpareAffinity(pE
13d0: 78 70 72 31 2c 20 61 66 66 29 20 7c 20 6a 75 6d  xpr1, aff) | jum
13e0: 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74 75 72  pIfNull;.  retur
13f0: 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aff;.}../*.** 
1400: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
1410: 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   to the collatio
1420: 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61 74 20  n sequence that 
1430: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 62  should be used b
1440: 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20 63 6f  y.** a binary co
1450: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
1460: 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c 65 66  r comparing pLef
1470: 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2a  t and pRight..**
1480: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66 74 20  .** If the left 
1490: 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 20  hand expression 
14a0: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  has a collating 
14b0: 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c 20 74  sequence type, t
14c0: 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75 73 65  hen it is.** use
14d0: 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  d. Otherwise the
14e0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
14f0: 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69 67 68  nce for the righ
1500: 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f  t hand expressio
1510: 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 6f 72  n.** is used, or
1520: 20 74 68 65 20 64 65 66 61 75 6c 74 20 28 42 49   the default (BI
1530: 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68 65 72  NARY) if neither
1540: 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
1550: 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 74  a collating.** t
1560: 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  ype..**.** Argum
1570: 65 6e 74 20 70 52 69 67 68 74 20 28 62 75 74 20  ent pRight (but 
1580: 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61 79 20 62  not pLeft) may b
1590: 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72  e a null pointer
15a0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a  . In this case,.
15b0: 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 63 6f 6e  ** it is not con
15c0: 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f 6c 6c  sidered..*/.Coll
15d0: 53 65 71 20 2a 73 71 6c 69 74 65 33 42 69 6e 61  Seq *sqlite3Bina
15e0: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
15f0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1600: 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c 65 66  e, .  Expr *pLef
1610: 74 2c 20 0a 20 20 45 78 70 72 20 2a 70 52 69 67  t, .  Expr *pRig
1620: 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  ht.){.  CollSeq 
1630: 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72 74  *pColl;.  assert
1640: 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 69 66 28  ( pLeft );.  if(
1650: 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20   pLeft->flags & 
1660: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b  EP_ExpCollate ){
1670: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65  .    assert( pLe
1680: 66 74 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20 20  ft->pColl );.   
1690: 20 70 43 6f 6c 6c 20 3d 20 70 4c 65 66 74 2d 3e   pColl = pLeft->
16a0: 70 43 6f 6c 6c 3b 0a 20 20 7d 65 6c 73 65 20 69  pColl;.  }else i
16b0: 66 28 20 70 52 69 67 68 74 20 26 26 20 70 52 69  f( pRight && pRi
16c0: 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ght->flags & EP_
16d0: 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  ExpCollate ){.  
16e0: 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74    assert( pRight
16f0: 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 70  ->pColl );.    p
1700: 43 6f 6c 6c 20 3d 20 70 52 69 67 68 74 2d 3e 70  Coll = pRight->p
1710: 43 6f 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Coll;.  }else{. 
1720: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
1730: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
1740: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
1750: 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
1760: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
1770: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
1780: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
1790: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
17a0: 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f  turn pColl;.}../
17b0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
17c0: 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 61 72 69  de for a compari
17d0: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f  son operator..*/
17e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
17f0: 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65  Compare(.  Parse
1800: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
1810: 54 68 65 20 70 61 72 73 69 6e 67 20 28 61 6e 64  The parsing (and
1820: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
1830: 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  ) context */.  E
1840: 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20  xpr *pLeft,     
1850: 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70 65   /* The left ope
1860: 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  rand */.  Expr *
1870: 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20 54  pRight,     /* T
1880: 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
1890: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64 65   */.  int opcode
18a0: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  ,       /* The c
18b0: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64 65  omparison opcode
18c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c 20 69   */.  int in1, i
18d0: 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67 69 73  nt in2, /* Regis
18e0: 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70 65 72  ter holding oper
18f0: 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20 64 65  ands */.  int de
1900: 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  st,         /* J
1910: 75 6d 70 20 68 65 72 65 20 69 66 20 74 72 75 65  ump here if true
1920: 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70  .  */.  int jump
1930: 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66 20  IfNull    /* If 
1940: 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20 65 69  true, jump if ei
1950: 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20  ther operand is 
1960: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  NULL */.){.  int
1970: 20 70 35 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b   p5;.  int addr;
1980: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34 3b 0a  .  CollSeq *p4;.
1990: 0a 20 20 70 34 20 3d 20 73 71 6c 69 74 65 33 42  .  p4 = sqlite3B
19a0: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
19b0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66  Seq(pParse, pLef
19c0: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 70 35  t, pRight);.  p5
19d0: 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65   = binaryCompare
19e0: 50 35 28 70 4c 65 66 74 2c 20 70 52 69 67 68 74  P5(pLeft, pRight
19f0: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
1a00: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
1a10: 64 62 65 41 64 64 4f 70 34 28 70 50 61 72 73 65  dbeAddOp4(pParse
1a20: 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64 65 2c  ->pVdbe, opcode,
1a30: 20 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e 31 2c   in2, dest, in1,
1a40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a50: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
1a60: 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c 53 45  d*)p4, P4_COLLSE
1a70: 51 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  Q);.  sqlite3Vdb
1a80: 65 43 68 61 6e 67 65 50 35 28 70 50 61 72 73 65  eChangeP5(pParse
1a90: 2d 3e 70 56 64 62 65 2c 20 70 35 29 3b 0a 20 20  ->pVdbe, p5);.  
1aa0: 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a  return addr;.}..
1ab0: 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  /*.** Construct 
1ac0: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
1ad0: 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e   node and return
1ae0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74   a pointer to it
1af0: 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72  .  Memory.** for
1b00: 20 74 68 69 73 20 6e 6f 64 65 20 69 73 20 6f 62   this node is ob
1b10: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
1b20: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 20 20 54  te3_malloc().  T
1b30: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
1b40: 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e  ion.** is respon
1b50: 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67  sible for making
1b60: 20 73 75 72 65 20 74 68 65 20 6e 6f 64 65 20 65   sure the node e
1b70: 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20 66  ventually gets f
1b80: 72 65 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  reed..*/.Expr *s
1b90: 71 6c 69 74 65 33 45 78 70 72 28 0a 20 20 73 71  qlite3Expr(.  sq
1ba0: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
1bb0: 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
1bc0: 66 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  for sqlite3DbMal
1bd0: 6c 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62  locZero() (may b
1be0: 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74  e null) */.  int
1bf0: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
1c00: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
1c10: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45  on opcode */.  E
1c20: 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20  xpr *pLeft,     
1c30: 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f         /* Left o
1c40: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72  perand */.  Expr
1c50: 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20 20 20   *pRight,       
1c60: 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65      /* Right ope
1c70: 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rand */.  const 
1c80: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 20 20  Token *pToken   
1c90: 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
1ca0: 6b 65 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ken */.){.  Expr
1cb0: 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d   *pNew;.  pNew =
1cc0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1cd0: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
1ce0: 45 78 70 72 29 29 3b 0a 20 20 69 66 28 20 70 4e  Expr));.  if( pN
1cf0: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ew==0 ){.    /* 
1d00: 57 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  When malloc fail
1d10: 73 2c 20 64 65 6c 65 74 65 20 70 4c 65 66 74 20  s, delete pLeft 
1d20: 61 6e 64 20 70 52 69 67 68 74 2e 20 45 78 70 72  and pRight. Expr
1d30: 65 73 73 69 6f 6e 73 20 70 61 73 73 65 64 20 74  essions passed t
1d40: 6f 20 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 66  o .    ** this f
1d50: 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 61 6c 77  unction must alw
1d60: 61 79 73 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  ays be allocated
1d70: 20 77 69 74 68 20 73 71 6c 69 74 65 33 45 78 70   with sqlite3Exp
1d80: 72 28 29 20 66 6f 72 20 74 68 69 73 20 0a 20 20  r() for this .  
1d90: 20 20 2a 2a 20 72 65 61 73 6f 6e 2e 20 0a 20 20    ** reason. .  
1da0: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
1db0: 45 78 70 72 44 65 6c 65 74 65 28 70 4c 65 66 74  ExprDelete(pLeft
1dc0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
1dd0: 70 72 44 65 6c 65 74 65 28 70 52 69 67 68 74 29  prDelete(pRight)
1de0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1df0: 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d    }.  pNew->op =
1e00: 20 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65   op;.  pNew->pLe
1e10: 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 70 4e  ft = pLeft;.  pN
1e20: 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 70 52 69  ew->pRight = pRi
1e30: 67 68 74 3b 0a 20 20 70 4e 65 77 2d 3e 69 41 67  ght;.  pNew->iAg
1e40: 67 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 54  g = -1;.  if( pT
1e50: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65  oken ){.    asse
1e60: 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e 3d  rt( pToken->dyn=
1e70: 3d 30 20 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  =0 );.    pNew->
1e80: 73 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b  span = pNew->tok
1e90: 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20  en = *pToken;.  
1ea0: 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74 20  }else if( pLeft 
1eb0: 29 7b 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  ){.    if( pRigh
1ec0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
1ed0: 65 33 45 78 70 72 53 70 61 6e 28 70 4e 65 77 2c  e3ExprSpan(pNew,
1ee0: 20 26 70 4c 65 66 74 2d 3e 73 70 61 6e 2c 20 26   &pLeft->span, &
1ef0: 70 52 69 67 68 74 2d 3e 73 70 61 6e 29 3b 0a 20  pRight->span);. 
1f00: 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d       if( pRight-
1f10: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
1f20: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20  ollate ){.      
1f30: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
1f40: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a   EP_ExpCollate;.
1f50: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 43          pNew->pC
1f60: 6f 6c 6c 20 3d 20 70 52 69 67 68 74 2d 3e 70 43  oll = pRight->pC
1f70: 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
1f80: 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74   }.    if( pLeft
1f90: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70  ->flags & EP_Exp
1fa0: 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20  Collate ){.     
1fb0: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
1fc0: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20  EP_ExpCollate;. 
1fd0: 20 20 20 20 20 70 4e 65 77 2d 3e 70 43 6f 6c 6c       pNew->pColl
1fe0: 20 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b   = pLeft->pColl;
1ff0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71  .    }.  }..  sq
2000: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
2010: 68 74 28 70 4e 65 77 29 3b 0a 20 20 72 65 74 75  ht(pNew);.  retu
2020: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
2030: 2a 20 57 6f 72 6b 73 20 6c 69 6b 65 20 73 71 6c  * Works like sql
2040: 69 74 65 33 45 78 70 72 28 29 20 65 78 63 65 70  ite3Expr() excep
2050: 74 20 74 68 61 74 20 69 74 20 74 61 6b 65 73 20  t that it takes 
2060: 61 6e 20 65 78 74 72 61 20 50 61 72 73 65 2a 0a  an extra Parse*.
2070: 2a 2a 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20  ** argument and 
2080: 6e 6f 74 69 66 69 65 73 20 74 68 65 20 61 73 73  notifies the ass
2090: 6f 63 69 61 74 65 64 20 63 6f 6e 6e 65 63 74 69  ociated connecti
20a0: 6f 6e 20 6f 62 6a 65 63 74 20 69 66 20 6d 61 6c  on object if mal
20b0: 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 45 78  loc fails..*/.Ex
20c0: 70 72 20 2a 73 71 6c 69 74 65 33 50 45 78 70 72  pr *sqlite3PExpr
20d0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
20e0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
20f0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
2100: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
2110: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
2120: 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65  xpression opcode
2130: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66   */.  Expr *pLef
2140: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
2150: 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   Left operand */
2160: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
2170: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69             /* Ri
2180: 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  ght operand */. 
2190: 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54   const Token *pT
21a0: 6f 6b 65 6e 20 20 20 20 20 2f 2a 20 41 72 67 75  oken     /* Argu
21b0: 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b  ment token */.){
21c0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
21d0: 33 45 78 70 72 28 70 50 61 72 73 65 2d 3e 64 62  3Expr(pParse->db
21e0: 2c 20 6f 70 2c 20 70 4c 65 66 74 2c 20 70 52 69  , op, pLeft, pRi
21f0: 67 68 74 2c 20 70 54 6f 6b 65 6e 29 3b 0a 7d 0a  ght, pToken);.}.
2200: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64 6f 69 6e  ./*.** When doin
2210: 67 20 61 20 6e 65 73 74 65 64 20 70 61 72 73 65  g a nested parse
2220: 2c 20 79 6f 75 20 63 61 6e 20 69 6e 63 6c 75 64  , you can includ
2230: 65 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 65 78  e terms in an ex
2240: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 68 61 74  pression.** that
2250: 20 6c 6f 6f 6b 20 6c 69 6b 65 20 74 68 69 73 3a   look like this:
2260: 20 20 20 23 30 20 23 31 20 23 32 20 2e 2e 2e 20     #0 #1 #2 ... 
2270: 20 54 68 65 73 65 20 74 65 72 6d 73 20 72 65 66   These terms ref
2280: 65 72 20 74 6f 20 65 6c 65 6d 65 6e 74 73 0a 2a  er to elements.*
2290: 2a 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20  * on the stack. 
22a0: 20 22 23 30 22 20 6d 65 61 6e 73 20 74 68 65 20   "#0" means the 
22b0: 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
22c0: 2e 0a 2a 2a 20 22 23 31 22 20 6d 65 61 6e 73 20  ..** "#1" means 
22d0: 74 68 65 20 6e 65 78 74 20 64 6f 77 6e 20 6f 6e  the next down on
22e0: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 41 6e 64   the stack.  And
22f0: 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a 0a 2a 2a   so forth..**.**
2300: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2310: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
2320: 61 72 73 65 72 20 74 6f 20 64 65 61 6c 20 77 69  arser to deal wi
2330: 74 68 20 6f 6e 20 6f 66 20 74 68 6f 73 65 20 74  th on of those t
2340: 65 72 6d 73 2e 0a 2a 2a 20 49 74 20 69 6d 6d 65  erms..** It imme
2350: 64 69 61 74 65 6c 79 20 67 65 6e 65 72 61 74 65  diately generate
2360: 73 20 63 6f 64 65 20 74 6f 20 73 74 6f 72 65 20  s code to store 
2370: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 61 20 6d  the value in a m
2380: 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a  emory location..
2390: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 73 20 61  ** The returns a
23a0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  n expression tha
23b0: 74 20 77 69 6c 6c 20 63 6f 64 65 20 74 6f 20 65  t will code to e
23c0: 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65  xtract the value
23d0: 20 66 72 6f 6d 0a 2a 2a 20 74 68 61 74 20 6d 65   from.** that me
23e0: 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 61 73  mory location as
23f0: 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 45 78 70 72   needed..*/.Expr
2400: 20 2a 73 71 6c 69 74 65 33 52 65 67 69 73 74 65   *sqlite3Registe
2410: 72 45 78 70 72 28 50 61 72 73 65 20 2a 70 50 61  rExpr(Parse *pPa
2420: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  rse, Token *pTok
2430: 65 6e 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  en){.  Vdbe *v =
2440: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
2450: 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 69 6e 74    Expr *p;.  int
2460: 20 64 65 70 74 68 3b 0a 20 20 69 66 28 20 70 50   depth;.  if( pP
2470: 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20  arse->nested==0 
2480: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
2490: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
24a0: 6e 65 61 72 20 5c 22 25 54 5c 22 3a 20 73 79 6e  near \"%T\": syn
24b0: 74 61 78 20 65 72 72 6f 72 22 2c 20 70 54 6f 6b  tax error", pTok
24c0: 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  en);.    return 
24d0: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
24e0: 72 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c  rse, TK_NULL, 0,
24f0: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66   0, 0);.  }.  if
2500: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( v==0 ) return 
2510: 30 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  0;.  p = sqlite3
2520: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
2530: 5f 52 45 47 49 53 54 45 52 2c 20 30 2c 20 30 2c  _REGISTER, 0, 0,
2540: 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20   pToken);.  if( 
2550: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  p==0 ){.    retu
2560: 72 6e 20 30 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63  rn 0;  /* Malloc
2570: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20   failed */.  }. 
2580: 20 64 65 70 74 68 20 3d 20 61 74 6f 69 28 28 63   depth = atoi((c
2590: 68 61 72 2a 29 26 70 54 6f 6b 65 6e 2d 3e 7a 5b  har*)&pToken->z[
25a0: 31 5d 29 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65  1]);.  p->iTable
25b0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
25c0: 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  m;.  sqlite3Vdbe
25d0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70  AddOp2(v, OP_Cop
25e0: 79 2c 20 2d 64 65 70 74 68 2c 20 70 2d 3e 69 54  y, -depth, p->iT
25f0: 61 62 6c 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  able);.  return 
2600: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e  p;.}../*.** Join
2610: 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73   two expressions
2620: 20 75 73 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70   using an AND op
2630: 65 72 61 74 6f 72 2e 20 20 49 66 20 65 69 74 68  erator.  If eith
2640: 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  er expression is
2650: 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a  .** NULL, then j
2660: 75 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 6f  ust return the o
2670: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 2e  ther expression.
2680: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
2690: 33 45 78 70 72 41 6e 64 28 73 71 6c 69 74 65 33  3ExprAnd(sqlite3
26a0: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c 65 66   *db, Expr *pLef
26b0: 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74 29  t, Expr *pRight)
26c0: 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30  {.  if( pLeft==0
26d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
26e0: 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69  Right;.  }else i
26f0: 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a  f( pRight==0 ){.
2700: 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74      return pLeft
2710: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
2720: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
2730: 72 28 64 62 2c 20 54 4b 5f 41 4e 44 2c 20 70 4c  r(db, TK_AND, pL
2740: 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b  eft, pRight, 0);
2750: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
2760: 74 20 74 68 65 20 45 78 70 72 2e 73 70 61 6e 20  t the Expr.span 
2770: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 67 69 76  field of the giv
2780: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  en expression to
2790: 20 73 70 61 6e 20 61 6c 6c 0a 2a 2a 20 74 65 78   span all.** tex
27a0: 74 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77  t between the tw
27b0: 6f 20 67 69 76 65 6e 20 74 6f 6b 65 6e 73 2e 0a  o given tokens..
27c0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
27d0: 78 70 72 53 70 61 6e 28 45 78 70 72 20 2a 70 45  xprSpan(Expr *pE
27e0: 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4c 65 66  xpr, Token *pLef
27f0: 74 2c 20 54 6f 6b 65 6e 20 2a 70 52 69 67 68 74  t, Token *pRight
2800: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 52 69  ){.  assert( pRi
2810: 67 68 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ght!=0 );.  asse
2820: 72 74 28 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a  rt( pLeft!=0 );.
2830: 20 20 69 66 28 20 70 45 78 70 72 20 26 26 20 70    if( pExpr && p
2840: 52 69 67 68 74 2d 3e 7a 20 26 26 20 70 4c 65 66  Right->z && pLef
2850: 74 2d 3e 7a 20 29 7b 0a 20 20 20 20 61 73 73 65  t->z ){.    asse
2860: 72 74 28 20 70 4c 65 66 74 2d 3e 64 79 6e 3d 3d  rt( pLeft->dyn==
2870: 30 20 7c 7c 20 70 4c 65 66 74 2d 3e 7a 5b 70 4c  0 || pLeft->z[pL
2880: 65 66 74 2d 3e 6e 5d 3d 3d 30 20 29 3b 0a 20 20  eft->n]==0 );.  
2890: 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 64 79 6e    if( pLeft->dyn
28a0: 3d 3d 30 20 26 26 20 70 52 69 67 68 74 2d 3e 64  ==0 && pRight->d
28b0: 79 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  yn==0 ){.      p
28c0: 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 20 3d 20 70  Expr->span.z = p
28d0: 4c 65 66 74 2d 3e 7a 3b 0a 20 20 20 20 20 20 70  Left->z;.      p
28e0: 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 20 3d 20 70  Expr->span.n = p
28f0: 52 69 67 68 74 2d 3e 6e 20 2b 20 28 70 52 69 67  Right->n + (pRig
2900: 68 74 2d 3e 7a 20 2d 20 70 4c 65 66 74 2d 3e 7a  ht->z - pLeft->z
2910: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2920: 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e      pExpr->span.
2930: 7a 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  z = 0;.    }.  }
2940: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72  .}../*.** Constr
2950: 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65 73  uct a new expres
2960: 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61 20  sion node for a 
2970: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d 75  function with mu
2980: 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d 65  ltiple.** argume
2990: 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  nts..*/.Expr *sq
29a0: 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74 69 6f  lite3ExprFunctio
29b0: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
29c0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
29d0: 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29  , Token *pToken)
29e0: 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a  {.  Expr *pNew;.
29f0: 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e    assert( pToken
2a00: 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   );.  pNew = sql
2a10: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
2a20: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a  (pParse->db, siz
2a30: 65 6f 66 28 45 78 70 72 29 20 29 3b 0a 20 20 69  eof(Expr) );.  i
2a40: 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
2a50: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
2a60: 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 20  tDelete(pList); 
2a70: 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67  /* Avoid leaking
2a80: 20 6d 65 6d 6f 72 79 20 77 68 65 6e 20 6d 61 6c   memory when mal
2a90: 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20  loc fails */.   
2aa0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
2ab0: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 46   pNew->op = TK_F
2ac0: 55 4e 43 54 49 4f 4e 3b 0a 20 20 70 4e 65 77 2d  UNCTION;.  pNew-
2ad0: 3e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a  >pList = pList;.
2ae0: 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e    assert( pToken
2af0: 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20 20 70 4e  ->dyn==0 );.  pN
2b00: 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f  ew->token = *pTo
2b10: 6b 65 6e 3b 0a 20 20 70 4e 65 77 2d 3e 73 70 61  ken;.  pNew->spa
2b20: 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 3b  n = pNew->token;
2b30: 0a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 53  ..  sqlite3ExprS
2b40: 65 74 48 65 69 67 68 74 28 70 4e 65 77 29 3b 0a  etHeight(pNew);.
2b50: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
2b60: 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 61  ../*.** Assign a
2b70: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
2b80: 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f   to an expressio
2b90: 6e 20 74 68 61 74 20 65 6e 63 6f 64 65 73 20 61  n that encodes a
2ba0: 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69 6e 20   wildcard.** in 
2bb0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c  the original SQL
2bc0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a   statement.  .**
2bd0: 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 63 6f  .** Wildcards co
2be0: 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69  nsisting of a si
2bf0: 6e 67 6c 65 20 22 3f 22 20 61 72 65 20 61 73 73  ngle "?" are ass
2c00: 69 67 6e 65 64 20 74 68 65 20 6e 65 78 74 20 73  igned the next s
2c10: 65 71 75 65 6e 74 69 61 6c 0a 2a 2a 20 76 61 72  equential.** var
2c20: 69 61 62 6c 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a  iable number..**
2c30: 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66  .** Wildcards of
2c40: 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22   the form "?nnn"
2c50: 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 68   are assigned th
2c60: 65 20 6e 75 6d 62 65 72 20 22 6e 6e 6e 22 2e 20  e number "nnn". 
2c70: 20 57 65 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65   We make.** sure
2c80: 20 22 6e 6e 6e 22 20 69 73 20 6e 6f 74 20 74 6f   "nnn" is not to
2c90: 6f 20 62 65 20 74 6f 20 61 76 6f 69 64 20 61 20  o be to avoid a 
2ca0: 64 65 6e 69 61 6c 20 6f 66 20 73 65 72 76 69 63  denial of servic
2cb0: 65 20 61 74 74 61 63 6b 20 77 68 65 6e 0a 2a 2a  e attack when.**
2cc0: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
2cd0: 6e 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20 61 6e  nt comes from an
2ce0: 20 65 78 74 65 72 6e 61 6c 20 73 6f 75 72 63 65   external source
2cf0: 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64  ..**.** Wildcard
2d00: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3a  s of the form ":
2d10: 61 61 61 22 20 6f 72 20 22 24 61 61 61 22 20 61  aaa" or "$aaa" a
2d20: 72 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20  re assigned the 
2d30: 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61  same number.** a
2d40: 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 69  s the previous i
2d50: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 73  nstance of the s
2d60: 61 6d 65 20 77 69 6c 64 63 61 72 64 2e 20 20 4f  ame wildcard.  O
2d70: 72 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  r if this is the
2d80: 20 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e   first.** instan
2d90: 63 65 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61  ce of the wildca
2da0: 72 64 2c 20 74 68 65 20 6e 65 78 74 20 73 65 71  rd, the next seq
2db0: 75 65 6e 69 61 6c 20 76 61 72 69 61 62 6c 65 20  uenial variable 
2dc0: 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73  number is.** ass
2dd0: 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  igned..*/.void s
2de0: 71 6c 69 74 65 33 45 78 70 72 41 73 73 69 67 6e  qlite3ExprAssign
2df0: 56 61 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20  VarNumber(Parse 
2e00: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
2e10: 45 78 70 72 29 7b 0a 20 20 54 6f 6b 65 6e 20 2a  Expr){.  Token *
2e20: 70 54 6f 6b 65 6e 3b 0a 20 20 73 71 6c 69 74 65  pToken;.  sqlite
2e30: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
2e40: 64 62 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72  db;..  if( pExpr
2e50: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
2e60: 70 54 6f 6b 65 6e 20 3d 20 26 70 45 78 70 72 2d  pToken = &pExpr-
2e70: 3e 74 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74  >token;.  assert
2e80: 28 20 70 54 6f 6b 65 6e 2d 3e 6e 3e 3d 31 20 29  ( pToken->n>=1 )
2e90: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b  ;.  assert( pTok
2ea0: 65 6e 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 61 73  en->z!=0 );.  as
2eb0: 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b  sert( pToken->z[
2ec0: 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  0]!=0 );.  if( p
2ed0: 54 6f 6b 65 6e 2d 3e 6e 3d 3d 31 20 29 7b 0a 20  Token->n==1 ){. 
2ee0: 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f     /* Wildcard o
2ef0: 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 22 2e 20  f the form "?". 
2f00: 20 41 73 73 69 67 6e 20 74 68 65 20 6e 65 78 74   Assign the next
2f10: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
2f20: 20 2a 2f 0a 20 20 20 20 70 45 78 70 72 2d 3e 69   */.    pExpr->i
2f30: 54 61 62 6c 65 20 3d 20 2b 2b 70 50 61 72 73 65  Table = ++pParse
2f40: 2d 3e 6e 56 61 72 3b 0a 20 20 7d 65 6c 73 65 20  ->nVar;.  }else 
2f50: 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d  if( pToken->z[0]
2f60: 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 2f 2a 20  =='?' ){.    /* 
2f70: 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20  Wildcard of the 
2f80: 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f  form "?nnn".  Co
2f90: 6e 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61  nvert "nnn" to a
2fa0: 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 0a 20 20  n integer and.  
2fb0: 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20 74    ** use it as t
2fc0: 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  he variable numb
2fd0: 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b  er */.    int i;
2fe0: 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62  .    pExpr->iTab
2ff0: 6c 65 20 3d 20 69 20 3d 20 61 74 6f 69 28 28 63  le = i = atoi((c
3000: 68 61 72 2a 29 26 70 54 6f 6b 65 6e 2d 3e 7a 5b  har*)&pToken->z[
3010: 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 69 3c 31  1]);.    if( i<1
3020: 20 7c 7c 20 69 3e 53 51 4c 49 54 45 5f 4d 41 58   || i>SQLITE_MAX
3030: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
3040: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
3050: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
3060: 2c 20 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  , "variable numb
3070: 65 72 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  er must be betwe
3080: 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a  en ?1 and ?%d",.
3090: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
30a0: 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55  _MAX_VARIABLE_NU
30b0: 4d 42 45 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20  MBER);.    }.   
30c0: 20 69 66 28 20 69 3e 70 50 61 72 73 65 2d 3e 6e   if( i>pParse->n
30d0: 56 61 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61  Var ){.      pPa
30e0: 72 73 65 2d 3e 6e 56 61 72 20 3d 20 69 3b 0a 20  rse->nVar = i;. 
30f0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
3100: 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 73 20 6f    /* Wildcards o
3110: 66 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61  f the form ":aaa
3120: 22 20 6f 72 20 22 24 61 61 61 22 2e 20 20 52 65  " or "$aaa".  Re
3130: 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72  use the same var
3140: 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 6e 75 6d  iable.    ** num
3150: 62 65 72 20 61 73 20 74 68 65 20 70 72 69 6f 72  ber as the prior
3160: 20 61 70 70 65 61 72 61 6e 63 65 20 6f 66 20 74   appearance of t
3170: 68 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72  he same name, or
3180: 20 69 66 20 74 68 65 20 6e 61 6d 65 0a 20 20 20   if the name.   
3190: 20 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70   ** has never ap
31a0: 70 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72  peared before, r
31b0: 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61  euse the same va
31c0: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20  riable number.  
31d0: 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20    */.    int i, 
31e0: 6e 3b 0a 20 20 20 20 6e 20 3d 20 70 54 6f 6b 65  n;.    n = pToke
31f0: 6e 2d 3e 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d  n->n;.    for(i=
3200: 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 61  0; i<pParse->nVa
3210: 72 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  rExpr; i++){.   
3220: 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20     Expr *pE;.   
3230: 20 20 20 69 66 28 20 28 70 45 20 3d 20 70 50 61     if( (pE = pPa
3240: 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 69  rse->apVarExpr[i
3250: 5d 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ])!=0.          
3260: 26 26 20 70 45 2d 3e 74 6f 6b 65 6e 2e 6e 3d 3d  && pE->token.n==
3270: 6e 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 6d  n.          && m
3280: 65 6d 63 6d 70 28 70 45 2d 3e 74 6f 6b 65 6e 2e  emcmp(pE->token.
3290: 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 6e 29  z, pToken->z, n)
32a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
32b0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
32c0: 45 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  E->iTable;.     
32d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
32e0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
32f0: 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 56 61 72 45  i>=pParse->nVarE
3300: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70 45 78  xpr ){.      pEx
3310: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2b 2b 70  pr->iTable = ++p
3320: 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 20  Parse->nVar;.   
3330: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
3340: 56 61 72 45 78 70 72 3e 3d 70 50 61 72 73 65 2d  VarExpr>=pParse-
3350: 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 2d 31  >nVarExprAlloc-1
3360: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72   ){.        pPar
3370: 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f  se->nVarExprAllo
3380: 63 20 2b 3d 20 70 50 61 72 73 65 2d 3e 6e 56 61  c += pParse->nVa
3390: 72 45 78 70 72 41 6c 6c 6f 63 20 2b 20 31 30 3b  rExprAlloc + 10;
33a0: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
33b0: 3e 61 70 56 61 72 45 78 70 72 20 3d 0a 20 20 20  >apVarExpr =.   
33c0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
33d0: 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  DbReallocOrFree(
33e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  .              d
33f0: 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
3400: 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78   pParse->apVarEx
3410: 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
3420: 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78    pParse->nVarEx
3430: 70 72 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70  prAlloc*sizeof(p
3440: 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72  Parse->apVarExpr
3450: 5b 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20  [0]).           
3460: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
3470: 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
3480: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
3490: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
34a0: 65 2d 3e 61 70 56 61 72 45 78 70 72 21 3d 30 20  e->apVarExpr!=0 
34b0: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
34c0: 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 70 50 61  e->apVarExpr[pPa
34d0: 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 2b 2b 5d  rse->nVarExpr++]
34e0: 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20   = pExpr;.      
34f0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 0a 20 20 69  }.    }.  } .  i
3500: 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 45 72 72  f( !pParse->nErr
3510: 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 56 61 72   && pParse->nVar
3520: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49  >SQLITE_MAX_VARI
3530: 41 42 4c 45 5f 4e 55 4d 42 45 52 20 29 7b 0a 20  ABLE_NUMBER ){. 
3540: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
3550: 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
3560: 6d 61 6e 79 20 53 51 4c 20 76 61 72 69 61 62 6c  many SQL variabl
3570: 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  es");.  }.}../*.
3580: 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 64  ** Recursively d
3590: 65 6c 65 74 65 20 61 6e 20 65 78 70 72 65 73 73  elete an express
35a0: 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69  ion tree..*/.voi
35b0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c  d sqlite3ExprDel
35c0: 65 74 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ete(Expr *p){.  
35d0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
35e0: 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 73 70 61 6e  n;.  if( p->span
35f0: 2e 64 79 6e 20 29 20 73 71 6c 69 74 65 33 5f 66  .dyn ) sqlite3_f
3600: 72 65 65 28 28 63 68 61 72 2a 29 70 2d 3e 73 70  ree((char*)p->sp
3610: 61 6e 2e 7a 29 3b 0a 20 20 69 66 28 20 70 2d 3e  an.z);.  if( p->
3620: 74 6f 6b 65 6e 2e 64 79 6e 20 29 20 73 71 6c 69  token.dyn ) sqli
3630: 74 65 33 5f 66 72 65 65 28 28 63 68 61 72 2a 29  te3_free((char*)
3640: 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 73  p->token.z);.  s
3650: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
3660: 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 73 71  (p->pLeft);.  sq
3670: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
3680: 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 73 71  p->pRight);.  sq
3690: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
36a0: 65 74 65 28 70 2d 3e 70 4c 69 73 74 29 3b 0a 20  ete(p->pList);. 
36b0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
36c0: 6c 65 74 65 28 70 2d 3e 70 53 65 6c 65 63 74 29  lete(p->pSelect)
36d0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
36e0: 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  (p);.}../*.** Th
36f0: 65 20 45 78 70 72 2e 74 6f 6b 65 6e 20 66 69 65  e Expr.token fie
3700: 6c 64 20 6d 69 67 68 74 20 62 65 20 61 20 73 74  ld might be a st
3710: 72 69 6e 67 20 6c 69 74 65 72 61 6c 20 74 68 61  ring literal tha
3720: 74 20 69 73 20 71 75 6f 74 65 64 2e 0a 2a 2a 20  t is quoted..** 
3730: 49 66 20 73 6f 2c 20 72 65 6d 6f 76 65 20 74 68  If so, remove th
3740: 65 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b  e quotation mark
3750: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
3760: 65 33 44 65 71 75 6f 74 65 45 78 70 72 28 73 71  e3DequoteExpr(sq
3770: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
3780: 2a 70 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48  *p){.  if( ExprH
3790: 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 2c  asAnyProperty(p,
37a0: 20 45 50 5f 44 65 71 75 6f 74 65 64 29 20 29 7b   EP_Dequoted) ){
37b0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
37c0: 0a 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72  .  ExprSetProper
37d0: 74 79 28 70 2c 20 45 50 5f 44 65 71 75 6f 74 65  ty(p, EP_Dequote
37e0: 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b  d);.  if( p->tok
37f0: 65 6e 2e 64 79 6e 3d 3d 30 20 29 7b 0a 20 20 20  en.dyn==0 ){.   
3800: 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70   sqlite3TokenCop
3810: 79 28 64 62 2c 20 26 70 2d 3e 74 6f 6b 65 6e 2c  y(db, &p->token,
3820: 20 26 70 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 7d   &p->token);.  }
3830: 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74  .  sqlite3Dequot
3840: 65 28 28 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65  e((char*)p->toke
3850: 6e 2e 7a 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n.z);.}.../*.** 
3860: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72  The following gr
3870: 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  oup of routines 
3880: 6d 61 6b 65 20 64 65 65 70 20 63 6f 70 69 65 73  make deep copies
3890: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 2c   of expressions,
38a0: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
38b0: 69 73 74 73 2c 20 49 44 20 6c 69 73 74 73 2c 20  ists, ID lists, 
38c0: 61 6e 64 20 73 65 6c 65 63 74 20 73 74 61 74 65  and select state
38d0: 6d 65 6e 74 73 2e 20 20 54 68 65 20 63 6f 70 69  ments.  The copi
38e0: 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64 65 6c  es can.** be del
38f0: 65 74 65 64 20 28 62 79 20 62 65 69 6e 67 20 70  eted (by being p
3900: 61 73 73 65 64 20 74 6f 20 74 68 65 69 72 20 72  assed to their r
3910: 65 73 70 65 63 74 69 76 65 20 2e 2e 2e 44 65 6c  espective ...Del
3920: 65 74 65 28 29 20 72 6f 75 74 69 6e 65 73 29 0a  ete() routines).
3930: 2a 2a 20 77 69 74 68 6f 75 74 20 65 66 66 65 63  ** without effec
3940: 74 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61  ting the origina
3950: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78  ls..**.** The ex
3960: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 49  pression list, I
3970: 44 2c 20 61 6e 64 20 73 6f 75 72 63 65 20 6c 69  D, and source li
3980: 73 74 73 20 72 65 74 75 72 6e 20 62 79 20 73 71  sts return by sq
3990: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
39a0: 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 49 64  (),.** sqlite3Id
39b0: 4c 69 73 74 44 75 70 28 29 2c 20 61 6e 64 20 73  ListDup(), and s
39c0: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70  qlite3SrcListDup
39d0: 28 29 20 63 61 6e 20 6e 6f 74 20 62 65 20 66 75  () can not be fu
39e0: 72 74 68 65 72 20 65 78 70 61 6e 64 65 64 20 0a  rther expanded .
39f0: 2a 2a 20 62 79 20 73 75 62 73 65 71 75 65 6e 74  ** by subsequent
3a00: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
3a10: 2a 4c 69 73 74 41 70 70 65 6e 64 28 29 20 72 6f  *ListAppend() ro
3a20: 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e  utines..**.** An
3a30: 79 20 74 61 62 6c 65 73 20 74 68 61 74 20 74 68  y tables that th
3a40: 65 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20  e SrcList might 
3a50: 70 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e 6f 74  point to are not
3a60: 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2f 0a   duplicated..*/.
3a70: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
3a80: 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  rDup(sqlite3 *db
3a90: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 45 78  , Expr *p){.  Ex
3aa0: 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20  pr *pNew;.  if( 
3ab0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
3ac0: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
3ad0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
3ae0: 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20   sizeof(*p) );. 
3af0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
3b00: 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 63 70  eturn 0;.  memcp
3b10: 79 28 70 4e 65 77 2c 20 70 2c 20 73 69 7a 65 6f  y(pNew, p, sizeo
3b20: 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66 28  f(*pNew));.  if(
3b30: 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 21 3d 30 20 29   p->token.z!=0 )
3b40: 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65  {.    pNew->toke
3b50: 6e 2e 7a 20 3d 20 28 75 38 2a 29 73 71 6c 69 74  n.z = (u8*)sqlit
3b60: 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20  e3DbStrNDup(db, 
3b70: 28 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e  (char*)p->token.
3b80: 7a 2c 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a  z, p->token.n);.
3b90: 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e      pNew->token.
3ba0: 64 79 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  dyn = 1;.  }else
3bb0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  {.    assert( pN
3bc0: 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29  ew->token.z==0 )
3bd0: 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 73 70  ;.  }.  pNew->sp
3be0: 61 6e 2e 7a 20 3d 20 30 3b 0a 20 20 70 4e 65 77  an.z = 0;.  pNew
3bf0: 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  ->pLeft = sqlite
3c00: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
3c10: 70 4c 65 66 74 29 3b 0a 20 20 70 4e 65 77 2d 3e  pLeft);.  pNew->
3c20: 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  pRight = sqlite3
3c30: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
3c40: 52 69 67 68 74 29 3b 0a 20 20 70 4e 65 77 2d 3e  Right);.  pNew->
3c50: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
3c60: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
3c70: 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 70 4e 65 77  ->pList);.  pNew
3c80: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
3c90: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
3ca0: 20 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20   p->pSelect);.  
3cb0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 76  return pNew;.}.v
3cc0: 6f 69 64 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e  oid sqlite3Token
3cd0: 43 6f 70 79 28 73 71 6c 69 74 65 33 20 2a 64 62  Copy(sqlite3 *db
3ce0: 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 54 6f  , Token *pTo, To
3cf0: 6b 65 6e 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69  ken *pFrom){.  i
3d00: 66 28 20 70 54 6f 2d 3e 64 79 6e 20 29 20 73 71  f( pTo->dyn ) sq
3d10: 6c 69 74 65 33 5f 66 72 65 65 28 28 63 68 61 72  lite3_free((char
3d20: 2a 29 70 54 6f 2d 3e 7a 29 3b 0a 20 20 69 66 28  *)pTo->z);.  if(
3d30: 20 70 46 72 6f 6d 2d 3e 7a 20 29 7b 0a 20 20 20   pFrom->z ){.   
3d40: 20 70 54 6f 2d 3e 6e 20 3d 20 70 46 72 6f 6d 2d   pTo->n = pFrom-
3d50: 3e 6e 3b 0a 20 20 20 20 70 54 6f 2d 3e 7a 20 3d  >n;.    pTo->z =
3d60: 20 28 75 38 2a 29 73 71 6c 69 74 65 33 44 62 53   (u8*)sqlite3DbS
3d70: 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72  trNDup(db, (char
3d80: 2a 29 70 46 72 6f 6d 2d 3e 7a 2c 20 70 46 72 6f  *)pFrom->z, pFro
3d90: 6d 2d 3e 6e 29 3b 0a 20 20 20 20 70 54 6f 2d 3e  m->n);.    pTo->
3da0: 64 79 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  dyn = 1;.  }else
3db0: 7b 0a 20 20 20 20 70 54 6f 2d 3e 7a 20 3d 20 30  {.    pTo->z = 0
3dc0: 3b 0a 20 20 7d 0a 7d 0a 45 78 70 72 4c 69 73 74  ;.  }.}.ExprList
3dd0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73   *sqlite3ExprLis
3de0: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
3df0: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 29 7b 0a  , ExprList *p){.
3e00: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77    ExprList *pNew
3e10: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
3e20: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c  ist_item *pItem,
3e30: 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20 20 69 6e   *pOldItem;.  in
3e40: 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  t i;.  if( p==0 
3e50: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
3e60: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
3e70: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
3e80: 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69  of(*pNew) );.  i
3e90: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
3ea0: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69  urn 0;.  pNew->i
3eb0: 45 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 70  ECursor = 0;.  p
3ec0: 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20 70 4e 65  New->nExpr = pNe
3ed0: 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e  w->nAlloc = p->n
3ee0: 45 78 70 72 3b 0a 20 20 70 4e 65 77 2d 3e 61 20  Expr;.  pNew->a 
3ef0: 3d 20 70 49 74 65 6d 20 3d 20 73 71 6c 69 74 65  = pItem = sqlite
3f00: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
3f10: 20 20 70 2d 3e 6e 45 78 70 72 2a 73 69 7a 65 6f    p->nExpr*sizeo
3f20: 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20  f(p->a[0]) );.  
3f30: 69 66 28 20 70 49 74 65 6d 3d 3d 30 20 29 7b 0a  if( pItem==0 ){.
3f40: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
3f50: 28 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75  (pNew);.    retu
3f60: 72 6e 20 30 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c  rn 0;.  } .  pOl
3f70: 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20  dItem = p->a;.  
3f80: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45  for(i=0; i<p->nE
3f90: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
3fa0: 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a  +, pOldItem++){.
3fb0: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
3fc0: 70 72 2c 20 2a 70 4f 6c 64 45 78 70 72 3b 0a 20  pr, *pOldExpr;. 
3fd0: 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20     pItem->pExpr 
3fe0: 3d 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c  = pNewExpr = sql
3ff0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
4000: 70 4f 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64 49  pOldExpr = pOldI
4010: 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
4020: 20 69 66 28 20 70 4f 6c 64 45 78 70 72 2d 3e 73   if( pOldExpr->s
4030: 70 61 6e 2e 7a 21 3d 30 20 26 26 20 70 4e 65 77  pan.z!=0 && pNew
4040: 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Expr ){.      /*
4050: 20 41 6c 77 61 79 73 20 6d 61 6b 65 20 61 20 63   Always make a c
4060: 6f 70 79 20 6f 66 20 74 68 65 20 73 70 61 6e 20  opy of the span 
4070: 66 6f 72 20 74 6f 70 2d 6c 65 76 65 6c 20 65 78  for top-level ex
4080: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
4090: 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73  .      ** expres
40a0: 73 69 6f 6e 20 6c 69 73 74 2e 20 20 54 68 65 20  sion list.  The 
40b0: 6c 6f 67 69 63 20 69 6e 20 53 45 4c 45 43 54 20  logic in SELECT 
40c0: 70 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20  processing that 
40d0: 64 65 74 65 72 6d 69 6e 65 73 0a 20 20 20 20 20  determines.     
40e0: 20 2a 2a 20 74 68 65 20 6e 61 6d 65 73 20 6f 66   ** the names of
40f0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
4100: 72 65 73 75 6c 74 20 73 65 74 20 6e 65 65 64 73  result set needs
4110: 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   this informatio
4120: 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  n */.      sqlit
4130: 65 33 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20  e3TokenCopy(db, 
4140: 26 70 4e 65 77 45 78 70 72 2d 3e 73 70 61 6e 2c  &pNewExpr->span,
4150: 20 26 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e   &pOldExpr->span
4160: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
4170: 65 72 74 28 20 70 4e 65 77 45 78 70 72 3d 3d 30  ert( pNewExpr==0
4180: 20 7c 7c 20 70 4e 65 77 45 78 70 72 2d 3e 73 70   || pNewExpr->sp
4190: 61 6e 2e 7a 21 3d 30 20 0a 20 20 20 20 20 20 20  an.z!=0 .       
41a0: 20 20 20 20 20 7c 7c 20 70 4f 6c 64 45 78 70 72       || pOldExpr
41b0: 2d 3e 73 70 61 6e 2e 7a 3d 3d 30 0a 20 20 20 20  ->span.z==0.    
41c0: 20 20 20 20 20 20 20 20 7c 7c 20 64 62 2d 3e 6d          || db->m
41d0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
41e0: 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20     pItem->zName 
41f0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
4200: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
4210: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65  zName);.    pIte
4220: 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70  m->sortOrder = p
4230: 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64  OldItem->sortOrd
4240: 65 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 69  er;.    pItem->i
4250: 73 41 67 67 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  sAgg = pOldItem-
4260: 3e 69 73 41 67 67 3b 0a 20 20 20 20 70 49 74 65  >isAgg;.    pIte
4270: 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d  m->done = 0;.  }
4280: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
4290: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73  }../*.** If curs
42a0: 6f 72 73 2c 20 74 72 69 67 67 65 72 73 2c 20 76  ors, triggers, v
42b0: 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72  iews and subquer
42c0: 69 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74  ies are all omit
42d0: 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20  ted from.** the 
42e0: 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65  build, then none
42f0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
4300: 67 20 72 6f 75 74 69 6e 65 73 2c 20 65 78 63 65  g routines, exce
4310: 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74  pt for .** sqlit
4320: 65 33 53 65 6c 65 63 74 44 75 70 28 29 2c 20 63  e3SelectDup(), c
4330: 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 73 71  an be called. sq
4340: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29  lite3SelectDup()
4350: 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a   is sometimes.**
4360: 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 20 4e   called with a N
4370: 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ULL argument..*/
4380: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
4390: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
43a0: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
43b0: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29  TE_OMIT_TRIGGER)
43c0: 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64 28   \. || !defined(
43d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
43e0: 55 45 52 59 29 0a 53 72 63 4c 69 73 74 20 2a 73  UERY).SrcList *s
43f0: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70  qlite3SrcListDup
4400: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72  (sqlite3 *db, Sr
4410: 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20 53 72 63  cList *p){.  Src
4420: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  List *pNew;.  in
4430: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  t i;.  int nByte
4440: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
4450: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65  eturn 0;.  nByte
4460: 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20   = sizeof(*p) + 
4470: 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a  (p->nSrc>0 ? siz
4480: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28  eof(p->a[0]) * (
4490: 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b  p->nSrc-1) : 0);
44a0: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
44b0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
44c0: 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20   nByte );.  if( 
44d0: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
44e0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63   0;.  pNew->nSrc
44f0: 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20   = pNew->nAlloc 
4500: 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72  = p->nSrc;.  for
4510: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b  (i=0; i<p->nSrc;
4520: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
4530: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
4540: 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77  pNewItem = &pNew
4550: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75  ->a[i];.    stru
4560: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
4570: 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e  *pOldItem = &p->
4580: 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20  a[i];.    Table 
4590: 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 49  *pTab;.    pNewI
45a0: 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d  tem->zDatabase =
45b0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
45c0: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
45d0: 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70  Database);.    p
45e0: 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d  NewItem->zName =
45f0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
4600: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
4610: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49  Name);.    pNewI
4620: 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71  tem->zAlias = sq
4630: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
4640: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69  , pOldItem->zAli
4650: 61 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  as);.    pNewIte
4660: 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 4f  m->jointype = pO
4670: 6c 64 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ldItem->jointype
4680: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
4690: 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74  iCursor = pOldIt
46a0: 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
46b0: 20 70 4e 65 77 49 74 65 6d 2d 3e 69 73 50 6f 70   pNewItem->isPop
46c0: 75 6c 61 74 65 64 20 3d 20 70 4f 6c 64 49 74 65  ulated = pOldIte
46d0: 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 3b 0a  m->isPopulated;.
46e0: 20 20 20 20 70 54 61 62 20 3d 20 70 4e 65 77 49      pTab = pNewI
46f0: 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64  tem->pTab = pOld
4700: 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
4710: 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20  if( pTab ){.    
4720: 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a    pTab->nRef++;.
4730: 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74      }.    pNewIt
4740: 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  em->pSelect = sq
4750: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
4760: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65  b, pOldItem->pSe
4770: 6c 65 63 74 29 3b 0a 20 20 20 20 70 4e 65 77 49  lect);.    pNewI
4780: 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74  tem->pOn = sqlit
4790: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f  e3ExprDup(db, pO
47a0: 6c 64 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20  ldItem->pOn);.  
47b0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69    pNewItem->pUsi
47c0: 6e 67 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69  ng = sqlite3IdLi
47d0: 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  stDup(db, pOldIt
47e0: 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20  em->pUsing);.   
47f0: 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73   pNewItem->colUs
4800: 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63  ed = pOldItem->c
4810: 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65  olUsed;.  }.  re
4820: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c  turn pNew;.}.IdL
4830: 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69  ist *sqlite3IdLi
4840: 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  stDup(sqlite3 *d
4850: 62 2c 20 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20  b, IdList *p){. 
4860: 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20   IdList *pNew;. 
4870: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d   int i;.  if( p=
4880: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
4890: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
48a0: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
48b0: 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a  izeof(*pNew) );.
48c0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
48d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
48e0: 2d 3e 6e 49 64 20 3d 20 70 4e 65 77 2d 3e 6e 41  ->nId = pNew->nA
48f0: 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20  lloc = p->nId;. 
4900: 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74   pNew->a = sqlit
4910: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
4920: 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28  , p->nId*sizeof(
4930: 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66  p->a[0]) );.  if
4940: 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a  ( pNew->a==0 ){.
4950: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
4960: 28 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75  (pNew);.    retu
4970: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  rn 0;.  }.  for(
4980: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69  i=0; i<p->nId; i
4990: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
49a0: 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65  IdList_item *pNe
49b0: 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61  wItem = &pNew->a
49c0: 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20  [i];.    struct 
49d0: 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c  IdList_item *pOl
49e0: 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d  dItem = &p->a[i]
49f0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
4a00: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
4a10: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
4a20: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
4a30: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20    pNewItem->idx 
4a40: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b  = pOldItem->idx;
4a50: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
4a60: 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71  ew;.}.Select *sq
4a70: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 73  lite3SelectDup(s
4a80: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65  qlite3 *db, Sele
4a90: 63 74 20 2a 70 29 7b 0a 20 20 53 65 6c 65 63 74  ct *p){.  Select
4aa0: 20 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d   *pNew;.  if( p=
4ab0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
4ac0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
4ad0: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
4ae0: 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
4af0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
4b00: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69  urn 0;.  pNew->i
4b10: 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69  sDistinct = p->i
4b20: 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 70 4e 65  sDistinct;.  pNe
4b30: 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69  w->pEList = sqli
4b40: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
4b50: 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  b, p->pEList);. 
4b60: 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71   pNew->pSrc = sq
4b70: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28  lite3SrcListDup(
4b80: 64 62 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20  db, p->pSrc);.  
4b90: 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 73  pNew->pWhere = s
4ba0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
4bb0: 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  , p->pWhere);.  
4bc0: 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d  pNew->pGroupBy =
4bd0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
4be0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75  Dup(db, p->pGrou
4bf0: 70 42 79 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48  pBy);.  pNew->pH
4c00: 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45  aving = sqlite3E
4c10: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 48  xprDup(db, p->pH
4c20: 61 76 69 6e 67 29 3b 0a 20 20 70 4e 65 77 2d 3e  aving);.  pNew->
4c30: 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74  pOrderBy = sqlit
4c40: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
4c50: 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  , p->pOrderBy);.
4c60: 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e    pNew->op = p->
4c70: 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69  op;.  pNew->pPri
4c80: 6f 72 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  or = sqlite3Sele
4c90: 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 50 72  ctDup(db, p->pPr
4ca0: 69 6f 72 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c  ior);.  pNew->pL
4cb0: 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78  imit = sqlite3Ex
4cc0: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69  prDup(db, p->pLi
4cd0: 6d 69 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f  mit);.  pNew->pO
4ce0: 66 66 73 65 74 20 3d 20 73 71 6c 69 74 65 33 45  ffset = sqlite3E
4cf0: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f  xprDup(db, p->pO
4d00: 66 66 73 65 74 29 3b 0a 20 20 70 4e 65 77 2d 3e  ffset);.  pNew->
4d10: 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 70  iLimit = -1;.  p
4d20: 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d  New->iOffset = -
4d30: 31 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 52 65 73  1;.  pNew->isRes
4d40: 6f 6c 76 65 64 20 3d 20 70 2d 3e 69 73 52 65 73  olved = p->isRes
4d50: 6f 6c 76 65 64 3b 0a 20 20 70 4e 65 77 2d 3e 69  olved;.  pNew->i
4d60: 73 41 67 67 20 3d 20 70 2d 3e 69 73 41 67 67 3b  sAgg = p->isAgg;
4d70: 0a 20 20 70 4e 65 77 2d 3e 75 73 65 73 45 70 68  .  pNew->usesEph
4d80: 6d 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 64  m = 0;.  pNew->d
4d90: 69 73 61 6c 6c 6f 77 4f 72 64 65 72 42 79 20 3d  isallowOrderBy =
4da0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67   0;.  pNew->pRig
4db0: 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 70 4e  htmost = 0;.  pN
4dc0: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
4dd0: 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  [0] = -1;.  pNew
4de0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
4df0: 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  ] = -1;.  pNew->
4e00: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20  addrOpenEphm[2] 
4e10: 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70  = -1;.  return p
4e20: 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c  New;.}.#else.Sel
4e30: 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65  ect *sqlite3Sele
4e40: 63 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  ctDup(sqlite3 *d
4e50: 62 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  b, Select *p){. 
4e60: 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b   assert( p==0 );
4e70: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
4e80: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64  endif.../*.** Ad
4e90: 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
4ea0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e  to the end of an
4eb0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
4ec0: 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a  .  If pList is.*
4ed0: 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c  * initially NULL
4ee0: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
4ef0: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  new expression l
4f00: 69 73 74 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74  ist..*/.ExprList
4f10: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73   *sqlite3ExprLis
4f20: 74 41 70 70 65 6e 64 28 0a 20 20 50 61 72 73 65  tAppend(.  Parse
4f30: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
4f40: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
4f50: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
4f60: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
4f70: 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68     /* List to wh
4f80: 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d  ich to append. M
4f90: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
4fa0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
4fb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
4fc0: 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70  ression to be ap
4fd0: 70 65 6e 64 65 64 20 2a 2f 0a 20 20 54 6f 6b 65  pended */.  Toke
4fe0: 6e 20 2a 70 4e 61 6d 65 20 20 20 20 20 20 20 20  n *pName        
4ff0: 20 20 20 20 2f 2a 20 41 53 20 6b 65 79 77 6f 72      /* AS keywor
5000: 64 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73  d for the expres
5010: 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  sion */.){.  sql
5020: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
5030: 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 4c 69  e->db;.  if( pLi
5040: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
5050: 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  st = sqlite3DbMa
5060: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
5070: 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20 29 3b  eof(ExprList) );
5080: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
5090: 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
50a0: 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20  no_mem;.    }.  
50b0: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
50c0: 3e 6e 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20  >nAlloc==0 );.  
50d0: 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e  }.  if( pList->n
50e0: 41 6c 6c 6f 63 3c 3d 70 4c 69 73 74 2d 3e 6e 45  Alloc<=pList->nE
50f0: 78 70 72 20 29 7b 0a 20 20 20 20 73 74 72 75 63  xpr ){.    struc
5100: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
5110: 2a 61 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20  *a;.    int n = 
5120: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20  pList->nAlloc*2 
5130: 2b 20 34 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c  + 4;.    a = sql
5140: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
5150: 2c 20 70 4c 69 73 74 2d 3e 61 2c 20 6e 2a 73 69  , pList->a, n*si
5160: 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
5170: 29 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30  ));.    if( a==0
5180: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e   ){.      goto n
5190: 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  o_mem;.    }.   
51a0: 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20   pList->a = a;. 
51b0: 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63     pList->nAlloc
51c0: 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = n;.  }.  asse
51d0: 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20  rt( pList->a!=0 
51e0: 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20 7c  );.  if( pExpr |
51f0: 7c 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73  | pName ){.    s
5200: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
5210: 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c  tem *pItem = &pL
5220: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45  ist->a[pList->nE
5230: 78 70 72 2b 2b 5d 3b 0a 20 20 20 20 6d 65 6d 73  xpr++];.    mems
5240: 65 74 28 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a  et(pItem, 0, siz
5250: 65 6f 66 28 2a 70 49 74 65 6d 29 29 3b 0a 20 20  eof(*pItem));.  
5260: 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
5270: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
5280: 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29  Token(db, pName)
5290: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78  ;.    pItem->pEx
52a0: 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 7d 0a  pr = pExpr;.  }.
52b0: 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
52c0: 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20  .no_mem:     .  
52d0: 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67  /* Avoid leaking
52e0: 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f   memory if mallo
52f0: 63 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f  c has failed. */
5300: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
5310: 6c 65 74 65 28 70 45 78 70 72 29 3b 0a 20 20 73  lete(pExpr);.  s
5320: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
5330: 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 72  lete(pList);.  r
5340: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
5350: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
5360: 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20  ion list pEList 
5370: 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68  contains more th
5380: 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e  an iLimit elemen
5390: 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20  ts,.** leave an 
53a0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
53b0: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64   pParse..*/.void
53c0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
53d0: 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50  CheckLength(.  P
53e0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20  arse *pParse,.  
53f0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
5400: 2c 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 2c 0a  ,.  int iLimit,.
5410: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
5420: 62 6a 65 63 74 0a 29 7b 0a 20 20 69 66 28 20 70  bject.){.  if( p
5430: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
5440: 3e 6e 45 78 70 72 3e 69 4c 69 6d 69 74 20 29 7b  >nExpr>iLimit ){
5450: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
5460: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
5470: 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69  o many columns i
5480: 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b  n %s", zObject);
5490: 0a 20 20 7d 0a 7d 0a 0a 0a 23 69 66 20 64 65 66  .  }.}...#if def
54a0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
54b0: 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ) || SQLITE_MAX_
54c0: 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 2f 2a 20  EXPR_DEPTH>0./* 
54d0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  The following th
54e0: 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68  ree functions, h
54f0: 65 69 67 68 74 4f 66 45 78 70 72 28 29 2c 20 68  eightOfExpr(), h
5500: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
5510: 29 0a 2a 2a 20 61 6e 64 20 68 65 69 67 68 74 4f  ).** and heightO
5520: 66 53 65 6c 65 63 74 28 29 2c 20 61 72 65 20 75  fSelect(), are u
5530: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
5540: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69   the maximum hei
5550: 67 68 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78  ght.** of any ex
5560: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65  pression tree re
5570: 66 65 72 65 6e 63 65 64 20 62 79 20 74 68 65 20  ferenced by the 
5580: 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
5590: 20 61 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   as the.** first
55a0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
55b0: 20 49 66 20 74 68 69 73 20 6d 61 78 69 6d 75 6d   If this maximum
55c0: 20 68 65 69 67 68 74 20 69 73 20 67 72 65 61 74   height is great
55d0: 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
55e0: 65 6e 74 20 76 61 6c 75 65 20 70 6f 69 6e 74 65  ent value pointe
55f0: 64 0a 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65 69  d.** to by pnHei
5600: 67 68 74 2c 20 74 68 65 20 73 65 63 6f 6e 64 20  ght, the second 
5610: 70 61 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20  parameter, then 
5620: 73 65 74 20 2a 70 6e 48 65 69 67 68 74 20 74 6f  set *pnHeight to
5630: 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a   that.** value..
5640: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68  */.static void h
5650: 65 69 67 68 74 4f 66 45 78 70 72 28 45 78 70 72  eightOfExpr(Expr
5660: 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67   *p, int *pnHeig
5670: 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  ht){.  if( p ){.
5680: 20 20 20 20 69 66 28 20 70 2d 3e 6e 48 65 69 67      if( p->nHeig
5690: 68 74 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a  ht>*pnHeight ){.
56a0: 20 20 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20        *pnHeight 
56b0: 3d 20 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20  = p->nHeight;.  
56c0: 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63    }.  }.}.static
56d0: 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78   void heightOfEx
56e0: 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20  prList(ExprList 
56f0: 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68  *p, int *pnHeigh
5700: 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  t){.  if( p ){. 
5710: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
5720: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70  r(i=0; i<p->nExp
5730: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68  r; i++){.      h
5740: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 61  eightOfExpr(p->a
5750: 5b 69 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65 69  [i].pExpr, pnHei
5760: 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ght);.    }.  }.
5770: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65  }.static void he
5780: 69 67 68 74 4f 66 53 65 6c 65 63 74 28 53 65 6c  ightOfSelect(Sel
5790: 65 63 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48  ect *p, int *pnH
57a0: 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20  eight){.  if( p 
57b0: 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  ){.    heightOfE
57c0: 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70  xpr(p->pWhere, p
57d0: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
57e0: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 48  ightOfExpr(p->pH
57f0: 61 76 69 6e 67 2c 20 70 6e 48 65 69 67 68 74 29  aving, pnHeight)
5800: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
5810: 70 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e  pr(p->pLimit, pn
5820: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
5830: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4f 66  ghtOfExpr(p->pOf
5840: 66 73 65 74 2c 20 70 6e 48 65 69 67 68 74 29 3b  fset, pnHeight);
5850: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
5860: 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c  rList(p->pEList,
5870: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
5880: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
5890: 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e  (p->pGroupBy, pn
58a0: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
58b0: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
58c0: 3e 70 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69  >pOrderBy, pnHei
58d0: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
58e0: 4f 66 53 65 6c 65 63 74 28 70 2d 3e 70 50 72 69  OfSelect(p->pPri
58f0: 6f 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  or, pnHeight);. 
5900: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
5910: 74 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74  the Expr.nHeight
5920: 20 76 61 72 69 61 62 6c 65 20 69 6e 20 74 68 65   variable in the
5930: 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65   structure passe
5940: 64 20 61 73 20 61 6e 20 0a 2a 2a 20 61 72 67 75  d as an .** argu
5950: 6d 65 6e 74 2e 20 41 6e 20 65 78 70 72 65 73 73  ment. An express
5960: 69 6f 6e 20 77 69 74 68 20 6e 6f 20 63 68 69 6c  ion with no chil
5970: 64 72 65 6e 2c 20 45 78 70 72 2e 70 4c 69 73 74  dren, Expr.pList
5980: 20 6f 72 20 0a 2a 2a 20 45 78 70 72 2e 70 53 65   or .** Expr.pSe
5990: 6c 65 63 74 20 6d 65 6d 62 65 72 20 68 61 73 20  lect member has 
59a0: 61 20 68 65 69 67 68 74 20 6f 66 20 31 2e 20 41  a height of 1. A
59b0: 6e 79 20 6f 74 68 65 72 20 65 78 70 72 65 73 73  ny other express
59c0: 69 6f 6e 0a 2a 2a 20 68 61 73 20 61 20 68 65 69  ion.** has a hei
59d0: 67 68 74 20 65 71 75 61 6c 20 74 6f 20 74 68 65  ght equal to the
59e0: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20   maximum height 
59f0: 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 0a 2a 2a  of any other .**
5a00: 20 72 65 66 65 72 65 6e 63 65 64 20 45 78 70 72   referenced Expr
5a10: 20 70 6c 75 73 20 6f 6e 65 2e 0a 2a 2f 0a 76 6f   plus one..*/.vo
5a20: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53 65  id sqlite3ExprSe
5a30: 74 48 65 69 67 68 74 28 45 78 70 72 20 2a 70 29  tHeight(Expr *p)
5a40: 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20  {.  int nHeight 
5a50: 3d 20 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 45  = 0;.  heightOfE
5a60: 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 6e  xpr(p->pLeft, &n
5a70: 48 65 69 67 68 74 29 3b 0a 20 20 68 65 69 67 68  Height);.  heigh
5a80: 74 4f 66 45 78 70 72 28 70 2d 3e 70 52 69 67 68  tOfExpr(p->pRigh
5a90: 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20  t, &nHeight);.  
5aa0: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
5ab0: 28 70 2d 3e 70 4c 69 73 74 2c 20 26 6e 48 65 69  (p->pList, &nHei
5ac0: 67 68 74 29 3b 0a 20 20 68 65 69 67 68 74 4f 66  ght);.  heightOf
5ad0: 53 65 6c 65 63 74 28 70 2d 3e 70 53 65 6c 65 63  Select(p->pSelec
5ae0: 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20  t, &nHeight);.  
5af0: 70 2d 3e 6e 48 65 69 67 68 74 20 3d 20 6e 48 65  p->nHeight = nHe
5b00: 69 67 68 74 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a  ight + 1;.}../*.
5b10: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 61  ** Return the ma
5b20: 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20  ximum height of 
5b30: 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74  any expression t
5b40: 72 65 65 20 72 65 66 65 72 65 6e 63 65 64 0a 2a  ree referenced.*
5b50: 2a 20 62 79 20 74 68 65 20 73 65 6c 65 63 74 20  * by the select 
5b60: 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
5b70: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e   as an argument.
5b80: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53  .*/.int sqlite3S
5b90: 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28  electExprHeight(
5ba0: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e  Select *p){.  in
5bb0: 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20  t nHeight = 0;. 
5bc0: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
5bd0: 70 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20  p, &nHeight);.  
5be0: 72 65 74 75 72 6e 20 6e 48 65 69 67 68 74 3b 0a  return nHeight;.
5bf0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
5c00: 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
5c10: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
5c20: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5c30: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
5c40: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
5c50: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
5c60: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
5c70: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20  m *pItem;.  if( 
5c80: 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
5c90: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  n;.  assert( pLi
5ca0: 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 28 70 4c 69  st->a!=0 || (pLi
5cb0: 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 26 26 20  st->nExpr==0 && 
5cc0: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30  pList->nAlloc==0
5cd0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
5ce0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3c 3d 70 4c 69  List->nExpr<=pLi
5cf0: 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 20 20  st->nAlloc );.  
5d00: 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
5d10: 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74  >a, i=0; i<pList
5d20: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  ->nExpr; i++, pI
5d30: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  tem++){.    sqli
5d40: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 49  te3ExprDelete(pI
5d50: 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
5d60: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
5d70: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  tem->zName);.  }
5d80: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
5d90: 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c  pList->a);.  sql
5da0: 69 74 65 33 5f 66 72 65 65 28 70 4c 69 73 74 29  ite3_free(pList)
5db0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  ;.}../*.** Walk 
5dc0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
5dd0: 65 65 2e 20 20 43 61 6c 6c 20 78 46 75 6e 63 20  ee.  Call xFunc 
5de0: 66 6f 72 20 65 61 63 68 20 6e 6f 64 65 20 76 69  for each node vi
5df0: 73 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  sited..**.** The
5e00: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72   return value fr
5e10: 6f 6d 20 78 46 75 6e 63 20 64 65 74 65 72 6d 69  om xFunc determi
5e20: 6e 65 73 20 77 68 65 74 68 65 72 20 74 68 65 20  nes whether the 
5e30: 74 72 65 65 20 77 61 6c 6b 20 63 6f 6e 74 69 6e  tree walk contin
5e40: 75 65 73 2e 0a 2a 2a 20 30 20 6d 65 61 6e 73 20  ues..** 0 means 
5e50: 63 6f 6e 74 69 6e 75 65 20 77 61 6c 6b 69 6e 67  continue walking
5e60: 20 74 68 65 20 74 72 65 65 2e 20 20 31 20 6d 65   the tree.  1 me
5e70: 61 6e 73 20 64 6f 20 6e 6f 74 20 77 61 6c 6b 20  ans do not walk 
5e80: 63 68 69 6c 64 72 65 6e 0a 2a 2a 20 6f 66 20 74  children.** of t
5e90: 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64 65 20  he current node 
5ea0: 62 75 74 20 63 6f 6e 74 69 6e 75 65 20 77 69 74  but continue wit
5eb0: 68 20 73 69 62 6c 69 6e 67 73 2e 20 20 32 20 6d  h siblings.  2 m
5ec0: 65 61 6e 73 20 61 62 61 6e 64 6f 6e 0a 2a 2a 20  eans abandon.** 
5ed0: 74 68 65 20 74 72 65 65 20 77 61 6c 6b 20 63 6f  the tree walk co
5ee0: 6d 70 6c 65 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20  mpletely..**.** 
5ef0: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
5f00: 20 66 72 6f 6d 20 74 68 69 73 20 72 6f 75 74 69   from this routi
5f10: 6e 65 20 69 73 20 31 20 74 6f 20 61 62 61 6e 64  ne is 1 to aband
5f20: 6f 6e 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b  on the tree walk
5f30: 0a 2a 2a 20 61 6e 64 20 30 20 74 6f 20 63 6f 6e  .** and 0 to con
5f40: 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 4e 4f 54  tinue..**.** NOT
5f50: 49 43 45 3a 20 20 54 68 69 73 20 72 6f 75 74 69  ICE:  This routi
5f60: 6e 65 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 64 65  ne does *not* de
5f70: 73 63 65 6e 64 20 69 6e 74 6f 20 73 75 62 71 75  scend into subqu
5f80: 65 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  eries..*/.static
5f90: 20 69 6e 74 20 77 61 6c 6b 45 78 70 72 4c 69 73   int walkExprLis
5fa0: 74 28 45 78 70 72 4c 69 73 74 20 2a 2c 20 69 6e  t(ExprList *, in
5fb0: 74 20 28 2a 29 28 76 6f 69 64 20 2a 2c 20 45 78  t (*)(void *, Ex
5fc0: 70 72 2a 29 2c 20 76 6f 69 64 20 2a 29 3b 0a 73  pr*), void *);.s
5fd0: 74 61 74 69 63 20 69 6e 74 20 77 61 6c 6b 45 78  tatic int walkEx
5fe0: 70 72 54 72 65 65 28 45 78 70 72 20 2a 70 45 78  prTree(Expr *pEx
5ff0: 70 72 2c 20 69 6e 74 20 28 2a 78 46 75 6e 63 29  pr, int (*xFunc)
6000: 28 76 6f 69 64 2a 2c 45 78 70 72 2a 29 2c 20 76  (void*,Expr*), v
6010: 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e  oid *pArg){.  in
6020: 74 20 72 63 3b 0a 20 20 69 66 28 20 70 45 78 70  t rc;.  if( pExp
6030: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  r==0 ) return 0;
6040: 0a 20 20 72 63 20 3d 20 28 2a 78 46 75 6e 63 29  .  rc = (*xFunc)
6050: 28 70 41 72 67 2c 20 70 45 78 70 72 29 3b 0a 20  (pArg, pExpr);. 
6060: 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20   if( rc==0 ){.  
6070: 20 20 69 66 28 20 77 61 6c 6b 45 78 70 72 54 72    if( walkExprTr
6080: 65 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  ee(pExpr->pLeft,
6090: 20 78 46 75 6e 63 2c 20 70 41 72 67 29 20 29 20   xFunc, pArg) ) 
60a0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66  return 1;.    if
60b0: 28 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70  ( walkExprTree(p
60c0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 78 46  Expr->pRight, xF
60d0: 75 6e 63 2c 20 70 41 72 67 29 20 29 20 72 65 74  unc, pArg) ) ret
60e0: 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 77  urn 1;.    if( w
60f0: 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 45 78 70  alkExprList(pExp
6100: 72 2d 3e 70 4c 69 73 74 2c 20 78 46 75 6e 63 2c  r->pList, xFunc,
6110: 20 70 41 72 67 29 20 29 20 72 65 74 75 72 6e 20   pArg) ) return 
6120: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
6130: 72 63 3e 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rc>1;.}../*.** C
6140: 61 6c 6c 20 77 61 6c 6b 45 78 70 72 54 72 65 65  all walkExprTree
6150: 28 29 20 66 6f 72 20 65 76 65 72 79 20 65 78 70  () for every exp
6160: 72 65 73 73 69 6f 6e 20 69 6e 20 6c 69 73 74 20  ression in list 
6170: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
6180: 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 45 78   walkExprList(Ex
6190: 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 28  prList *p, int (
61a0: 2a 78 46 75 6e 63 29 28 76 6f 69 64 20 2a 2c 20  *xFunc)(void *, 
61b0: 45 78 70 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41  Expr*), void *pA
61c0: 72 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  rg){.  int i;.  
61d0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
61e0: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
61f0: 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 20 30  f( !p ) return 0
6200: 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 45 78  ;.  for(i=p->nEx
6210: 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e 61 3b 20  pr, pItem=p->a; 
6220: 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b  i>0; i--, pItem+
6230: 2b 29 7b 0a 20 20 20 20 69 66 28 20 77 61 6c 6b  +){.    if( walk
6240: 45 78 70 72 54 72 65 65 28 70 49 74 65 6d 2d 3e  ExprTree(pItem->
6250: 70 45 78 70 72 2c 20 78 46 75 6e 63 2c 20 70 41  pExpr, xFunc, pA
6260: 72 67 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  rg) ) return 1;.
6270: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
6280: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 77 61  }../*.** Call wa
6290: 6c 6b 45 78 70 72 54 72 65 65 28 29 20 66 6f 72  lkExprTree() for
62a0: 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f   every expressio
62b0: 6e 20 69 6e 20 53 65 6c 65 63 74 20 70 2c 20 6e  n in Select p, n
62c0: 6f 74 20 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20  ot including.** 
62d0: 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74  expressions that
62e0: 20 61 72 65 20 70 61 72 74 20 6f 66 20 73 75 62   are part of sub
62f0: 2d 73 65 6c 65 63 74 73 20 69 6e 20 61 6e 79 20  -selects in any 
6300: 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 72 20 74  FROM clause or t
6310: 68 65 20 4c 49 4d 49 54 0a 2a 2a 20 6f 72 20 4f  he LIMIT.** or O
6320: 46 46 53 45 54 20 65 78 70 72 65 73 73 69 6f 6e  FFSET expression
6330: 73 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  s...*/.static in
6340: 74 20 77 61 6c 6b 53 65 6c 65 63 74 45 78 70 72  t walkSelectExpr
6350: 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20  (Select *p, int 
6360: 28 2a 78 46 75 6e 63 29 28 76 6f 69 64 20 2a 2c  (*xFunc)(void *,
6370: 20 45 78 70 72 2a 29 2c 20 76 6f 69 64 20 2a 70   Expr*), void *p
6380: 41 72 67 29 7b 0a 20 20 77 61 6c 6b 45 78 70 72  Arg){.  walkExpr
6390: 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20  List(p->pEList, 
63a0: 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20  xFunc, pArg);.  
63b0: 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70 2d 3e  walkExprTree(p->
63c0: 70 57 68 65 72 65 2c 20 78 46 75 6e 63 2c 20 70  pWhere, xFunc, p
63d0: 41 72 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72  Arg);.  walkExpr
63e0: 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79  List(p->pGroupBy
63f0: 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a  , xFunc, pArg);.
6400: 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70    walkExprTree(p
6410: 2d 3e 70 48 61 76 69 6e 67 2c 20 78 46 75 6e 63  ->pHaving, xFunc
6420: 2c 20 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b 45  , pArg);.  walkE
6430: 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65  xprList(p->pOrde
6440: 72 42 79 2c 20 78 46 75 6e 63 2c 20 70 41 72 67  rBy, xFunc, pArg
6450: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  );.  if( p->pPri
6460: 6f 72 20 29 7b 0a 20 20 20 20 77 61 6c 6b 53 65  or ){.    walkSe
6470: 6c 65 63 74 45 78 70 72 28 70 2d 3e 70 50 72 69  lectExpr(p->pPri
6480: 6f 72 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29  or, xFunc, pArg)
6490: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
64a0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
64b0: 20 72 6f 75 74 69 6e 65 20 69 73 20 64 65 73 69   routine is desi
64c0: 67 6e 65 64 20 61 73 20 61 6e 20 78 46 75 6e 63  gned as an xFunc
64d0: 20 66 6f 72 20 77 61 6c 6b 45 78 70 72 54 72 65   for walkExprTre
64e0: 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 70 41 72 67 20  e()..**.** pArg 
64f0: 69 73 20 72 65 61 6c 6c 79 20 61 20 70 6f 69 6e  is really a poin
6500: 74 65 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  ter to an intege
6510: 72 2e 20 20 49 66 20 77 65 20 63 61 6e 20 74 65  r.  If we can te
6520: 6c 6c 20 62 79 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a  ll by looking.**
6530: 20 61 74 20 70 45 78 70 72 20 74 68 61 74 20 74   at pExpr that t
6540: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
6550: 61 74 20 63 6f 6e 74 61 69 6e 73 20 70 45 78 70  at contains pExp
6560: 72 20 69 73 20 6e 6f 74 20 61 20 63 6f 6e 73 74  r is not a const
6570: 61 6e 74 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ant.** expressio
6580: 6e 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 41 72  n, then set *pAr
6590: 67 20 74 6f 20 30 20 61 6e 64 20 72 65 74 75 72  g to 0 and retur
65a0: 6e 20 32 20 74 6f 20 61 62 61 6e 64 6f 6e 20 74  n 2 to abandon t
65b0: 68 65 20 74 72 65 65 20 77 61 6c 6b 2e 0a 2a 2a  he tree walk..**
65c0: 20 49 66 20 70 45 78 70 72 20 64 6f 65 73 20 64   If pExpr does d
65d0: 6f 65 73 20 6e 6f 74 20 64 69 73 71 75 61 6c 69  oes not disquali
65e0: 66 79 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  fy the expressio
65f0: 6e 20 66 72 6f 6d 20 62 65 69 6e 67 20 61 20 63  n from being a c
6600: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 65 6e 20  onstant.** then 
6610: 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a  do nothing..**.*
6620: 2a 20 41 66 74 65 72 20 77 61 6c 6b 69 6e 67 20  * After walking 
6630: 74 68 65 20 77 68 6f 6c 65 20 74 72 65 65 2c 20  the whole tree, 
6640: 69 66 20 6e 6f 20 6e 6f 64 65 73 20 61 72 65 20  if no nodes are 
6650: 66 6f 75 6e 64 20 74 68 61 74 20 64 69 73 71 75  found that disqu
6660: 61 6c 69 66 79 0a 2a 2a 20 74 68 65 20 65 78 70  alify.** the exp
6670: 72 65 73 73 69 6f 6e 20 61 73 20 63 6f 6e 73 74  ression as const
6680: 61 6e 74 2c 20 74 68 65 6e 20 77 65 20 61 73 73  ant, then we ass
6690: 75 6d 65 20 74 68 65 20 77 68 6f 6c 65 20 65 78  ume the whole ex
66a0: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63  pression.** is c
66b0: 6f 6e 73 74 61 6e 74 2e 20 20 53 65 65 20 73 71  onstant.  See sq
66c0: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
66d0: 61 6e 74 28 29 20 66 6f 72 20 61 64 64 69 74 69  ant() for additi
66e0: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
66f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6700: 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61  exprNodeIsConsta
6710: 6e 74 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 45  nt(void *pArg, E
6720: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69  xpr *pExpr){.  i
6730: 6e 74 20 2a 70 4e 20 3d 20 28 69 6e 74 2a 29 70  nt *pN = (int*)p
6740: 41 72 67 3b 0a 0a 20 20 2f 2a 20 49 66 20 2a 70  Arg;..  /* If *p
6750: 41 72 67 20 69 73 20 33 20 74 68 65 6e 20 61 6e  Arg is 3 then an
6760: 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 65 78  y term of the ex
6770: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f  pression that co
6780: 6d 65 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68  mes from.  ** th
6790: 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
67a0: 61 75 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e 20  auses of a join 
67b0: 64 69 73 71 75 61 6c 69 66 69 65 73 20 74 68 65  disqualifies the
67c0: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a   expression.  **
67d0: 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f 6e 73   from being cons
67e0: 69 64 65 72 65 64 20 63 6f 6e 73 74 61 6e 74 2e  idered constant.
67f0: 20 2a 2f 0a 20 20 69 66 28 20 28 2a 70 4e 29 3d   */.  if( (*pN)=
6800: 3d 33 20 26 26 20 45 78 70 72 48 61 73 41 6e 79  =3 && ExprHasAny
6810: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
6820: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a  EP_FromJoin) ){.
6830: 20 20 20 20 2a 70 4e 20 3d 20 30 3b 0a 20 20 20      *pN = 0;.   
6840: 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 0a   return 2;.  }..
6850: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
6860: 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f  >op ){.    /* Co
6870: 6e 73 69 64 65 72 20 66 75 6e 63 74 69 6f 6e 73  nsider functions
6880: 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 20   to be constant 
6890: 69 66 20 61 6c 6c 20 74 68 65 69 72 20 61 72 67  if all their arg
68a0: 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e 73 74  uments are const
68b0: 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 2a  ant.    ** and *
68c0: 70 41 72 67 3d 3d 32 20 2a 2f 0a 20 20 20 20 63  pArg==2 */.    c
68d0: 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
68e0: 0a 20 20 20 20 20 20 69 66 28 20 28 2a 70 4e 29  .      if( (*pN)
68f0: 3d 3d 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==2 ) return 0;.
6900: 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
6910: 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73  rough */.    cas
6920: 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73  e TK_ID:.    cas
6930: 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  e TK_COLUMN:.   
6940: 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a 0a 20 20   case TK_DOT:.  
6950: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
6960: 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65  NCTION:.    case
6970: 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a   TK_AGG_COLUMN:.
6980: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
6990: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
69a0: 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
69b0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49  .    case TK_EXI
69c0: 53 54 53 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20  STS:.#endif.    
69d0: 20 20 2a 70 4e 20 3d 20 30 3b 0a 20 20 20 20 20    *pN = 0;.     
69e0: 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 63   return 2;.    c
69f0: 61 73 65 20 54 4b 5f 49 4e 3a 0a 20 20 20 20 20  ase TK_IN:.     
6a00: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c   if( pExpr->pSel
6a10: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ect ){.        *
6a20: 70 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  pN = 0;.        
6a30: 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 20 20  return 2;.      
6a40: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  }.    default:. 
6a50: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
6a60: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b   }.}../*.** Walk
6a70: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
6a80: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69  ree.  Return 1 i
6a90: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
6aa0: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
6ab0: 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f  and 0 if it invo
6ac0: 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f  lves variables o
6ad0: 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73  r function calls
6ae0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
6af0: 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
6b00: 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75   function, a dou
6b10: 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  ble-quoted strin
6b20: 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a  g (ex: "abc").**
6b30: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
6b40: 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20   variable but a 
6b50: 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74  single-quoted st
6b60: 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29  ring (ex: 'abc')
6b70: 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e   is.** a constan
6b80: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
6b90: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
6ba0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Expr *p){.  int 
6bb0: 69 73 43 6f 6e 73 74 20 3d 20 31 3b 0a 20 20 77  isConst = 1;.  w
6bc0: 61 6c 6b 45 78 70 72 54 72 65 65 28 70 2c 20 65  alkExprTree(p, e
6bd0: 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  xprNodeIsConstan
6be0: 74 2c 20 26 69 73 43 6f 6e 73 74 29 3b 0a 20 20  t, &isConst);.  
6bf0: 72 65 74 75 72 6e 20 69 73 43 6f 6e 73 74 3b 0a  return isConst;.
6c00: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
6c10: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
6c20: 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  .  Return 1 if t
6c30: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
6c40: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 61   constant.** tha
6c50: 74 20 64 6f 65 73 20 6e 6f 20 6f 72 69 67 69 6e  t does no origin
6c60: 61 74 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20  ate from the ON 
6c70: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
6c80: 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20 52   of a join..** R
6c90: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 6e  eturn 0 if it in
6ca0: 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73  volves variables
6cb0: 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c   or function cal
6cc0: 6c 73 20 6f 72 20 74 65 72 6d 73 20 66 72 6f 6d  ls or terms from
6cd0: 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72 20 55 53 49  .** an ON or USI
6ce0: 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e  NG clause..*/.in
6cf0: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
6d00: 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45  onstantNotJoin(E
6d10: 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  xpr *p){.  int i
6d20: 73 43 6f 6e 73 74 20 3d 20 33 3b 0a 20 20 77 61  sConst = 3;.  wa
6d30: 6c 6b 45 78 70 72 54 72 65 65 28 70 2c 20 65 78  lkExprTree(p, ex
6d40: 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  prNodeIsConstant
6d50: 2c 20 26 69 73 43 6f 6e 73 74 29 3b 0a 20 20 72  , &isConst);.  r
6d60: 65 74 75 72 6e 20 69 73 43 6f 6e 73 74 21 3d 30  eturn isConst!=0
6d70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  ;.}../*.** Walk 
6d80: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
6d90: 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66  ee.  Return 1 if
6da0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
6db0: 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f  is constant.** o
6dc0: 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  r a function cal
6dd0: 6c 20 77 69 74 68 20 63 6f 6e 73 74 61 6e 74 20  l with constant 
6de0: 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75  arguments.  Retu
6df0: 72 6e 20 61 6e 64 20 30 20 69 66 20 74 68 65 72  rn and 0 if ther
6e00: 65 0a 2a 2a 20 61 72 65 20 61 6e 79 20 76 61 72  e.** are any var
6e10: 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f  iables..**.** Fo
6e20: 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
6e30: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  f this function,
6e40: 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64   a double-quoted
6e50: 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62   string (ex: "ab
6e60: 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64  c").** is consid
6e70: 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65 20  ered a variable 
6e80: 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f  but a single-quo
6e90: 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20  ted string (ex: 
6ea0: 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63  'abc') is.** a c
6eb0: 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  onstant..*/.int 
6ec0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
6ed0: 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28  stantOrFunction(
6ee0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Expr *p){.  int 
6ef0: 69 73 43 6f 6e 73 74 20 3d 20 32 3b 0a 20 20 77  isConst = 2;.  w
6f00: 61 6c 6b 45 78 70 72 54 72 65 65 28 70 2c 20 65  alkExprTree(p, e
6f10: 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  xprNodeIsConstan
6f20: 74 2c 20 26 69 73 43 6f 6e 73 74 29 3b 0a 20 20  t, &isConst);.  
6f30: 72 65 74 75 72 6e 20 69 73 43 6f 6e 73 74 21 3d  return isConst!=
6f40: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  0;.}../*.** If t
6f50: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20  he expression p 
6f60: 63 6f 64 65 73 20 61 20 63 6f 6e 73 74 61 6e 74  codes a constant
6f70: 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 69 73   integer that is
6f80: 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a   small enough.**
6f90: 20 74 6f 20 66 69 74 20 69 6e 20 61 20 33 32 2d   to fit in a 32-
6fa0: 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74  bit integer, ret
6fb0: 75 72 6e 20 31 20 61 6e 64 20 70 75 74 20 74 68  urn 1 and put th
6fc0: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69  e value of the i
6fd0: 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56  nteger.** in *pV
6fe0: 61 6c 75 65 2e 20 20 49 66 20 74 68 65 20 65 78  alue.  If the ex
6ff0: 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20  pression is not 
7000: 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 69 66  an integer or if
7010: 20 69 74 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a   it is too big.*
7020: 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 73 69  * to fit in a si
7030: 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65  gned 32-bit inte
7040: 67 65 72 2c 20 72 65 74 75 72 6e 20 30 20 61 6e  ger, return 0 an
7050: 64 20 6c 65 61 76 65 20 2a 70 56 61 6c 75 65 20  d leave *pValue 
7060: 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e  unchanged..*/.in
7070: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  t sqlite3ExprIsI
7080: 6e 74 65 67 65 72 28 45 78 70 72 20 2a 70 2c 20  nteger(Expr *p, 
7090: 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20  int *pValue){.  
70a0: 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
70b0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
70c0: 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 66  EGER: {.      if
70d0: 28 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33  ( sqlite3GetInt3
70e0: 32 28 28 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65  2((char*)p->toke
70f0: 6e 2e 7a 2c 20 70 56 61 6c 75 65 29 20 29 7b 0a  n.z, pValue) ){.
7100: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
7110: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7120: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7130: 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20   case TK_UPLUS: 
7140: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73  {.      return s
7150: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
7160: 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56  ger(p->pLeft, pV
7170: 61 6c 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  alue);.    }.   
7180: 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a   case TK_UMINUS:
7190: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b 0a   {.      int v;.
71a0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
71b0: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
71c0: 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a  ->pLeft, &v) ){.
71d0: 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20          *pValue 
71e0: 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 65  = -v;.        re
71f0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
7200: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7210: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
7220: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
7230: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
7240: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
7250: 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20  he given string 
7260: 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75  is a row-id colu
7270: 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20  mn name..*/.int 
7280: 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 63  sqlite3IsRowid(c
7290: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
72a0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
72b0: 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22  Cmp(z, "_ROWID_"
72c0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
72d0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
72e0: 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22  rICmp(z, "ROWID"
72f0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
7300: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
7310: 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d  rICmp(z, "OID")=
7320: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
7330: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
7340: 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 61  .** Given the na
7350: 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 6f  me of a column o
7360: 66 20 74 68 65 20 66 6f 72 6d 20 58 2e 59 2e 5a  f the form X.Y.Z
7370: 20 6f 72 20 59 2e 5a 20 6f 72 20 6a 75 73 74 20   or Y.Z or just 
7380: 5a 2c 20 6c 6f 6f 6b 20 75 70 0a 2a 2a 20 74 68  Z, look up.** th
7390: 61 74 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73  at name in the s
73a0: 65 74 20 6f 66 20 73 6f 75 72 63 65 20 74 61 62  et of source tab
73b0: 6c 65 73 20 69 6e 20 70 53 72 63 4c 69 73 74 20  les in pSrcList 
73c0: 61 6e 64 20 6d 61 6b 65 20 74 68 65 20 70 45 78  and make the pEx
73d0: 70 72 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  pr .** expressio
73e0: 6e 20 6e 6f 64 65 20 72 65 66 65 72 20 62 61 63  n node refer bac
73f0: 6b 20 74 6f 20 74 68 61 74 20 73 6f 75 72 63 65  k to that source
7400: 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 66 6f   column.  The fo
7410: 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73 0a  llowing changes.
7420: 2a 2a 20 61 72 65 20 6d 61 64 65 20 74 6f 20 70  ** are made to p
7430: 45 78 70 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70  Expr:.**.**    p
7440: 45 78 70 72 2d 3e 69 44 62 20 20 20 20 20 20 20  Expr->iDb       
7450: 20 20 20 20 53 65 74 20 74 68 65 20 69 6e 64 65      Set the inde
7460: 78 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 6f  x in db->aDb[] o
7470: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
7480: 6f 6c 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20  olding.**       
7490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74a0: 20 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20    the table..** 
74b0: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
74c0: 20 20 20 20 20 20 20 20 53 65 74 20 74 6f 20 74          Set to t
74d0: 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
74e0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6f   for the table o
74f0: 62 74 61 69 6e 65 64 0a 2a 2a 20 20 20 20 20 20  btained.**      
7500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7510: 20 20 20 66 72 6f 6d 20 70 53 72 63 4c 69 73 74     from pSrcList
7520: 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 69  ..**    pExpr->i
7530: 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 53 65 74  Column       Set
7540: 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e   to the column n
7550: 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74 68 65  umber within the
7560: 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 70 45   table..**    pE
7570: 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20  xpr->op         
7580: 20 20 20 53 65 74 20 74 6f 20 54 4b 5f 43 4f 4c     Set to TK_COL
7590: 55 4d 4e 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72  UMN..**    pExpr
75a0: 2d 3e 70 4c 65 66 74 20 20 20 20 20 20 20 20 20  ->pLeft         
75b0: 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74  Any expression t
75c0: 68 69 73 20 70 6f 69 6e 74 73 20 74 6f 20 69 73  his points to is
75d0: 20 64 65 6c 65 74 65 64 0a 2a 2a 20 20 20 20 70   deleted.**    p
75e0: 45 78 70 72 2d 3e 70 52 69 67 68 74 20 20 20 20  Expr->pRight    
75f0: 20 20 20 20 41 6e 79 20 65 78 70 72 65 73 73 69      Any expressi
7600: 6f 6e 20 74 68 69 73 20 70 6f 69 6e 74 73 20 74  on this points t
7610: 6f 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  o is deleted..**
7620: 0a 2a 2a 20 54 68 65 20 70 44 62 54 6f 6b 65 6e  .** The pDbToken
7630: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
7640: 74 68 65 20 64 61 74 61 62 61 73 65 20 28 74 68  the database (th
7650: 65 20 22 58 22 29 2e 20 20 54 68 69 73 20 76 61  e "X").  This va
7660: 6c 75 65 20 6d 61 79 20 62 65 0a 2a 2a 20 4e 55  lue may be.** NU
7670: 4c 4c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  LL meaning that 
7680: 6e 61 6d 65 20 69 73 20 6f 66 20 74 68 65 20 66  name is of the f
7690: 6f 72 6d 20 59 2e 5a 20 6f 72 20 5a 2e 20 20 41  orm Y.Z or Z.  A
76a0: 6e 79 20 61 76 61 69 6c 61 62 6c 65 20 64 61 74  ny available dat
76b0: 61 62 61 73 65 0a 2a 2a 20 63 61 6e 20 62 65 20  abase.** can be 
76c0: 75 73 65 64 2e 20 20 54 68 65 20 70 54 61 62 6c  used.  The pTabl
76d0: 65 54 6f 6b 65 6e 20 69 73 20 74 68 65 20 6e 61  eToken is the na
76e0: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
76f0: 28 74 68 65 20 22 59 22 29 2e 20 20 54 68 69 73  (the "Y").  This
7700: 0a 2a 2a 20 76 61 6c 75 65 20 63 61 6e 20 62 65  .** value can be
7710: 20 4e 55 4c 4c 20 69 66 20 70 44 62 54 6f 6b 65   NULL if pDbToke
7720: 6e 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e 20  n is also NULL. 
7730: 20 49 66 20 70 54 61 62 6c 65 54 6f 6b 65 6e 20   If pTableToken 
7740: 69 73 20 4e 55 4c 4c 20 69 74 0a 2a 2a 20 6d 65  is NULL it.** me
7750: 61 6e 73 20 74 68 61 74 20 74 68 65 20 66 6f 72  ans that the for
7760: 6d 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73  m of the name is
7770: 20 5a 20 61 6e 64 20 74 68 61 74 20 63 6f 6c 75   Z and that colu
7780: 6d 6e 73 20 66 72 6f 6d 20 61 6e 79 20 74 61 62  mns from any tab
7790: 6c 65 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65  le.** can be use
77a0: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
77b0: 6e 61 6d 65 20 63 61 6e 6e 6f 74 20 62 65 20 72  name cannot be r
77c0: 65 73 6f 6c 76 65 64 20 75 6e 61 6d 62 69 67 75  esolved unambigu
77d0: 6f 75 73 6c 79 2c 20 6c 65 61 76 65 20 61 6e 20  ously, leave an 
77e0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a  error message.**
77f0: 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
7800: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 20  eturn non-zero. 
7810: 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 6f 6e 20   Return zero on 
7820: 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74  success..*/.stat
7830: 69 63 20 69 6e 74 20 6c 6f 6f 6b 75 70 4e 61 6d  ic int lookupNam
7840: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
7850: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  se,       /* The
7860: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
7870: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 62   */.  Token *pDb
7880: 54 6f 6b 65 6e 2c 20 20 20 20 20 2f 2a 20 4e 61  Token,     /* Na
7890: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
78a0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61  se containing ta
78b0: 62 6c 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  ble, or NULL */.
78c0: 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 54    Token *pTableT
78d0: 6f 6b 65 6e 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f  oken,  /* Name o
78e0: 66 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69  f table containi
78f0: 6e 67 20 63 6f 6c 75 6d 6e 2c 20 6f 72 20 4e 55  ng column, or NU
7900: 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  LL */.  Token *p
7910: 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2c 20 2f 2a 20  ColumnToken, /* 
7920: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75  Name of the colu
7930: 6d 6e 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e  mn. */.  NameCon
7940: 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 2f 2a  text *pNC,    /*
7950: 20 54 68 65 20 6e 61 6d 65 20 63 6f 6e 74 65 78   The name contex
7960: 74 20 75 73 65 64 20 74 6f 20 72 65 73 6f 6c 76  t used to resolv
7970: 65 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  e the name */.  
7980: 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20  Expr *pExpr     
7990: 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 74 68 69       /* Make thi
79a0: 73 20 45 58 50 52 20 6e 6f 64 65 20 70 6f 69 6e  s EXPR node poin
79b0: 74 20 74 6f 20 74 68 65 20 73 65 6c 65 63 74 65  t to the selecte
79c0: 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20  d column */.){. 
79d0: 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b 20   char *zDb = 0; 
79e0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
79f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
7a00: 54 68 65 20 22 58 22 20 69 6e 20 58 2e 59 2e 5a  The "X" in X.Y.Z
7a10: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 61 62   */.  char *zTab
7a20: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61   = 0;      /* Na
7a30: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  me of the table.
7a40: 20 20 54 68 65 20 22 59 22 20 69 6e 20 58 2e 59    The "Y" in X.Y
7a50: 2e 5a 20 6f 72 20 59 2e 5a 20 2a 2f 0a 20 20 63  .Z or Y.Z */.  c
7a60: 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 30 3b 20 20  har *zCol = 0;  
7a70: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
7a80: 68 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20  he column.  The 
7a90: 22 5a 22 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  "Z" */.  int i, 
7aa0: 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  j;            /*
7ab0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
7ac0: 2f 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  /.  int cnt = 0;
7ad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7ae0: 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63  er of matching c
7af0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
7b00: 20 69 6e 74 20 63 6e 74 54 61 62 20 3d 20 30 3b   int cntTab = 0;
7b10: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7b20: 6f 66 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c  of matching tabl
7b30: 65 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 73 71 6c  e names */.  sql
7b40: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
7b50: 65 2d 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20 64  e->db;  /* The d
7b60: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 74 72  atabase */.  str
7b70: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
7b80: 20 2a 70 49 74 65 6d 3b 20 20 20 20 20 20 20 2f   *pItem;       /
7b90: 2a 20 55 73 65 20 66 6f 72 20 6c 6f 6f 70 69 6e  * Use for loopin
7ba0: 67 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20  g over pSrcList 
7bb0: 69 74 65 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63  items */.  struc
7bc0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
7bd0: 70 4d 61 74 63 68 20 3d 20 30 3b 20 20 2f 2a 20  pMatch = 0;  /* 
7be0: 54 68 65 20 6d 61 74 63 68 69 6e 67 20 70 53 72  The matching pSr
7bf0: 63 4c 69 73 74 20 69 74 65 6d 20 2a 2f 0a 20 20  cList item */.  
7c00: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 54 6f  NameContext *pTo
7c10: 70 4e 43 20 3d 20 70 4e 43 3b 20 20 20 20 20 20  pNC = pNC;      
7c20: 20 20 2f 2a 20 46 69 72 73 74 20 6e 61 6d 65 63    /* First namec
7c30: 6f 6e 74 65 78 74 20 69 6e 20 74 68 65 20 6c 69  ontext in the li
7c40: 73 74 20 2a 2f 0a 20 20 53 63 68 65 6d 61 20 2a  st */.  Schema *
7c50: 70 53 63 68 65 6d 61 20 3d 20 30 3b 20 20 20 20  pSchema = 0;    
7c60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63 68            /* Sch
7c70: 65 6d 61 20 6f 66 20 74 68 65 20 65 78 70 72 65  ema of the expre
7c80: 73 73 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65  ssion */..  asse
7c90: 72 74 28 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e  rt( pColumnToken
7ca0: 20 26 26 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e   && pColumnToken
7cb0: 2d 3e 7a 20 29 3b 20 2f 2a 20 54 68 65 20 5a 20  ->z ); /* The Z 
7cc0: 69 6e 20 58 2e 59 2e 5a 20 63 61 6e 6e 6f 74 20  in X.Y.Z cannot 
7cd0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 7a 44 62  be NULL */.  zDb
7ce0: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
7cf0: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 44 62 54  omToken(db, pDbT
7d00: 6f 6b 65 6e 29 3b 0a 20 20 7a 54 61 62 20 3d 20  oken);.  zTab = 
7d10: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
7d20: 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65 54  oken(db, pTableT
7d30: 6f 6b 65 6e 29 3b 0a 20 20 7a 43 6f 6c 20 3d 20  oken);.  zCol = 
7d40: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
7d50: 6f 6b 65 6e 28 64 62 2c 20 70 43 6f 6c 75 6d 6e  oken(db, pColumn
7d60: 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 64 62  Token);.  if( db
7d70: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
7d80: 7b 0a 20 20 20 20 67 6f 74 6f 20 6c 6f 6f 6b 75  {.    goto looku
7d90: 70 6e 61 6d 65 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  pname_end;.  }..
7da0: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
7db0: 3d 20 2d 31 3b 0a 20 20 77 68 69 6c 65 28 20 70  = -1;.  while( p
7dc0: 4e 43 20 26 26 20 63 6e 74 3d 3d 30 20 29 7b 0a  NC && cnt==0 ){.
7dd0: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
7de0: 4c 69 73 74 3b 0a 20 20 20 20 53 72 63 4c 69 73  List;.    SrcLis
7df0: 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e  t *pSrcList = pN
7e00: 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 0a 20 20  C->pSrcList;..  
7e10: 20 20 69 66 28 20 70 53 72 63 4c 69 73 74 20 29    if( pSrcList )
7e20: 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c  {.      for(i=0,
7e30: 20 70 49 74 65 6d 3d 70 53 72 63 4c 69 73 74 2d   pItem=pSrcList-
7e40: 3e 61 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e  >a; i<pSrcList->
7e50: 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  nSrc; i++, pItem
7e60: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62  ++){.        Tab
7e70: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20  le *pTab;.      
7e80: 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20    int iDb;.     
7e90: 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b     Column *pCol;
7ea0: 0a 20 20 0a 20 20 20 20 20 20 20 20 70 54 61 62  .  .        pTab
7eb0: 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a   = pItem->pTab;.
7ec0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
7ed0: 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 20  pTab!=0 );.     
7ee0: 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
7ef0: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
7f00: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
7f10: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
7f20: 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29  ( pTab->nCol>0 )
7f30: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 54  ;.        if( zT
7f40: 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ab ){.          
7f50: 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  if( pItem->zAlia
7f60: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s ){.           
7f70: 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20   char *zTabName 
7f80: 3d 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b  = pItem->zAlias;
7f90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
7fa0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
7fb0: 7a 54 61 62 4e 61 6d 65 2c 20 7a 54 61 62 29 21  zTabName, zTab)!
7fc0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
7fd0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
7fe0: 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
7ff0: 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61   *zTabName = pTa
8000: 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b->zName;.      
8010: 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61        if( zTabNa
8020: 6d 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  me==0 || sqlite3
8030: 53 74 72 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65  StrICmp(zTabName
8040: 2c 20 7a 54 61 62 29 21 3d 30 20 29 20 63 6f 6e  , zTab)!=0 ) con
8050: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
8060: 20 20 20 69 66 28 20 7a 44 62 21 3d 30 20 26 26     if( zDb!=0 &&
8070: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
8080: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
8090: 6d 65 2c 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20  me, zDb)!=0 ){. 
80a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
80b0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
80c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
80d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
80e0: 20 20 20 69 66 28 20 30 3d 3d 28 63 6e 74 54 61     if( 0==(cntTa
80f0: 62 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 20 20  b++) ){.        
8100: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
8110: 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  = pItem->iCursor
8120: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 63 68  ;.          pSch
8130: 65 6d 61 20 3d 20 70 54 61 62 2d 3e 70 53 63 68  ema = pTab->pSch
8140: 65 6d 61 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ema;.          p
8150: 4d 61 74 63 68 20 3d 20 70 49 74 65 6d 3b 0a 20  Match = pItem;. 
8160: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8170: 20 66 6f 72 28 6a 3d 30 2c 20 70 43 6f 6c 3d 70   for(j=0, pCol=p
8180: 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61  Tab->aCol; j<pTa
8190: 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 43  b->nCol; j++, pC
81a0: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  ol++){.         
81b0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
81c0: 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c  Cmp(pCol->zName,
81d0: 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20   zCol)==0 ){.   
81e0: 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63           const c
81f0: 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 54 61  har *zColl = pTa
8200: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c  b->aCol[j].zColl
8210: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 64  ;.            Id
8220: 4c 69 73 74 20 2a 70 55 73 69 6e 67 3b 0a 20 20  List *pUsing;.  
8230: 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b            cnt++;
8240: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
8250: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 49 74  pr->iTable = pIt
8260: 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
8270: 20 20 20 20 20 20 20 20 20 70 4d 61 74 63 68 20           pMatch 
8280: 3d 20 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20  = pItem;.       
8290: 20 20 20 20 20 70 53 63 68 65 6d 61 20 3d 20 70       pSchema = p
82a0: 54 61 62 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  Tab->pSchema;.  
82b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62            /* Sub
82c0: 73 74 69 74 75 74 65 20 74 68 65 20 72 6f 77 69  stitute the rowi
82d0: 64 20 28 63 6f 6c 75 6d 6e 20 2d 31 29 20 66 6f  d (column -1) fo
82e0: 72 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52  r the INTEGER PR
82f0: 49 4d 41 52 59 20 4b 45 59 20 2a 2f 0a 20 20 20  IMARY KEY */.   
8300: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
8310: 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3d 3d 70 54 61  iColumn = j==pTa
8320: 62 2d 3e 69 50 4b 65 79 20 3f 20 2d 31 20 3a 20  b->iPKey ? -1 : 
8330: 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  j;.            p
8340: 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d  Expr->affinity =
8350: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61   pTab->aCol[j].a
8360: 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20  ffinity;.       
8370: 20 20 20 20 20 69 66 28 20 28 70 45 78 70 72 2d       if( (pExpr-
8380: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
8390: 6f 6c 6c 61 74 65 29 3d 3d 30 20 29 7b 0a 20 20  ollate)==0 ){.  
83a0: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
83b0: 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  r->pColl = sqlit
83c0: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
83d0: 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c  , ENC(db), zColl
83e0: 2c 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ,-1, 0);.       
83f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
8400: 20 20 20 69 66 28 20 69 3c 70 53 72 63 4c 69 73     if( i<pSrcLis
8410: 74 2d 3e 6e 53 72 63 2d 31 20 29 7b 0a 20 20 20  t->nSrc-1 ){.   
8420: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
8430: 49 74 65 6d 5b 31 5d 2e 6a 6f 69 6e 74 79 70 65  Item[1].jointype
8440: 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b   & JT_NATURAL ){
8450: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8460: 20 2f 2a 20 49 66 20 74 68 69 73 20 6d 61 74 63   /* If this matc
8470: 68 20 6f 63 63 75 72 72 65 64 20 69 6e 20 74 68  h occurred in th
8480: 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20  e left table of 
8490: 61 20 6e 61 74 75 72 61 6c 20 6a 6f 69 6e 2c 0a  a natural join,.
84a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84b0: 2a 2a 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65  ** then skip the
84c0: 20 72 69 67 68 74 20 74 61 62 6c 65 20 74 6f 20   right table to 
84d0: 61 76 6f 69 64 20 61 20 64 75 70 6c 69 63 61 74  avoid a duplicat
84e0: 65 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20  e match */.     
84f0: 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
8500: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
8510: 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20      i++;.       
8520: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
8530: 20 28 70 55 73 69 6e 67 20 3d 20 70 49 74 65 6d   (pUsing = pItem
8540: 5b 31 5d 2e 70 55 73 69 6e 67 29 21 3d 30 20 29  [1].pUsing)!=0 )
8550: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
8560: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6d 61 74    /* If this mat
8570: 63 68 20 6f 63 63 75 72 73 20 6f 6e 20 61 20 63  ch occurs on a c
8580: 6f 6c 75 6d 6e 20 74 68 61 74 20 69 73 20 69 6e  olumn that is in
8590: 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   the USING claus
85a0: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
85b0: 20 20 2a 2a 20 6f 66 20 61 20 6a 6f 69 6e 2c 20    ** of a join, 
85c0: 73 6b 69 70 20 74 68 65 20 73 65 61 72 63 68 20  skip the search 
85d0: 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62  of the right tab
85e0: 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 0a 20  le of the join. 
85f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
8600: 2a 20 74 6f 20 61 76 6f 69 64 20 61 20 64 75 70  * to avoid a dup
8610: 6c 69 63 61 74 65 20 6d 61 74 63 68 20 74 68 65  licate match the
8620: 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  re. */.         
8630: 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20         int k;.  
8640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
8650: 72 28 6b 3d 30 3b 20 6b 3c 70 55 73 69 6e 67 2d  r(k=0; k<pUsing-
8660: 3e 6e 49 64 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  >nId; k++){.    
8670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
8680: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
8690: 28 70 55 73 69 6e 67 2d 3e 61 5b 6b 5d 2e 7a 4e  (pUsing->a[k].zN
86a0: 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b  ame, zCol)==0 ){
86b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
86c0: 20 20 20 20 20 70 49 74 65 6d 2b 2b 3b 0a 20 20       pItem++;.  
86d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86e0: 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    i++;.         
86f0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
8700: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
8710: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
8720: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8730: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8740: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
8750: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
8760: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
8770: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69       }.    }..#i
8780: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8790: 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 2f 2a  T_TRIGGER.    /*
87a0: 20 49 66 20 77 65 20 68 61 76 65 20 6e 6f 74 20   If we have not 
87b0: 61 6c 72 65 61 64 79 20 72 65 73 6f 6c 76 65 64  already resolved
87c0: 20 74 68 65 20 6e 61 6d 65 2c 20 74 68 65 6e 20   the name, then 
87d0: 6d 61 79 62 65 20 0a 20 20 20 20 2a 2a 20 69 74  maybe .    ** it
87e0: 20 69 73 20 61 20 6e 65 77 2e 2a 20 6f 72 20 6f   is a new.* or o
87f0: 6c 64 2e 2a 20 74 72 69 67 67 65 72 20 61 72 67  ld.* trigger arg
8800: 75 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 0a  ument reference.
8810: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a      */.    if( z
8820: 44 62 3d 3d 30 20 26 26 20 7a 54 61 62 21 3d 30  Db==0 && zTab!=0
8830: 20 26 26 20 63 6e 74 3d 3d 30 20 26 26 20 70 50   && cnt==0 && pP
8840: 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 21  arse->trigStack!
8850: 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 72 69 67  =0 ){.      Trig
8860: 67 65 72 53 74 61 63 6b 20 2a 70 54 72 69 67 67  gerStack *pTrigg
8870: 65 72 53 74 61 63 6b 20 3d 20 70 50 61 72 73 65  erStack = pParse
8880: 2d 3e 74 72 69 67 53 74 61 63 6b 3b 0a 20 20 20  ->trigStack;.   
8890: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
88a0: 20 30 3b 0a 20 20 20 20 20 20 75 33 32 20 2a 70   0;.      u32 *p
88b0: 69 43 6f 6c 4d 61 73 6b 3b 0a 20 20 20 20 20 20  iColMask;.      
88c0: 69 66 28 20 70 54 72 69 67 67 65 72 53 74 61 63  if( pTriggerStac
88d0: 6b 2d 3e 6e 65 77 49 64 78 20 21 3d 20 2d 31 20  k->newIdx != -1 
88e0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
88f0: 70 28 22 6e 65 77 22 2c 20 7a 54 61 62 29 20 3d  p("new", zTab) =
8900: 3d 20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  = 0 ){.        p
8910: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
8920: 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6e 65  TriggerStack->ne
8930: 77 49 64 78 3b 0a 20 20 20 20 20 20 20 20 61 73  wIdx;.        as
8940: 73 65 72 74 28 20 70 54 72 69 67 67 65 72 53 74  sert( pTriggerSt
8950: 61 63 6b 2d 3e 70 54 61 62 20 29 3b 0a 20 20 20  ack->pTab );.   
8960: 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 72 69       pTab = pTri
8970: 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 3b  ggerStack->pTab;
8980: 0a 20 20 20 20 20 20 20 20 70 69 43 6f 6c 4d 61  .        piColMa
8990: 73 6b 20 3d 20 26 28 70 54 72 69 67 67 65 72 53  sk = &(pTriggerS
89a0: 74 61 63 6b 2d 3e 6e 65 77 43 6f 6c 4d 61 73 6b  tack->newColMask
89b0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
89c0: 66 28 20 70 54 72 69 67 67 65 72 53 74 61 63 6b  f( pTriggerStack
89d0: 2d 3e 6f 6c 64 49 64 78 20 21 3d 20 2d 31 20 26  ->oldIdx != -1 &
89e0: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
89f0: 28 22 6f 6c 64 22 2c 20 7a 54 61 62 29 3d 3d 30  ("old", zTab)==0
8a00: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70   ){.        pExp
8a10: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 54 72 69  r->iTable = pTri
8a20: 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 49 64  ggerStack->oldId
8a30: 78 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  x;.        asser
8a40: 74 28 20 70 54 72 69 67 67 65 72 53 74 61 63 6b  t( pTriggerStack
8a50: 2d 3e 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20  ->pTab );.      
8a60: 20 20 70 54 61 62 20 3d 20 70 54 72 69 67 67 65    pTab = pTrigge
8a70: 72 53 74 61 63 6b 2d 3e 70 54 61 62 3b 0a 20 20  rStack->pTab;.  
8a80: 20 20 20 20 20 20 70 69 43 6f 6c 4d 61 73 6b 20        piColMask 
8a90: 3d 20 26 28 70 54 72 69 67 67 65 72 53 74 61 63  = &(pTriggerStac
8aa0: 6b 2d 3e 6f 6c 64 43 6f 6c 4d 61 73 6b 29 3b 0a  k->oldColMask);.
8ab0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
8ac0: 66 28 20 70 54 61 62 20 29 7b 20 0a 20 20 20 20  f( pTab ){ .    
8ad0: 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20      int iCol;.  
8ae0: 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43        Column *pC
8af0: 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 3b  ol = pTab->aCol;
8b00: 0a 0a 20 20 20 20 20 20 20 20 70 53 63 68 65 6d  ..        pSchem
8b10: 61 20 3d 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  a = pTab->pSchem
8b20: 61 3b 0a 20 20 20 20 20 20 20 20 63 6e 74 54 61  a;.        cntTa
8b30: 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  b++;.        for
8b40: 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 20 3c 20  (iCol=0; iCol < 
8b50: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c  pTab->nCol; iCol
8b60: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 20 7b 0a 20 20  ++, pCol++) {.  
8b70: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
8b80: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d  te3StrICmp(pCol-
8b90: 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30  >zName, zCol)==0
8ba0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8bb0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
8bc0: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l = pTab->aCol[i
8bd0: 43 6f 6c 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20  Col].zColl;.    
8be0: 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20          cnt++;. 
8bf0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
8c00: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c  ->iColumn = iCol
8c10: 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 3f 20  ==pTab->iPKey ? 
8c20: 2d 31 20 3a 20 69 43 6f 6c 3b 0a 20 20 20 20 20  -1 : iCol;.     
8c30: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66         pExpr->af
8c40: 66 69 6e 69 74 79 20 3d 20 70 54 61 62 2d 3e 61  finity = pTab->a
8c50: 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e 69  Col[iCol].affini
8c60: 74 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ty;.            
8c70: 69 66 28 20 28 70 45 78 70 72 2d 3e 66 6c 61 67  if( (pExpr->flag
8c80: 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74  s & EP_ExpCollat
8c90: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
8ca0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 43         pExpr->pC
8cb0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
8cc0: 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43  dCollSeq(db, ENC
8cd0: 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 2d 31 2c 20  (db), zColl,-1, 
8ce0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
8cf0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  }.            pE
8d00: 78 70 72 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  xpr->pTab = pTab
8d10: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
8d20: 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20  ( iCol>=0 ){.   
8d30: 20 20 20 20 20 20 20 20 20 20 20 2a 70 69 43 6f             *piCo
8d40: 6c 4d 61 73 6b 20 7c 3d 20 28 28 75 33 32 29 31  lMask |= ((u32)1
8d50: 3c 3c 69 43 6f 6c 29 20 7c 20 28 69 43 6f 6c 3e  <<iCol) | (iCol>
8d60: 3d 33 32 3f 30 78 66 66 66 66 66 66 66 66 3a 30  =32?0xffffffff:0
8d70: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
8d80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
8d90: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
8da0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8db0: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  }.    }.#endif /
8dc0: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
8dd0: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20  E_OMIT_TRIGGER) 
8de0: 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  */..    /*.    *
8df0: 2a 20 50 65 72 68 61 70 73 20 74 68 65 20 6e 61  * Perhaps the na
8e00: 6d 65 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  me is a referenc
8e10: 65 20 74 6f 20 74 68 65 20 52 4f 57 49 44 0a 20  e to the ROWID. 
8e20: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e     */.    if( cn
8e30: 74 3d 3d 30 20 26 26 20 63 6e 74 54 61 62 3d 3d  t==0 && cntTab==
8e40: 31 20 26 26 20 73 71 6c 69 74 65 33 49 73 52 6f  1 && sqlite3IsRo
8e50: 77 69 64 28 7a 43 6f 6c 29 20 29 7b 0a 20 20 20  wid(zCol) ){.   
8e60: 20 20 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20     cnt = 1;.    
8e70: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
8e80: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 45 78   = -1;.      pEx
8e90: 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53  pr->affinity = S
8ea0: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
8eb0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
8ec0: 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 69  .    ** If the i
8ed0: 6e 70 75 74 20 69 73 20 6f 66 20 74 68 65 20 66  nput is of the f
8ee0: 6f 72 6d 20 5a 20 28 6e 6f 74 20 59 2e 5a 20 6f  orm Z (not Y.Z o
8ef0: 72 20 58 2e 59 2e 5a 29 20 74 68 65 6e 20 74 68  r X.Y.Z) then th
8f00: 65 20 6e 61 6d 65 20 5a 0a 20 20 20 20 2a 2a 20  e name Z.    ** 
8f10: 6d 69 67 68 74 20 72 65 66 65 72 20 74 6f 20 61  might refer to a
8f20: 6e 20 72 65 73 75 6c 74 2d 73 65 74 20 61 6c 69  n result-set ali
8f30: 61 73 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e  as.  This happen
8f40: 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  s, for example, 
8f50: 77 68 65 6e 0a 20 20 20 20 2a 2a 20 77 65 20 61  when.    ** we a
8f60: 72 65 20 72 65 73 6f 6c 76 69 6e 67 20 6e 61 6d  re resolving nam
8f70: 65 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  es in the WHERE 
8f80: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f  clause of the fo
8f90: 6c 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 3a  llowing command:
8fa0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
8fb0: 20 20 20 53 45 4c 45 43 54 20 61 2b 62 20 41 53     SELECT a+b AS
8fc0: 20 78 20 46 52 4f 4d 20 74 61 62 6c 65 20 57 48   x FROM table WH
8fd0: 45 52 45 20 78 3c 31 30 3b 0a 20 20 20 20 2a 2a  ERE x<10;.    **
8fe0: 0a 20 20 20 20 2a 2a 20 49 6e 20 63 61 73 65 73  .    ** In cases
8ff0: 20 6c 69 6b 65 20 74 68 69 73 2c 20 72 65 70 6c   like this, repl
9000: 61 63 65 20 70 45 78 70 72 20 77 69 74 68 20 61  ace pExpr with a
9010: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70   copy of the exp
9020: 72 65 73 73 69 6f 6e 20 74 68 61 74 0a 20 20 20  ression that.   
9030: 20 2a 2a 20 66 6f 72 6d 73 20 74 68 65 20 72 65   ** forms the re
9040: 73 75 6c 74 20 73 65 74 20 65 6e 74 72 79 20 28  sult set entry (
9050: 22 61 2b 62 22 20 69 6e 20 74 68 65 20 65 78 61  "a+b" in the exa
9060: 6d 70 6c 65 29 20 61 6e 64 20 72 65 74 75 72 6e  mple) and return
9070: 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20   immediately..  
9080: 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
9090: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  he expression in
90a0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
90b0: 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65  should have alre
90c0: 61 64 79 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20  ady been.    ** 
90d0: 72 65 73 6f 6c 76 65 64 20 62 79 20 74 68 65 20  resolved by the 
90e0: 74 69 6d 65 20 74 68 65 20 57 48 45 52 45 20 63  time the WHERE c
90f0: 6c 61 75 73 65 20 69 73 20 72 65 73 6f 6c 76 65  lause is resolve
9100: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
9110: 28 20 63 6e 74 3d 3d 30 20 26 26 20 28 70 45 4c  ( cnt==0 && (pEL
9120: 69 73 74 20 3d 20 70 4e 43 2d 3e 70 45 4c 69 73  ist = pNC->pELis
9130: 74 29 21 3d 30 20 26 26 20 7a 54 61 62 3d 3d 30  t)!=0 && zTab==0
9140: 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   ){.      for(j=
9150: 30 3b 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; j<pEList->nEx
9160: 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; j++){.      
9170: 20 20 63 68 61 72 20 2a 7a 41 73 20 3d 20 70 45    char *zAs = pE
9180: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65  List->a[j].zName
9190: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 41  ;.        if( zA
91a0: 73 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53  s!=0 && sqlite3S
91b0: 74 72 49 43 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c  trICmp(zAs, zCol
91c0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
91d0: 20 20 45 78 70 72 20 2a 70 44 75 70 2c 20 2a 70    Expr *pDup, *p
91e0: 4f 72 69 67 3b 0a 20 20 20 20 20 20 20 20 20 20  Orig;.          
91f0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
9200: 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72  Left==0 && pExpr
9210: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
9220: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
9230: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30   pExpr->pList==0
9240: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
9250: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 53 65  sert( pExpr->pSe
9260: 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  lect==0 );.     
9270: 20 20 20 20 20 70 4f 72 69 67 20 3d 20 70 45 4c       pOrig = pEL
9280: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 3b  ist->a[j].pExpr;
9290: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
92a0: 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 26 26  pNC->allowAgg &&
92b0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
92c0: 28 70 4f 72 69 67 2c 20 45 50 5f 41 67 67 29 20  (pOrig, EP_Agg) 
92d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
92e0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
92f0: 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f  Parse, "misuse o
9300: 66 20 61 6c 69 61 73 65 64 20 61 67 67 72 65 67  f aliased aggreg
9310: 61 74 65 20 25 73 22 2c 20 7a 41 73 29 3b 0a 20  ate %s", zAs);. 
9320: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
9330: 65 33 5f 66 72 65 65 28 7a 43 6f 6c 29 3b 0a 20  e3_free(zCol);. 
9340: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
9350: 6e 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  n 2;.          }
9360: 0a 20 20 20 20 20 20 20 20 20 20 70 44 75 70 20  .          pDup 
9370: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
9380: 28 64 62 2c 20 70 4f 72 69 67 29 3b 0a 20 20 20  (db, pOrig);.   
9390: 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
93a0: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70  ->flags & EP_Exp
93b0: 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20  Collate ){.     
93c0: 20 20 20 20 20 20 20 70 44 75 70 2d 3e 70 43 6f         pDup->pCo
93d0: 6c 6c 20 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c  ll = pExpr->pCol
93e0: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  l;.            p
93f0: 44 75 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  Dup->flags |= EP
9400: 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20  _ExpCollate;.   
9410: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9420: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 73 70     if( pExpr->sp
9430: 61 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74 65 33  an.dyn ) sqlite3
9440: 5f 66 72 65 65 28 28 63 68 61 72 2a 29 70 45 78  _free((char*)pEx
9450: 70 72 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20 20  pr->span.z);.   
9460: 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
9470: 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 29 20 73 71  ->token.dyn ) sq
9480: 6c 69 74 65 33 5f 66 72 65 65 28 28 63 68 61 72  lite3_free((char
9490: 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  *)pExpr->token.z
94a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
94b0: 63 70 79 28 70 45 78 70 72 2c 20 70 44 75 70 2c  cpy(pExpr, pDup,
94c0: 20 73 69 7a 65 6f 66 28 2a 70 45 78 70 72 29 29   sizeof(*pExpr))
94d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
94e0: 74 65 33 5f 66 72 65 65 28 70 44 75 70 29 3b 0a  te3_free(pDup);.
94f0: 20 20 20 20 20 20 20 20 20 20 63 6e 74 20 3d 20            cnt = 
9500: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 61  1;.          pMa
9510: 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tch = 0;.       
9520: 20 20 20 61 73 73 65 72 74 28 20 7a 54 61 62 3d     assert( zTab=
9530: 3d 30 20 26 26 20 7a 44 62 3d 3d 30 20 29 3b 0a  =0 && zDb==0 );.
9540: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6c            goto l
9550: 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 5f 32 3b  ookupname_end_2;
9560: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9570: 20 7d 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   } .    }..    /
9580: 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65  * Advance to the
9590: 20 6e 65 78 74 20 6e 61 6d 65 20 63 6f 6e 74 65   next name conte
95a0: 78 74 2e 20 20 54 68 65 20 6c 6f 6f 70 20 77 69  xt.  The loop wi
95b0: 6c 6c 20 65 78 69 74 20 77 68 65 6e 20 65 69 74  ll exit when eit
95c0: 68 65 72 0a 20 20 20 20 2a 2a 20 77 65 20 68 61  her.    ** we ha
95d0: 76 65 20 61 20 6d 61 74 63 68 20 28 63 6e 74 3e  ve a match (cnt>
95e0: 30 29 20 6f 72 20 77 68 65 6e 20 77 65 20 72 75  0) or when we ru
95f0: 6e 20 6f 75 74 20 6f 66 20 6e 61 6d 65 20 63 6f  n out of name co
9600: 6e 74 65 78 74 73 2e 0a 20 20 20 20 2a 2f 0a 20  ntexts..    */. 
9610: 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 29 7b     if( cnt==0 ){
9620: 0a 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43  .      pNC = pNC
9630: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
9640: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66   }..  /*.  ** If
9650: 20 58 20 61 6e 64 20 59 20 61 72 65 20 4e 55 4c   X and Y are NUL
9660: 4c 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64  L (in other word
9670: 73 20 69 66 20 6f 6e 6c 79 20 74 68 65 20 63 6f  s if only the co
9680: 6c 75 6d 6e 20 6e 61 6d 65 20 5a 20 69 73 0a 20  lumn name Z is. 
9690: 20 2a 2a 20 73 75 70 70 6c 69 65 64 29 20 61 6e   ** supplied) an
96a0: 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 5a  d the value of Z
96b0: 20 69 73 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20   is enclosed in 
96c0: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2c 20 74  double-quotes, t
96d0: 68 65 6e 0a 20 20 2a 2a 20 5a 20 69 73 20 61 20  hen.  ** Z is a 
96e0: 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 20 69  string literal i
96f0: 66 20 69 74 20 64 6f 65 73 6e 27 74 20 6d 61 74  f it doesn't mat
9700: 63 68 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6e 61  ch any column na
9710: 6d 65 73 2e 20 20 49 6e 20 74 68 61 74 0a 20 20  mes.  In that.  
9720: 2a 2a 20 63 61 73 65 2c 20 77 65 20 6e 65 65 64  ** case, we need
9730: 20 74 6f 20 72 65 74 75 72 6e 20 72 69 67 68 74   to return right
9740: 20 61 77 61 79 20 61 6e 64 20 6e 6f 74 20 6d 61   away and not ma
9750: 6b 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 74  ke any changes t
9760: 6f 0a 20 20 2a 2a 20 70 45 78 70 72 2e 0a 20 20  o.  ** pExpr..  
9770: 2a 2a 0a 20 20 2a 2a 20 42 65 63 61 75 73 65 20  **.  ** Because 
9780: 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73  no reference was
9790: 20 6d 61 64 65 20 74 6f 20 6f 75 74 65 72 20 63   made to outer c
97a0: 6f 6e 74 65 78 74 73 2c 20 74 68 65 20 70 4e 43  ontexts, the pNC
97b0: 2d 3e 6e 52 65 66 0a 20 20 2a 2a 20 66 69 65 6c  ->nRef.  ** fiel
97c0: 64 73 20 61 72 65 20 6e 6f 74 20 63 68 61 6e 67  ds are not chang
97d0: 65 64 20 69 6e 20 61 6e 79 20 63 6f 6e 74 65 78  ed in any contex
97e0: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e  t..  */.  if( cn
97f0: 74 3d 3d 30 20 26 26 20 7a 54 61 62 3d 3d 30 20  t==0 && zTab==0 
9800: 26 26 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d  && pColumnToken-
9810: 3e 7a 5b 30 5d 3d 3d 27 22 27 20 29 7b 0a 20 20  >z[0]=='"' ){.  
9820: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
9830: 43 6f 6c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Col);.    return
9840: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20   0;.  }..  /*.  
9850: 2a 2a 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20  ** cnt==0 means 
9860: 74 68 65 72 65 20 77 61 73 20 6e 6f 74 20 6d 61  there was not ma
9870: 74 63 68 2e 20 20 63 6e 74 3e 31 20 6d 65 61 6e  tch.  cnt>1 mean
9880: 73 20 74 68 65 72 65 20 77 65 72 65 20 74 77 6f  s there were two
9890: 20 6f 72 0a 20 20 2a 2a 20 6d 6f 72 65 20 6d 61   or.  ** more ma
98a0: 74 63 68 65 73 2e 20 20 45 69 74 68 65 72 20 77  tches.  Either w
98b0: 61 79 2c 20 77 65 20 68 61 76 65 20 61 6e 20 65  ay, we have an e
98c0: 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rror..  */.  if(
98d0: 20 63 6e 74 21 3d 31 20 29 7b 0a 20 20 20 20 63   cnt!=1 ){.    c
98e0: 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20  har *z = 0;.    
98f0: 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20  char *zErr;.    
9900: 7a 45 72 72 20 3d 20 63 6e 74 3d 3d 30 20 3f 20  zErr = cnt==0 ? 
9910: 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e 3a  "no such column:
9920: 20 25 73 22 20 3a 20 22 61 6d 62 69 67 75 6f 75   %s" : "ambiguou
9930: 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25  s column name: %
9940: 73 22 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20  s";.    if( zDb 
9950: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
9960: 53 65 74 53 74 72 69 6e 67 28 26 7a 2c 20 7a 44  SetString(&z, zD
9970: 62 2c 20 22 2e 22 2c 20 7a 54 61 62 2c 20 22 2e  b, ".", zTab, ".
9980: 22 2c 20 7a 43 6f 6c 2c 20 28 63 68 61 72 2a 29  ", zCol, (char*)
9990: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  0);.    }else if
99a0: 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ( zTab ){.      
99b0: 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
99c0: 28 26 7a 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20  (&z, zTab, ".", 
99d0: 7a 43 6f 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b  zCol, (char*)0);
99e0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
99f0: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 53 74 72    z = sqlite3Str
9a00: 44 75 70 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d  Dup(zCol);.    }
9a10: 0a 20 20 20 20 69 66 28 20 7a 20 29 7b 0a 20 20  .    if( z ){.  
9a20: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
9a30: 4d 73 67 28 70 50 61 72 73 65 2c 20 7a 45 72 72  Msg(pParse, zErr
9a40: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , z);.      sqli
9a50: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20  te3_free(z);.   
9a60: 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 45 72 72 2b     pTopNC->nErr+
9a70: 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  +;.    }else{.  
9a80: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
9a90: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  iled = 1;.    }.
9aa0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 63    }..  /* If a c
9ab0: 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 20 74 61 62  olumn from a tab
9ac0: 6c 65 20 69 6e 20 70 53 72 63 4c 69 73 74 20 69  le in pSrcList i
9ad0: 73 20 72 65 66 65 72 65 6e 63 65 64 2c 20 74 68  s referenced, th
9ae0: 65 6e 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 74  en record.  ** t
9af0: 68 69 73 20 66 61 63 74 20 69 6e 20 74 68 65 20  his fact in the 
9b00: 70 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 63 6f 6c  pSrcList.a[].col
9b10: 55 73 65 64 20 62 69 74 6d 61 73 6b 2e 20 20 43  Used bitmask.  C
9b20: 6f 6c 75 6d 6e 20 30 20 63 61 75 73 65 73 0a 20  olumn 0 causes. 
9b30: 20 2a 2a 20 62 69 74 20 30 20 74 6f 20 62 65 20   ** bit 0 to be 
9b40: 73 65 74 2e 20 20 43 6f 6c 75 6d 6e 20 31 20 73  set.  Column 1 s
9b50: 65 74 73 20 62 69 74 20 31 2e 20 20 41 6e 64 20  ets bit 1.  And 
9b60: 73 6f 20 66 6f 72 74 68 2e 20 20 49 66 20 74 68  so forth.  If th
9b70: 65 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 75  e.  ** column nu
9b80: 6d 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20  mber is greater 
9b90: 74 68 61 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  than the number 
9ba0: 6f 66 20 62 69 74 73 20 69 6e 20 74 68 65 20 62  of bits in the b
9bb0: 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 74 68 65 6e  itmask.  ** then
9bc0: 20 73 65 74 20 74 68 65 20 68 69 67 68 2d 6f 72   set the high-or
9bd0: 64 65 72 20 62 69 74 20 6f 66 20 74 68 65 20 62  der bit of the b
9be0: 69 74 6d 61 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69  itmask..  */.  i
9bf0: 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
9c00: 6e 3e 3d 30 20 26 26 20 70 4d 61 74 63 68 21 3d  n>=0 && pMatch!=
9c10: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  0 ){.    int n =
9c20: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
9c30: 0a 20 20 20 20 69 66 28 20 6e 3e 3d 73 69 7a 65  .    if( n>=size
9c40: 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 20 29 7b  of(Bitmask)*8 ){
9c50: 0a 20 20 20 20 20 20 6e 20 3d 20 73 69 7a 65 6f  .      n = sizeo
9c60: 66 28 42 69 74 6d 61 73 6b 29 2a 38 2d 31 3b 0a  f(Bitmask)*8-1;.
9c70: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
9c80: 28 20 70 4d 61 74 63 68 2d 3e 69 43 75 72 73 6f  ( pMatch->iCurso
9c90: 72 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  r==pExpr->iTable
9ca0: 20 29 3b 0a 20 20 20 20 70 4d 61 74 63 68 2d 3e   );.    pMatch->
9cb0: 63 6f 6c 55 73 65 64 20 7c 3d 20 28 28 42 69 74  colUsed |= ((Bit
9cc0: 6d 61 73 6b 29 31 29 3c 3c 6e 3b 0a 20 20 7d 0a  mask)1)<<n;.  }.
9cd0: 0a 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 3a  .lookupname_end:
9ce0: 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 61  .  /* Clean up a
9cf0: 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20  nd return.  */. 
9d00: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 44   sqlite3_free(zD
9d10: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  b);.  sqlite3_fr
9d20: 65 65 28 7a 54 61 62 29 3b 0a 20 20 73 71 6c 69  ee(zTab);.  sqli
9d30: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45  te3ExprDelete(pE
9d40: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 70  xpr->pLeft);.  p
9d50: 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b  Expr->pLeft = 0;
9d60: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
9d70: 6c 65 74 65 28 70 45 78 70 72 2d 3e 70 52 69 67  lete(pExpr->pRig
9d80: 68 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52  ht);.  pExpr->pR
9d90: 69 67 68 74 20 3d 20 30 3b 0a 20 20 70 45 78 70  ight = 0;.  pExp
9da0: 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d  r->op = TK_COLUM
9db0: 4e 3b 0a 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e  N;.lookupname_en
9dc0: 64 5f 32 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  d_2:.  sqlite3_f
9dd0: 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 69 66 28  ree(zCol);.  if(
9de0: 20 63 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 61   cnt==1 ){.    a
9df0: 73 73 65 72 74 28 20 70 4e 43 21 3d 30 20 29 3b  ssert( pNC!=0 );
9e00: 0a 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 68  .    sqlite3Auth
9e10: 52 65 61 64 28 70 50 61 72 73 65 2c 20 70 45 78  Read(pParse, pEx
9e20: 70 72 2c 20 70 53 63 68 65 6d 61 2c 20 70 4e 43  pr, pSchema, pNC
9e30: 2d 3e 70 53 72 63 4c 69 73 74 29 3b 0a 20 20 20  ->pSrcList);.   
9e40: 20 69 66 28 20 70 4d 61 74 63 68 20 26 26 20 21   if( pMatch && !
9e50: 70 4d 61 74 63 68 2d 3e 70 53 65 6c 65 63 74 20  pMatch->pSelect 
9e60: 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  ){.      pExpr->
9e70: 70 54 61 62 20 3d 20 70 4d 61 74 63 68 2d 3e 70  pTab = pMatch->p
9e80: 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  Tab;.    }.    /
9e90: 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
9ea0: 6e 52 65 66 20 76 61 6c 75 65 20 6f 6e 20 61 6c  nRef value on al
9eb0: 6c 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 73 20  l name contexts 
9ec0: 66 72 6f 6d 20 54 6f 70 4e 43 20 75 70 20 74 6f  from TopNC up to
9ed0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e  .    ** the poin
9ee0: 74 20 77 68 65 72 65 20 74 68 65 20 6e 61 6d 65  t where the name
9ef0: 20 6d 61 74 63 68 65 64 2e 20 2a 2f 0a 20 20 20   matched. */.   
9f00: 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
9f10: 61 73 73 65 72 74 28 20 70 54 6f 70 4e 43 21 3d  assert( pTopNC!=
9f20: 30 20 29 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e  0 );.      pTopN
9f30: 43 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20  C->nRef++;.     
9f40: 20 69 66 28 20 70 54 6f 70 4e 43 3d 3d 70 4e 43   if( pTopNC==pNC
9f50: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
9f60: 70 54 6f 70 4e 43 20 3d 20 70 54 6f 70 4e 43 2d  pTopNC = pTopNC-
9f70: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
9f80: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20    return 0;.  } 
9f90: 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72  else {.    retur
9fa0: 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  n 1;.  }.}../*.*
9fb0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
9fc0: 73 20 64 65 73 69 67 6e 65 64 20 61 73 20 61 6e  s designed as an
9fd0: 20 78 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b 45   xFunc for walkE
9fe0: 78 70 72 54 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a  xprTree()..**.**
9ff0: 20 52 65 73 6f 6c 76 65 20 73 79 6d 62 6f 6c 69   Resolve symboli
a000: 63 20 6e 61 6d 65 73 20 69 6e 74 6f 20 54 4b 5f  c names into TK_
a010: 43 4f 4c 55 4d 4e 20 6f 70 65 72 61 74 6f 72 73  COLUMN operators
a020: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
a030: 0a 2a 2a 20 6e 6f 64 65 20 69 6e 20 74 68 65 20  .** node in the 
a040: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
a050: 20 20 52 65 74 75 72 6e 20 30 20 74 6f 20 63 6f    Return 0 to co
a060: 6e 74 69 6e 75 65 20 74 68 65 20 73 65 61 72 63  ntinue the searc
a070: 68 20 64 6f 77 6e 0a 2a 2a 20 74 68 65 20 74 72  h down.** the tr
a080: 65 65 20 6f 72 20 32 20 74 6f 20 61 62 6f 72 74  ee or 2 to abort
a090: 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b 2e 0a   the tree walk..
a0a0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
a0b0: 6e 65 20 61 6c 73 6f 20 64 6f 65 73 20 65 72 72  ne also does err
a0c0: 6f 72 20 63 68 65 63 6b 69 6e 67 20 61 6e 64 20  or checking and 
a0d0: 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20  name resolution 
a0e0: 66 6f 72 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  for.** function 
a0f0: 6e 61 6d 65 73 2e 20 20 54 68 65 20 6f 70 65 72  names.  The oper
a100: 61 74 6f 72 20 66 6f 72 20 61 67 67 72 65 67 61  ator for aggrega
a110: 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 73 20  te functions is 
a120: 63 68 61 6e 67 65 64 0a 2a 2a 20 74 6f 20 54 4b  changed.** to TK
a130: 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 2e 0a 2a  _AGG_FUNCTION..*
a140: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 61 6d  /.static int nam
a150: 65 52 65 73 6f 6c 76 65 72 53 74 65 70 28 76 6f  eResolverStep(vo
a160: 69 64 20 2a 70 41 72 67 2c 20 45 78 70 72 20 2a  id *pArg, Expr *
a170: 70 45 78 70 72 29 7b 0a 20 20 4e 61 6d 65 43 6f  pExpr){.  NameCo
a180: 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 28 4e 61  ntext *pNC = (Na
a190: 6d 65 43 6f 6e 74 65 78 74 2a 29 70 41 72 67 3b  meContext*)pArg;
a1a0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
a1b0: 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ;..  if( pExpr==
a1c0: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
a1d0: 61 73 73 65 72 74 28 20 70 4e 43 21 3d 30 20 29  assert( pNC!=0 )
a1e0: 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 4e 43  ;.  pParse = pNC
a1f0: 2d 3e 70 50 61 72 73 65 3b 0a 0a 20 20 69 66 28  ->pParse;..  if(
a200: 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65   ExprHasAnyPrope
a210: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 52 65  rty(pExpr, EP_Re
a220: 73 6f 6c 76 65 64 29 20 29 20 72 65 74 75 72 6e  solved) ) return
a230: 20 31 3b 0a 20 20 45 78 70 72 53 65 74 50 72 6f   1;.  ExprSetPro
a240: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
a250: 52 65 73 6f 6c 76 65 64 29 3b 0a 23 69 66 6e 64  Resolved);.#ifnd
a260: 65 66 20 4e 44 45 42 55 47 0a 20 20 69 66 28 20  ef NDEBUG.  if( 
a270: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 20 26 26  pNC->pSrcList &&
a280: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 2d 3e   pNC->pSrcList->
a290: 6e 41 6c 6c 6f 63 3e 30 20 29 7b 0a 20 20 20 20  nAlloc>0 ){.    
a2a0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73  SrcList *pSrcLis
a2b0: 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
a2c0: 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  t;.    int i;.  
a2d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 43    for(i=0; i<pNC
a2e0: 2d 3e 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63  ->pSrcList->nSrc
a2f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; i++){.      as
a300: 73 65 72 74 28 20 70 53 72 63 4c 69 73 74 2d 3e  sert( pSrcList->
a310: 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3e 3d 30 20  a[i].iCursor>=0 
a320: 26 26 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69  && pSrcList->a[i
a330: 5d 2e 69 43 75 72 73 6f 72 3c 70 50 61 72 73 65  ].iCursor<pParse
a340: 2d 3e 6e 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20  ->nTab);.    }. 
a350: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 77 69 74   }.#endif.  swit
a360: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
a370: 0a 20 20 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 71  .    /* Double-q
a380: 75 6f 74 65 64 20 73 74 72 69 6e 67 73 20 28 65  uoted strings (e
a390: 78 3a 20 22 61 62 63 22 29 20 61 72 65 20 75 73  x: "abc") are us
a3a0: 65 64 20 61 73 20 69 64 65 6e 74 69 66 69 65 72  ed as identifier
a3b0: 73 20 69 66 0a 20 20 20 20 2a 2a 20 70 6f 73 73  s if.    ** poss
a3c0: 69 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65  ible.  Otherwise
a3d0: 20 74 68 65 79 20 72 65 6d 61 69 6e 20 61 73 20   they remain as 
a3e0: 73 74 72 69 6e 67 73 2e 20 20 53 69 6e 67 6c 65  strings.  Single
a3f0: 2d 71 75 6f 74 65 64 0a 20 20 20 20 2a 2a 20 73  -quoted.    ** s
a400: 74 72 69 6e 67 73 20 28 65 78 3a 20 27 61 62 63  trings (ex: 'abc
a410: 27 29 20 61 72 65 20 61 6c 77 61 79 73 20 73 74  ') are always st
a420: 72 69 6e 67 20 6c 69 74 65 72 61 6c 73 2e 0a 20  ring literals.. 
a430: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54     */.    case T
a440: 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20  K_STRING: {.    
a450: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b    if( pExpr->tok
a460: 65 6e 2e 7a 5b 30 5d 3d 3d 27 5c 27 27 20 29 20  en.z[0]=='\'' ) 
a470: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 2f 2a 20  break;.      /* 
a480: 46 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74  Fall thru into t
a490: 68 65 20 54 4b 5f 49 44 20 63 61 73 65 20 69 66  he TK_ID case if
a4a0: 20 74 68 69 73 20 69 73 20 61 20 64 6f 75 62 6c   this is a doubl
a4b0: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
a4c0: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  */.    }.    /* 
a4d0: 41 20 6c 6f 6e 65 20 69 64 65 6e 74 69 66 69 65  A lone identifie
a4e0: 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  r is the name of
a4f0: 20 61 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a   a column..    *
a500: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44  /.    case TK_ID
a510: 3a 20 7b 0a 20 20 20 20 20 20 6c 6f 6f 6b 75 70  : {.      lookup
a520: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 30 2c 20  Name(pParse, 0, 
a530: 30 2c 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  0, &pExpr->token
a540: 2c 20 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20  , pNC, pExpr);. 
a550: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
a560: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 41     }.  .    /* A
a570: 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
a580: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20 20 20  column name:    
a590: 20 49 44 2e 49 44 0a 20 20 20 20 2a 2a 20 4f 72   ID.ID.    ** Or
a5a0: 20 61 20 64 61 74 61 62 61 73 65 2c 20 74 61 62   a database, tab
a5b0: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 3a 20 20  le and column:  
a5c0: 49 44 2e 49 44 2e 49 44 0a 20 20 20 20 2a 2f 0a  ID.ID.ID.    */.
a5d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a      case TK_DOT:
a5e0: 20 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a   {.      Token *
a5f0: 70 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 54  pColumn;.      T
a600: 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 3b 0a 20 20  oken *pTable;.  
a610: 20 20 20 20 54 6f 6b 65 6e 20 2a 70 44 62 3b 0a      Token *pDb;.
a620: 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
a630: 68 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 69 66  ht;..      /* if
a640: 28 20 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20  ( pSrcList==0 ) 
a650: 62 72 65 61 6b 3b 20 2a 2f 0a 20 20 20 20 20 20  break; */.      
a660: 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
a670: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66  pRight;.      if
a680: 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ( pRight->op==TK
a690: 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _ID ){.        p
a6a0: 44 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  Db = 0;.        
a6b0: 70 54 61 62 6c 65 20 3d 20 26 70 45 78 70 72 2d  pTable = &pExpr-
a6c0: 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20  >pLeft->token;. 
a6d0: 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d         pColumn =
a6e0: 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 3b   &pRight->token;
a6f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a700: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52        assert( pR
a710: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  ight->op==TK_DOT
a720: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62 20   );.        pDb 
a730: 3d 20 26 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  = &pExpr->pLeft-
a740: 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  >token;.        
a750: 70 54 61 62 6c 65 20 3d 20 26 70 52 69 67 68 74  pTable = &pRight
a760: 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a  ->pLeft->token;.
a770: 20 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20          pColumn 
a780: 3d 20 26 70 52 69 67 68 74 2d 3e 70 52 69 67 68  = &pRight->pRigh
a790: 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  t->token;.      
a7a0: 7d 0a 20 20 20 20 20 20 6c 6f 6f 6b 75 70 4e 61  }.      lookupNa
a7b0: 6d 65 28 70 50 61 72 73 65 2c 20 70 44 62 2c 20  me(pParse, pDb, 
a7c0: 70 54 61 62 6c 65 2c 20 70 43 6f 6c 75 6d 6e 2c  pTable, pColumn,
a7d0: 20 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20 20   pNC, pExpr);.  
a7e0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
a7f0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 6f    }..    /* Reso
a800: 6c 76 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  lve function nam
a810: 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  es.    */.    ca
a820: 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43  se TK_CONST_FUNC
a830: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  :.    case TK_FU
a840: 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
a850: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
a860: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 20  = pExpr->pList; 
a870: 20 20 20 2f 2a 20 54 68 65 20 61 72 67 75 6d 65     /* The argume
a880: 6e 74 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20  nt list */.     
a890: 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 20 3f   int n = pList ?
a8a0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20   pList->nExpr : 
a8b0: 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  0;  /* Number of
a8c0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
a8d0: 20 20 20 20 69 6e 74 20 6e 6f 5f 73 75 63 68 5f      int no_such_
a8e0: 66 75 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20  func = 0;       
a8f0: 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f 20 73 75  /* True if no su
a900: 63 68 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73  ch function exis
a910: 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
a920: 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d  wrong_num_args =
a930: 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20   0;     /* True 
a940: 69 66 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20  if wrong number 
a950: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
a960: 20 20 20 20 20 20 69 6e 74 20 69 73 5f 61 67 67        int is_agg
a970: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
a980: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 73 20    /* True if is 
a990: 61 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  an aggregate fun
a9a0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ction */.      i
a9b0: 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20  nt i;.      int 
a9c0: 61 75 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  auth;           
a9d0: 20 20 20 20 20 20 20 20 2f 2a 20 41 75 74 68 6f          /* Autho
a9e0: 72 69 7a 61 74 69 6f 6e 20 74 6f 20 75 73 65 20  rization to use 
a9f0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  the function */.
aa00: 20 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 20 20        int nId;  
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa20: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
aa30: 68 61 72 61 63 74 65 72 73 20 69 6e 20 66 75 6e  haracters in fun
aa40: 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
aa50: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
aa60: 7a 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  zId;            
aa70: 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20  /* The function 
aa80: 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 46  name. */.      F
aa90: 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20  uncDef *pDef;   
aaa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
aab0: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
aac0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  the function */.
aad0: 20 20 20 20 20 20 69 6e 74 20 65 6e 63 20 3d 20        int enc = 
aae0: 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b  ENC(pParse->db);
aaf0: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
ab00: 65 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 0a 20  e encoding */.. 
ab10: 20 20 20 20 20 7a 49 64 20 3d 20 28 63 68 61 72       zId = (char
ab20: 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  *)pExpr->token.z
ab30: 3b 0a 20 20 20 20 20 20 6e 49 64 20 3d 20 70 45  ;.      nId = pE
ab40: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20  xpr->token.n;.  
ab50: 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
ab60: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70  e3FindFunction(p
ab70: 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20  Parse->db, zId, 
ab80: 6e 49 64 2c 20 6e 2c 20 65 6e 63 2c 20 30 29 3b  nId, n, enc, 0);
ab90: 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d  .      if( pDef=
aba0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  =0 ){.        pD
abb0: 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ef = sqlite3Find
abc0: 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d  Function(pParse-
abd0: 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 2d  >db, zId, nId, -
abe0: 31 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20  1, enc, 0);.    
abf0: 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20      if( pDef==0 
ac00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 5f  ){.          no_
ac10: 73 75 63 68 5f 66 75 6e 63 20 3d 20 31 3b 0a 20  such_func = 1;. 
ac20: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
ac30: 20 20 20 20 20 20 20 20 77 72 6f 6e 67 5f 6e 75          wrong_nu
ac40: 6d 5f 61 72 67 73 20 3d 20 31 3b 0a 20 20 20 20  m_args = 1;.    
ac50: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
ac60: 65 7b 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67  e{.        is_ag
ac70: 67 20 3d 20 70 44 65 66 2d 3e 78 46 75 6e 63 3d  g = pDef->xFunc=
ac80: 3d 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e  =0;.      }.#ifn
ac90: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
aca0: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
acb0: 20 20 20 20 69 66 28 20 70 44 65 66 20 29 7b 0a      if( pDef ){.
acc0: 20 20 20 20 20 20 20 20 61 75 74 68 20 3d 20 73          auth = s
acd0: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
ace0: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 46  pParse, SQLITE_F
acf0: 55 4e 43 54 49 4f 4e 2c 20 30 2c 20 70 44 65 66  UNCTION, 0, pDef
ad00: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
ad10: 20 20 20 20 20 69 66 28 20 61 75 74 68 21 3d 53       if( auth!=S
ad20: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ad30: 20 20 20 20 20 20 69 66 28 20 61 75 74 68 3d 3d        if( auth==
ad40: 53 51 4c 49 54 45 5f 44 45 4e 59 20 29 7b 0a 20  SQLITE_DENY ){. 
ad50: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
ad60: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
ad70: 65 2c 20 22 6e 6f 74 20 61 75 74 68 6f 72 69 7a  e, "not authoriz
ad80: 65 64 20 74 6f 20 75 73 65 20 66 75 6e 63 74 69  ed to use functi
ad90: 6f 6e 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20  on: %s",.       
ada0: 20 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 70 44 65               pDe
adc0: 66 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  f->zName);.     
add0: 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72         pNC->nErr
ade0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
adf0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
ae00: 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20  >op = TK_NULL;. 
ae10: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
ae20: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
ae30: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
ae40: 20 20 69 66 28 20 69 73 5f 61 67 67 20 26 26 20    if( is_agg && 
ae50: 21 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 29  !pNC->allowAgg )
ae60: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
ae70: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
ae80: 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67  , "misuse of agg
ae90: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20  regate function 
aea0: 25 2e 2a 73 28 29 22 2c 20 6e 49 64 2c 7a 49 64  %.*s()", nId,zId
aeb0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e  );.        pNC->
aec0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nErr++;.        
aed0: 69 73 5f 61 67 67 20 3d 20 30 3b 0a 20 20 20 20  is_agg = 0;.    
aee0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 6f 5f 73    }else if( no_s
aef0: 75 63 68 5f 66 75 6e 63 20 29 7b 0a 20 20 20 20  uch_func ){.    
af00: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
af10: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
af20: 73 75 63 68 20 66 75 6e 63 74 69 6f 6e 3a 20 25  such function: %
af30: 2e 2a 73 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b  .*s", nId, zId);
af40: 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45  .        pNC->nE
af50: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rr++;.      }els
af60: 65 20 69 66 28 20 77 72 6f 6e 67 5f 6e 75 6d 5f  e if( wrong_num_
af70: 61 72 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20  args ){.        
af80: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
af90: 70 50 61 72 73 65 2c 22 77 72 6f 6e 67 20 6e 75  pParse,"wrong nu
afa0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
afb0: 73 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 25 2e  s to function %.
afc0: 2a 73 28 29 22 2c 0a 20 20 20 20 20 20 20 20 20  *s()",.         
afd0: 20 20 20 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20      nId, zId);. 
afe0: 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72         pNC->nErr
aff0: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
b000: 20 20 69 66 28 20 69 73 5f 61 67 67 20 29 7b 0a    if( is_agg ){.
b010: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
b020: 70 20 3d 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  p = TK_AGG_FUNCT
b030: 49 4f 4e 3b 0a 20 20 20 20 20 20 20 20 70 4e 43  ION;.        pNC
b040: 2d 3e 68 61 73 41 67 67 20 3d 20 31 3b 0a 20 20  ->hasAgg = 1;.  
b050: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
b060: 69 73 5f 61 67 67 20 29 20 70 4e 43 2d 3e 61 6c  is_agg ) pNC->al
b070: 6c 6f 77 41 67 67 20 3d 20 30 3b 0a 20 20 20 20  lowAgg = 0;.    
b080: 20 20 66 6f 72 28 69 3d 30 3b 20 70 4e 43 2d 3e    for(i=0; pNC->
b090: 6e 45 72 72 3d 3d 30 20 26 26 20 69 3c 6e 3b 20  nErr==0 && i<n; 
b0a0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 77 61  i++){.        wa
b0b0: 6c 6b 45 78 70 72 54 72 65 65 28 70 4c 69 73 74  lkExprTree(pList
b0c0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 6e 61  ->a[i].pExpr, na
b0d0: 6d 65 52 65 73 6f 6c 76 65 72 53 74 65 70 2c 20  meResolverStep, 
b0e0: 70 4e 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pNC);.      }.  
b0f0: 20 20 20 20 69 66 28 20 69 73 5f 61 67 67 20 29      if( is_agg )
b100: 20 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 3d   pNC->allowAgg =
b110: 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 46 49 58   1;.      /* FIX
b120: 20 4d 45 3a 20 20 43 6f 6d 70 75 74 65 20 70 45   ME:  Compute pE
b130: 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 62 61  xpr->affinity ba
b140: 73 65 64 20 6f 6e 20 74 68 65 20 65 78 70 65 63  sed on the expec
b150: 74 65 64 20 72 65 74 75 72 6e 0a 20 20 20 20 20  ted return.     
b160: 20 2a 2a 20 74 79 70 65 20 6f 66 20 74 68 65 20   ** type of the 
b170: 66 75 6e 63 74 69 6f 6e 20 0a 20 20 20 20 20 20  function .      
b180: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
b190: 69 73 5f 61 67 67 3b 0a 20 20 20 20 7d 0a 23 69  is_agg;.    }.#i
b1a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b1b0: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
b1c0: 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20  ase TK_SELECT:. 
b1d0: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54     case TK_EXIST
b1e0: 53 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61  S:.#endif.    ca
b1f0: 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
b200: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65    if( pExpr->pSe
b210: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
b220: 69 6e 74 20 6e 52 65 66 20 3d 20 70 4e 43 2d 3e  int nRef = pNC->
b230: 6e 52 65 66 3b 0a 23 69 66 6e 64 65 66 20 53 51  nRef;.#ifndef SQ
b240: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a  LITE_OMIT_CHECK.
b250: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d          if( pNC-
b260: 3e 69 73 43 68 65 63 6b 20 29 7b 0a 20 20 20 20  >isCheck ){.    
b270: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
b280: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 73 75  orMsg(pParse,"su
b290: 62 71 75 65 72 69 65 73 20 70 72 6f 68 69 62 69  bqueries prohibi
b2a0: 74 65 64 20 69 6e 20 43 48 45 43 4b 20 63 6f 6e  ted in CHECK con
b2b0: 73 74 72 61 69 6e 74 73 22 29 3b 0a 20 20 20 20  straints");.    
b2c0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
b2d0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
b2e0: 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65  ctResolve(pParse
b2f0: 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  , pExpr->pSelect
b300: 2c 20 70 4e 43 29 3b 0a 20 20 20 20 20 20 20 20  , pNC);.        
b310: 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 6e 52 65  assert( pNC->nRe
b320: 66 3e 3d 6e 52 65 66 20 29 3b 0a 20 20 20 20 20  f>=nRef );.     
b330: 20 20 20 69 66 28 20 6e 52 65 66 21 3d 70 4e 43     if( nRef!=pNC
b340: 2d 3e 6e 52 65 66 20 29 7b 0a 20 20 20 20 20 20  ->nRef ){.      
b350: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
b360: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61  rty(pExpr, EP_Va
b370: 72 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  rSelect);.      
b380: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
b390: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
b3a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b3b0: 49 54 5f 43 48 45 43 4b 0a 20 20 20 20 63 61 73  IT_CHECK.    cas
b3c0: 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b  e TK_VARIABLE: {
b3d0: 0a 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e  .      if( pNC->
b3e0: 69 73 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 20  isCheck ){.     
b3f0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
b400: 73 67 28 70 50 61 72 73 65 2c 22 70 61 72 61 6d  sg(pParse,"param
b410: 65 74 65 72 73 20 70 72 6f 68 69 62 69 74 65 64  eters prohibited
b420: 20 69 6e 20 43 48 45 43 4b 20 63 6f 6e 73 74 72   in CHECK constr
b430: 61 69 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 7d  aints");.      }
b440: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b450: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
b460: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
b470: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
b480: 20 77 61 6c 6b 73 20 61 6e 20 65 78 70 72 65 73   walks an expres
b490: 73 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 72 65  sion tree and re
b4a0: 73 6f 6c 76 65 73 20 72 65 66 65 72 65 6e 63 65  solves reference
b4b0: 73 20 74 6f 0a 2a 2a 20 74 61 62 6c 65 20 63 6f  s to.** table co
b4c0: 6c 75 6d 6e 73 2e 20 20 4e 6f 64 65 73 20 6f 66  lumns.  Nodes of
b4d0: 20 74 68 65 20 66 6f 72 6d 20 49 44 2e 49 44 20   the form ID.ID 
b4e0: 6f 72 20 49 44 20 72 65 73 6f 6c 76 65 20 69 6e  or ID resolve in
b4f0: 74 6f 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 20 74  to an.** index t
b500: 6f 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 74  o the table in t
b510: 68 65 20 74 61 62 6c 65 20 6c 69 73 74 20 61 6e  he table list an
b520: 64 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 66 73 65  d a column offse
b530: 74 2e 20 20 54 68 65 20 0a 2a 2a 20 45 78 70 72  t.  The .** Expr
b540: 2e 6f 70 63 6f 64 65 20 66 6f 72 20 73 75 63 68  .opcode for such
b550: 20 6e 6f 64 65 73 20 69 73 20 63 68 61 6e 67 65   nodes is change
b560: 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 20  d to TK_COLUMN. 
b570: 20 54 68 65 20 45 78 70 72 2e 69 54 61 62 6c 65   The Expr.iTable
b580: 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 63 68 61  .** value is cha
b590: 6e 67 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65  nged to the inde
b5a0: 78 20 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e  x of the referen
b5b0: 63 65 64 20 74 61 62 6c 65 20 69 6e 20 70 54 61  ced table in pTa
b5c0: 62 4c 69 73 74 0a 2a 2a 20 70 6c 75 73 20 74 68  bList.** plus th
b5d0: 65 20 22 62 61 73 65 22 20 76 61 6c 75 65 2e 20  e "base" value. 
b5e0: 20 54 68 65 20 62 61 73 65 20 76 61 6c 75 65 20   The base value 
b5f0: 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20  will ultimately 
b600: 62 65 63 6f 6d 65 20 74 68 65 0a 2a 2a 20 56 44  become the.** VD
b610: 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
b620: 20 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68   for a cursor th
b630: 61 74 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 69  at is pointing i
b640: 6e 74 6f 20 74 68 65 20 72 65 66 65 72 65 6e 63  nto the referenc
b650: 65 64 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 54 68  ed.** table.  Th
b660: 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 76  e Expr.iColumn v
b670: 61 6c 75 65 20 69 73 20 63 68 61 6e 67 65 64 20  alue is changed 
b680: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
b690: 74 68 65 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 6f  the column .** o
b6a0: 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64  f the referenced
b6b0: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 45 78 70   table.  The Exp
b6c0: 72 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  r.iColumn value 
b6d0: 66 6f 72 20 74 68 65 20 73 70 65 63 69 61 6c 0a  for the special.
b6e0: 2a 2a 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20  ** ROWID column 
b6f0: 69 73 20 2d 31 2e 20 20 41 6e 79 20 49 4e 54 45  is -1.  Any INTE
b700: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
b710: 63 6f 6c 75 6d 6e 20 69 73 20 74 72 69 65 64 20  column is tried 
b720: 61 73 20 61 6e 0a 2a 2a 20 61 6c 69 61 73 20 66  as an.** alias f
b730: 6f 72 20 52 4f 57 49 44 2e 0a 2a 2a 0a 2a 2a 20  or ROWID..**.** 
b740: 41 6c 73 6f 20 72 65 73 6f 6c 76 65 20 66 75 6e  Also resolve fun
b750: 63 74 69 6f 6e 20 6e 61 6d 65 73 20 61 6e 64 20  ction names and 
b760: 63 68 65 63 6b 20 74 68 65 20 66 75 6e 63 74 69  check the functi
b770: 6f 6e 73 20 66 6f 72 20 70 72 6f 70 65 72 0a 2a  ons for proper.*
b780: 2a 20 75 73 61 67 65 2e 20 20 4d 61 6b 65 20 73  * usage.  Make s
b790: 75 72 65 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e  ure all function
b7a0: 20 6e 61 6d 65 73 20 61 72 65 20 72 65 63 6f 67   names are recog
b7b0: 6e 69 7a 65 64 20 61 6e 64 20 61 6c 6c 20 66 75  nized and all fu
b7c0: 6e 63 74 69 6f 6e 73 0a 2a 2a 20 68 61 76 65 20  nctions.** have 
b7d0: 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62  the correct numb
b7e0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e  er of arguments.
b7f0: 20 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72    Leave an error
b800: 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70   message.** in p
b810: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20 69  Parse->zErrMsg i
b820: 66 20 61 6e 79 74 68 69 6e 67 20 69 73 20 61 6d  f anything is am
b830: 69 73 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65  iss.  Return the
b840: 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
b850: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
b860: 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61  expression conta
b870: 69 6e 73 20 61 67 67 72 65 67 61 74 65 20 66 75  ins aggregate fu
b880: 6e 63 74 69 6f 6e 73 20 74 68 65 6e 20 73 65 74  nctions then set
b890: 20 74 68 65 20 45 50 5f 41 67 67 0a 2a 2a 20 70   the EP_Agg.** p
b8a0: 72 6f 70 65 72 74 79 20 6f 6e 20 74 68 65 20 65  roperty on the e
b8b0: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 69 6e  xpression..*/.in
b8c0: 74 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73  t sqlite3ExprRes
b8d0: 6f 6c 76 65 4e 61 6d 65 73 28 20 0a 20 20 4e 61  olveNames( .  Na
b8e0: 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
b8f0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61        /* Namespa
b900: 63 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 65 78  ce to resolve ex
b910: 70 72 65 73 73 69 6f 6e 73 20 69 6e 2e 20 2a 2f  pressions in. */
b920: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20  .  Expr *pExpr  
b930: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
b940: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  e expression to 
b950: 62 65 20 61 6e 61 6c 79 7a 65 64 2e 20 2a 2f 0a  be analyzed. */.
b960: 29 7b 0a 20 20 69 6e 74 20 73 61 76 65 64 48 61  ){.  int savedHa
b970: 73 41 67 67 3b 0a 20 20 69 66 28 20 70 45 78 70  sAgg;.  if( pExp
b980: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  r==0 ) return 0;
b990: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
b9a0: 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 53 51 4c  ITE_TEST) || SQL
b9b0: 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
b9c0: 54 48 3e 30 0a 20 20 69 66 28 20 28 70 45 78 70  TH>0.  if( (pExp
b9d0: 72 2d 3e 6e 48 65 69 67 68 74 2b 70 4e 43 2d 3e  r->nHeight+pNC->
b9e0: 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 29  pParse->nHeight)
b9f0: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52  >SQLITE_MAX_EXPR
ba00: 5f 44 45 50 54 48 20 29 7b 0a 20 20 20 20 73 71  _DEPTH ){.    sq
ba10: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 4e  lite3ErrorMsg(pN
ba20: 43 2d 3e 70 50 61 72 73 65 2c 20 0a 20 20 20 20  C->pParse, .    
ba30: 20 20 20 22 45 78 70 72 65 73 73 69 6f 6e 20 74     "Expression t
ba40: 72 65 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65  ree is too large
ba50: 20 28 6d 61 78 69 6d 75 6d 20 64 65 70 74 68 20   (maximum depth 
ba60: 25 64 29 22 2c 0a 20 20 20 20 20 20 20 53 51 4c  %d)",.       SQL
ba70: 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
ba80: 54 48 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 65  TH.    );.    re
ba90: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 70 4e  turn 1;.  }.  pN
baa0: 43 2d 3e 70 50 61 72 73 65 2d 3e 6e 48 65 69 67  C->pParse->nHeig
bab0: 68 74 20 2b 3d 20 70 45 78 70 72 2d 3e 6e 48 65  ht += pExpr->nHe
bac0: 69 67 68 74 3b 0a 23 65 6e 64 69 66 0a 20 20 73  ight;.#endif.  s
bad0: 61 76 65 64 48 61 73 41 67 67 20 3d 20 70 4e 43  avedHasAgg = pNC
bae0: 2d 3e 68 61 73 41 67 67 3b 0a 20 20 70 4e 43 2d  ->hasAgg;.  pNC-
baf0: 3e 68 61 73 41 67 67 20 3d 20 30 3b 0a 20 20 77  >hasAgg = 0;.  w
bb00: 61 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78 70  alkExprTree(pExp
bb10: 72 2c 20 6e 61 6d 65 52 65 73 6f 6c 76 65 72 53  r, nameResolverS
bb20: 74 65 70 2c 20 70 4e 43 29 3b 0a 23 69 66 20 64  tep, pNC);.#if d
bb30: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
bb40: 53 54 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41  ST) || SQLITE_MA
bb50: 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20  X_EXPR_DEPTH>0. 
bb60: 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 6e 48   pNC->pParse->nH
bb70: 65 69 67 68 74 20 2d 3d 20 70 45 78 70 72 2d 3e  eight -= pExpr->
bb80: 6e 48 65 69 67 68 74 3b 0a 23 65 6e 64 69 66 0a  nHeight;.#endif.
bb90: 20 20 69 66 28 20 70 4e 43 2d 3e 6e 45 72 72 3e    if( pNC->nErr>
bba0: 30 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74  0 ){.    ExprSet
bbb0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
bbc0: 45 50 5f 45 72 72 6f 72 29 3b 0a 20 20 7d 0a 20  EP_Error);.  }. 
bbd0: 20 69 66 28 20 70 4e 43 2d 3e 68 61 73 41 67 67   if( pNC->hasAgg
bbe0: 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50   ){.    ExprSetP
bbf0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
bc00: 50 5f 41 67 67 29 3b 0a 20 20 7d 65 6c 73 65 20  P_Agg);.  }else 
bc10: 69 66 28 20 73 61 76 65 64 48 61 73 41 67 67 20  if( savedHasAgg 
bc20: 29 7b 0a 20 20 20 20 70 4e 43 2d 3e 68 61 73 41  ){.    pNC->hasA
bc30: 67 67 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  gg = 1;.  }.  re
bc40: 74 75 72 6e 20 45 78 70 72 48 61 73 50 72 6f 70  turn ExprHasProp
bc50: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 45  erty(pExpr, EP_E
bc60: 72 72 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rror);.}../*.** 
bc70: 41 20 70 6f 69 6e 74 65 72 20 69 6e 73 74 61 6e  A pointer instan
bc80: 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
bc90: 74 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20  ture is used to 
bca0: 70 61 73 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  pass information
bcb0: 0a 2a 2a 20 74 68 72 6f 75 67 68 20 77 61 6c 6b  .** through walk
bcc0: 45 78 70 72 54 72 65 65 20 69 6e 74 6f 20 63 6f  ExprTree into co
bcd0: 64 65 53 75 62 71 75 65 72 79 53 74 65 70 28 29  deSubqueryStep()
bce0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
bcf0: 75 63 74 20 51 75 65 72 79 43 6f 64 65 72 20 51  uct QueryCoder Q
bd00: 75 65 72 79 43 6f 64 65 72 3b 0a 73 74 72 75 63  ueryCoder;.struc
bd10: 74 20 51 75 65 72 79 43 6f 64 65 72 20 7b 0a 20  t QueryCoder {. 
bd20: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
bd30: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
bd40: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
bd50: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
bd60: 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70  NC;    /* Namesp
bd70: 61 63 65 20 6f 66 20 66 69 72 73 74 20 65 6e 63  ace of first enc
bd80: 6c 6f 73 69 6e 67 20 71 75 65 72 79 20 2a 2f 0a  losing query */.
bd90: 7d 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  };..#ifdef SQLIT
bda0: 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 73 71 6c  E_TEST.  int sql
bdb0: 69 74 65 33 5f 65 6e 61 62 6c 65 5f 69 6e 5f 6f  ite3_enable_in_o
bdc0: 70 74 20 3d 20 31 3b 0a 23 65 6c 73 65 0a 20 20  pt = 1;.#else.  
bdd0: 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 5f  #define sqlite3_
bde0: 65 6e 61 62 6c 65 5f 69 6e 5f 6f 70 74 20 31 0a  enable_in_opt 1.
bdf0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
be00: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
be10: 73 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65  sed by the imple
be20: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
be30: 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74   IN (...) operat
be40: 6f 72 2e 0a 2a 2a 20 49 74 27 73 20 6a 6f 62 20  or..** It's job 
be50: 69 73 20 74 6f 20 66 69 6e 64 20 6f 72 20 63 72  is to find or cr
be60: 65 61 74 65 20 61 20 62 2d 74 72 65 65 20 73 74  eate a b-tree st
be70: 72 75 63 74 75 72 65 20 74 68 61 74 20 6d 61 79  ructure that may
be80: 20 62 65 20 75 73 65 64 0a 2a 2a 20 65 69 74 68   be used.** eith
be90: 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6d  er to test for m
bea0: 65 6d 62 65 72 73 68 69 70 20 6f 66 20 74 68 65  embership of the
beb0: 20 28 2e 2e 2e 29 20 73 65 74 20 6f 72 20 74 6f   (...) set or to
bec0: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
bed0: 0a 2a 2a 20 69 74 73 20 6d 65 6d 62 65 72 73 2c  .** its members,
bee0: 20 73 6b 69 70 70 69 6e 67 20 64 75 70 6c 69 63   skipping duplic
bef0: 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ates..**.** The 
bf00: 63 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 6f 6e  cursor opened on
bf10: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 28   the structure (
bf20: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c 20  database table, 
bf30: 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 0a  database index .
bf40: 2a 2a 20 6f 72 20 65 70 68 65 72 6d 61 6c 20 74  ** or ephermal t
bf50: 61 62 6c 65 29 20 69 73 20 73 74 6f 72 65 64 20  able) is stored 
bf60: 69 6e 20 70 58 2d 3e 69 54 61 62 6c 65 20 62 65  in pX->iTable be
bf70: 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69  fore this functi
bf80: 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 20 54  on returns..** T
bf90: 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
bfa0: 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 65 20  e indicates the 
bfb0: 73 74 72 75 63 74 75 72 65 20 74 79 70 65 2c 20  structure type, 
bfc0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
bfd0: 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  *   IN_INDEX_ROW
bfe0: 49 44 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20  ID - The cursor 
bff0: 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20  was opened on a 
c000: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a  database table..
c010: 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e  **   IN_INDEX_IN
c020: 44 45 58 20 2d 20 54 68 65 20 63 75 72 73 6f 72  DEX - The cursor
c030: 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
c040: 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 63 2e   database indec.
c050: 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45  .**   IN_INDEX_E
c060: 50 48 20 2d 20 20 20 54 68 65 20 63 75 72 73 6f  PH -   The curso
c070: 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
c080: 61 20 73 70 65 63 69 61 6c 6c 79 20 63 72 65 61  a specially crea
c090: 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ted and.**      
c0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f                po
c0b0: 70 75 6c 61 74 65 64 20 65 70 68 65 72 65 6d 61  pulated epherema
c0c0: 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41  l table..**.** A
c0d0: 6e 20 65 78 69 73 74 69 6e 67 20 73 74 72 75 63  n existing struc
c0e0: 74 75 72 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65  ture may only be
c0f0: 20 75 73 65 64 20 69 66 20 74 68 65 20 53 45 4c   used if the SEL
c100: 45 43 54 20 69 73 20 6f 66 20 74 68 65 20 73 69  ECT is of the si
c110: 6d 70 6c 65 0a 2a 2a 20 66 6f 72 6d 3a 0a 2a 2a  mple.** form:.**
c120: 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c  .**     SELECT <
c130: 63 6f 6c 75 6d 6e 3e 20 46 52 4f 4d 20 3c 74 61  column> FROM <ta
c140: 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ble>.**.** If th
c150: 65 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20 70  e mustBeUnique p
c160: 61 72 61 6d 65 74 65 72 20 69 73 20 66 61 6c 73  arameter is fals
c170: 65 2c 20 74 68 65 20 73 74 72 75 63 74 75 72 65  e, the structure
c180: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a   will be used .*
c190: 2a 20 66 6f 72 20 66 61 73 74 20 73 65 74 20 6d  * for fast set m
c1a0: 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 2e  embership tests.
c1b0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e   In this case an
c1c0: 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65   epheremal table
c1d0: 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75 73 65   must .** be use
c1e0: 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e  d unless <column
c1f0: 3e 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20  > is an INTEGER 
c200: 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 61  PRIMARY KEY or a
c210: 6e 20 69 6e 64 65 78 20 63 61 6e 20 0a 2a 2a 20  n index can .** 
c220: 62 65 20 66 6f 75 6e 64 20 77 69 74 68 20 3c 63  be found with <c
c230: 6f 6c 75 6d 6e 3e 20 61 73 20 69 74 73 20 6c 65  olumn> as its le
c240: 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 2e 0a  ft-most column..
c250: 2a 2a 0a 2a 2a 20 49 66 20 6d 75 73 74 42 65 55  **.** If mustBeU
c260: 6e 69 71 75 65 20 69 73 20 74 72 75 65 2c 20 74  nique is true, t
c270: 68 65 6e 20 74 68 65 20 73 74 72 75 63 74 75 72  hen the structur
c280: 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  e will be used t
c290: 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68 72  o iterate.** thr
c2a0: 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d 65 6d  ough the set mem
c2b0: 62 65 72 73 2c 20 73 6b 69 70 70 69 6e 67 20 61  bers, skipping a
c2c0: 6e 79 20 64 75 70 6c 69 63 61 74 65 73 2e 20 49  ny duplicates. I
c2d0: 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 0a 2a  n this case an.*
c2e0: 2a 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c  * epheremal tabl
c2f0: 65 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 75  e must be used u
c300: 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63 74  nless the select
c310: 65 64 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 67  ed <column> is g
c320: 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20  uaranteed.** to 
c330: 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74 68  be unique - eith
c340: 65 72 20 62 65 63 61 75 73 65 20 69 74 20 69 73  er because it is
c350: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
c360: 41 52 59 20 4b 45 59 20 6f 72 20 69 74 0a 2a 2a  ARY KEY or it.**
c370: 20 69 73 20 75 6e 69 71 75 65 20 62 79 20 76 69   is unique by vi
c380: 72 74 75 65 20 6f 66 20 61 20 63 6f 6e 73 74 72  rtue of a constr
c390: 61 69 6e 74 20 6f 72 20 69 6d 70 6c 69 63 69 74  aint or implicit
c3a0: 20 69 6e 64 65 78 2e 0a 2a 2f 0a 23 69 66 6e 64   index..*/.#ifnd
c3b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
c3c0: 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69  UBQUERY.int sqli
c3d0: 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 50  te3FindInIndex(P
c3e0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
c3f0: 70 72 20 2a 70 58 2c 20 69 6e 74 20 6d 75 73 74  pr *pX, int must
c400: 42 65 55 6e 69 71 75 65 29 7b 0a 20 20 53 65 6c  BeUnique){.  Sel
c410: 65 63 74 20 2a 70 3b 0a 20 20 69 6e 74 20 65 54  ect *p;.  int eT
c420: 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ype = 0;.  int i
c430: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
c440: 61 62 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ab++;..  /* The 
c450: 66 6f 6c 6c 77 69 6e 67 20 69 66 28 2e 2e 2e 29  follwing if(...)
c460: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
c470: 72 75 65 20 69 66 20 74 68 65 20 53 45 4c 45 43  rue if the SELEC
c480: 54 20 69 73 20 6f 66 20 74 68 65 20 0a 20 20 2a  T is of the .  *
c490: 2a 20 73 69 6d 70 6c 65 20 66 6f 72 6d 3a 0a 20  * simple form:. 
c4a0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
c4b0: 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52 4f  ECT <column> FRO
c4c0: 4d 20 3c 74 61 62 6c 65 3e 0a 20 20 2a 2a 0a 20  M <table>.  **. 
c4d0: 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   ** If this is t
c4e0: 68 65 20 63 61 73 65 2c 20 69 74 20 6d 61 79 20  he case, it may 
c4f0: 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75  be possible to u
c500: 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74  se an existing t
c510: 61 62 6c 65 0a 20 20 2a 2a 20 6f 72 20 69 6e 64  able.  ** or ind
c520: 65 78 20 69 6e 73 74 65 61 64 20 6f 66 20 67 65  ex instead of ge
c530: 6e 65 72 61 74 69 6e 67 20 61 6e 20 65 70 68 65  nerating an ephe
c540: 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 20 20 2a  remal table..  *
c550: 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  /.  if( sqlite3_
c560: 65 6e 61 62 6c 65 5f 69 6e 5f 6f 70 74 0a 20 20  enable_in_opt.  
c570: 20 26 26 20 28 70 3d 70 58 2d 3e 70 53 65 6c 65   && (p=pX->pSele
c580: 63 74 29 20 26 26 20 21 70 2d 3e 70 50 72 69 6f  ct) && !p->pPrio
c590: 72 0a 20 20 20 26 26 20 21 70 2d 3e 69 73 44 69  r.   && !p->isDi
c5a0: 73 74 69 6e 63 74 20 26 26 20 21 70 2d 3e 69 73  stinct && !p->is
c5b0: 41 67 67 20 26 26 20 21 70 2d 3e 70 47 72 6f 75  Agg && !p->pGrou
c5c0: 70 42 79 0a 20 20 20 26 26 20 70 2d 3e 70 53 72  pBy.   && p->pSr
c5d0: 63 20 26 26 20 70 2d 3e 70 53 72 63 2d 3e 6e 53  c && p->pSrc->nS
c5e0: 72 63 3d 3d 31 20 26 26 20 21 70 2d 3e 70 53 72  rc==1 && !p->pSr
c5f0: 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a  c->a[0].pSelect.
c600: 20 20 20 26 26 20 21 70 2d 3e 70 53 72 63 2d 3e     && !p->pSrc->
c610: 61 5b 30 5d 2e 70 54 61 62 2d 3e 70 53 65 6c 65  a[0].pTab->pSele
c620: 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ct              
c630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c640: 20 20 20 20 0a 20 20 20 26 26 20 70 2d 3e 70 45      .   && p->pE
c650: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 26  List->nExpr==1 &
c660: 26 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  & p->pEList->a[0
c670: 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ].pExpr->op==TK_
c680: 43 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 21 70 2d  COLUMN.   && !p-
c690: 3e 70 4c 69 6d 69 74 20 26 26 20 21 70 2d 3e 70  >pLimit && !p->p
c6a0: 4f 66 66 73 65 74 20 26 26 20 21 70 2d 3e 70 57  Offset && !p->pW
c6b0: 68 65 72 65 0a 20 20 29 7b 0a 20 20 20 20 73 71  here.  ){.    sq
c6c0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
c6d0: 73 65 2d 3e 64 62 3b 0a 20 20 20 20 49 6e 64 65  se->db;.    Inde
c6e0: 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 45 78 70  x *pIdx;.    Exp
c6f0: 72 20 2a 70 45 78 70 72 20 3d 20 70 2d 3e 70 45  r *pExpr = p->pE
c700: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
c710: 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d  ;.    int iCol =
c720: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
c730: 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73  .    Vdbe *v = s
c740: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
c750: 61 72 73 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  arse);..    /* T
c760: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
c770: 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d  only called from
c780: 20 74 77 6f 20 70 6c 61 63 65 73 2e 20 49 6e 20   two places. In 
c790: 62 6f 74 68 20 63 61 73 65 73 20 74 68 65 20 76  both cases the v
c7a0: 64 62 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 61  dbe.    ** has a
c7b0: 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
c7c0: 63 61 74 65 64 2e 20 53 6f 20 61 73 73 75 6d 65  cated. So assume
c7d0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
c7e0: 29 20 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20  ) is always.    
c7f0: 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 68 65  ** successful he
c800: 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  re..    */.    a
c810: 73 73 65 72 74 28 76 29 3b 0a 20 20 20 20 69 66  ssert(v);.    if
c820: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
c830: 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70    int iMem = ++p
c840: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
c850: 20 20 20 69 6e 74 20 69 41 64 64 72 3b 0a 20 20     int iAddr;.  
c860: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
c870: 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  = p->pSrc->a[0].
c880: 70 54 61 62 3b 0a 20 20 20 20 20 20 69 6e 74 20  pTab;.      int 
c890: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
c8a0: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
c8b0: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
c8c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c8d0: 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62  UsesBtree(v, iDb
c8e0: 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
c8f0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
c900: 50 5f 53 43 6f 70 79 2c 20 69 4d 65 6d 29 3b 0a  P_SCopy, iMem);.
c910: 20 20 20 20 20 20 69 41 64 64 72 20 3d 20 73 71        iAddr = sq
c920: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
c930: 76 2c 20 4f 50 5f 49 66 2c 20 30 2c 20 69 4d 65  v, OP_If, 0, iMe
c940: 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
c950: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
c960: 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 4d  P_Integer, 1, iM
c970: 65 6d 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  em);..      sqli
c980: 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
c990: 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20  rse, iTab, iDb, 
c9a0: 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  pTab, OP_OpenRea
c9b0: 64 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20  d);.      eType 
c9c0: 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  = IN_INDEX_ROWID
c9d0: 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
c9e0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
c9f0: 69 41 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73  iAddr);.    }els
ca00: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e{.      /* The 
ca10: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
ca20: 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63  ce used by the c
ca30: 6f 6d 70 61 72 69 73 6f 6e 2e 20 49 66 20 61 6e  omparison. If an
ca40: 20 69 6e 64 65 78 20 69 73 20 74 6f 20 0a 20 20   index is to .  
ca50: 20 20 20 20 2a 2a 20 62 65 20 75 73 65 64 20 69      ** be used i
ca60: 6e 20 70 6c 61 63 65 20 6f 66 20 61 20 74 65 6d  n place of a tem
ca70: 70 2d 74 61 62 6c 65 2c 20 69 74 20 6d 75 73 74  p-table, it must
ca80: 20 62 65 20 6f 72 64 65 72 65 64 20 61 63 63 6f   be ordered acco
ca90: 72 64 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74  rding.      ** t
caa0: 6f 20 74 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e  o this collation
cab0: 20 73 65 71 75 65 6e 63 65 2e 0a 20 20 20 20 20   sequence..     
cac0: 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65   */.      CollSe
cad0: 71 20 2a 70 52 65 71 20 3d 20 73 71 6c 69 74 65  q *pReq = sqlite
cae0: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
caf0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58  llSeq(pParse, pX
cb00: 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 29 3b  ->pLeft, pExpr);
cb10: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b  ..      /* Check
cb20: 20 74 68 61 74 20 74 68 65 20 61 66 66 69 6e 69   that the affini
cb30: 74 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ty that will be 
cb40: 75 73 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20  used to perform 
cb50: 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  the .      ** co
cb60: 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 68 65 20  mparison is the 
cb70: 73 61 6d 65 20 61 73 20 74 68 65 20 61 66 66 69  same as the affi
cb80: 6e 69 74 79 20 6f 66 20 74 68 65 20 63 6f 6c 75  nity of the colu
cb90: 6d 6e 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20  mn. If.      ** 
cba0: 69 74 20 69 73 20 6e 6f 74 2c 20 69 74 20 69 73  it is not, it is
cbb0: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
cbc0: 20 75 73 65 20 61 6e 79 20 69 6e 64 65 78 2e 0a   use any index..
cbd0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54        */.      T
cbe0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 2d 3e  able *pTab = p->
cbf0: 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  pSrc->a[0].pTab;
cc00: 0a 20 20 20 20 20 20 63 68 61 72 20 61 66 66 20  .      char aff 
cc10: 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69  = comparisonAffi
cc20: 6e 69 74 79 28 70 58 29 3b 0a 20 20 20 20 20 20  nity(pX);.      
cc30: 69 6e 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20  int affinity_ok 
cc40: 3d 20 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  = (pTab->aCol[iC
cc50: 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 61 66  ol].affinity==af
cc60: 66 7c 7c 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  f||aff==SQLITE_A
cc70: 46 46 5f 4e 4f 4e 45 29 3b 0a 0a 20 20 20 20 20  FF_NONE);..     
cc80: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
cc90: 70 49 6e 64 65 78 3b 20 70 49 64 78 20 26 26 20  pIndex; pIdx && 
cca0: 65 54 79 70 65 3d 3d 30 20 26 26 20 61 66 66 69  eType==0 && affi
ccb0: 6e 69 74 79 5f 6f 6b 3b 20 70 49 64 78 3d 70 49  nity_ok; pIdx=pI
ccc0: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
ccd0: 20 20 20 20 69 66 28 20 28 70 49 64 78 2d 3e 61      if( (pIdx->a
cce0: 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c  iColumn[0]==iCol
ccf0: 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  ).         && (p
cd00: 52 65 71 3d 3d 73 71 6c 69 74 65 33 46 69 6e 64  Req==sqlite3Find
cd10: 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28  CollSeq(db, ENC(
cd20: 64 62 29 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  db), pIdx->azCol
cd30: 6c 5b 30 5d 2c 20 2d 31 2c 20 30 29 29 0a 20 20  l[0], -1, 0)).  
cd40: 20 20 20 20 20 20 20 26 26 20 28 21 6d 75 73 74         && (!must
cd50: 42 65 55 6e 69 71 75 65 20 7c 7c 20 28 70 49 64  BeUnique || (pId
cd60: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 26 26  x->nColumn==1 &&
cd70: 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d   pIdx->onError!=
cd80: 4f 45 5f 4e 6f 6e 65 29 29 0a 20 20 20 20 20 20  OE_None)).      
cd90: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
cda0: 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20  nt iDb;.        
cdb0: 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70    int iMem = ++p
cdc0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
cdd0: 20 20 20 20 20 20 20 69 6e 74 20 69 41 64 64 72         int iAddr
cde0: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  ;.          char
cdf0: 20 2a 70 4b 65 79 3b 0a 20 20 0a 20 20 20 20 20   *pKey;.  .     
ce00: 20 20 20 20 20 70 4b 65 79 20 3d 20 28 63 68 61       pKey = (cha
ce10: 72 20 2a 29 73 71 6c 69 74 65 33 49 6e 64 65 78  r *)sqlite3Index
ce20: 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20  Keyinfo(pParse, 
ce30: 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20  pIdx);.         
ce40: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
ce50: 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
ce60: 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pIdx->pSchema);.
ce70: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ce80: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76  3VdbeUsesBtree(v
ce90: 2c 20 69 44 62 29 3b 0a 0a 20 20 20 20 20 20 20  , iDb);..       
cea0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ceb0: 64 4f 70 31 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp1(v, OP_SCopy
cec0: 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20  , iMem);.       
ced0: 20 20 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74     iAddr = sqlit
cee0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
cef0: 4f 50 5f 49 66 2c 20 30 2c 20 69 4d 65 6d 29 3b  OP_If, 0, iMem);
cf00: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
cf10: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
cf20: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69  OP_Integer, 1, i
cf30: 4d 65 6d 29 3b 0a 20 20 0a 20 20 20 20 20 20 20  Mem);.  .       
cf40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cf50: 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  dOp4(v, OP_OpenR
cf60: 65 61 64 2c 20 69 54 61 62 2c 20 70 49 64 78 2d  ead, iTab, pIdx-
cf70: 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a 20 20 20 20  >tnum, iDb,.    
cf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf90: 20 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 2c             pKey,
cfa0: 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
cfb0: 46 46 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56  FF);.          V
cfc0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
cfd0: 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  %s", pIdx->zName
cfe0: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 54  ));.          eT
cff0: 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49  ype = IN_INDEX_I
d000: 4e 44 45 58 3b 0a 20 20 20 20 20 20 20 20 20 20  NDEX;.          
d010: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d020: 32 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f  2(v, OP_SetNumCo
d030: 6c 75 6d 6e 73 2c 20 69 54 61 62 2c 20 70 49 64  lumns, iTab, pId
d040: 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 0a 20 20  x->nColumn);..  
d050: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d060: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69  dbeJumpHere(v, i
d070: 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Addr);.        }
d080: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
d090: 20 7d 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d   }..  if( eType=
d0a0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
d0b0: 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  3CodeSubselect(p
d0c0: 50 61 72 73 65 2c 20 70 58 29 3b 0a 20 20 20 20  Parse, pX);.    
d0d0: 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
d0e0: 5f 45 50 48 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  _EPH;.  }else{. 
d0f0: 20 20 20 70 58 2d 3e 69 54 61 62 6c 65 20 3d 20     pX->iTable = 
d100: 69 54 61 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75  iTab;.  }.  retu
d110: 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e 64  rn eType;.}.#end
d120: 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  if../*.** Genera
d130: 74 65 20 63 6f 64 65 20 66 6f 72 20 73 63 61 6c  te code for scal
d140: 61 72 20 73 75 62 71 75 65 72 69 65 73 20 75 73  ar subqueries us
d150: 65 64 20 61 73 20 61 6e 20 65 78 70 72 65 73 73  ed as an express
d160: 69 6f 6e 0a 2a 2a 20 61 6e 64 20 49 4e 20 6f 70  ion.** and IN op
d170: 65 72 61 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c  erators.  Exampl
d180: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53  es:.**.**     (S
d190: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20  ELECT a FROM b) 
d1a0: 20 20 20 20 20 20 20 20 20 2d 2d 20 73 75 62 71           -- subq
d1b0: 75 65 72 79 0a 2a 2a 20 20 20 20 20 45 58 49 53  uery.**     EXIS
d1c0: 54 53 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f  TS (SELECT a FRO
d1d0: 4d 20 62 29 20 20 20 2d 2d 20 45 58 49 53 54 53  M b)   -- EXISTS
d1e0: 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20   subquery.**    
d1f0: 20 78 20 49 4e 20 28 34 2c 35 2c 31 31 29 20 20   x IN (4,5,11)  
d200: 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 49              -- I
d210: 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  N operator with 
d220: 6c 69 73 74 20 6f 6e 20 72 69 67 68 74 2d 68 61  list on right-ha
d230: 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20 20 20 78  nd side.**     x
d240: 20 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52   IN (SELECT a FR
d250: 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20 49 4e 20  OM b)     -- IN 
d260: 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 73 75  operator with su
d270: 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20 72 69  bquery on the ri
d280: 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45  ght.**.** The pE
d290: 78 70 72 20 70 61 72 61 6d 65 74 65 72 20 64 65  xpr parameter de
d2a0: 73 63 72 69 62 65 73 20 74 68 65 20 65 78 70 72  scribes the expr
d2b0: 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74  ession that cont
d2c0: 61 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f  ains the IN.** o
d2d0: 70 65 72 61 74 6f 72 20 6f 72 20 73 75 62 71 75  perator or subqu
d2e0: 65 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ery..*/.#ifndef 
d2f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
d300: 55 45 52 59 0a 76 6f 69 64 20 73 71 6c 69 74 65  UERY.void sqlite
d310: 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 50  3CodeSubselect(P
d320: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
d330: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e  pr *pExpr){.  in
d340: 74 20 74 65 73 74 41 64 64 72 20 3d 20 30 3b 20  t testAddr = 0; 
d350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d360: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d        /* One-tim
d370: 65 20 74 65 73 74 20 61 64 64 72 65 73 73 20 2a  e test address *
d380: 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  /.  Vdbe *v = sq
d390: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
d3a0: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
d3b0: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 0a 20 20 2f   ) return;...  /
d3c0: 2a 20 54 68 69 73 20 63 6f 64 65 20 6d 75 73 74  * This code must
d3d0: 20 62 65 20 72 75 6e 20 69 6e 20 69 74 73 20 65   be run in its e
d3e0: 6e 74 69 72 65 74 79 20 65 76 65 72 79 20 74 69  ntirety every ti
d3f0: 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74  me it is encount
d400: 65 72 65 64 0a 20 20 2a 2a 20 69 66 20 61 6e 79  ered.  ** if any
d410: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
d420: 67 20 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a 0a  g is true:.  **.
d430: 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72    **    *  The r
d440: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69  ight-hand side i
d450: 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73  s a correlated s
d460: 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 20 20 20  ubquery.  **    
d470: 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e  *  The right-han
d480: 64 20 73 69 64 65 20 69 73 20 61 6e 20 65 78 70  d side is an exp
d490: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e  ression list con
d4a0: 74 61 69 6e 69 6e 67 20 76 61 72 69 61 62 6c 65  taining variable
d4b0: 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57 65 20  s.  **    *  We 
d4c0: 61 72 65 20 69 6e 73 69 64 65 20 61 20 74 72 69  are inside a tri
d4d0: 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  gger.  **.  ** I
d4e0: 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f  f all of the abo
d4f0: 76 65 20 61 72 65 20 66 61 6c 73 65 2c 20 74 68  ve are false, th
d500: 65 6e 20 77 65 20 63 61 6e 20 72 75 6e 20 74 68  en we can run th
d510: 69 73 20 63 6f 64 65 20 6a 75 73 74 20 6f 6e 63  is code just onc
d520: 65 0a 20 20 2a 2a 20 73 61 76 65 20 74 68 65 20  e.  ** save the 
d530: 72 65 73 75 6c 74 73 2c 20 61 6e 64 20 72 65 75  results, and reu
d540: 73 65 20 74 68 65 20 73 61 6d 65 20 72 65 73 75  se the same resu
d550: 6c 74 20 6f 6e 20 73 75 62 73 65 71 75 65 6e 74  lt on subsequent
d560: 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a 20 20   invocations..  
d570: 2a 2f 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  */.  if( !ExprHa
d580: 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78  sAnyProperty(pEx
d590: 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74  pr, EP_VarSelect
d5a0: 29 20 26 26 20 21 70 50 61 72 73 65 2d 3e 74 72  ) && !pParse->tr
d5b0: 69 67 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 69  igStack ){.    i
d5c0: 6e 74 20 6d 65 6d 20 3d 20 2b 2b 70 50 61 72 73  nt mem = ++pPars
d5d0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c  e->nMem;.    sql
d5e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
d5f0: 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 6d 65 6d 29  , OP_SCopy, mem)
d600: 3b 0a 20 20 20 20 74 65 73 74 41 64 64 72 20 3d  ;.    testAddr =
d610: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d620: 70 30 28 76 2c 20 4f 50 5f 49 66 29 3b 0a 20 20  p0(v, OP_If);.  
d630: 20 20 61 73 73 65 72 74 28 20 74 65 73 74 41 64    assert( testAd
d640: 64 72 3e 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  dr>0 || pParse->
d650: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
d660: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
d670: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
d680: 49 6e 74 65 67 65 72 2c 20 31 2c 20 6d 65 6d 29  Integer, 1, mem)
d690: 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28  ;.  }..  switch(
d6a0: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
d6b0: 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
d6c0: 20 20 20 20 20 20 63 68 61 72 20 61 66 66 69 6e        char affin
d6d0: 69 74 79 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e  ity;.      KeyIn
d6e0: 66 6f 20 6b 65 79 49 6e 66 6f 3b 0a 20 20 20 20  fo keyInfo;.    
d6f0: 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20    int addr;     
d700: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
d710: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
d720: 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f  l instruction */
d730: 0a 0a 20 20 20 20 20 20 61 66 66 69 6e 69 74 79  ..      affinity
d740: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
d750: 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 4c  finity(pExpr->pL
d760: 65 66 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  eft);..      /* 
d770: 57 68 65 74 68 65 72 20 74 68 69 73 20 69 73 20  Whether this is 
d780: 61 6e 20 27 78 20 49 4e 28 53 45 4c 45 43 54 2e  an 'x IN(SELECT.
d790: 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78 20 49 4e  ..)' or an 'x IN
d7a0: 28 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a 20 20  (<exprlist>)'.  
d7b0: 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
d7c0: 6e 20 69 74 20 69 73 20 68 61 6e 64 6c 65 64 20  n it is handled 
d7d0: 74 68 65 20 73 61 6d 65 20 77 61 79 2e 20 41 20  the same way. A 
d7e0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 73  virtual table is
d7f0: 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65   .      ** fille
d800: 64 20 77 69 74 68 20 73 69 6e 67 6c 65 2d 66 69  d with single-fi
d810: 65 6c 64 20 69 6e 64 65 78 20 6b 65 79 73 20 72  eld index keys r
d820: 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20  epresenting the 
d830: 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a  results.      **
d840: 20 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54   from the SELECT
d850: 20 6f 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73   or the <exprlis
d860: 74 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  t>..      **.   
d870: 20 20 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27     ** If the 'x'
d880: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
d890: 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f   column value, o
d8a0: 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a  r the SELECT....
d8b0: 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
d8c0: 6e 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c  nt returns a col
d8d0: 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  umn value, then 
d8e0: 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20  the affinity of 
d8f0: 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f  that.      ** co
d900: 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20  lumn is used to 
d910: 62 75 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20  build the index 
d920: 6b 65 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78  keys. If both 'x
d930: 27 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20  ' and the.      
d940: 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61  ** SELECT... sta
d950: 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d  tement are colum
d960: 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63  ns, then numeric
d970: 20 61 66 66 69 6e 69 74 79 20 69 73 20 75 73 65   affinity is use
d980: 64 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69  d.      ** if ei
d990: 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20  ther column has 
d9a0: 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47  NUMERIC or INTEG
d9b0: 45 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20  ER affinity. If 
d9c0: 6e 65 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a  neither.      **
d9d0: 20 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c   'x' nor the SEL
d9e0: 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74  ECT... statement
d9f0: 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68   are columns, th
da00: 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  en numeric affin
da10: 69 74 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  ity.      ** is 
da20: 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  used..      */. 
da30: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
da40: 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  le = pParse->nTa
da50: 62 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 20  b++;.      addr 
da60: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
da70: 4f 70 31 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op1(v, OP_OpenEp
da80: 68 65 6d 65 72 61 6c 2c 20 70 45 78 70 72 2d 3e  hemeral, pExpr->
da90: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 6d  iTable);.      m
daa0: 65 6d 73 65 74 28 26 6b 65 79 49 6e 66 6f 2c 20  emset(&keyInfo, 
dab0: 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79 49 6e 66  0, sizeof(keyInf
dac0: 6f 29 29 3b 0a 20 20 20 20 20 20 6b 65 79 49 6e  o));.      keyIn
dad0: 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 31 3b 0a 20  fo.nField = 1;. 
dae0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
daf0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 74  AddOp2(v, OP_Set
db00: 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 70 45 78 70  NumColumns, pExp
db10: 72 2d 3e 69 54 61 62 6c 65 2c 20 31 29 3b 0a 0a  r->iTable, 1);..
db20: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
db30: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
db40: 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20      /* Case 1:  
db50: 20 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45     expr IN (SELE
db60: 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20  CT ...).        
db70: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65  **.        ** Ge
db80: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77  nerate code to w
db90: 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73  rite the results
dba0: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 69   of the select i
dbb0: 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72  nto the temporar
dbc0: 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62  y.        ** tab
dbd0: 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  le allocated and
dbe0: 20 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20   opened above.. 
dbf0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
dc00: 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
dc10: 74 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c  t;.        ExprL
dc20: 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20  ist *pEList;..  
dc30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
dc40: 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
dc50: 74 2c 20 53 52 54 5f 53 65 74 2c 20 70 45 78 70  t, SRT_Set, pExp
dc60: 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20  r->iTable);.    
dc70: 20 20 20 20 64 65 73 74 2e 61 66 66 69 6e 69 74      dest.affinit
dc80: 79 20 3d 20 28 69 6e 74 29 61 66 66 69 6e 69 74  y = (int)affinit
dc90: 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  y;.        asser
dca0: 74 28 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c  t( (pExpr->iTabl
dcb0: 65 26 30 78 30 30 30 30 46 46 46 46 29 3d 3d 70  e&0x0000FFFF)==p
dcc0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a  Expr->iTable );.
dcd0: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
dce0: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
dcf0: 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  , pExpr->pSelect
dd00: 2c 20 26 64 65 73 74 2c 20 30 2c 20 30 2c 20 30  , &dest, 0, 0, 0
dd10: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
dd20: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
dd30: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 45 4c 69    }.        pELi
dd40: 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c  st = pExpr->pSel
dd50: 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  ect->pEList;.   
dd60: 20 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 20       if( pEList 
dd70: 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
dd80: 3e 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20  >0 ){ .         
dd90: 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30   keyInfo.aColl[0
dda0: 5d 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  ] = sqlite3Binar
ddb0: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
ddc0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
ddd0: 4c 65 66 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Left,.          
dde0: 20 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d      pEList->a[0]
ddf0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
de00: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
de10: 66 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20  f( pExpr->pList 
de20: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61  ){.        /* Ca
de30: 73 65 20 32 3a 20 20 20 20 20 65 78 70 72 20 49  se 2:     expr I
de40: 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20  N (exprlist).   
de50: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
de60: 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70 72  ** For each expr
de70: 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e  ession, build an
de80: 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20   index key from 
de90: 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61  the evaluation a
dea0: 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  nd.        ** st
deb0: 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20 74 65  ore it in the te
dec0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 49  mporary table. I
ded0: 66 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f  f <expr> is a co
dee0: 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20  lumn, then use. 
def0: 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63         ** that c
df00: 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20  olumns affinity 
df10: 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e  when building in
df20: 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78  dex keys. If <ex
df30: 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 20  pr> is not.     
df40: 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20     ** a column, 
df50: 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69  use numeric affi
df60: 6e 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f  nity..        */
df70: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
df80: 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
df90: 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
dfa0: 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  >pList;.        
dfb0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
dfc0: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 0a 20 20  item *pItem;..  
dfd0: 20 20 20 20 20 20 69 66 28 20 21 61 66 66 69 6e        if( !affin
dfe0: 69 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ity ){.         
dff0: 20 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49   affinity = SQLI
e000: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
e010: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6b       }.        k
e020: 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20  eyInfo.aColl[0] 
e030: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  = pExpr->pLeft->
e040: 70 43 6f 6c 6c 3b 0a 0a 20 20 20 20 20 20 20 20  pColl;..        
e050: 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
e060: 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20  each expression 
e070: 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a  in <exprlist>. *
e080: 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  /.        for(i=
e090: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49  pList->nExpr, pI
e0a0: 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e  tem=pList->a; i>
e0b0: 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; i--, pItem++)
e0c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
e0d0: 20 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70   *pE2 = pItem->p
e0e0: 45 78 70 72 3b 0a 0a 20 20 20 20 20 20 20 20 20  Expr;..         
e0f0: 20 2f 2a 20 49 66 20 74 68 65 20 65 78 70 72 65   /* If the expre
e100: 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e  ssion is not con
e110: 73 74 61 6e 74 20 74 68 65 6e 20 77 65 20 77 69  stant then we wi
e120: 6c 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20  ll need to.     
e130: 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20       ** disable 
e140: 74 68 65 20 74 65 73 74 20 74 68 61 74 20 77 61  the test that wa
e150: 73 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f 76  s generated abov
e160: 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72  e that makes sur
e170: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  e.          ** t
e180: 68 69 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65 78  his code only ex
e190: 65 63 75 74 65 73 20 6f 6e 63 65 2e 20 20 42 65  ecutes once.  Be
e1a0: 63 61 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e 2d  cause for a non-
e1b0: 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 20 20 20  constant.       
e1c0: 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
e1d0: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 72 75   we need to reru
e1e0: 6e 20 74 68 69 73 20 63 6f 64 65 20 65 61 63 68  n this code each
e1f0: 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 20   time..         
e200: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
e210: 28 20 74 65 73 74 41 64 64 72 3e 30 20 26 26 20  ( testAddr>0 && 
e220: 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f  !sqlite3ExprIsCo
e230: 6e 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a 20  nstant(pE2) ){. 
e240: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
e250: 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
e260: 6f 70 28 76 2c 20 74 65 73 74 41 64 64 72 2d 31  op(v, testAddr-1
e270: 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 3);.          
e280: 20 20 74 65 73 74 41 64 64 72 20 3d 20 30 3b 0a    testAddr = 0;.
e290: 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
e2a0: 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61         /* Evalua
e2b0: 74 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  te the expressio
e2c0: 6e 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20  n and insert it 
e2d0: 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61  into the temp ta
e2e0: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ble */.         
e2f0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
e300: 28 70 50 61 72 73 65 2c 20 70 45 32 2c 20 30 29  (pParse, pE2, 0)
e310: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
e320: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
e330: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
e340: 31 2c 20 30 2c 20 30 2c 20 26 61 66 66 69 6e 69  1, 0, 0, &affini
e350: 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ty, 1);.        
e360: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e370: 4f 70 31 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op1(v, OP_IdxIns
e380: 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  ert, pExpr->iTab
e390: 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  le);.        }. 
e3a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
e3b0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
e3c0: 28 76 2c 20 61 64 64 72 2c 20 28 76 6f 69 64 20  (v, addr, (void 
e3d0: 2a 29 26 6b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)&keyInfo, P4_K
e3e0: 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 62  EYINFO);.      b
e3f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
e400: 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
e410: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
e420: 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ECT: {.      /* 
e430: 54 68 69 73 20 68 61 73 20 74 6f 20 62 65 20 61  This has to be a
e440: 20 73 63 61 6c 61 72 20 53 45 4c 45 43 54 2e 20   scalar SELECT. 
e450: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
e460: 6f 20 70 75 74 20 74 68 65 0a 20 20 20 20 20 20  o put the.      
e470: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  ** value of this
e480: 20 73 65 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d   select in a mem
e490: 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 63  ory cell and rec
e4a0: 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 0a 20  ord the number. 
e4b0: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d       ** of the m
e4c0: 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43  emory cell in iC
e4d0: 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  olumn..      */.
e4e0: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
e4f0: 73 74 20 54 6f 6b 65 6e 20 6f 6e 65 20 3d 20 7b  st Token one = {
e500: 20 28 75 38 2a 29 22 31 22 2c 20 30 2c 20 31 20   (u8*)"1", 0, 1 
e510: 7d 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  };.      Select 
e520: 2a 70 53 65 6c 3b 0a 20 20 20 20 20 20 53 65 6c  *pSel;.      Sel
e530: 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 0a 20  ectDest dest;.. 
e540: 20 20 20 20 20 70 53 65 6c 20 3d 20 70 45 78 70       pSel = pExp
e550: 72 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  r->pSelect;.    
e560: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
e570: 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 30  estInit(&dest, 0
e580: 2c 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  , ++pParse->nMem
e590: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
e5a0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
e5b0: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 64 65 73  T ){.        des
e5c0: 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 4d 65  t.eDest = SRT_Me
e5d0: 6d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  m;.        sqlit
e5e0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
e5f0: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65 73 74  OP_Null, 0, dest
e600: 2e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20  .iParm);.       
e610: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
e620: 20 22 49 6e 69 74 20 73 75 62 71 75 65 72 79 20   "Init subquery 
e630: 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20  result"));.     
e640: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e650: 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
e660: 5f 45 78 69 73 74 73 3b 0a 20 20 20 20 20 20 20  _Exists;.       
e670: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e680: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
e690: 2c 20 30 2c 20 64 65 73 74 2e 69 50 61 72 6d 29  , 0, dest.iParm)
e6a0: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
e6b0: 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20  mment((v, "Init 
e6c0: 45 58 49 53 54 53 20 72 65 73 75 6c 74 22 29 29  EXISTS result"))
e6d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e6e0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
e6f0: 65 28 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 29 3b  e(pSel->pLimit);
e700: 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69  .      pSel->pLi
e710: 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78  mit = sqlite3PEx
e720: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e  pr(pParse, TK_IN
e730: 54 45 47 45 52 2c 20 30 2c 20 30 2c 20 26 6f 6e  TEGER, 0, 0, &on
e740: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  e);.      if( sq
e750: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
e760: 73 65 2c 20 70 53 65 6c 2c 20 26 64 65 73 74 2c  se, pSel, &dest,
e770: 20 30 2c 20 30 2c 20 30 2c 20 30 29 20 29 7b 0a   0, 0, 0, 0) ){.
e780: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
e790: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 45        }.      pE
e7a0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 64  xpr->iColumn = d
e7b0: 65 73 74 2e 69 50 61 72 6d 3b 0a 20 20 20 20 20  est.iParm;.     
e7c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
e7d0: 7d 0a 0a 20 20 69 66 28 20 74 65 73 74 41 64 64  }..  if( testAdd
e7e0: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
e7f0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
e800: 74 65 73 74 41 64 64 72 29 3b 0a 20 20 7d 0a 0a  testAddr);.  }..
e810: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64    return;.}.#end
e820: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
e830: 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f  T_SUBQUERY */../
e840: 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 61  *.** Duplicate a
e850: 6e 20 38 2d 62 79 74 65 20 76 61 6c 75 65 0a 2a  n 8-byte value.*
e860: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 64  /.static char *d
e870: 75 70 38 62 79 74 65 73 28 56 64 62 65 20 2a 76  up8bytes(Vdbe *v
e880: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 6e  , const char *in
e890: 29 7b 0a 20 20 63 68 61 72 20 2a 6f 75 74 20 3d  ){.  char *out =
e8a0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
e8b0: 52 61 77 28 73 71 6c 69 74 65 33 56 64 62 65 44  Raw(sqlite3VdbeD
e8c0: 62 28 76 29 2c 20 38 29 3b 0a 20 20 69 66 28 20  b(v), 8);.  if( 
e8d0: 6f 75 74 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  out ){.    memcp
e8e0: 79 28 6f 75 74 2c 20 69 6e 2c 20 38 29 3b 0a 20  y(out, in, 8);. 
e8f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f 75 74 3b   }.  return out;
e900: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
e910: 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f  te an instructio
e920: 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20  n that will put 
e930: 74 68 65 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  the floating poi
e940: 6e 74 0a 2a 2a 20 76 61 6c 75 65 20 64 65 73 63  nt.** value desc
e950: 72 69 62 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d  ribed by z[0..n-
e960: 31 5d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  1] on the stack.
e970: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73  .**.** The z[] s
e980: 74 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61  tring will proba
e990: 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d  bly not be zero-
e9a0: 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74  terminated.  But
e9b0: 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68   the .** z[n] ch
e9c0: 61 72 61 63 74 65 72 20 69 73 20 67 75 61 72 61  aracter is guara
e9d0: 6e 74 65 65 64 20 74 6f 20 62 65 20 73 6f 6d 65  nteed to be some
e9e0: 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65 73 20  thing that does 
e9f0: 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65  not look.** like
ea00: 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f   the continuatio
ea10: 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 2e  n of the number.
ea20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ea30: 63 6f 64 65 52 65 61 6c 28 56 64 62 65 20 2a 76  codeReal(Vdbe *v
ea40: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  , const char *z,
ea50: 20 69 6e 74 20 6e 2c 20 69 6e 74 20 6e 65 67 61   int n, int nega
ea60: 74 65 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d  teFlag, int iMem
ea70: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 7a 20 7c  ){.  assert( z |
ea80: 7c 20 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  | v==0 || sqlite
ea90: 33 56 64 62 65 44 62 28 76 29 2d 3e 6d 61 6c 6c  3VdbeDb(v)->mall
eaa0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
eab0: 28 20 7a 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c  ( z ){.    doubl
eac0: 65 20 76 61 6c 75 65 3b 0a 20 20 20 20 63 68 61  e value;.    cha
ead0: 72 20 2a 7a 56 3b 0a 20 20 20 20 61 73 73 65 72  r *zV;.    asser
eae0: 74 28 20 21 69 73 64 69 67 69 74 28 7a 5b 6e 5d  t( !isdigit(z[n]
eaf0: 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
eb00: 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65 29 3b  AtoF(z, &value);
eb10: 0a 20 20 20 20 69 66 28 20 6e 65 67 61 74 65 46  .    if( negateF
eb20: 6c 61 67 20 29 20 76 61 6c 75 65 20 3d 20 2d 76  lag ) value = -v
eb30: 61 6c 75 65 3b 0a 20 20 20 20 7a 56 20 3d 20 64  alue;.    zV = d
eb40: 75 70 38 62 79 74 65 73 28 76 2c 20 28 63 68 61  up8bytes(v, (cha
eb50: 72 2a 29 26 76 61 6c 75 65 29 3b 0a 20 20 20 20  r*)&value);.    
eb60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
eb70: 34 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c  4(v, OP_Real, 0,
eb80: 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34   iMem, 0, zV, P4
eb90: 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  _REAL);.  }.}...
eba0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
ebb0: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  n instruction th
ebc0: 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20  at will put the 
ebd0: 69 6e 74 65 67 65 72 20 64 65 73 63 72 69 62 65  integer describe
ebe0: 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e   by.** text z[0.
ebf0: 2e 6e 2d 31 5d 20 6f 6e 20 74 68 65 20 73 74 61  .n-1] on the sta
ec00: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b  ck..**.** The z[
ec10: 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72  ] string will pr
ec20: 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65  obably not be ze
ec30: 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20  ro-terminated.  
ec40: 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d  But the .** z[n]
ec50: 20 63 68 61 72 61 63 74 65 72 20 69 73 20 67 75   character is gu
ec60: 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73  aranteed to be s
ec70: 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f  omething that do
ec80: 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c  es not look.** l
ec90: 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61  ike the continua
eca0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62  tion of the numb
ecb0: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
ecc0: 69 64 20 63 6f 64 65 49 6e 74 65 67 65 72 28 56  id codeInteger(V
ecd0: 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68  dbe *v, const ch
ece0: 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69 6e  ar *z, int n, in
ecf0: 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74 20 69  t negFlag, int i
ed00: 4d 65 6d 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Mem){.  assert( 
ed10: 7a 20 7c 7c 20 76 3d 3d 30 20 7c 7c 20 73 71 6c  z || v==0 || sql
ed20: 69 74 65 33 56 64 62 65 44 62 28 76 29 2d 3e 6d  ite3VdbeDb(v)->m
ed30: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
ed40: 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 69 6e   if( z ){.    in
ed50: 74 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t i;.    assert(
ed60: 20 21 69 73 64 69 67 69 74 28 7a 5b 6e 5d 29 20   !isdigit(z[n]) 
ed70: 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
ed80: 65 33 47 65 74 49 6e 74 33 32 28 7a 2c 20 26 69  e3GetInt32(z, &i
ed90: 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  ) ){.      if( n
eda0: 65 67 46 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b  egFlag ) i = -i;
edb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
edc0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
edd0: 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29  nteger, i, iMem)
ede0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
edf0: 73 71 6c 69 74 65 33 46 69 74 73 49 6e 36 34 42  sqlite3FitsIn64B
ee00: 69 74 73 28 7a 2c 20 6e 65 67 46 6c 61 67 29 20  its(z, negFlag) 
ee10: 29 7b 0a 20 20 20 20 20 20 69 36 34 20 76 61 6c  ){.      i64 val
ee20: 75 65 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  ue;.      char *
ee30: 7a 56 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  zV;.      sqlite
ee40: 33 41 74 6f 69 36 34 28 7a 2c 20 26 76 61 6c 75  3Atoi64(z, &valu
ee50: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  e);.      if( ne
ee60: 67 46 6c 61 67 20 29 20 76 61 6c 75 65 20 3d 20  gFlag ) value = 
ee70: 2d 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 7a 56  -value;.      zV
ee80: 20 3d 20 64 75 70 38 62 79 74 65 73 28 76 2c 20   = dup8bytes(v, 
ee90: 28 63 68 61 72 2a 29 26 76 61 6c 75 65 29 3b 0a  (char*)&value);.
eea0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
eeb0: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 49 6e  eAddOp4(v, OP_In
eec0: 74 36 34 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c  t64, 0, iMem, 0,
eed0: 20 7a 56 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a   zV, P4_INT64);.
eee0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
eef0: 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 7a 2c 20   codeReal(v, z, 
ef00: 6e 2c 20 6e 65 67 46 6c 61 67 2c 20 69 4d 65 6d  n, negFlag, iMem
ef10: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
ef20: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
ef30: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
ef40: 78 74 72 61 63 74 20 74 68 65 20 69 43 6f 6c 75  xtract the iColu
ef50: 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66 72 6f  mn-th column fro
ef60: 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61 62 20  m.** table pTab 
ef70: 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 63 6f  and store the co
ef80: 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72 65  lumn value in re
ef90: 67 69 73 74 65 72 20 69 4d 65 6d 2c 20 6f 72 20  gister iMem, or 
efa0: 6f 6e 0a 2a 2a 20 74 68 65 20 73 74 61 63 6b 20  on.** the stack 
efb0: 69 66 20 69 4d 65 6d 3d 3d 30 2e 20 20 54 68 65  if iMem==0.  The
efc0: 72 65 20 69 73 20 61 6e 20 6f 70 65 6e 20 63 75  re is an open cu
efd0: 72 73 6f 72 20 74 6f 20 70 54 61 62 20 69 6e 20  rsor to pTab in 
efe0: 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 20 49 66 20  .** iTable.  If 
eff0: 69 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63  iColumn<0 then c
f000: 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ode is generated
f010: 20 74 68 61 74 20 65 78 74 72 61 63 74 73 20 74   that extracts t
f020: 68 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 76 6f 69  he rowid..*/.voi
f030: 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
f040: 65 47 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 56 64  eGetColumn(.  Vd
f050: 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 2f  be *v,         /
f060: 2a 20 54 68 65 20 56 4d 20 62 65 69 6e 67 20 63  * The VM being c
f070: 72 65 61 74 65 64 20 2a 2f 0a 20 20 54 61 62 6c  reated */.  Tabl
f080: 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20  e *pTab,     /* 
f090: 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  Description of t
f0a0: 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20  he table we are 
f0b0: 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a  reading from */.
f0c0: 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20    int iColumn,  
f0d0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
f0e0: 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20  he table column 
f0f0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
f100: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
f110: 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
f120: 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  the table */.  i
f130: 6e 74 20 69 52 65 67 20 20 20 20 20 20 20 20 20  nt iReg         
f140: 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73  /* Store results
f150: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 66   here */.){.  if
f160: 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ( iColumn<0 ){. 
f170: 20 20 20 69 6e 74 20 6f 70 20 3d 20 28 70 54 61     int op = (pTa
f180: 62 20 26 26 20 49 73 56 69 72 74 75 61 6c 28 70  b && IsVirtual(p
f190: 54 61 62 29 29 20 3f 20 4f 50 5f 56 52 6f 77 69  Tab)) ? OP_VRowi
f1a0: 64 20 3a 20 4f 50 5f 52 6f 77 69 64 3b 0a 20 20  d : OP_Rowid;.  
f1b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f1c0: 4f 70 32 28 76 2c 20 6f 70 2c 20 69 54 61 62 6c  Op2(v, op, iTabl
f1d0: 65 2c 20 69 52 65 67 29 3b 0a 20 20 7d 65 6c 73  e, iReg);.  }els
f1e0: 65 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b  e if( pTab==0 ){
f1f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
f200: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
f210: 75 6d 6e 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f  umn, iTable, iCo
f220: 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 7d  lumn, iReg);.  }
f230: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6f 70  else{.    int op
f240: 20 3d 20 49 73 56 69 72 74 75 61 6c 28 70 54 61   = IsVirtual(pTa
f250: 62 29 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20  b) ? OP_VColumn 
f260: 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20  : OP_Column;.   
f270: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f280: 70 33 28 76 2c 20 6f 70 2c 20 69 54 61 62 6c 65  p3(v, op, iTable
f290: 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29  , iColumn, iReg)
f2a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c  ;.    sqlite3Col
f2b0: 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 54  umnDefault(v, pT
f2c0: 61 62 2c 20 69 43 6f 6c 75 6d 6e 29 3b 0a 23 69  ab, iColumn);.#i
f2d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f2e0: 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
f2f0: 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 61  .    if( pTab->a
f300: 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66  Col[iColumn].aff
f310: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
f320: 46 5f 52 45 41 4c 20 29 7b 0a 20 20 20 20 20 20  F_REAL ){.      
f330: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f340: 31 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69  1(v, OP_RealAffi
f350: 6e 69 74 79 2c 20 69 52 65 67 29 3b 0a 20 20 20  nity, iReg);.   
f360: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a   }.#endif.  }.}.
f370: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
f380: 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20 63 75  code into the cu
f390: 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20 65 76  rrent Vdbe to ev
f3a0: 61 6c 75 61 74 65 20 74 68 65 20 67 69 76 65 6e  aluate the given
f3b0: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61  .** expression a
f3c0: 6e 64 20 6c 65 61 76 65 73 20 74 68 65 20 72 65  nd leaves the re
f3d0: 73 75 6c 74 20 69 6e 20 61 20 72 65 67 69 73 74  sult in a regist
f3e0: 65 72 20 6f 6e 20 6f 6e 20 74 68 65 20 73 74 61  er on on the sta
f3f0: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
f400: 20 74 61 72 67 65 74 20 72 65 67 69 73 74 65 72   target register
f410: 20 6e 75 6d 62 65 72 20 69 73 20 6e 65 67 61 74   number is negat
f420: 69 76 65 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20  ive, allocate a 
f430: 6e 65 77 0a 2a 2a 20 72 65 67 69 73 74 65 72 20  new.** register 
f440: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  to store the res
f450: 75 6c 74 2e 20 20 49 66 20 74 68 65 20 74 61 72  ult.  If the tar
f460: 67 65 74 20 72 65 67 69 73 74 65 72 20 6e 75 6d  get register num
f470: 62 65 72 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 74  ber.** is zero t
f480: 68 65 6e 20 70 75 73 68 20 74 68 65 20 72 65 73  hen push the res
f490: 75 6c 74 20 6f 6e 74 6f 20 74 68 65 20 73 74 61  ult onto the sta
f4a0: 63 6b 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ck.  Return the 
f4b0: 74 61 72 67 65 74 0a 2a 2a 20 72 65 67 69 73 74  target.** regist
f4c0: 65 72 20 6e 75 6d 62 65 72 20 72 65 67 61 72 64  er number regard
f4d0: 6c 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  less..**.** This
f4e0: 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e   code depends on
f4f0: 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 63   the fact that c
f500: 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c  ertain token val
f510: 75 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a  ues (ex: TK_EQ).
f520: 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  ** are the same 
f530: 61 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73  as opcode values
f540: 20 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61   (ex: OP_Eq) tha
f550: 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  t implement the 
f560: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
f570: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65   operation.  Spe
f580: 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e  cial comments in
f590: 20 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20   vdbe.c and the 
f5a0: 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63  mkopcodeh.awk sc
f5b0: 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d  ript in.** the m
f5c0: 61 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75 73  ake process caus
f5d0: 65 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 74  e these values t
f5e0: 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74  o align.  Assert
f5f0: 28 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a  ()s in the code.
f600: 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20  ** below verify 
f610: 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73  that the numbers
f620: 20 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72   are aligned cor
f630: 72 65 63 74 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73  rectly..*/.int s
f640: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 50  qlite3ExprCode(P
f650: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
f660: 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
f670: 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a  arget){.  Vdbe *
f680: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
f690: 65 3b 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20 69  e;.  int op;.  i
f6a0: 6e 74 20 69 6e 52 65 67 20 3d 20 30 3b 0a 20 20  nt inReg = 0;.  
f6b0: 69 6e 74 20 6f 72 69 67 54 61 72 67 65 74 20 3d  int origTarget =
f6c0: 20 74 61 72 67 65 74 3b 0a 0a 20 20 61 73 73 65   target;..  asse
f6d0: 72 74 28 20 76 21 3d 30 20 7c 7c 20 70 50 61 72  rt( v!=0 || pPar
f6e0: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
f6f0: 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 76 3d  iled );.  if( v=
f700: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
f710: 20 69 66 28 20 74 61 72 67 65 74 3c 30 20 29 7b   if( target<0 ){
f720: 0a 20 20 20 20 74 61 72 67 65 74 20 3d 20 2b 2b  .    target = ++
f730: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
f740: 7d 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  }..  if( pExpr==
f750: 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b  0 ){.    op = TK
f760: 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _NULL;.  }else{.
f770: 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e      op = pExpr->
f780: 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68  op;.  }.  switch
f790: 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
f7a0: 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20   TK_AGG_COLUMN: 
f7b0: 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20  {.      AggInfo 
f7c0: 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 45 78 70  *pAggInfo = pExp
f7d0: 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20  r->pAggInfo;.   
f7e0: 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
f7f0: 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70  o_col *pCol = &p
f800: 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45  AggInfo->aCol[pE
f810: 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20  xpr->iAgg];.    
f820: 20 20 69 66 28 20 21 70 41 67 67 49 6e 66 6f 2d    if( !pAggInfo-
f830: 3e 64 69 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20  >directMode ){. 
f840: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
f850: 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20  Col->iMem>0 );. 
f860: 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70         inReg = p
f870: 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20 20  Col->iMem;.     
f880: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
f890: 7d 65 6c 73 65 20 69 66 28 20 70 41 67 67 49 6e  }else if( pAggIn
f8a0: 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67 49 64  fo->useSortingId
f8b0: 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  x ){.        sql
f8c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
f8d0: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67  , OP_Column, pAg
f8e0: 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64  gInfo->sortingId
f8f0: 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  x,.             
f900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f910: 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
f920: 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20  lumn, target);. 
f930: 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74         inReg = t
f940: 61 72 67 65 74 3b 0a 20 20 20 20 20 20 20 20 62  arget;.        b
f950: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
f960: 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65      /* Otherwise
f970: 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f  , fall thru into
f980: 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63   the TK_COLUMN c
f990: 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ase */.    }.   
f9a0: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
f9b0: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   {.      if( pEx
f9c0: 70 72 2d 3e 69 54 61 62 6c 65 3c 30 20 29 7b 0a  pr->iTable<0 ){.
f9d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
f9e0: 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65  only happens whe
f9f0: 6e 20 63 6f 64 69 6e 67 20 63 68 65 63 6b 20 63  n coding check c
fa00: 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
fa10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
fa20: 61 72 73 65 2d 3e 63 6b 42 61 73 65 3e 30 20 29  arse->ckBase>0 )
fa30: 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20  ;.        inReg 
fa40: 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
fa50: 20 2b 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73   + pParse->ckBas
fa60: 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
fa70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
fa80: 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
fa90: 28 76 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c  (v, pExpr->pTab,
faa0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fac0: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
fad0: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
fae0: 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
faf0: 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74    inReg = target
fb00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
fb10: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
fb20: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
fb30: 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64 65 49 6e  : {.      codeIn
fb40: 74 65 67 65 72 28 76 2c 20 28 63 68 61 72 2a 29  teger(v, (char*)
fb50: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  pExpr->token.z, 
fb60: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20  pExpr->token.n, 
fb70: 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
fb80: 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74    inReg = target
fb90: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
fba0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
fbb0: 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20  _FLOAT: {.      
fbc0: 63 6f 64 65 52 65 61 6c 28 76 2c 20 28 63 68 61  codeReal(v, (cha
fbd0: 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  r*)pExpr->token.
fbe0: 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  z, pExpr->token.
fbf0: 6e 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  n, 0, target);. 
fc00: 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72       inReg = tar
fc10: 67 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  get;.      break
fc20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
fc30: 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20   TK_STRING: {.  
fc40: 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f      sqlite3Dequo
fc50: 74 65 45 78 70 72 28 70 50 61 72 73 65 2d 3e 64  teExpr(pParse->d
fc60: 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  b, pExpr);.     
fc70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fc80: 70 34 28 76 2c 4f 50 5f 53 74 72 69 6e 67 38 2c  p4(v,OP_String8,
fc90: 20 30 2c 20 74 61 72 67 65 74 2c 20 30 2c 0a 20   0, target, 0,. 
fca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fcb0: 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 45         (char*)pE
fcc0: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45  xpr->token.z, pE
fcd0: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20  xpr->token.n);. 
fce0: 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72       inReg = tar
fcf0: 67 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  get;.      break
fd00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
fd10: 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20   TK_NULL: {.    
fd20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fd30: 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
fd40: 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
fd50: 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74    inReg = target
fd60: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
fd70: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
fd80: 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49  ITE_OMIT_BLOB_LI
fd90: 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54  TERAL.    case T
fda0: 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20  K_BLOB: {.      
fdb0: 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e  int n;.      con
fdc0: 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20  st char *z;.    
fdd0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 4c 4f    assert( TK_BLO
fde0: 42 3d 3d 4f 50 5f 48 65 78 42 6c 6f 62 20 29 3b  B==OP_HexBlob );
fdf0: 0a 20 20 20 20 20 20 6e 20 3d 20 70 45 78 70 72  .      n = pExpr
fe00: 2d 3e 74 6f 6b 65 6e 2e 6e 20 2d 20 33 3b 0a 20  ->token.n - 3;. 
fe10: 20 20 20 20 20 7a 20 3d 20 28 63 68 61 72 2a 29       z = (char*)
fe20: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 2b  pExpr->token.z +
fe30: 20 32 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   2;.      assert
fe40: 28 20 6e 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( n>=0 );.      
fe50: 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
fe60: 20 20 20 20 7a 20 3d 20 22 22 3b 0a 20 20 20 20      z = "";.    
fe70: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
fe80: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 6f  3VdbeAddOp4(v, o
fe90: 70 2c 20 30 2c 20 74 61 72 67 65 74 2c 20 30 2c  p, 0, target, 0,
fea0: 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 6e   z, n);.      in
feb0: 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20  Reg = target;.  
fec0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
fed0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
fee0: 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a   TK_VARIABLE: {.
fef0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ff00: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 56 61  eAddOp2(v, OP_Va
ff10: 72 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69  riable, pExpr->i
ff20: 54 61 62 6c 65 2c 20 74 61 72 67 65 74 29 3b 0a  Table, target);.
ff30: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
ff40: 3e 74 6f 6b 65 6e 2e 6e 3e 31 20 29 7b 0a 20 20  >token.n>1 ){.  
ff50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ff60: 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
ff70: 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74   (char*)pExpr->t
ff80: 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74  oken.z, pExpr->t
ff90: 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d  oken.n);.      }
ffa0: 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74  .      inReg = t
ffb0: 61 72 67 65 74 3b 0a 20 20 20 20 20 20 62 72 65  arget;.      bre
ffc0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
ffd0: 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20  se TK_REGISTER: 
ffe0: 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20  {.      inReg = 
fff0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20  pExpr->iTable;. 
10000 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10010 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
10020 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20 63  _OMIT_CAST.    c
10030 61 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20  ase TK_CAST: {. 
10040 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
10050 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  ons of the form:
10060 20 20 20 43 41 53 54 28 70 4c 65 66 74 20 41 53     CAST(pLeft AS
10070 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20   token) */.     
10080 20 69 6e 74 20 61 66 66 2c 20 74 6f 5f 6f 70 3b   int aff, to_op;
10090 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
100a0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
100b0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72  Expr->pLeft, tar
100c0 67 65 74 29 3b 0a 20 20 20 20 20 20 61 66 66 20  get);.      aff 
100d0 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  = sqlite3Affinit
100e0 79 54 79 70 65 28 26 70 45 78 70 72 2d 3e 74 6f  yType(&pExpr->to
100f0 6b 65 6e 29 3b 0a 20 20 20 20 20 20 74 6f 5f 6f  ken);.      to_o
10100 70 20 3d 20 61 66 66 20 2d 20 53 51 4c 49 54 45  p = aff - SQLITE
10110 5f 41 46 46 5f 54 45 58 54 20 2b 20 4f 50 5f 54  _AFF_TEXT + OP_T
10120 6f 54 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73  oText;.      ass
10130 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ert( to_op==OP_T
10140 6f 54 65 78 74 20 20 20 20 7c 7c 20 61 66 66 21  oText    || aff!
10150 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
10160 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73      );.      ass
10170 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ert( to_op==OP_T
10180 6f 42 6c 6f 62 20 20 20 20 7c 7c 20 61 66 66 21  oBlob    || aff!
10190 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
101a0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73      );.      ass
101b0 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ert( to_op==OP_T
101c0 6f 4e 75 6d 65 72 69 63 20 7c 7c 20 61 66 66 21  oNumeric || aff!
101d0 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
101e0 52 49 43 20 29 3b 0a 20 20 20 20 20 20 61 73 73  RIC );.      ass
101f0 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ert( to_op==OP_T
10200 6f 49 6e 74 20 20 20 20 20 7c 7c 20 61 66 66 21  oInt     || aff!
10210 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45  =SQLITE_AFF_INTE
10220 47 45 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73  GER );.      ass
10230 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ert( to_op==OP_T
10240 6f 52 65 61 6c 20 20 20 20 7c 7c 20 61 66 66 21  oReal    || aff!
10250 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
10260 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c      );.      sql
10270 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
10280 2c 20 74 6f 5f 6f 70 2c 20 74 61 72 67 65 74 29  , to_op, target)
10290 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20  ;.      inReg = 
102a0 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 62 72  target;.      br
102b0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
102c0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
102d0 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73  _CAST */.    cas
102e0 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
102f0 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
10300 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
10310 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73  e TK_GE:.    cas
10320 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
10330 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20  e TK_EQ: {.     
10340 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 20 20 20   int r1, r2;.   
10350 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54     assert( TK_LT
10360 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20  ==OP_Lt );.     
10370 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d   assert( TK_LE==
10380 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20 61  OP_Le );.      a
10390 73 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50  ssert( TK_GT==OP
103a0 5f 47 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Gt );.      ass
103b0 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47  ert( TK_GE==OP_G
103c0 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
103d0 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20  t( TK_EQ==OP_Eq 
103e0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
103f0 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b   TK_NE==OP_Ne );
10400 0a 20 20 20 20 20 20 69 66 28 20 74 61 72 67 65  .      if( targe
10410 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  t>0 ){.        i
10420 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20  nReg = target;. 
10430 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10440 20 20 20 20 69 6e 52 65 67 20 3d 20 2b 2b 70 50      inReg = ++pP
10450 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
10460 20 20 7d 0a 20 20 20 20 20 20 72 31 20 3d 20 73    }.      r1 = s
10470 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
10480 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
10490 65 66 74 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  eft, -1);.      
104a0 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
104b0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
104c0 70 72 2d 3e 70 52 69 67 68 74 2c 20 2d 31 29 3b  pr->pRight, -1);
104d0 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
104e0 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
104f0 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
10500 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
10510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31                r1
10520 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c  , r2, inReg, SQL
10530 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20  ITE_STOREP2);.  
10540 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
10550 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
10560 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  :.    case TK_OR
10570 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c  :.    case TK_PL
10580 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  US:.    case TK_
10590 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54  STAR:.    case T
105a0 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73  K_MINUS:.    cas
105b0 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61  e TK_REM:.    ca
105c0 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20  se TK_BITAND:.  
105d0 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a    case TK_BITOR:
105e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41  .    case TK_SLA
105f0 53 48 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  SH:.    case TK_
10600 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65  LSHIFT:.    case
10610 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20   TK_RSHIFT: .   
10620 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a   case TK_CONCAT:
10630 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 2c   {.      int r1,
10640 20 72 32 3b 0a 20 20 20 20 20 20 61 73 73 65 72   r2;.      asser
10650 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e  t( TK_AND==OP_An
10660 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d );.      asser
10670 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20  t( TK_OR==OP_Or 
10680 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
10690 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64   TK_PLUS==OP_Add
106a0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
106b0 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53  ( TK_MINUS==OP_S
106c0 75 62 74 72 61 63 74 20 29 3b 0a 20 20 20 20 20  ubtract );.     
106d0 20 61 73 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d   assert( TK_REM=
106e0 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b  =OP_Remainder );
106f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
10700 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74  K_BITAND==OP_Bit
10710 41 6e 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73  And );.      ass
10720 65 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f  ert( TK_BITOR==O
10730 50 5f 42 69 74 4f 72 20 29 3b 0a 20 20 20 20 20  P_BitOr );.     
10740 20 61 73 73 65 72 74 28 20 54 4b 5f 53 4c 41 53   assert( TK_SLAS
10750 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b 0a  H==OP_Divide );.
10760 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
10770 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66  _LSHIFT==OP_Shif
10780 74 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 61  tLeft );.      a
10790 73 73 65 72 74 28 20 54 4b 5f 52 53 48 49 46 54  ssert( TK_RSHIFT
107a0 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68 74 20  ==OP_ShiftRight 
107b0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
107c0 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43   TK_CONCAT==OP_C
107d0 6f 6e 63 61 74 20 29 3b 0a 20 20 20 20 20 20 72  oncat );.      r
107e0 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
107f0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
10800 72 2d 3e 70 4c 65 66 74 2c 20 2d 31 29 3b 0a 20  r->pLeft, -1);. 
10810 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
10820 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
10830 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
10840 20 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   -1);.      sqli
10850 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
10860 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74 61 72   op, r2, r1, tar
10870 67 65 74 29 3b 0a 20 20 20 20 20 20 69 6e 52 65  get);.      inRe
10880 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20  g = target;.    
10890 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
108a0 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55     case TK_UMINU
108b0 53 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20  S: {.      Expr 
108c0 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
108d0 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 61 73 73  pLeft;.      ass
108e0 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20  ert( pLeft );.  
108f0 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f      if( pLeft->o
10900 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20 70  p==TK_FLOAT || p
10910 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54  Left->op==TK_INT
10920 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20  EGER ){.        
10930 54 6f 6b 65 6e 20 2a 70 20 3d 20 26 70 4c 65 66  Token *p = &pLef
10940 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  t->token;.      
10950 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d    if( pLeft->op=
10960 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20  =TK_FLOAT ){.   
10970 20 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28         codeReal(
10980 76 2c 20 28 63 68 61 72 2a 29 70 2d 3e 7a 2c 20  v, (char*)p->z, 
10990 70 2d 3e 6e 2c 20 31 2c 20 74 61 72 67 65 74 29  p->n, 1, target)
109a0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
109b0 0a 20 20 20 20 20 20 20 20 20 20 63 6f 64 65 49  .          codeI
109c0 6e 74 65 67 65 72 28 76 2c 20 28 63 68 61 72 2a  nteger(v, (char*
109d0 29 70 2d 3e 7a 2c 20 70 2d 3e 6e 2c 20 31 2c 20  )p->z, p->n, 1, 
109e0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
109f0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
10a00 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d          int r1 =
10a10 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
10a20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
10a30 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10a40 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 31 29  _Integer, 0, r1)
10a50 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10a60 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
10a70 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
10a80 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
10a90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10aa0 70 33 28 76 2c 20 4f 50 5f 53 75 62 74 72 61 63  p3(v, OP_Subtrac
10ab0 74 2c 20 74 61 72 67 65 74 2c 20 72 31 2c 20 74  t, target, r1, t
10ac0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a  arget);.      }.
10ad0 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61        inReg = ta
10ae0 72 67 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61  rget;.      brea
10af0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
10b00 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20  e TK_BITNOT:.   
10b10 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a   case TK_NOT: {.
10b20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
10b30 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e  _BITNOT==OP_BitN
10b40 6f 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ot );.      asse
10b50 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e  rt( TK_NOT==OP_N
10b60 6f 74 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ot );.      sqli
10b70 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
10b80 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
10b90 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
10ba0 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
10bb0 20 6f 70 29 3b 0a 20 20 20 20 20 20 62 72 65 61   op);.      brea
10bc0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
10bd0 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
10be0 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
10bf0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  : {.      int ad
10c00 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  dr;.      assert
10c10 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f  ( TK_ISNULL==OP_
10c20 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20  IsNull );.      
10c30 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55  assert( TK_NOTNU
10c40 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  LL==OP_NotNull )
10c50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10c60 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10c70 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67  Integer, 1, targ
10c80 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
10c90 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
10ca0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
10cb0 20 30 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20   0);.      addr 
10cc0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
10cd0 4f 70 30 28 76 2c 20 6f 70 29 3b 0a 20 20 20 20  Op0(v, op);.    
10ce0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10cf0 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
10d00 2c 20 74 61 72 67 65 74 2c 20 2d 31 29 3b 0a 20  , target, -1);. 
10d10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10d20 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
10d30 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d  );.      inReg =
10d40 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 62   target;.      b
10d50 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
10d60 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
10d70 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67  TION: {.      Ag
10d80 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70  gInfo *pInfo = p
10d90 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a  Expr->pAggInfo;.
10da0 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 3d        if( pInfo=
10db0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
10dc0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
10dd0 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66  arse, "misuse of
10de0 20 61 67 67 72 65 67 61 74 65 3a 20 25 54 22 2c   aggregate: %T",
10df0 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 70 45  .            &pE
10e00 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20  xpr->span);.    
10e10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10e20 20 69 6e 52 65 67 20 3d 20 70 49 6e 66 6f 2d 3e   inReg = pInfo->
10e30 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41 67  aFunc[pExpr->iAg
10e40 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d  g].iMem;.      }
10e50 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
10e60 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
10e70 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20 20  CONST_FUNC:.    
10e80 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  case TK_FUNCTION
10e90 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69  : {.      ExprLi
10ea0 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70  st *pList = pExp
10eb0 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  r->pList;.      
10ec0 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 4c 69 73  int nExpr = pLis
10ed0 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  t ? pList->nExpr
10ee0 20 3a 20 30 3b 0a 20 20 20 20 20 20 46 75 6e 63   : 0;.      Func
10ef0 44 65 66 20 2a 70 44 65 66 3b 0a 20 20 20 20 20  Def *pDef;.     
10f00 20 69 6e 74 20 6e 49 64 3b 0a 20 20 20 20 20 20   int nId;.      
10f10 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b  const char *zId;
10f20 0a 20 20 20 20 20 20 69 6e 74 20 63 6f 6e 73 74  .      int const
10f30 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  Mask = 0;.      
10f40 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 71 6c  int i;.      sql
10f50 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
10f60 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 75 38 20  e->db;.      u8 
10f70 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
10f80 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
10f90 6f 6c 6c 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  oll = 0;..      
10fa0 7a 49 64 20 3d 20 28 63 68 61 72 2a 29 70 45 78  zId = (char*)pEx
10fb0 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20  pr->token.z;.   
10fc0 20 20 20 6e 49 64 20 3d 20 70 45 78 70 72 2d 3e     nId = pExpr->
10fd0 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 70  token.n;.      p
10fe0 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Def = sqlite3Fin
10ff0 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  dFunction(pParse
11000 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20  ->db, zId, nId, 
11010 6e 45 78 70 72 2c 20 65 6e 63 2c 20 30 29 3b 0a  nExpr, enc, 0);.
11020 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44        assert( pD
11030 65 66 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e  ef!=0 );.      n
11040 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
11050 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
11060 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 30 29  Parse, pList, 0)
11070 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
11080 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
11090 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73 73  LE.      /* Poss
110a0 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74 68  ibly overload th
110b0 65 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 74 68  e function if th
110c0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
110d0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 76   is.      ** a v
110e0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c  irtual table col
110f0 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  umn..      **.  
11100 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78      ** For infix
11110 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45   functions (LIKE
11120 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20  , GLOB, REGEXP, 
11130 61 6e 64 20 4d 41 54 43 48 29 20 75 73 65 20 74  and MATCH) use t
11140 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 63 6f  he.      ** seco
11150 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74  nd argument, not
11160 20 74 68 65 20 66 69 72 73 74 2c 20 61 73 20 74   the first, as t
11170 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  he argument to t
11180 65 73 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  est to.      ** 
11190 73 65 65 20 69 66 20 69 74 20 69 73 20 61 20 63  see if it is a c
111a0 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72 74 75  olumn in a virtu
111b0 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  al table.  This 
111c0 69 73 20 64 6f 6e 65 20 62 65 63 61 75 73 65 0a  is done because.
111d0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 66        ** the lef
111e0 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 66  t operand of inf
111f0 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 74 68  ix functions (th
11200 65 20 6f 70 65 72 61 6e 64 20 77 65 20 77 61 6e  e operand we wan
11210 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f  t to.      ** co
11220 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e  ntrol overloadin
11230 67 29 20 65 6e 64 73 20 75 70 20 61 73 20 74 68  g) ends up as th
11240 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
11250 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  t to the.      *
11260 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65  * function.  The
11270 20 65 78 70 72 65 73 73 69 6f 6e 20 22 41 20 67   expression "A g
11280 6c 6f 62 20 42 22 20 69 73 20 65 71 75 69 76 61  lob B" is equiva
11290 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20 2a  lent to .      *
112a0 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57  * "glob(B,A).  W
112b0 65 20 77 61 6e 74 20 74 6f 20 75 73 65 20 74 68  e want to use th
112c0 65 20 41 20 69 6e 20 22 41 20 67 6c 6f 62 20 42  e A in "A glob B
112d0 22 20 74 6f 20 74 65 73 74 0a 20 20 20 20 20 20  " to test.      
112e0 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ** for function 
112f0 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75  overloading.  Bu
11300 74 20 77 65 20 75 73 65 20 74 68 65 20 42 20 74  t we use the B t
11310 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41  erm in "glob(B,A
11320 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  )"..      */.   
11330 20 20 20 69 66 28 20 6e 45 78 70 72 3e 3d 32 20     if( nExpr>=2 
11340 26 26 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73  && (pExpr->flags
11350 20 26 20 45 50 5f 49 6e 66 69 78 46 75 6e 63 29   & EP_InfixFunc)
11360 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66   ){.        pDef
11370 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76   = sqlite3VtabOv
11380 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64  erloadFunction(d
11390 62 2c 20 70 44 65 66 2c 20 6e 45 78 70 72 2c 20  b, pDef, nExpr, 
113a0 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
113b0 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  r);.      }else 
113c0 69 66 28 20 6e 45 78 70 72 3e 30 20 29 7b 0a 20  if( nExpr>0 ){. 
113d0 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71         pDef = sq
113e0 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61  lite3VtabOverloa
113f0 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44  dFunction(db, pD
11400 65 66 2c 20 6e 45 78 70 72 2c 20 70 4c 69 73 74  ef, nExpr, pList
11410 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
11420 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
11430 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
11440 45 78 70 72 20 26 26 20 69 3c 33 32 3b 20 69 2b  Expr && i<32; i+
11450 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
11460 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
11470 73 74 61 6e 74 28 70 4c 69 73 74 2d 3e 61 5b 69  stant(pList->a[i
11480 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
11490 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20        constMask 
114a0 7c 3d 20 28 31 3c 3c 69 29 3b 0a 20 20 20 20 20  |= (1<<i);.     
114b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
114c0 20 70 44 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53   pDef->needCollS
114d0 65 71 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a  eq && !pColl ){.
114e0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20            pColl 
114f0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
11500 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 69  lSeq(pParse, pLi
11510 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
11520 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11530 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44 65   }.      if( pDe
11540 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29  f->needCollSeq )
11550 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  {.        if( !p
11560 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 70  Coll ) pColl = p
11570 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
11580 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73  Coll; .        s
11590 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
115a0 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20  (v, OP_CollSeq, 
115b0 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a  0, 0, 0, (char *
115c0 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53  )pColl, P4_COLLS
115d0 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  EQ);.      }.   
115e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
115f0 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74  dOp4(v, OP_Funct
11600 69 6f 6e 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c 20  ion, constMask, 
11610 6e 45 78 70 72 2c 20 30 2c 0a 20 20 20 20 20 20  nExpr, 0,.      
11620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11630 20 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50    (char*)pDef, P
11640 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20  4_FUNCDEF);.    
11650 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
11660 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11670 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
11680 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a  case TK_EXISTS:.
11690 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
116a0 43 54 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  CT: {.      if( 
116b0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  pExpr->iColumn==
116c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
116d0 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
116e0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  t(pParse, pExpr)
116f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11700 69 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 69  inReg = pExpr->i
11710 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 62 72  Column;.      br
11720 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
11730 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
11740 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32 2c 20 6a     int j1, j2, j
11750 33 2c 20 6a 34 2c 20 6a 35 3b 0a 20 20 20 20 20  3, j4, j5;.     
11760 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 0a   char affinity;.
11770 20 20 20 20 20 20 69 6e 74 20 65 54 79 70 65 3b        int eType;
11780 0a 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d 20  ..      eType = 
11790 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64  sqlite3FindInInd
117a0 65 78 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ex(pParse, pExpr
117b0 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  , 0);..      /* 
117c0 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 61  Figure out the a
117d0 66 66 69 6e 69 74 79 20 74 6f 20 75 73 65 20 74  ffinity to use t
117e0 6f 20 63 72 65 61 74 65 20 61 20 6b 65 79 20 66  o create a key f
117f0 72 6f 6d 20 74 68 65 20 72 65 73 75 6c 74 73 0a  rom the results.
11800 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
11810 65 78 70 72 65 73 73 69 6f 6e 2e 20 61 66 66 69  expression. affi
11820 6e 69 74 79 53 74 72 20 73 74 6f 72 65 73 20 61  nityStr stores a
11830 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 73   static string s
11840 75 69 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20  uitable for.    
11850 20 20 2a 2a 20 50 34 20 6f 66 20 4f 50 5f 4d 61    ** P4 of OP_Ma
11860 6b 65 52 65 63 6f 72 64 2e 0a 20 20 20 20 20 20  keRecord..      
11870 2a 2f 0a 20 20 20 20 20 20 61 66 66 69 6e 69 74  */.      affinit
11880 79 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66  y = comparisonAf
11890 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 0a  finity(pExpr);..
118a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
118b0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 6e  eAddOp1(v, OP_In
118c0 74 65 67 65 72 2c 20 31 29 3b 0a 0a 20 20 20 20  teger, 1);..    
118d0 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 3c 65    /* Code the <e
118e0 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72  xpr> from "<expr
118f0 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 20 54 68 65  > IN (...)". The
11900 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
11910 0a 20 20 20 20 20 20 2a 2a 20 70 45 78 70 72 2d  .      ** pExpr-
11920 3e 69 54 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73  >iTable contains
11930 20 74 68 65 20 76 61 6c 75 65 73 20 74 68 61 74   the values that
11940 20 6d 61 6b 65 20 75 70 20 74 68 65 20 28 2e 2e   make up the (..
11950 2e 29 20 73 65 74 2e 0a 20 20 20 20 20 20 2a 2f  .) set..      */
11960 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
11970 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
11980 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29 3b  Expr->pLeft, 0);
11990 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
119a0 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 53  beAddOp0(v, OP_S
119b0 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 6a 31 20  Copy);.      j1 
119c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
119d0 4f 70 30 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c  Op0(v, OP_NotNul
119e0 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
119f0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
11a00 50 5f 50 6f 70 2c 20 32 29 3b 0a 20 20 20 20 20  P_Pop, 2);.     
11a10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11a20 70 30 28 76 2c 20 4f 50 5f 4e 75 6c 6c 29 3b 0a  p0(v, OP_Null);.
11a30 20 20 20 20 20 20 6a 32 20 20 3d 20 73 71 6c 69        j2  = sqli
11a40 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
11a50 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 20   OP_Goto);.     
11a60 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
11a70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20  Here(v, j1);.   
11a80 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e     if( eType==IN
11a90 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a  _INDEX_ROWID ){.
11aa0 20 20 20 20 20 20 20 20 6a 33 20 3d 20 73 71 6c          j3 = sql
11ab0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
11ac0 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
11ad0 30 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 20 20  0, 0, 1);.      
11ae0 20 20 6a 34 20 3d 20 73 71 6c 69 74 65 33 56 64    j4 = sqlite3Vd
11af0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
11b00 6f 74 45 78 69 73 74 73 2c 20 70 45 78 70 72 2d  otExists, pExpr-
11b10 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20  >iTable);.      
11b20 20 20 6a 35 20 3d 20 73 71 6c 69 74 65 33 56 64    j5 = sqlite3Vd
11b30 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47  beAddOp0(v, OP_G
11b40 6f 74 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71  oto);.        sq
11b50 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
11b60 65 28 76 2c 20 6a 33 29 3b 0a 20 20 20 20 20 20  e(v, j3);.      
11b70 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
11b80 70 48 65 72 65 28 76 2c 20 6a 34 29 3b 0a 20 20  pHere(v, j4);.  
11b90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11ba0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11bb0 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
11bc0 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20 30 2c 20  ecord, 1, 0, 0, 
11bd0 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20  &affinity, 1);. 
11be0 20 20 20 20 20 20 20 6a 35 20 3d 20 73 71 6c 69         j5 = sqli
11bf0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
11c00 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72   OP_Found, pExpr
11c10 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20  ->iTable);.     
11c20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
11c30 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11c40 5f 41 64 64 49 6d 6d 2c 20 30 2c 20 2d 31 29 3b  _AddImm, 0, -1);
11c50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11c60 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 32  beJumpHere(v, j2
11c70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11c80 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
11c90 6a 35 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  j5);.      break
11ca0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
11cb0 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
11cc0 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  EN: {.      Expr
11cd0 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
11ce0 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 73 74  >pLeft;.      st
11cf0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
11d00 65 6d 20 2a 70 4c 49 74 65 6d 20 3d 20 70 45 78  em *pLItem = pEx
11d10 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 3b 0a 20 20  pr->pList->a;.  
11d20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
11d30 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72   = pLItem->pExpr
11d40 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20  ;.      int r1, 
11d50 72 32 2c 20 72 33 2c 20 72 34 2c 20 72 35 3b 0a  r2, r3, r4, r5;.
11d60 0a 20 20 20 20 20 20 69 66 28 20 74 61 72 67 65  .      if( targe
11d70 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  t>0 ){.        i
11d80 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20  nReg = target;. 
11d90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
11da0 20 20 20 20 69 6e 52 65 67 20 3d 20 2b 2b 70 50      inReg = ++pP
11db0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
11dc0 20 20 7d 0a 20 20 20 20 20 20 72 31 20 3d 20 73    }.      r1 = s
11dd0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
11de0 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 2d 31  Parse, pLeft, -1
11df0 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
11e00 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
11e10 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 2d 31  arse, pRight, -1
11e20 29 3b 0a 20 20 20 20 20 20 72 33 20 3d 20 2b 2b  );.      r3 = ++
11e30 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
11e40 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
11e50 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
11e60 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c 0a 20 20  Right, OP_Ge,.  
11e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e80 72 31 2c 20 72 32 2c 20 72 33 2c 20 53 51 4c 49  r1, r2, r3, SQLI
11e90 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20  TE_STOREP2);.   
11ea0 20 20 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20 20 20     pLItem++;.   
11eb0 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c 49 74     pRight = pLIt
11ec0 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  em->pExpr;.     
11ed0 20 72 34 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r4 = sqlite3Exp
11ee0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52  rCode(pParse, pR
11ef0 69 67 68 74 2c 20 2d 31 29 3b 0a 20 20 20 20 20  ight, -1);.     
11f00 20 72 35 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e   r5 = ++pParse->
11f10 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 63 6f 64 65  nMem;.      code
11f20 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
11f30 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f  pLeft, pRight, O
11f40 50 5f 4c 65 2c 20 72 31 2c 20 72 34 2c 20 72 35  P_Le, r1, r4, r5
11f50 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32  , SQLITE_STOREP2
11f60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11f70 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
11f80 5f 41 6e 64 2c 20 72 33 2c 20 72 35 2c 20 69 6e  _And, r3, r5, in
11f90 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Reg);.      brea
11fa0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
11fb0 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20  e TK_UPLUS: {.  
11fc0 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
11fd0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
11fe0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
11ff0 2c 20 6f 72 69 67 54 61 72 67 65 74 29 3b 0a 20  , origTarget);. 
12000 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
12010 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41  }.    case TK_CA
12020 53 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  SE: {.      int 
12030 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 3b 0a  expr_end_label;.
12040 20 20 20 20 20 20 69 6e 74 20 6a 75 6d 70 49 6e        int jumpIn
12050 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45  st;.      int nE
12060 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  xpr;.      int i
12070 3b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  ;.      ExprList
12080 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20   *pEList;.      
12090 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
120a0 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b  item *aListelem;
120b0 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  ..      assert(p
120c0 45 78 70 72 2d 3e 70 4c 69 73 74 29 3b 0a 20 20  Expr->pList);.  
120d0 20 20 20 20 61 73 73 65 72 74 28 28 70 45 78 70      assert((pExp
120e0 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  r->pList->nExpr 
120f0 25 20 32 29 20 3d 3d 20 30 29 3b 0a 20 20 20 20  % 2) == 0);.    
12100 20 20 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e    assert(pExpr->
12110 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30  pList->nExpr > 0
12120 29 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20  );.      pEList 
12130 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a  = pExpr->pList;.
12140 20 20 20 20 20 20 61 4c 69 73 74 65 6c 65 6d 20        aListelem 
12150 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  = pEList->a;.   
12160 20 20 20 6e 45 78 70 72 20 3d 20 70 45 4c 69 73     nExpr = pELis
12170 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
12180 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 20 3d  expr_end_label =
12190 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
121a0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
121b0 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  if( pExpr->pLeft
121c0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
121d0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
121e0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
121f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
12200 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
12210 45 78 70 72 3b 20 69 3d 69 2b 32 29 7b 0a 20 20  Expr; i=i+2){.  
12220 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
12230 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61 4c  rCode(pParse, aL
12240 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72  istelem[i].pExpr
12250 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
12260 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29  ( pExpr->pLeft )
12270 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
12280 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
12290 20 4f 50 5f 53 43 6f 70 79 2c 20 2d 31 29 3b 0a   OP_SCopy, -1);.
122a0 20 20 20 20 20 20 20 20 20 20 6a 75 6d 70 49 6e            jumpIn
122b0 73 74 20 3d 20 63 6f 64 65 43 6f 6d 70 61 72 65  st = codeCompare
122c0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
122d0 70 4c 65 66 74 2c 20 61 4c 69 73 74 65 6c 65 6d  pLeft, aListelem
122e0 5b 69 5d 2e 70 45 78 70 72 2c 0a 20 20 20 20 20  [i].pExpr,.     
122f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12300 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e              OP_N
12310 65 2c 20 30 2c 20 30 2c 20 30 2c 20 53 51 4c 49  e, 0, 0, 0, SQLI
12320 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
12330 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
12340 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
12350 50 5f 50 6f 70 2c 20 31 29 3b 0a 20 20 20 20 20  P_Pop, 1);.     
12360 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12370 20 20 20 20 6a 75 6d 70 49 6e 73 74 20 3d 20 73      jumpInst = s
12380 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
12390 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 30 2c  (v, OP_IfNot, 0,
123a0 20 30 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20   0, 1);.        
123b0 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
123c0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
123d0 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d  , aListelem[i+1]
123e0 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b  .pExpr, target);
123f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12400 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12410 5f 47 6f 74 6f 2c 20 30 2c 20 65 78 70 72 5f 65  _Goto, 0, expr_e
12420 6e 64 5f 6c 61 62 65 6c 29 3b 0a 20 20 20 20 20  nd_label);.     
12430 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
12440 6d 70 48 65 72 65 28 76 2c 20 6a 75 6d 70 49 6e  mpHere(v, jumpIn
12450 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
12460 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c     if( pExpr->pL
12470 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  eft ){.        s
12480 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12490 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30  (v, OP_Pop, 1, 0
124a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
124b0 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67   if( pExpr->pRig
124c0 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ht ){.        sq
124d0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
124e0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
124f0 67 68 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  ght, target);.  
12500 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12510 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12520 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
12530 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
12540 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
12550 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
12560 65 6c 28 76 2c 20 65 78 70 72 5f 65 6e 64 5f 6c  el(v, expr_end_l
12570 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 69 6e 52  abel);.      inR
12580 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20  eg = target;.   
12590 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
125a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
125b0 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20  MIT_TRIGGER.    
125c0 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b  case TK_RAISE: {
125d0 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 72  .      if( !pPar
125e0 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 29 7b  se->trigStack ){
125f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12600 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
12610 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12620 20 20 20 20 20 20 20 20 22 52 41 49 53 45 28 29          "RAISE()
12630 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65   may only be use
12640 64 20 77 69 74 68 69 6e 20 61 20 74 72 69 67 67  d within a trigg
12650 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20  er-program");.  
12660 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
12670 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
12680 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
12690 21 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20  !=OE_Ignore ){. 
126a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
126b0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  pExpr->iColumn==
126c0 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 7c 7c 0a 20  OE_Rollback ||. 
126d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126e0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
126f0 3d 20 4f 45 5f 41 62 6f 72 74 20 7c 7c 0a 20 20  = OE_Abort ||.  
12700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
12710 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d  Expr->iColumn ==
12720 20 4f 45 5f 46 61 69 6c 20 29 3b 0a 20 20 20 20   OE_Fail );.    
12730 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75       sqlite3Dequ
12740 6f 74 65 45 78 70 72 28 70 50 61 72 73 65 2d 3e  oteExpr(pParse->
12750 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  db, pExpr);.    
12760 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12770 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 48 61 6c  AddOp4(v, OP_Hal
12780 74 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  t, SQLITE_CONSTR
12790 41 49 4e 54 2c 20 70 45 78 70 72 2d 3e 69 43 6f  AINT, pExpr->iCo
127a0 6c 75 6d 6e 2c 20 30 2c 0a 20 20 20 20 20 20 20  lumn, 0,.       
127b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127c0 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74   (char*)pExpr->t
127d0 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74  oken.z, pExpr->t
127e0 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d  oken.n);.      }
127f0 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
12800 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
12810 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 49 67  iColumn == OE_Ig
12820 6e 6f 72 65 20 29 3b 0a 20 20 20 20 20 20 20 20  nore );.        
12830 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12840 70 32 28 76 2c 20 4f 50 5f 43 6f 6e 74 65 78 74  p2(v, OP_Context
12850 50 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Pop, 0, 0);.    
12860 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12870 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
12880 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 74 72  o, 0, pParse->tr
12890 69 67 53 74 61 63 6b 2d 3e 69 67 6e 6f 72 65 4a  igStack->ignoreJ
128a0 75 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20 56  ump);.         V
128b0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
128c0 72 61 69 73 65 28 49 47 4e 4f 52 45 29 22 29 29  raise(IGNORE)"))
128d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
128e0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
128f0 64 69 66 0a 20 20 7d 0a 20 20 69 66 28 20 69 6e  dif.  }.  if( in
12900 52 65 67 21 3d 74 61 72 67 65 74 20 29 7b 0a 20  Reg!=target ){. 
12910 20 20 20 69 66 28 20 6f 72 69 67 54 61 72 67 65     if( origTarge
12920 74 21 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 73  t!=-1 ){.      s
12930 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12940 28 76 2c 20 28 69 6e 52 65 67 3e 30 20 3f 20 4f  (v, (inReg>0 ? O
12950 50 5f 53 43 6f 70 79 20 3a 20 4f 50 5f 4d 6f 76  P_SCopy : OP_Mov
12960 65 29 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65  e), inReg, targe
12970 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
12980 20 20 20 20 20 74 61 72 67 65 74 20 3d 20 69 6e       target = in
12990 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Reg;.    }.  }. 
129a0 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
129b0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
129c0 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 2f  E_OMIT_TRIGGER./
129d0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
129e0 64 65 20 74 68 61 74 20 65 76 61 6c 75 74 65 73  de that evalutes
129f0 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
12a00 73 73 69 6f 6e 20 61 6e 64 20 6c 65 61 76 65 73  ssion and leaves
12a10 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 6f   the result.** o
12a20 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 53 65  n the stack.  Se
12a30 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 45 78  e also sqlite3Ex
12a40 70 72 43 6f 64 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  prCode()..**.** 
12a50 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  This routine mig
12a60 68 74 20 61 6c 73 6f 20 63 61 63 68 65 20 74 68  ht also cache th
12a70 65 20 72 65 73 75 6c 74 20 61 6e 64 20 6d 6f 64  e result and mod
12a80 69 66 79 20 74 68 65 20 70 45 78 70 72 20 74 72  ify the pExpr tr
12a90 65 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74  ee.** so that it
12aa0 20 77 69 6c 6c 20 6d 61 6b 65 20 75 73 65 20 6f   will make use o
12ab0 66 20 74 68 65 20 63 61 63 68 65 64 20 72 65 73  f the cached res
12ac0 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75 65 6e  ult on subsequen
12ad0 74 20 65 76 61 6c 75 61 74 69 6f 6e 73 0a 2a 2a  t evaluations.**
12ae0 20 72 61 74 68 65 72 20 74 68 61 6e 20 65 76 61   rather than eva
12af0 6c 75 61 74 65 20 74 68 65 20 77 68 6f 6c 65 20  luate the whole 
12b00 65 78 70 72 65 73 73 69 6f 6e 20 61 67 61 69 6e  expression again
12b10 2e 20 20 54 72 69 76 69 61 6c 20 65 78 70 72 65  .  Trivial expre
12b20 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 6e 6f  ssions are.** no
12b30 74 20 63 61 63 68 65 64 2e 20 20 49 66 20 74 68  t cached.  If th
12b40 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
12b50 63 61 63 68 65 64 2c 20 69 74 73 20 72 65 73 75  cached, its resu
12b60 6c 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  lt is stored in 
12b70 61 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6c 6f 63  a .** memory loc
12b80 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
12b90 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 6e  qlite3ExprCodeAn
12ba0 64 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50  dCache(Parse *pP
12bb0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
12bc0 72 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  r){.  Vdbe *v = 
12bd0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
12be0 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
12bf0 69 6e 74 20 69 4d 65 6d 3b 0a 20 20 69 6e 74 20  int iMem;.  int 
12c00 61 64 64 72 31 2c 20 61 64 64 72 32 3b 0a 20 20  addr1, addr2;.  
12c10 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
12c20 6e 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  n;.  addr1 = sql
12c30 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
12c40 64 64 72 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  ddr(v);.  sqlite
12c50 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
12c60 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 61  , pExpr, 0);.  a
12c70 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr2 = sqlite3Vd
12c80 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
12c90 3b 0a 20 20 69 66 28 20 61 64 64 72 32 3e 61 64  ;.  if( addr2>ad
12ca0 64 72 31 2b 31 0a 20 20 20 7c 7c 20 28 28 70 4f  dr1+1.   || ((pO
12cb0 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47  p = sqlite3VdbeG
12cc0 65 74 4f 70 28 76 2c 20 61 64 64 72 31 29 29 21  etOp(v, addr1))!
12cd0 3d 30 20 26 26 20 70 4f 70 2d 3e 6f 70 63 6f 64  =0 && pOp->opcod
12ce0 65 3d 3d 4f 50 5f 46 75 6e 63 74 69 6f 6e 29 20  e==OP_Function) 
12cf0 29 7b 0a 20 20 20 20 69 4d 65 6d 20 3d 20 70 45  ){.    iMem = pE
12d00 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2b 2b  xpr->iTable = ++
12d10 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
12d20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12d30 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
12d40 30 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 70 45  0, iMem);.    pE
12d50 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47  xpr->op = TK_REG
12d60 49 53 54 45 52 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  ISTER;.  }.}.#en
12d70 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  dif../*.** Gener
12d80 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 70 75  ate code that pu
12d90 73 68 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f  shes the value o
12da0 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20  f every element 
12db0 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  of the given.** 
12dc0 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
12dd0 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a  onto the stack..
12de0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
12df0 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   number of eleme
12e00 6e 74 73 20 70 75 73 68 65 64 20 6f 6e 74 6f 20  nts pushed onto 
12e10 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a 69 6e  the stack..*/.in
12e20 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
12e30 65 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72  eExprList(.  Par
12e40 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
12e50 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
12e60 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
12e70 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68   *pList,   /* Th
12e80 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
12e90 74 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  t to be coded */
12ea0 0a 20 20 69 6e 74 20 74 61 72 67 65 74 20 20 20  .  int target   
12eb0 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
12ec0 6f 20 77 72 69 74 65 20 72 65 73 75 6c 74 73 20  o write results 
12ed0 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45  */.){.  struct E
12ee0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
12ef0 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 2c  tem;.  int i, n,
12f00 20 69 6e 63 72 20 3d 20 31 3b 0a 20 20 69 66 28   incr = 1;.  if(
12f10 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
12f20 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 70 4c 69 73  rn 0;.  n = pLis
12f30 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20  t->nExpr;.  if( 
12f40 74 61 72 67 65 74 3c 30 20 29 7b 0a 20 20 20 20  target<0 ){.    
12f50 74 61 72 67 65 74 20 3d 20 70 50 61 72 73 65 2d  target = pParse-
12f60 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
12f70 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 3b 0a  rse->nMem += n;.
12f80 20 20 7d 65 6c 73 65 20 69 66 28 20 74 61 72 67    }else if( targ
12f90 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 63  et==0 ){.    inc
12fa0 72 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72  r = 0;.  }.  for
12fb0 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
12fc0 20 69 3d 6e 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20   i=n; i>0; i--, 
12fd0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71  pItem++){.    sq
12fe0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
12ff0 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78  arse, pItem->pEx
13000 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
13010 20 74 61 72 67 65 74 20 2b 3d 20 69 6e 63 72 3b   target += incr;
13020 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e   .  }.  return n
13030 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
13040 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62  ate code for a b
13050 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f  oolean expressio
13060 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75  n such that a ju
13070 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f  mp is made.** to
13080 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74   the label "dest
13090 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  " if the express
130a0 69 6f 6e 20 69 73 20 74 72 75 65 20 62 75 74 20  ion is true but 
130b0 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e  execution.** con
130c0 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20  tinues straight 
130d0 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72  thru if the expr
130e0 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e  ession is false.
130f0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
13100 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74  pression evaluat
13110 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74  es to NULL (neit
13120 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c  her true nor fal
13130 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b  se), then.** tak
13140 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68  e the jump if th
13150 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61  e jumpIfNull fla
13160 67 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50  g is SQLITE_JUMP
13170 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  IFNULL..**.** Th
13180 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20  is code depends 
13190 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68 61 74  on the fact that
131a0 20 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76   certain token v
131b0 61 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f 45 51  alues (ex: TK_EQ
131c0 29 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d  ).** are the sam
131d0 65 20 61 73 20 6f 70 63 6f 64 65 20 76 61 6c 75  e as opcode valu
131e0 65 73 20 28 65 78 3a 20 4f 50 5f 45 71 29 20 74  es (ex: OP_Eq) t
131f0 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68  hat implement th
13200 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
13210 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53  ** operation.  S
13220 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20  pecial comments 
13230 69 6e 20 76 64 62 65 2e 63 20 61 6e 64 20 74 68  in vdbe.c and th
13240 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20  e mkopcodeh.awk 
13250 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65  script in.** the
13260 20 6d 61 6b 65 20 70 72 6f 63 65 73 73 20 63 61   make process ca
13270 75 73 65 20 74 68 65 73 65 20 76 61 6c 75 65 73  use these values
13280 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73 65   to align.  Asse
13290 72 74 28 29 73 20 69 6e 20 74 68 65 20 63 6f 64  rt()s in the cod
132a0 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69 66  e.** below verif
132b0 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65  y that the numbe
132c0 72 73 20 61 72 65 20 61 6c 69 67 6e 65 64 20 63  rs are aligned c
132d0 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69  orrectly..*/.voi
132e0 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54  d sqlite3ExprIfT
132f0 72 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  rue(Parse *pPars
13300 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
13310 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75  int dest, int ju
13320 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62  mpIfNull){.  Vdb
13330 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
13340 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d  Vdbe;.  int op =
13350 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 75   0;.  assert( ju
13360 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
13370 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a  _JUMPIFNULL || j
13380 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
13390 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45    if( v==0 || pE
133a0 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
133b0 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f  .  op = pExpr->o
133c0 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  p;.  switch( op 
133d0 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
133e0 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ND: {.      int 
133f0 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
13400 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
13410 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
13420 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
13430 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c  Expr->pLeft, d2,
13440 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54  jumpIfNull^SQLIT
13450 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
13460 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
13470 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
13480 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
13490 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
134a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
134b0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
134c0 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65  , d2);.      bre
134d0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
134e0 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20  se TK_OR: {.    
134f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
13500 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
13510 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
13520 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
13530 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
13540 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
13550 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
13560 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
13570 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13580 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  }.    case TK_NO
13590 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
135a0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
135b0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
135c0 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
135d0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
135e0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
135f0 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
13600 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
13610 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
13620 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61  se TK_GE:.    ca
13630 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
13640 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20  se TK_EQ: {.    
13650 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d    assert( TK_LT=
13660 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20  =OP_Lt );.      
13670 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f  assert( TK_LE==O
13680 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Le );.      as
13690 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f  sert( TK_GT==OP_
136a0 47 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Gt );.      asse
136b0 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65  rt( TK_GE==OP_Ge
136c0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
136d0 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29  ( TK_EQ==OP_Eq )
136e0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
136f0 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a  TK_NE==OP_Ne );.
13700 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
13710 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
13720 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a  xpr->pLeft, 0);.
13730 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
13740 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
13750 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b  xpr->pRight, 0);
13760 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
13770 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
13780 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
13790 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
137a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
137b0 20 30 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66   0, dest, jumpIf
137c0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
137d0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
137e0 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20  se TK_ISNULL:.  
137f0 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
13800 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  L: {.      asser
13810 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50  t( TK_ISNULL==OP
13820 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20  _IsNull );.     
13830 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e   assert( TK_NOTN
13840 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20  ULL==OP_NotNull 
13850 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13860 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
13870 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30   pExpr->pLeft, 0
13880 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13890 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70  VdbeAddOp2(v, op
138a0 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  , 0, dest);.    
138b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
138c0 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
138d0 45 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  EN: {.      /* T
138e0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 78  he expression "x
138f0 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a   BETWEEN y AND z
13900 22 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  " is implemented
13910 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20   as:.      **.  
13920 20 20 20 20 2a 2a 20 31 20 49 46 20 28 78 20 3c      ** 1 IF (x <
13930 20 79 29 20 47 4f 54 4f 20 33 0a 20 20 20 20 20   y) GOTO 3.     
13940 20 2a 2a 20 32 20 49 46 20 28 78 20 3c 3d 20 7a   ** 2 IF (x <= z
13950 29 20 47 4f 54 4f 20 3c 64 65 73 74 3e 0a 20 20  ) GOTO <dest>.  
13960 20 20 20 20 2a 2a 20 33 20 2e 2e 2e 0a 20 20 20      ** 3 ....   
13970 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
13980 61 64 64 72 3b 0a 20 20 20 20 20 20 45 78 70 72  addr;.      Expr
13990 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
139a0 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 45 78  >pLeft;.      Ex
139b0 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78  pr *pRight = pEx
139c0 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  pr->pList->a[0].
139d0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c  pExpr;.      sql
139e0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
139f0 72 73 65 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a  rse, pLeft, 0);.
13a00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13a10 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 43 6f  eAddOp0(v, OP_Co
13a20 70 79 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  py);.      sqlit
13a30 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
13a40 65 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20  e, pRight, 0);. 
13a50 20 20 20 20 20 61 64 64 72 20 3d 20 63 6f 64 65       addr = code
13a60 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
13a70 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f  pLeft, pRight, O
13a80 50 5f 4c 74 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  P_Lt, 0, 0, 0,. 
13a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13aa0 20 20 20 20 20 20 20 20 6a 75 6d 70 49 66 4e 75          jumpIfNu
13ab0 6c 6c 20 5e 20 53 51 4c 49 54 45 5f 4a 55 4d 50  ll ^ SQLITE_JUMP
13ac0 49 46 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 20 20  IFNULL);..      
13ad0 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
13ae0 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
13af0 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
13b00 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
13b10 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20   pRight, 0);.   
13b20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
13b30 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52  Parse, pLeft, pR
13b40 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 30 2c 20  ight, OP_Le, 0, 
13b50 30 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  0, dest, jumpIfN
13b60 75 6c 6c 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  ull);..      sql
13b70 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13b80 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
13b90 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
13ba0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
13bb0 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 73  , addr);.      s
13bc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13bd0 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30  (v, OP_Pop, 1, 0
13be0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
13bf0 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
13c00 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t: {.      sqlit
13c10 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
13c20 65 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  e, pExpr, 0);.  
13c30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13c40 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp3(v, OP_If, 
13c50 30 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  0, dest, jumpIfN
13c60 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 62  ull!=0);.      b
13c70 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
13c80 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
13c90 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f  e code for a boo
13ca0 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lean expression 
13cb0 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70  such that a jump
13cc0 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74   is made.** to t
13cd0 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20  he label "dest" 
13ce0 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
13cf0 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74 20 65  n is false but e
13d00 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74  xecution.** cont
13d10 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74  inues straight t
13d20 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65  hru if the expre
13d30 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a  ssion is true..*
13d40 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
13d50 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73  ession evaluates
13d60 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65   to NULL (neithe
13d70 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65  r true nor false
13d80 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69  ) then.** jump i
13d90 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20  f jumpIfNull is 
13da0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
13db0 4c 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67  L or fall throug
13dc0 68 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a  h if jumpIfNull.
13dd0 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64  ** is 0..*/.void
13de0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
13df0 6c 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  lse(Parse *pPars
13e00 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
13e10 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75  int dest, int ju
13e20 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62  mpIfNull){.  Vdb
13e30 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
13e40 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d  Vdbe;.  int op =
13e50 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 75   0;.  assert( ju
13e60 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
13e70 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a  _JUMPIFNULL || j
13e80 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
13e90 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45    if( v==0 || pE
13ea0 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
13eb0 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65  ..  /* The value
13ec0 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e   of pExpr->op an
13ed0 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65 64  d op are related
13ee0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a   as follows:.  *
13ef0 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45 78  *.  **       pEx
13f00 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20  pr->op          
13f10 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20 20    op.  **       
13f20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20  ---------       
13f30 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20     ----------.  
13f40 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e 55  **       TK_ISNU
13f50 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e  LL          OP_N
13f60 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  otNull.  **     
13f70 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20    TK_NOTNULL    
13f80 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20       OP_IsNull. 
13f90 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45 20   **       TK_NE 
13fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
13fb0 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Eq.  **       TK
13fc0 5f 45 51 20 20 20 20 20 20 20 20 20 20 20 20 20  _EQ             
13fd0 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20   OP_Ne.  **     
13fe0 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20 20    TK_GT         
13ff0 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20       OP_Le.  ** 
14000 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20 20        TK_LE     
14010 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a 20           OP_Gt. 
14020 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45 20   **       TK_GE 
14030 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
14040 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Lt.  **       TK
14050 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20  _LT             
14060 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a   OP_Ge.  **.  **
14070 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75 65   For other value
14080 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20  s of pExpr->op, 
14090 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  op is undefined 
140a0 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a  and unused..  **
140b0 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54 4b   The value of TK
140c0 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61  _ and OP_ consta
140d0 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67 65 64  nts are arranged
140e0 20 73 75 63 68 20 74 68 61 74 20 77 65 0a 20 20   such that we.  
140f0 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  ** can compute t
14100 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76 65  he mapping above
14110 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f   using the follo
14120 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 2e  wing expression.
14130 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73 20  .  ** Assert()s 
14140 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
14150 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 63  computation is c
14160 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f  orrect..  */.  o
14170 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b  p = ((pExpr->op+
14180 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31  (TK_ISNULL&1))^1
14190 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b  )-(TK_ISNULL&1);
141a0 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63 6f  ..  /* Verify co
141b0 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20  rrect alignment 
141c0 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63  of TK_ and OP_ c
141d0 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20  onstants.  */.  
141e0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
141f0 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20  p!=TK_ISNULL || 
14200 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  op==OP_NotNull )
14210 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
14220 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c  r->op!=TK_NOTNUL
14230 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75  L || op==OP_IsNu
14240 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
14250 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45  pExpr->op!=TK_NE
14260 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b   || op==OP_Eq );
14270 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
14280 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f  ->op!=TK_EQ || o
14290 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73  p==OP_Ne );.  as
142a0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
142b0 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_LT || op==OP
142c0 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Ge );.  assert(
142d0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c   pExpr->op!=TK_L
142e0 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29  E || op==OP_Gt )
142f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
14300 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20  r->op!=TK_GT || 
14310 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61  op==OP_Le );.  a
14320 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
14330 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_GE || op==O
14340 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74 63  P_Lt );..  switc
14350 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
14360 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
14370 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
14380 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
14390 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
143a0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
143b0 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
143c0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
143d0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
143e0 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
143f0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
14400 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
14410 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20  ase TK_OR: {.   
14420 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69     int d2 = sqli
14430 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
14440 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
14450 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
14460 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
14470 74 2c 20 64 32 2c 20 6a 75 6d 70 49 66 4e 75 6c  t, d2, jumpIfNul
14480 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  l^SQLITE_JUMPIFN
14490 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ULL);.      sqli
144a0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
144b0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
144c0 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
144d0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
144e0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
144f0 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20  eLabel(v, d2);. 
14500 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14510 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  }.    case TK_NO
14520 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
14530 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
14540 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
14550 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
14560 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
14570 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
14580 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
14590 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
145a0 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
145b0 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73  e TK_GE:.    cas
145c0 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
145d0 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20  e TK_EQ: {.     
145e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
145f0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
14600 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20  pLeft, 0);.     
14610 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
14620 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
14630 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20  pRight, 0);.    
14640 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(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 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
14670 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  t, op,.         
14680 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 64           0, 0, d
14690 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
146a0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
146b0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
146c0 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
146d0 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a  e TK_NOTNULL: {.
146e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
146f0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
14700 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a  xpr->pLeft, 0);.
14710 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14720 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 30  eAddOp2(v, op, 0
14730 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62  , dest);.      b
14740 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
14750 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
14760 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   {.      /* The 
14770 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 22 78  expression is "x
14780 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a   BETWEEN y AND z
14790 22 2e 20 49 74 20 69 73 20 69 6d 70 6c 65 6d 65  ". It is impleme
147a0 6e 74 65 64 20 61 73 3a 0a 20 20 20 20 20 20 2a  nted as:.      *
147b0 2a 0a 20 20 20 20 20 20 2a 2a 20 31 20 49 46 20  *.      ** 1 IF 
147c0 28 78 20 3e 3d 20 79 29 20 47 4f 54 4f 20 33 0a  (x >= y) GOTO 3.
147d0 20 20 20 20 20 20 2a 2a 20 32 20 47 4f 54 4f 20        ** 2 GOTO 
147e0 3c 64 65 73 74 3e 0a 20 20 20 20 20 20 2a 2a 20  <dest>.      ** 
147f0 33 20 49 46 20 28 78 20 3e 20 7a 29 20 47 4f 54  3 IF (x > z) GOT
14800 4f 20 3c 64 65 73 74 3e 0a 20 20 20 20 20 20 2a  O <dest>.      *
14810 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
14820 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  ;.      Expr *pL
14830 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
14840 66 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  ft;.      Expr *
14850 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
14860 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
14870 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
14880 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
14890 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20   pLeft, 0);.    
148a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
148b0 4f 70 30 28 76 2c 20 4f 50 5f 43 6f 70 79 29 3b  Op0(v, OP_Copy);
148c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
148d0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
148e0 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20  Right, 0);.     
148f0 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
14900 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
14910 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
14920 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65  pare(pParse, pLe
14930 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 47  ft, pRight, OP_G
14940 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
14950 20 20 20 20 20 30 2c 20 30 2c 20 61 64 64 72 2b       0, 0, addr+
14960 33 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 5e 20  3, jumpIfNull ^ 
14970 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
14980 4c 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  L);..      sqlit
14990 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
149a0 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20  OP_Pop, 1, 0);. 
149b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
149c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
149d0 6f 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20 20  o, 0, dest);.   
149e0 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70     pRight = pExp
149f0 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  r->pList->a[1].p
14a00 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
14a10 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
14a20 73 65 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a  se, pRight, 0);.
14a30 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
14a40 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  e(pParse, pLeft,
14a50 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 74 2c 0a   pRight, OP_Gt,.
14a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a70 20 20 30 2c 20 30 2c 20 64 65 73 74 2c 20 6a 75    0, 0, dest, ju
14a80 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
14a90 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
14aa0 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
14ab0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
14ac0 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
14ad0 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
14ae0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
14af0 20 4f 50 5f 49 66 4e 6f 74 2c 20 30 2c 20 64 65   OP_IfNot, 0, de
14b00 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d  st, jumpIfNull!=
14b10 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
14b20 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
14b30 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f  .** Do a deep co
14b40 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20  mparison of two 
14b50 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
14b60 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 28  .  Return TRUE (
14b70 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a 2a 20 69 66 20  non-zero).** if 
14b80 74 68 65 79 20 61 72 65 20 69 64 65 6e 74 69 63  they are identic
14b90 61 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 46 41  al and return FA
14ba0 4c 53 45 20 69 66 20 74 68 65 79 20 64 69 66 66  LSE if they diff
14bb0 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a  er in any way..*
14bc0 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74  *.** Sometimes t
14bd0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
14be0 20 72 65 74 75 72 6e 20 46 41 4c 53 45 20 65 76   return FALSE ev
14bf0 65 6e 20 69 66 20 74 68 65 20 74 77 6f 20 65 78  en if the two ex
14c00 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 72 65 61  pressions.** rea
14c10 6c 6c 79 20 61 72 65 20 65 71 75 69 76 61 6c 65  lly are equivale
14c20 6e 74 2e 20 20 49 66 20 77 65 20 63 61 6e 6e 6f  nt.  If we canno
14c30 74 20 70 72 6f 76 65 20 74 68 61 74 20 74 68 65  t prove that the
14c40 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
14c50 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 77  .** identical, w
14c60 65 20 72 65 74 75 72 6e 20 46 41 4c 53 45 20 6a  e return FALSE j
14c70 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e 20  ust to be safe. 
14c80 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74   So if this rout
14c90 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 66  ine.** returns f
14ca0 61 6c 73 65 2c 20 74 68 65 6e 20 79 6f 75 20 64  alse, then you d
14cb0 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f  o not really kno
14cc0 77 20 66 6f 72 20 63 65 72 74 61 69 6e 20 69 66  w for certain if
14cd0 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72   the two.** expr
14ce0 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20  essions are the 
14cf0 73 61 6d 65 2e 20 20 42 75 74 20 69 66 20 79 6f  same.  But if yo
14d00 75 20 67 65 74 20 61 20 54 52 55 45 20 72 65 74  u get a TRUE ret
14d10 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a  urn, then you.**
14d20 20 63 61 6e 20 62 65 20 73 75 72 65 20 74 68 65   can be sure the
14d30 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
14d40 20 74 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74   the same.  In t
14d50 68 65 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a  he places where.
14d60 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
14d70 69 73 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73  is used, it does
14d80 20 6e 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74   not hurt to get
14d90 20 61 6e 20 65 78 74 72 61 20 46 41 4c 53 45 20   an extra FALSE 
14da0 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d  - that.** just m
14db0 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 73  ight result in s
14dc0 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f  ome slightly slo
14dd0 77 65 72 20 63 6f 64 65 2e 20 20 42 75 74 20 72  wer code.  But r
14de0 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69  eturning.** an i
14df0 6e 63 6f 72 72 65 63 74 20 54 52 55 45 20 63 6f  ncorrect TRUE co
14e00 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 6d 61  uld lead to a ma
14e10 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  lfunction..*/.in
14e20 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  t sqlite3ExprCom
14e30 70 61 72 65 28 45 78 70 72 20 2a 70 41 2c 20 45  pare(Expr *pA, E
14e40 78 70 72 20 2a 70 42 29 7b 0a 20 20 69 6e 74 20  xpr *pB){.  int 
14e50 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 7c 7c  i;.  if( pA==0||
14e60 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  pB==0 ){.    ret
14e70 75 72 6e 20 70 42 3d 3d 70 41 3b 0a 20 20 7d 0a  urn pB==pA;.  }.
14e80 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42    if( pA->op!=pB
14e90 2d 3e 6f 70 20 29 20 72 65 74 75 72 6e 20 30 3b  ->op ) return 0;
14ea0 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67  .  if( (pA->flag
14eb0 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29  s & EP_Distinct)
14ec0 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20 45  !=(pB->flags & E
14ed0 50 5f 44 69 73 74 69 6e 63 74 29 20 29 20 72 65  P_Distinct) ) re
14ee0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73  turn 0;.  if( !s
14ef0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
14f00 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d  e(pA->pLeft, pB-
14f10 3e 70 4c 65 66 74 29 20 29 20 72 65 74 75 72 6e  >pLeft) ) return
14f20 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   0;.  if( !sqlit
14f30 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41  e3ExprCompare(pA
14f40 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e 70 52  ->pRight, pB->pR
14f50 69 67 68 74 29 20 29 20 72 65 74 75 72 6e 20 30  ight) ) return 0
14f60 3b 0a 20 20 69 66 28 20 70 41 2d 3e 70 4c 69 73  ;.  if( pA->pLis
14f70 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 2d  t ){.    if( pB-
14f80 3e 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75  >pList==0 ) retu
14f90 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70 41  rn 0;.    if( pA
14fa0 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  ->pList->nExpr!=
14fb0 70 42 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pB->pList->nExpr
14fc0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
14fd0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e   for(i=0; i<pA->
14fe0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
14ff0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 73  +){.      if( !s
15000 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
15010 65 28 70 41 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  e(pA->pList->a[i
15020 5d 2e 70 45 78 70 72 2c 20 70 42 2d 3e 70 4c 69  ].pExpr, pB->pLi
15030 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20  st->a[i].pExpr) 
15040 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
15050 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
15060 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70   }.  }else if( p
15070 42 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  B->pList ){.    
15080 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
15090 69 66 28 20 70 41 2d 3e 70 53 65 6c 65 63 74 20  if( pA->pSelect 
150a0 7c 7c 20 70 42 2d 3e 70 53 65 6c 65 63 74 20 29  || pB->pSelect )
150b0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
150c0 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d   pA->iTable!=pB-
150d0 3e 69 54 61 62 6c 65 20 7c 7c 20 70 41 2d 3e 69  >iTable || pA->i
150e0 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c  Column!=pB->iCol
150f0 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  umn ) return 0;.
15100 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b    if( pA->op!=TK
15110 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 74  _COLUMN && pA->t
15120 6f 6b 65 6e 2e 7a 20 29 7b 0a 20 20 20 20 69 66  oken.z ){.    if
15130 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30  ( pB->token.z==0
15140 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
15150 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e   if( pB->token.n
15160 21 3d 70 41 2d 3e 74 6f 6b 65 6e 2e 6e 20 29 20  !=pA->token.n ) 
15170 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66  return 0;.    if
15180 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ( sqlite3StrNICm
15190 70 28 28 63 68 61 72 2a 29 70 41 2d 3e 74 6f 6b  p((char*)pA->tok
151a0 65 6e 2e 7a 2c 28 63 68 61 72 2a 29 70 42 2d 3e  en.z,(char*)pB->
151b0 74 6f 6b 65 6e 2e 7a 2c 70 42 2d 3e 74 6f 6b 65  token.z,pB->toke
151c0 6e 2e 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  n.n)!=0 ){.     
151d0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
151e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
151f0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  .}.../*.** Add a
15200 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
15210 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43  the pAggInfo->aC
15220 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74  ol[] array.  Ret
15230 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
15240 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d  .** the new elem
15250 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e  ent.  Return a n
15260 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69  egative number i
15270 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a  f malloc fails..
15280 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64  */.static int ad
15290 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73  dAggInfoColumn(s
152a0 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49  qlite3 *db, AggI
152b0 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69  nfo *pInfo){.  i
152c0 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61  nt i;.  pInfo->a
152d0 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 41 72 72  Col = sqlite3Arr
152e0 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20  ayAllocate(.    
152f0 20 20 20 64 62 2c 0a 20 20 20 20 20 20 20 70 49     db,.       pI
15300 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20  nfo->aCol,.     
15310 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e    sizeof(pInfo->
15320 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20  aCol[0]),.      
15330 20 33 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66   3,.       &pInf
15340 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  o->nColumn,.    
15350 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75     &pInfo->nColu
15360 6d 6e 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 20  mnAlloc,.       
15370 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e  &i.  );.  return
15380 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a   i;.}    ../*.**
15390 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65   Add a new eleme
153a0 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e  nt to the pAggIn
153b0 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61  fo->aFunc[] arra
153c0 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69  y.  Return the i
153d0 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ndex of.** the n
153e0 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74  ew element.  Ret
153f0 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e  urn a negative n
15400 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20  umber if malloc 
15410 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
15420 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 46   int addAggInfoF
15430 75 6e 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  unc(sqlite3 *db,
15440 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29   AggInfo *pInfo)
15450 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e  {.  int i;.  pIn
15460 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69  fo->aFunc = sqli
15470 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
15480 28 0a 20 20 20 20 20 20 20 64 62 2c 20 0a 20 20  (.       db, .  
15490 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e       pInfo->aFun
154a0 63 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66  c,.       sizeof
154b0 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d  (pInfo->aFunc[0]
154c0 29 2c 0a 20 20 20 20 20 20 20 33 2c 0a 20 20 20  ),.       3,.   
154d0 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e      &pInfo->nFun
154e0 63 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f  c,.       &pInfo
154f0 2d 3e 6e 46 75 6e 63 41 6c 6c 6f 63 2c 0a 20 20  ->nFuncAlloc,.  
15500 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72       &i.  );.  r
15510 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a  eturn i;.}    ..
15520 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e  /*.** This is an
15530 20 78 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b 45   xFunc for walkE
15540 78 70 72 54 72 65 65 28 29 20 75 73 65 64 20 74  xprTree() used t
15550 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 0a 2a 2a 20  o implement .** 
15560 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
15570 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 2e 20  zeAggregates(). 
15580 20 53 65 65 20 73 71 6c 69 74 65 33 45 78 70 72   See sqlite3Expr
15590 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
155a0 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f  s.** for additio
155b0 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
155c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
155d0 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20 74 68 65  ine analyzes the
155e0 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
155f0 69 6f 6e 20 61 74 20 70 45 78 70 72 2e 0a 2a 2f  ion at pExpr..*/
15600 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c  .static int anal
15610 79 7a 65 41 67 67 72 65 67 61 74 65 28 76 6f 69  yzeAggregate(voi
15620 64 20 2a 70 41 72 67 2c 20 45 78 70 72 20 2a 70  d *pArg, Expr *p
15630 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Expr){.  int i;.
15640 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
15650 4e 43 20 3d 20 28 4e 61 6d 65 43 6f 6e 74 65 78  NC = (NameContex
15660 74 20 2a 29 70 41 72 67 3b 0a 20 20 50 61 72 73  t *)pArg;.  Pars
15670 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d  e *pParse = pNC-
15680 3e 70 50 61 72 73 65 3b 0a 20 20 53 72 63 4c 69  >pParse;.  SrcLi
15690 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70  st *pSrcList = p
156a0 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20  NC->pSrcList;.  
156b0 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
156c0 6f 20 3d 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66  o = pNC->pAggInf
156d0 6f 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45  o;..  switch( pE
156e0 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
156f0 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  ase TK_AGG_COLUM
15700 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  N:.    case TK_C
15710 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f  OLUMN: {.      /
15720 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
15730 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  f the column is 
15740 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61  in one of the ta
15750 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  bles in the FROM
15760 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65  .      ** clause
15770 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74   of the aggregat
15780 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20  e query */.     
15790 20 69 66 28 20 70 53 72 63 4c 69 73 74 20 29 7b   if( pSrcList ){
157a0 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
157b0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
157c0 74 65 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e  tem = pSrcList->
157d0 61 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  a;.        for(i
157e0 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e  =0; i<pSrcList->
157f0 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  nSrc; i++, pItem
15800 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
15810 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
15820 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20  l *pCol;.       
15830 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
15840 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75  able==pItem->iCu
15850 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rsor ){.        
15860 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61      /* If we rea
15870 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69  ch this point, i
15880 74 20 6d 65 61 6e 73 20 74 68 61 74 20 70 45 78  t means that pEx
15890 70 72 20 72 65 66 65 72 73 20 74 6f 20 61 20 74  pr refers to a t
158a0 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  able.           
158b0 20 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 20 74   ** that is in t
158c0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
158d0 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
158e0 71 75 65 72 79 2e 20 20 0a 20 20 20 20 20 20 20  query.  .       
158f0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
15900 20 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65      ** Make an e
15910 6e 74 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c  ntry for the col
15920 75 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  umn in pAggInfo-
15930 3e 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65  >aCol[] if there
15940 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
15950 69 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20  is not an entry 
15960 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20  there already.. 
15970 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
15980 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b            int k;
15990 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
159a0 6c 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43  l = pAggInfo->aC
159b0 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol;.            
159c0 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49  for(k=0; k<pAggI
159d0 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b  nfo->nColumn; k+
159e0 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
159f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
15a00 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70  ol->iTable==pExp
15a10 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20  r->iTable &&.   
15a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
15a30 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45  Col->iColumn==pE
15a40 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a  xpr->iColumn ){.
15a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a60 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
15a70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
15a80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
15a90 20 69 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66   if( (k>=pAggInf
15aa0 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20  o->nColumn).    
15ab0 20 20 20 20 20 20 20 20 20 26 26 20 28 6b 20 3d           && (k =
15ac0 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d   addAggInfoColum
15ad0 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41  n(pParse->db, pA
15ae0 67 67 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20  ggInfo))>=0 .   
15af0 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
15b00 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d            pCol =
15b10 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c   &pAggInfo->aCol
15b20 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [k];.           
15b30 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20     pCol->pTab = 
15b40 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20  pExpr->pTab;.   
15b50 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
15b60 3e 69 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d  >iTable = pExpr-
15b70 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  >iTable;.       
15b80 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f         pCol->iCo
15b90 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43  lumn = pExpr->iC
15ba0 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20  olumn;.         
15bb0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20       pCol->iMem 
15bc0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
15bd0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
15be0 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
15bf0 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  umn = -1;.      
15c00 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45          pCol->pE
15c10 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  xpr = pExpr;.   
15c20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
15c30 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42  AggInfo->pGroupB
15c40 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  y ){.           
15c50 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20       int j, n;. 
15c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
15c70 78 70 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70  xprList *pGB = p
15c80 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42  AggInfo->pGroupB
15c90 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y;.             
15ca0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
15cb0 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d  st_item *pTerm =
15cc0 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20   pGB->a;.       
15cd0 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42           n = pGB
15ce0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->nExpr;.       
15cf0 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
15d00 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72  ; j<n; j++, pTer
15d10 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
15d20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
15d30 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
15d40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15d50 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
15d60 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e  K_COLUMN && pE->
15d70 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69  iTable==pExpr->i
15d80 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20  Table &&.       
15d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
15da0 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70  E->iColumn==pExp
15db0 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  r->iColumn ){.  
15dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15dd0 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
15de0 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20  olumn = j;.     
15df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
15e00 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
15e10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15e20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
15e30 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
15e40 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
15e50 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
15e60 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  n<0 ){.         
15e70 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
15e80 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67  rterColumn = pAg
15e90 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43  gInfo->nSortingC
15ea0 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20  olumn++;.       
15eb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15ec0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
15ed0 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e     /* There is n
15ee0 6f 77 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  ow an entry for 
15ef0 70 45 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66  pExpr in pAggInf
15f00 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65  o->aCol[] (eithe
15f10 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  r.            **
15f20 20 62 65 63 61 75 73 65 20 69 74 20 77 61 73 20   because it was 
15f30 74 68 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20  there before or 
15f40 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 20  because we just 
15f50 63 72 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20  created it)..   
15f60 20 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76           ** Conv
15f70 65 72 74 20 74 68 65 20 70 45 78 70 72 20 74 6f  ert the pExpr to
15f80 20 62 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c   be a TK_AGG_COL
15f90 55 4d 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f  UMN referring to
15fa0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20   that.          
15fb0 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61    ** pAggInfo->a
15fc0 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20  Col[] entry..   
15fd0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
15fe0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
15ff0 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e  AggInfo = pAggIn
16000 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  fo;.            
16010 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41  pExpr->op = TK_A
16020 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20  GG_COLUMN;.     
16030 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41         pExpr->iA
16040 67 67 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20  gg = k;.        
16050 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
16060 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20       } /* endif 
16070 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
16080 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f  Item->iCursor */
16090 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e  .        } /* en
160a0 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63  d loop over pSrc
160b0 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  List */.      }.
160c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
160d0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
160e0 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20  K_AGG_FUNCTION: 
160f0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  {.      /* The p
16100 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 74 65  NC->nDepth==0 te
16110 73 74 20 63 61 75 73 65 73 20 61 67 67 72 65 67  st causes aggreg
16120 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e  ate functions in
16130 20 73 75 62 71 75 65 72 69 65 73 0a 20 20 20 20   subqueries.    
16140 20 20 2a 2a 20 74 6f 20 62 65 20 69 67 6e 6f 72    ** to be ignor
16150 65 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ed */.      if( 
16160 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 29  pNC->nDepth==0 )
16170 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65  {.        /* Che
16180 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 45 78  ck to see if pEx
16190 70 72 20 69 73 20 61 20 64 75 70 6c 69 63 61 74  pr is a duplicat
161a0 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67  e of another agg
161b0 72 65 67 61 74 65 20 0a 20 20 20 20 20 20 20 20  regate .        
161c0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  ** function that
161d0 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
161e0 68 65 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75  he pAggInfo stru
161f0 63 74 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f  cture.        */
16200 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
16210 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49  AggInfo_func *pI
16220 74 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  tem = pAggInfo->
16230 61 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66  aFunc;.        f
16240 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  or(i=0; i<pAggIn
16250 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
16260 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
16270 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
16280 78 70 72 43 6f 6d 70 61 72 65 28 70 49 74 65 6d  xprCompare(pItem
16290 2d 3e 70 45 78 70 72 2c 20 70 45 78 70 72 29 20  ->pExpr, pExpr) 
162a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  ){.            b
162b0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
162c0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
162d0 20 20 20 20 69 66 28 20 69 3e 3d 70 41 67 67 49      if( i>=pAggI
162e0 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20  nfo->nFunc ){.  
162f0 20 20 20 20 20 20 20 20 2f 2a 20 70 45 78 70 72          /* pExpr
16300 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d   is original.  M
16310 61 6b 65 20 61 20 6e 65 77 20 65 6e 74 72 79 20  ake a new entry 
16320 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  in pAggInfo->aFu
16330 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a  nc[].          *
16340 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65  /.          u8 e
16350 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d  nc = ENC(pParse-
16360 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >db);.          
16370 69 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 46 75  i = addAggInfoFu
16380 6e 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  nc(pParse->db, p
16390 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
163a0 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a      if( i>=0 ){.
163b0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
163c0 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61  m = &pAggInfo->a
163d0 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20  Func[i];.       
163e0 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70       pItem->pExp
163f0 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  r = pExpr;.     
16400 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d         pItem->iM
16410 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
16420 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Mem;.           
16430 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20   pItem->pFunc = 
16440 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
16450 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a  ion(pParse->db,.
16460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16470 20 20 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d     (char*)pExpr-
16480 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d  >token.z, pExpr-
16490 3e 74 6f 6b 65 6e 2e 6e 2c 0a 20 20 20 20 20 20  >token.n,.      
164a0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
164b0 70 72 2d 3e 70 4c 69 73 74 20 3f 20 70 45 78 70  pr->pList ? pExp
164c0 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  r->pList->nExpr 
164d0 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20  : 0, enc, 0);.  
164e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
164f0 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
16500 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
16510 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
16520 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61  >iDistinct = pPa
16530 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
16540 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
16550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
16560 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  tem->iDistinct =
16570 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20   -1;.           
16580 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
16590 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
165a0 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72 20 70   /* Make pExpr p
165b0 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 70 70 72  oint to the appr
165c0 6f 70 72 69 61 74 65 20 70 41 67 67 49 6e 66 6f  opriate pAggInfo
165d0 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a  ->aFunc[] entry.
165e0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
165f0 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d     pExpr->iAgg =
16600 20 69 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70   i;.        pExp
16610 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41  r->pAggInfo = pA
16620 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  ggInfo;.        
16630 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
16640 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
16650 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 77 61  * Recursively wa
16660 6c 6b 20 73 75 62 71 75 65 72 69 65 73 20 6c 6f  lk subqueries lo
16670 6f 6b 69 6e 67 20 66 6f 72 20 54 4b 5f 43 4f 4c  oking for TK_COL
16680 55 4d 4e 20 6e 6f 64 65 73 20 74 68 61 74 20 6e  UMN nodes that n
16690 65 65 64 0a 20 20 2a 2a 20 74 6f 20 62 65 20 63  eed.  ** to be c
166a0 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f 41 47 47  hanged to TK_AGG
166b0 5f 43 4f 4c 55 4d 4e 2e 20 20 42 75 74 20 69 6e  _COLUMN.  But in
166c0 63 72 65 6d 65 6e 74 20 6e 44 65 70 74 68 20 73  crement nDepth s
166d0 6f 20 74 68 61 74 0a 20 20 2a 2a 20 54 4b 5f 41  o that.  ** TK_A
166e0 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65  GG_FUNCTION node
166f0 73 20 69 6e 20 73 75 62 71 75 65 72 69 65 73 20  s in subqueries 
16700 77 69 6c 6c 20 62 65 20 75 6e 63 68 61 6e 67 65  will be unchange
16710 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45  d..  */.  if( pE
16720 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  xpr->pSelect ){.
16730 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2b      pNC->nDepth+
16740 2b 3b 0a 20 20 20 20 77 61 6c 6b 53 65 6c 65 63  +;.    walkSelec
16750 74 45 78 70 72 28 70 45 78 70 72 2d 3e 70 53 65  tExpr(pExpr->pSe
16760 6c 65 63 74 2c 20 61 6e 61 6c 79 7a 65 41 67 67  lect, analyzeAgg
16770 72 65 67 61 74 65 2c 20 70 4e 43 29 3b 0a 20 20  regate, pNC);.  
16780 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2d 2d 3b    pNC->nDepth--;
16790 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
167a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a  .}../*.** Analyz
167b0 65 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  e the given expr
167c0 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66  ession looking f
167d0 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  or aggregate fun
167e0 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f  ctions and.** fo
167f0 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74  r variables that
16800 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64 65   need to be adde
16810 64 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d  d to the pParse-
16820 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 2e 0a 2a  >aAgg[] array..*
16830 2a 20 4d 61 6b 65 20 61 64 64 69 74 69 6f 6e 61  * Make additiona
16840 6c 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65  l entries to the
16850 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20   pParse->aAgg[] 
16860 61 72 72 61 79 20 61 73 20 6e 65 63 65 73 73 61  array as necessa
16870 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ry..**.** This r
16880 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e  outine should on
16890 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74  ly be called aft
168a0 65 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  er the expressio
168b0 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e  n has been.** an
168c0 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65  alyzed by sqlite
168d0 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
168e0 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 72  s()..**.** If er
168f0 72 6f 72 73 20 61 72 65 20 73 65 65 6e 2c 20 6c  rors are seen, l
16900 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
16910 73 73 61 67 65 20 69 6e 20 7a 45 72 72 4d 73 67  ssage in zErrMsg
16920 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 74   and return.** t
16930 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
16940 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ors..*/.int sqli
16950 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
16960 67 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e  gregates(NameCon
16970 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20  text *pNC, Expr 
16980 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 6e  *pExpr){.  int n
16990 45 72 72 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  Err = pNC->pPars
169a0 65 2d 3e 6e 45 72 72 3b 0a 20 20 77 61 6c 6b 45  e->nErr;.  walkE
169b0 78 70 72 54 72 65 65 28 70 45 78 70 72 2c 20 61  xprTree(pExpr, a
169c0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 2c  nalyzeAggregate,
169d0 20 70 4e 43 29 3b 0a 20 20 72 65 74 75 72 6e 20   pNC);.  return 
169e0 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 6e 45 72  pNC->pParse->nEr
169f0 72 20 2d 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a  r - nErr;.}../*.
16a00 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 45  ** Call sqlite3E
16a10 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
16a20 61 74 65 73 28 29 20 66 6f 72 20 65 76 65 72 79  ates() for every
16a30 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61   expression in a
16a40 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
16a50 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 68  list.  Return th
16a60 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
16a70 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  rs..**.** If an 
16a80 65 72 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20  error is found, 
16a90 74 68 65 20 61 6e 61 6c 79 73 69 73 20 69 73 20  the analysis is 
16aa0 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 69 6e  cut short..*/.in
16ab0 74 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  t sqlite3ExprAna
16ac0 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d 65  lyzeAggList(Name
16ad0 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78  Context *pNC, Ex
16ae0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
16af0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
16b00 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
16b10 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 45   int i;.  int nE
16b20 72 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4c  rr = 0;.  if( pL
16b30 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 70  ist ){.    for(p
16b40 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
16b50 3d 30 3b 20 6e 45 72 72 3d 3d 30 20 26 26 20 69  =0; nErr==0 && i
16b60 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
16b70 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
16b80 20 20 20 20 6e 45 72 72 20 2b 3d 20 73 71 6c 69      nErr += sqli
16b90 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
16ba0 67 72 65 67 61 74 65 73 28 70 4e 43 2c 20 70 49  gregates(pNC, pI
16bb0 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
16bc0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
16bd0 6e 45 72 72 3b 0a 7d 0a                          nErr;.}.