/ Hex Artifact Content
Login

Artifact 11e9a05c4eb60789cd6f1b056d1b7039ec3512c8:


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 36 32 20 32 30 30 38 2f 30 34 2f 30 31 20  .362 2008/04/01 
0220: 30 35 3a 30 37 3a 31 35 20 64 72 68 20 45 78 70  05:07:15 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 74 68  *.** Generate th
17c0: 65 20 6f 70 65 72 61 6e 64 73 20 66 6f 72 20 61  e operands for a
17d0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
17e0: 61 74 69 6f 6e 2e 20 20 42 65 66 6f 72 65 0a 2a  ation.  Before.*
17f0: 2a 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65  * generating the
1800: 20 63 6f 64 65 20 66 6f 72 20 65 61 63 68 20 6f   code for each o
1810: 70 65 72 61 6e 64 2c 20 73 65 74 20 74 68 65 20  perand, set the 
1820: 45 50 5f 41 6e 79 41 66 66 0a 2a 2a 20 66 6c 61  EP_AnyAff.** fla
1830: 67 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  g on the express
1840: 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 74 20 77  ion so that it w
1850: 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f 20 75  ill be able to u
1860: 73 65 64 20 61 0a 2a 2a 20 63 61 63 68 65 64 20  sed a.** cached 
1870: 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 74 68 61  column value tha
1880: 74 20 68 61 73 20 70 72 65 76 69 6f 75 73 6c 79  t has previously
1890: 20 75 6e 64 65 72 67 6f 6e 65 20 61 6e 0a 2a 2a   undergone an.**
18a0: 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65   affinity change
18b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
18c0: 20 63 6f 64 65 43 6f 6d 70 61 72 65 4f 70 65 72   codeCompareOper
18d0: 61 6e 64 73 28 0a 20 20 50 61 72 73 65 20 2a 70  ands(.  Parse *p
18e0: 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
18f0: 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
1900: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
1910: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66   */.  Expr *pLef
1920: 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c  t,      /* The l
1930: 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  eft operand */. 
1940: 20 69 6e 74 20 2a 70 52 65 67 4c 65 66 74 2c 20   int *pRegLeft, 
1950: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 77     /* Register w
1960: 68 65 72 65 20 6c 65 66 74 20 6f 70 65 72 61 6e  here left operan
1970: 64 20 69 73 20 73 74 6f 72 65 64 20 2a 2f 0a 20  d is stored */. 
1980: 20 69 6e 74 20 2a 70 46 72 65 65 4c 65 66 74 2c   int *pFreeLeft,
1990: 20 20 20 2f 2a 20 46 72 65 65 20 74 68 69 73 20     /* Free this 
19a0: 72 65 67 69 73 74 65 72 20 77 68 65 6e 20 64 6f  register when do
19b0: 6e 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52  ne */.  Expr *pR
19c0: 69 67 68 74 2c 20 20 20 20 20 2f 2a 20 54 68 65  ight,     /* The
19d0: 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a   right operand *
19e0: 2f 0a 20 20 69 6e 74 20 2a 70 52 65 67 52 69 67  /.  int *pRegRig
19f0: 68 74 2c 20 20 20 2f 2a 20 52 65 67 69 73 74 65  ht,   /* Registe
1a00: 72 20 77 68 65 72 65 20 72 69 67 68 74 20 6f 70  r where right op
1a10: 65 72 61 6e 64 20 69 73 20 73 74 6f 72 65 64 20  erand is stored 
1a20: 2a 2f 0a 20 20 69 6e 74 20 2a 70 46 72 65 65 52  */.  int *pFreeR
1a30: 69 67 68 74 20 20 20 2f 2a 20 57 72 69 74 65 20  ight   /* Write 
1a40: 74 65 6d 70 20 72 65 67 69 73 74 65 72 20 66 6f  temp register fo
1a50: 72 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  r right operand 
1a60: 74 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 77 68  there */.){.  wh
1a70: 69 6c 65 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d  ile( pLeft->op==
1a80: 54 4b 5f 55 50 4c 55 53 20 29 20 70 4c 65 66 74  TK_UPLUS ) pLeft
1a90: 20 3d 20 70 4c 65 66 74 2d 3e 70 4c 65 66 74 3b   = pLeft->pLeft;
1aa0: 0a 20 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20  .  pLeft->flags 
1ab0: 7c 3d 20 45 50 5f 41 6e 79 41 66 66 3b 0a 20 20  |= EP_AnyAff;.  
1ac0: 2a 70 52 65 67 4c 65 66 74 20 3d 20 73 71 6c 69  *pRegLeft = sqli
1ad0: 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1ae0: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
1af0: 46 72 65 65 4c 65 66 74 29 3b 0a 20 20 77 68 69  FreeLeft);.  whi
1b00: 6c 65 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d  le( pRight->op==
1b10: 54 4b 5f 55 50 4c 55 53 20 29 20 70 52 69 67 68  TK_UPLUS ) pRigh
1b20: 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 4c 65 66  t = pRight->pLef
1b30: 74 3b 0a 20 20 70 52 69 67 68 74 2d 3e 66 6c 61  t;.  pRight->fla
1b40: 67 73 20 7c 3d 20 45 50 5f 41 6e 79 41 66 66 3b  gs |= EP_AnyAff;
1b50: 0a 20 20 2a 70 52 65 67 52 69 67 68 74 20 3d 20  .  *pRegRight = 
1b60: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1b70: 65 6d 70 28 70 50 61 72 73 65 2c 20 70 52 69 67  emp(pParse, pRig
1b80: 68 74 2c 20 70 46 72 65 65 52 69 67 68 74 29 3b  ht, pFreeRight);
1b90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1ba0: 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f  te code for a co
1bb0: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
1bc0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
1bd0: 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 0a 20 20   codeCompare(.  
1be0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1bf0: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
1c00: 20 28 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72   (and code gener
1c10: 61 74 69 6e 67 29 20 63 6f 6e 74 65 78 74 20 2a  ating) context *
1c20: 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c  /.  Expr *pLeft,
1c30: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66        /* The lef
1c40: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45  t operand */.  E
1c50: 78 70 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20  xpr *pRight,    
1c60: 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20 6f 70   /* The right op
1c70: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  erand */.  int o
1c80: 70 63 6f 64 65 2c 20 20 20 20 20 20 20 2f 2a 20  pcode,       /* 
1c90: 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  The comparison o
1ca0: 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69  pcode */.  int i
1cb0: 6e 31 2c 20 69 6e 74 20 69 6e 32 2c 20 2f 2a 20  n1, int in2, /* 
1cc0: 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
1cd0: 20 6f 70 65 72 61 6e 64 73 20 2a 2f 0a 20 20 69   operands */.  i
1ce0: 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20 20 20  nt dest,        
1cf0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
1d00: 20 74 72 75 65 2e 20 20 2a 2f 0a 20 20 69 6e 74   true.  */.  int
1d10: 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f   jumpIfNull    /
1d20: 2a 20 49 66 20 74 72 75 65 2c 20 6a 75 6d 70 20  * If true, jump 
1d30: 69 66 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e  if either operan
1d40: 64 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  d is NULL */.){.
1d50: 20 20 69 6e 74 20 70 35 3b 0a 20 20 69 6e 74 20    int p5;.  int 
1d60: 61 64 64 72 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  addr;.  CollSeq 
1d70: 2a 70 34 3b 0a 0a 20 20 70 34 20 3d 20 73 71 6c  *p4;..  p4 = sql
1d80: 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
1d90: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
1da0: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b   pLeft, pRight);
1db0: 0a 20 20 70 35 20 3d 20 62 69 6e 61 72 79 43 6f  .  p5 = binaryCo
1dc0: 6d 70 61 72 65 50 35 28 70 4c 65 66 74 2c 20 70  mpareP5(pLeft, p
1dd0: 52 69 67 68 74 2c 20 6a 75 6d 70 49 66 4e 75 6c  Right, jumpIfNul
1de0: 6c 29 3b 0a 20 20 61 64 64 72 20 3d 20 73 71 6c  l);.  addr = sql
1df0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 70  ite3VdbeAddOp4(p
1e00: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 6f 70  Parse->pVdbe, op
1e10: 63 6f 64 65 2c 20 69 6e 32 2c 20 64 65 73 74 2c  code, in2, dest,
1e20: 20 69 6e 31 2c 0a 20 20 20 20 20 20 20 20 20 20   in1,.          
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e40: 20 28 76 6f 69 64 2a 29 70 34 2c 20 50 34 5f 43   (void*)p4, P4_C
1e50: 4f 4c 4c 53 45 51 29 3b 0a 20 20 73 71 6c 69 74  OLLSEQ);.  sqlit
1e60: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 70  e3VdbeChangeP5(p
1e70: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 35  Parse->pVdbe, p5
1e80: 29 3b 0a 20 20 69 66 28 20 70 35 20 26 20 53 51  );.  if( p5 & SQ
1e90: 4c 49 54 45 5f 41 46 46 5f 4d 41 53 4b 20 29 7b  LITE_AFF_MASK ){
1ea0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1eb0: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
1ec0: 6e 67 65 28 70 50 61 72 73 65 2c 20 69 6e 31 2c  nge(pParse, in1,
1ed0: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
1ee0: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
1ef0: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
1f00: 69 6e 32 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72  in2, 1);.  }.  r
1f10: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
1f20: 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61  *.** Construct a
1f30: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
1f40: 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e 20  node and return 
1f50: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e  a pointer to it.
1f60: 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20    Memory.** for 
1f70: 74 68 69 73 20 6e 6f 64 65 20 69 73 20 6f 62 74  this node is obt
1f80: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
1f90: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 20 20 54 68  e3_malloc().  Th
1fa0: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
1fb0: 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73  on.** is respons
1fc0: 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20  ible for making 
1fd0: 73 75 72 65 20 74 68 65 20 6e 6f 64 65 20 65 76  sure the node ev
1fe0: 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20 66 72  entually gets fr
1ff0: 65 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  eed..*/.Expr *sq
2000: 6c 69 74 65 33 45 78 70 72 28 0a 20 20 73 71 6c  lite3Expr(.  sql
2010: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
2020: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66       /* Handle f
2030: 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  or sqlite3DbMall
2040: 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65  ocZero() (may be
2050: 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20   null) */.  int 
2060: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
2070: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
2080: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78  n opcode */.  Ex
2090: 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20  pr *pLeft,      
20a0: 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70        /* Left op
20b0: 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20  erand */.  Expr 
20c0: 2a 70 52 69 67 68 74 2c 20 20 20 20 20 20 20 20  *pRight,        
20d0: 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65 72     /* Right oper
20e0: 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54  and */.  const T
20f0: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 20 20 20  oken *pToken    
2100: 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 6b   /* Argument tok
2110: 65 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20  en */.){.  Expr 
2120: 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20  *pNew;.  pNew = 
2130: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
2140: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 45  ero(db, sizeof(E
2150: 78 70 72 29 29 3b 0a 20 20 69 66 28 20 70 4e 65  xpr));.  if( pNe
2160: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57  w==0 ){.    /* W
2170: 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73  hen malloc fails
2180: 2c 20 64 65 6c 65 74 65 20 70 4c 65 66 74 20 61  , delete pLeft a
2190: 6e 64 20 70 52 69 67 68 74 2e 20 45 78 70 72 65  nd pRight. Expre
21a0: 73 73 69 6f 6e 73 20 70 61 73 73 65 64 20 74 6f  ssions passed to
21b0: 20 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 66 75   .    ** this fu
21c0: 6e 63 74 69 6f 6e 20 6d 75 73 74 20 61 6c 77 61  nction must alwa
21d0: 79 73 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20  ys be allocated 
21e0: 77 69 74 68 20 73 71 6c 69 74 65 33 45 78 70 72  with sqlite3Expr
21f0: 28 29 20 66 6f 72 20 74 68 69 73 20 0a 20 20 20  () for this .   
2200: 20 2a 2a 20 72 65 61 73 6f 6e 2e 20 0a 20 20 20   ** reason. .   
2210: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
2220: 78 70 72 44 65 6c 65 74 65 28 70 4c 65 66 74 29  xprDelete(pLeft)
2230: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2240: 72 44 65 6c 65 74 65 28 70 52 69 67 68 74 29 3b  rDelete(pRight);
2250: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2260: 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20   }.  pNew->op = 
2270: 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65 66  op;.  pNew->pLef
2280: 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 70 4e 65  t = pLeft;.  pNe
2290: 77 2d 3e 70 52 69 67 68 74 20 3d 20 70 52 69 67  w->pRight = pRig
22a0: 68 74 3b 0a 20 20 70 4e 65 77 2d 3e 69 41 67 67  ht;.  pNew->iAgg
22b0: 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 54 6f   = -1;.  if( pTo
22c0: 6b 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ken ){.    asser
22d0: 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e 3d 3d  t( pToken->dyn==
22e0: 30 20 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 73  0 );.    pNew->s
22f0: 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b 65  pan = pNew->toke
2300: 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 7d  n = *pToken;.  }
2310: 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74 20 29  else if( pLeft )
2320: 7b 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  {.    if( pRight
2330: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2340: 33 45 78 70 72 53 70 61 6e 28 70 4e 65 77 2c 20  3ExprSpan(pNew, 
2350: 26 70 4c 65 66 74 2d 3e 73 70 61 6e 2c 20 26 70  &pLeft->span, &p
2360: 52 69 67 68 74 2d 3e 73 70 61 6e 29 3b 0a 20 20  Right->span);.  
2370: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
2380: 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f  flags & EP_ExpCo
2390: 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20  llate ){.       
23a0: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
23b0: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20  EP_ExpCollate;. 
23c0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 43 6f         pNew->pCo
23d0: 6c 6c 20 3d 20 70 52 69 67 68 74 2d 3e 70 43 6f  ll = pRight->pCo
23e0: 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
23f0: 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d  }.    if( pLeft-
2400: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
2410: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20  ollate ){.      
2420: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  pNew->flags |= E
2430: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20  P_ExpCollate;.  
2440: 20 20 20 20 70 4e 65 77 2d 3e 70 43 6f 6c 6c 20      pNew->pColl 
2450: 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a  = pLeft->pColl;.
2460: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c      }.  }..  sql
2470: 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68  ite3ExprSetHeigh
2480: 74 28 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72  t(pNew);.  retur
2490: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
24a0: 20 57 6f 72 6b 73 20 6c 69 6b 65 20 73 71 6c 69   Works like sqli
24b0: 74 65 33 45 78 70 72 28 29 20 65 78 63 65 70 74  te3Expr() except
24c0: 20 74 68 61 74 20 69 74 20 74 61 6b 65 73 20 61   that it takes a
24d0: 6e 20 65 78 74 72 61 20 50 61 72 73 65 2a 0a 2a  n extra Parse*.*
24e0: 2a 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 6e  * argument and n
24f0: 6f 74 69 66 69 65 73 20 74 68 65 20 61 73 73 6f  otifies the asso
2500: 63 69 61 74 65 64 20 63 6f 6e 6e 65 63 74 69 6f  ciated connectio
2510: 6e 20 6f 62 6a 65 63 74 20 69 66 20 6d 61 6c 6c  n object if mall
2520: 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 45 78 70  oc fails..*/.Exp
2530: 72 20 2a 73 71 6c 69 74 65 33 50 45 78 70 72 28  r *sqlite3PExpr(
2540: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2550: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
2560: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
2570: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
2580: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
2590: 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20  pression opcode 
25a0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74  */.  Expr *pLeft
25b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
25c0: 4c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  Left operand */.
25d0: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20    Expr *pRight, 
25e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67            /* Rig
25f0: 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  ht operand */.  
2600: 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f  const Token *pTo
2610: 6b 65 6e 20 20 20 20 20 2f 2a 20 41 72 67 75 6d  ken     /* Argum
2620: 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a  ent token */.){.
2630: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2640: 45 78 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c  Expr(pParse->db,
2650: 20 6f 70 2c 20 70 4c 65 66 74 2c 20 70 52 69 67   op, pLeft, pRig
2660: 68 74 2c 20 70 54 6f 6b 65 6e 29 3b 0a 7d 0a 0a  ht, pToken);.}..
2670: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64 6f 69 6e 67  /*.** When doing
2680: 20 61 20 6e 65 73 74 65 64 20 70 61 72 73 65 2c   a nested parse,
2690: 20 79 6f 75 20 63 61 6e 20 69 6e 63 6c 75 64 65   you can include
26a0: 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 65 78 70   terms in an exp
26b0: 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 68 61 74 20  ression.** that 
26c0: 6c 6f 6f 6b 20 6c 69 6b 65 20 74 68 69 73 3a 20  look like this: 
26d0: 20 20 23 31 20 23 32 20 2e 2e 2e 20 20 54 68 65    #1 #2 ...  The
26e0: 73 65 20 74 65 72 6d 73 20 72 65 66 65 72 20 74  se terms refer t
26f0: 6f 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 69  o registers.** i
2700: 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  n the virtual ma
2710: 63 68 69 6e 65 2e 20 20 23 4e 20 69 73 20 74 68  chine.  #N is th
2720: 65 20 4e 2d 74 68 20 72 65 67 69 73 74 65 72 2e  e N-th register.
2730: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2740: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
2750: 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 64   the parser to d
2760: 65 61 6c 20 77 69 74 68 20 6f 6e 20 6f 66 20 74  eal with on of t
2770: 68 6f 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 49  hose terms..** I
2780: 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 67 65  t immediately ge
2790: 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20  nerates code to 
27a0: 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20  store the value 
27b0: 69 6e 20 61 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  in a memory loca
27c0: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 72 65 74  tion..** The ret
27d0: 75 72 6e 73 20 61 6e 20 65 78 70 72 65 73 73 69  urns an expressi
27e0: 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 63 6f 64  on that will cod
27f0: 65 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65  e to extract the
2800: 20 76 61 6c 75 65 20 66 72 6f 6d 0a 2a 2a 20 74   value from.** t
2810: 68 61 74 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  hat memory locat
2820: 69 6f 6e 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a  ion as needed..*
2830: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 52  /.Expr *sqlite3R
2840: 65 67 69 73 74 65 72 45 78 70 72 28 50 61 72 73  egisterExpr(Pars
2850: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
2860: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 56 64 62   *pToken){.  Vdb
2870: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
2880: 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70 3b  Vdbe;.  Expr *p;
2890: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
28a0: 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ested==0 ){.    
28b0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
28c0: 70 50 61 72 73 65 2c 20 22 6e 65 61 72 20 5c 22  pParse, "near \"
28d0: 25 54 5c 22 3a 20 73 79 6e 74 61 78 20 65 72 72  %T\": syntax err
28e0: 6f 72 22 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20  or", pToken);.  
28f0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2900: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
2910: 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20 30 29 3b  _NULL, 0, 0, 0);
2920: 0a 20 20 7d 0a 20 20 69 66 28 20 76 3d 3d 30 20  .  }.  if( v==0 
2930: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 20  ) return 0;.  p 
2940: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
2950: 50 61 72 73 65 2c 20 54 4b 5f 52 45 47 49 53 54  Parse, TK_REGIST
2960: 45 52 2c 20 30 2c 20 30 2c 20 70 54 6f 6b 65 6e  ER, 0, 0, pToken
2970: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  );.  if( p==0 ){
2980: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
2990: 2f 2a 20 4d 61 6c 6c 6f 63 20 66 61 69 6c 65 64  /* Malloc failed
29a0: 20 2a 2f 0a 20 20 7d 0a 20 20 70 2d 3e 69 54 61   */.  }.  p->iTa
29b0: 62 6c 65 20 3d 20 61 74 6f 69 28 28 63 68 61 72  ble = atoi((char
29c0: 2a 29 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d 29  *)&pToken->z[1])
29d0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  ;.  return p;.}.
29e0: 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f 20  ./*.** Join two 
29f0: 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73 69 6e  expressions usin
2a00: 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  g an AND operato
2a10: 72 2e 20 20 49 66 20 65 69 74 68 65 72 20 65 78  r.  If either ex
2a20: 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 4e  pression is.** N
2a30: 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74 20 72  ULL, then just r
2a40: 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65 72 20  eturn the other 
2a50: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 45  expression..*/.E
2a60: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
2a70: 41 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  And(sqlite3 *db,
2a80: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78   Expr *pLeft, Ex
2a90: 70 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69  pr *pRight){.  i
2aa0: 66 28 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20  f( pLeft==0 ){. 
2ab0: 20 20 20 72 65 74 75 72 6e 20 70 52 69 67 68 74     return pRight
2ac0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52  ;.  }else if( pR
2ad0: 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ight==0 ){.    r
2ae0: 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d  eturn pLeft;.  }
2af0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
2b00: 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
2b10: 20 54 4b 5f 41 4e 44 2c 20 70 4c 65 66 74 2c 20   TK_AND, pLeft, 
2b20: 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 7d 0a  pRight, 0);.  }.
2b30: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
2b40: 20 45 78 70 72 2e 73 70 61 6e 20 66 69 65 6c 64   Expr.span field
2b50: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   of the given ex
2b60: 70 72 65 73 73 69 6f 6e 20 74 6f 20 73 70 61 6e  pression to span
2b70: 20 61 6c 6c 0a 2a 2a 20 74 65 78 74 20 62 65 74   all.** text bet
2b80: 77 65 65 6e 20 74 68 65 20 74 77 6f 20 67 69 76  ween the two giv
2b90: 65 6e 20 74 6f 6b 65 6e 73 2e 0a 2a 2f 0a 76 6f  en tokens..*/.vo
2ba0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53 70  id sqlite3ExprSp
2bb0: 61 6e 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20  an(Expr *pExpr, 
2bc0: 54 6f 6b 65 6e 20 2a 70 4c 65 66 74 2c 20 54 6f  Token *pLeft, To
2bd0: 6b 65 6e 20 2a 70 52 69 67 68 74 29 7b 0a 20 20  ken *pRight){.  
2be0: 61 73 73 65 72 74 28 20 70 52 69 67 68 74 21 3d  assert( pRight!=
2bf0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
2c00: 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 69 66 28  Left!=0 );.  if(
2c10: 20 70 45 78 70 72 20 26 26 20 70 52 69 67 68 74   pExpr && pRight
2c20: 2d 3e 7a 20 26 26 20 70 4c 65 66 74 2d 3e 7a 20  ->z && pLeft->z 
2c30: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2c40: 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30 20 7c 7c 20  Left->dyn==0 || 
2c50: 70 4c 65 66 74 2d 3e 7a 5b 70 4c 65 66 74 2d 3e  pLeft->z[pLeft->
2c60: 6e 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  n]==0 );.    if(
2c70: 20 70 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30 20 26   pLeft->dyn==0 &
2c80: 26 20 70 52 69 67 68 74 2d 3e 64 79 6e 3d 3d 30  & pRight->dyn==0
2c90: 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   ){.      pExpr-
2ca0: 3e 73 70 61 6e 2e 7a 20 3d 20 70 4c 65 66 74 2d  >span.z = pLeft-
2cb0: 3e 7a 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  >z;.      pExpr-
2cc0: 3e 73 70 61 6e 2e 6e 20 3d 20 70 52 69 67 68 74  >span.n = pRight
2cd0: 2d 3e 6e 20 2b 20 28 70 52 69 67 68 74 2d 3e 7a  ->n + (pRight->z
2ce0: 20 2d 20 70 4c 65 66 74 2d 3e 7a 29 3b 0a 20 20   - pLeft->z);.  
2cf0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
2d00: 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 20 3d 20 30  Expr->span.z = 0
2d10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
2d20: 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61  *.** Construct a
2d30: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
2d40: 6e 6f 64 65 20 66 6f 72 20 61 20 66 75 6e 63 74  node for a funct
2d50: 69 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69 70 6c  ion with multipl
2d60: 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a  e.** arguments..
2d70: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
2d80: 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 50 61 72  ExprFunction(Par
2d90: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
2da0: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b  List *pList, Tok
2db0: 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45  en *pToken){.  E
2dc0: 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 61 73 73  xpr *pNew;.  ass
2dd0: 65 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b 0a 20  ert( pToken );. 
2de0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
2df0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72  bMallocZero(pPar
2e00: 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 45  se->db, sizeof(E
2e10: 78 70 72 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  xpr) );.  if( pN
2e20: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ew==0 ){.    sql
2e30: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
2e40: 74 65 28 70 4c 69 73 74 29 3b 20 2f 2a 20 41 76  te(pList); /* Av
2e50: 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f  oid leaking memo
2e60: 72 79 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20 66  ry when malloc f
2e70: 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74 75  ails */.    retu
2e80: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77  rn 0;.  }.  pNew
2e90: 2d 3e 6f 70 20 3d 20 54 4b 5f 46 55 4e 43 54 49  ->op = TK_FUNCTI
2ea0: 4f 4e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 73  ON;.  pNew->pLis
2eb0: 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73 73  t = pList;.  ass
2ec0: 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e  ert( pToken->dyn
2ed0: 3d 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 74  ==0 );.  pNew->t
2ee0: 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a  oken = *pToken;.
2ef0: 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20 70    pNew->span = p
2f00: 4e 65 77 2d 3e 74 6f 6b 65 6e 3b 0a 0a 20 20 73  New->token;..  s
2f10: 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69  qlite3ExprSetHei
2f20: 67 68 74 28 70 4e 65 77 29 3b 0a 20 20 72 65 74  ght(pNew);.  ret
2f30: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
2f40: 2a 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72 69  ** Assign a vari
2f50: 61 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20 61  able number to a
2f60: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  n expression tha
2f70: 74 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c 64  t encodes a wild
2f80: 63 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f  card.** in the o
2f90: 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74  riginal SQL stat
2fa0: 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57  ement.  .**.** W
2fb0: 69 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73 74  ildcards consist
2fc0: 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ing of a single 
2fd0: 22 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65 64  "?" are assigned
2fe0: 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e   the next sequen
2ff0: 74 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65  tial.** variable
3000: 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57   number..**.** W
3010: 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20  ildcards of the 
3020: 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20  form "?nnn" are 
3030: 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75 6d  assigned the num
3040: 62 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d  ber "nnn".  We m
3050: 61 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e  ake.** sure "nnn
3060: 22 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65 20  " is not too be 
3070: 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69 61  to avoid a denia
3080: 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61 74 74  l of service att
3090: 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ack when.** the 
30a0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63 6f  SQL statement co
30b0: 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74 65  mes from an exte
30c0: 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a  rnal source..**.
30d0: 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20  ** Wildcards of 
30e0: 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 20  the form ":aaa" 
30f0: 6f 72 20 22 24 61 61 61 22 20 61 72 65 20 61 73  or "$aaa" are as
3100: 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d 65 20  signed the same 
3110: 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68 65  number.** as the
3120: 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61 6e   previous instan
3130: 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 77  ce of the same w
3140: 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69 66 20  ildcard.  Or if 
3150: 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
3160: 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66  t.** instance of
3170: 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c 20 74   the wildcard, t
3180: 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 69 61  he next sequenia
3190: 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  l variable numbe
31a0: 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65 64  r is.** assigned
31b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
31c0: 33 45 78 70 72 41 73 73 69 67 6e 56 61 72 4e 75  3ExprAssignVarNu
31d0: 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50 61 72  mber(Parse *pPar
31e0: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
31f0: 7b 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  {.  Token *pToke
3200: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  n;.  sqlite3 *db
3210: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
3220: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
3230: 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 6f 6b 65   return;.  pToke
3240: 6e 20 3d 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65  n = &pExpr->toke
3250: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f  n;.  assert( pTo
3260: 6b 65 6e 2d 3e 6e 3e 3d 31 20 29 3b 0a 20 20 61  ken->n>=1 );.  a
3270: 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a  ssert( pToken->z
3280: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
3290: 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 21 3d 30   pToken->z[0]!=0
32a0: 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e   );.  if( pToken
32b0: 2d 3e 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a  ->n==1 ){.    /*
32c0: 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65   Wildcard of the
32d0: 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73 69   form "?".  Assi
32e0: 67 6e 20 74 68 65 20 6e 65 78 74 20 76 61 72 69  gn the next vari
32f0: 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  able number */. 
3300: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
3310: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61   = ++pParse->nVa
3320: 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  r;.  }else if( p
3330: 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 3f 27  Token->z[0]=='?'
3340: 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63   ){.    /* Wildc
3350: 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ard of the form 
3360: 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74  "?nnn".  Convert
3370: 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74   "nnn" to an int
3380: 65 67 65 72 20 61 6e 64 0a 20 20 20 20 2a 2a 20  eger and.    ** 
3390: 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76 61  use it as the va
33a0: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f  riable number */
33b0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
33c0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
33d0: 69 20 3d 20 61 74 6f 69 28 28 63 68 61 72 2a 29  i = atoi((char*)
33e0: 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d 29 3b 0a  &pToken->z[1]);.
33f0: 20 20 20 20 69 66 28 20 69 3c 31 20 7c 7c 20 69      if( i<1 || i
3400: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
3410: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
3420: 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20  E_NUMBER] ){.   
3430: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
3440: 73 67 28 70 50 61 72 73 65 2c 20 22 76 61 72 69  sg(pParse, "vari
3450: 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74  able number must
3460: 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61   be between ?1 a
3470: 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20  nd ?%d",.       
3480: 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51     db->aLimit[SQ
3490: 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
34a0: 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a 20 20  BLE_NUMBER]);.  
34b0: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 70 50    }.    if( i>pP
34c0: 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a 20 20  arse->nVar ){.  
34d0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72      pParse->nVar
34e0: 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = i;.    }.  }e
34f0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64  lse{.    /* Wild
3500: 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72  cards of the for
3510: 6d 20 22 3a 61 61 61 22 20 6f 72 20 22 24 61 61  m ":aaa" or "$aa
3520: 61 22 2e 20 20 52 65 75 73 65 20 74 68 65 20 73  a".  Reuse the s
3530: 61 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20 20  ame variable.   
3540: 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20 74 68   ** number as th
3550: 65 20 70 72 69 6f 72 20 61 70 70 65 61 72 61 6e  e prior appearan
3560: 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e  ce of the same n
3570: 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65 20 6e  ame, or if the n
3580: 61 6d 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e  ame.    ** has n
3590: 65 76 65 72 20 61 70 70 65 61 72 65 64 20 62 65  ever appeared be
35a0: 66 6f 72 65 2c 20 72 65 75 73 65 20 74 68 65 20  fore, reuse the 
35b0: 73 61 6d 65 20 76 61 72 69 61 62 6c 65 20 6e 75  same variable nu
35c0: 6d 62 65 72 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mber.    */.    
35d0: 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 20 20 6e 20  int i, n;.    n 
35e0: 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 3b 0a 20 20 20  = pToken->n;.   
35f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72   for(i=0; i<pPar
3600: 73 65 2d 3e 6e 56 61 72 45 78 70 72 3b 20 69 2b  se->nVarExpr; i+
3610: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
3620: 70 45 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  pE;.      if( (p
3630: 45 20 3d 20 70 50 61 72 73 65 2d 3e 61 70 56 61  E = pParse->apVa
3640: 72 45 78 70 72 5b 69 5d 29 21 3d 30 0a 20 20 20  rExpr[i])!=0.   
3650: 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e 74 6f         && pE->to
3660: 6b 65 6e 2e 6e 3d 3d 6e 0a 20 20 20 20 20 20 20  ken.n==n.       
3670: 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 45 2d     && memcmp(pE-
3680: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 54 6f 6b 65 6e  >token.z, pToken
3690: 2d 3e 7a 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ->z, n)==0 ){.  
36a0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
36b0: 62 6c 65 20 3d 20 70 45 2d 3e 69 54 61 62 6c 65  ble = pE->iTable
36c0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
36d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
36e0: 20 20 20 69 66 28 20 69 3e 3d 70 50 61 72 73 65     if( i>=pParse
36f0: 2d 3e 6e 56 61 72 45 78 70 72 20 29 7b 0a 20 20  ->nVarExpr ){.  
3700: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
3710: 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 56  e = ++pParse->nV
3720: 61 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  ar;.      if( pP
3730: 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 3e 3d  arse->nVarExpr>=
3740: 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72  pParse->nVarExpr
3750: 41 6c 6c 6f 63 2d 31 20 29 7b 0a 20 20 20 20 20  Alloc-1 ){.     
3760: 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45     pParse->nVarE
3770: 78 70 72 41 6c 6c 6f 63 20 2b 3d 20 70 50 61 72  xprAlloc += pPar
3780: 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f  se->nVarExprAllo
3790: 63 20 2b 20 31 30 3b 0a 20 20 20 20 20 20 20 20  c + 10;.        
37a0: 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70  pParse->apVarExp
37b0: 72 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  r =.            
37c0: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
37d0: 4f 72 46 72 65 65 28 0a 20 20 20 20 20 20 20 20  OrFree(.        
37e0: 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20        db,.      
37f0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
3800: 61 70 56 61 72 45 78 70 72 2c 0a 20 20 20 20 20  apVarExpr,.     
3810: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
3820: 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 2a 73  >nVarExprAlloc*s
3830: 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61 70  izeof(pParse->ap
3840: 56 61 72 45 78 70 72 5b 30 5d 29 0a 20 20 20 20  VarExpr[0]).    
3850: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
3860: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 64 62   }.      if( !db
3870: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
3880: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
3890: 28 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45  ( pParse->apVarE
38a0: 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  xpr!=0 );.      
38b0: 20 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45    pParse->apVarE
38c0: 78 70 72 5b 70 50 61 72 73 65 2d 3e 6e 56 61 72  xpr[pParse->nVar
38d0: 45 78 70 72 2b 2b 5d 20 3d 20 70 45 78 70 72 3b  Expr++] = pExpr;
38e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
38f0: 20 7d 20 0a 20 20 69 66 28 20 21 70 50 61 72 73   } .  if( !pPars
3900: 65 2d 3e 6e 45 72 72 20 26 26 20 70 50 61 72 73  e->nErr && pPars
3910: 65 2d 3e 6e 56 61 72 3e 64 62 2d 3e 61 4c 69 6d  e->nVar>db->aLim
3920: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
3930: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
3940: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
3950: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3960: 22 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61  "too many SQL va
3970: 72 69 61 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d  riables");.  }.}
3980: 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76  ../*.** Recursiv
3990: 65 6c 79 20 64 65 6c 65 74 65 20 61 6e 20 65 78  ely delete an ex
39a0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a  pression tree..*
39b0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
39c0: 70 72 44 65 6c 65 74 65 28 45 78 70 72 20 2a 70  prDelete(Expr *p
39d0: 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  ){.  if( p==0 ) 
39e0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d  return;.  if( p-
39f0: 3e 73 70 61 6e 2e 64 79 6e 20 29 20 73 71 6c 69  >span.dyn ) sqli
3a00: 74 65 33 5f 66 72 65 65 28 28 63 68 61 72 2a 29  te3_free((char*)
3a10: 70 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20 69 66  p->span.z);.  if
3a20: 28 20 70 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 29  ( p->token.dyn )
3a30: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 28 63   sqlite3_free((c
3a40: 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 29  har*)p->token.z)
3a50: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
3a60: 65 6c 65 74 65 28 70 2d 3e 70 4c 65 66 74 29 3b  elete(p->pLeft);
3a70: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
3a80: 6c 65 74 65 28 70 2d 3e 70 52 69 67 68 74 29 3b  lete(p->pRight);
3a90: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
3aa0: 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69 73  stDelete(p->pLis
3ab0: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  t);.  sqlite3Sel
3ac0: 65 63 74 44 65 6c 65 74 65 28 70 2d 3e 70 53 65  ectDelete(p->pSe
3ad0: 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  lect);.  sqlite3
3ae0: 5f 66 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  _free(p);.}../*.
3af0: 2a 2a 20 54 68 65 20 45 78 70 72 2e 74 6f 6b 65  ** The Expr.toke
3b00: 6e 20 66 69 65 6c 64 20 6d 69 67 68 74 20 62 65  n field might be
3b10: 20 61 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61   a string litera
3b20: 6c 20 74 68 61 74 20 69 73 20 71 75 6f 74 65 64  l that is quoted
3b30: 2e 0a 2a 2a 20 49 66 20 73 6f 2c 20 72 65 6d 6f  ..** If so, remo
3b40: 76 65 20 74 68 65 20 71 75 6f 74 61 74 69 6f 6e  ve the quotation
3b50: 20 6d 61 72 6b 73 2e 0a 2a 2f 0a 76 6f 69 64 20   marks..*/.void 
3b60: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 45 78  sqlite3DequoteEx
3b70: 70 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  pr(sqlite3 *db, 
3b80: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
3b90: 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72  ExprHasAnyProper
3ba0: 74 79 28 70 2c 20 45 50 5f 44 65 71 75 6f 74 65  ty(p, EP_Dequote
3bb0: 64 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  d) ){.    return
3bc0: 3b 0a 20 20 7d 0a 20 20 45 78 70 72 53 65 74 50  ;.  }.  ExprSetP
3bd0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 44 65  roperty(p, EP_De
3be0: 71 75 6f 74 65 64 29 3b 0a 20 20 69 66 28 20 70  quoted);.  if( p
3bf0: 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 3d 3d 30 20 29  ->token.dyn==0 )
3c00: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b  {.    sqlite3Tok
3c10: 65 6e 43 6f 70 79 28 64 62 2c 20 26 70 2d 3e 74  enCopy(db, &p->t
3c20: 6f 6b 65 6e 2c 20 26 70 2d 3e 74 6f 6b 65 6e 29  oken, &p->token)
3c30: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
3c40: 65 71 75 6f 74 65 28 28 63 68 61 72 2a 29 70 2d  equote((char*)p-
3c50: 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 7d 0a 0a 0a 2f  >token.z);.}.../
3c60: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
3c70: 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74  ng group of rout
3c80: 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63  ines make deep c
3c90: 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65 73 73  opies of express
3ca0: 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73  ions,.** express
3cb0: 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69  ion lists, ID li
3cc0: 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20  sts, and select 
3cd0: 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65  statements.  The
3ce0: 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62   copies can.** b
3cf0: 65 20 64 65 6c 65 74 65 64 20 28 62 79 20 62 65  e deleted (by be
3d00: 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74 68  ing passed to th
3d10: 65 69 72 20 72 65 73 70 65 63 74 69 76 65 20 2e  eir respective .
3d20: 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69  ..Delete() routi
3d30: 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20  nes).** without 
3d40: 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72  effecting the or
3d50: 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54  iginals..**.** T
3d60: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
3d70: 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72  st, ID, and sour
3d80: 63 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20  ce lists return 
3d90: 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  by sqlite3ExprLi
3da0: 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69  stDup(),.** sqli
3db0: 74 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20  te3IdListDup(), 
3dc0: 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  and sqlite3SrcLi
3dd0: 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20  stDup() can not 
3de0: 62 65 20 66 75 72 74 68 65 72 20 65 78 70 61 6e  be further expan
3df0: 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65  ded .** by subse
3e00: 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73  quent calls to s
3e10: 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64  qlite*ListAppend
3e20: 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a  () routines..**.
3e30: 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68  ** Any tables th
3e40: 61 74 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d  at the SrcList m
3e50: 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72  ight point to ar
3e60: 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64  e not duplicated
3e70: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
3e80: 65 33 45 78 70 72 44 75 70 28 73 71 6c 69 74 65  e3ExprDup(sqlite
3e90: 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b  3 *db, Expr *p){
3ea0: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20  .  Expr *pNew;. 
3eb0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
3ec0: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
3ed0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
3ee0: 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29  w(db, sizeof(*p)
3ef0: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
3f00: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
3f10: 6d 65 6d 63 70 79 28 70 4e 65 77 2c 20 70 2c 20  memcpy(pNew, p, 
3f20: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a  sizeof(*pNew));.
3f30: 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 7a    if( p->token.z
3f40: 21 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d  !=0 ){.    pNew-
3f50: 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 28 75 38 2a 29  >token.z = (u8*)
3f60: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
3f70: 28 64 62 2c 20 28 63 68 61 72 2a 29 70 2d 3e 74  (db, (char*)p->t
3f80: 6f 6b 65 6e 2e 7a 2c 20 70 2d 3e 74 6f 6b 65 6e  oken.z, p->token
3f90: 2e 6e 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 74  .n);.    pNew->t
3fa0: 6f 6b 65 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20 20  oken.dyn = 1;.  
3fb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
3fc0: 74 28 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a  t( pNew->token.z
3fd0: 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70 4e 65  ==0 );.  }.  pNe
3fe0: 77 2d 3e 73 70 61 6e 2e 7a 20 3d 20 30 3b 0a 20  w->span.z = 0;. 
3ff0: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73   pNew->pLeft = s
4000: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
4010: 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 70  , p->pLeft);.  p
4020: 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 73 71  New->pRight = sq
4030: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
4040: 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 70   p->pRight);.  p
4050: 4e 65 77 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c  New->pList = sql
4060: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
4070: 64 62 2c 20 70 2d 3e 70 4c 69 73 74 29 3b 0a 20  db, p->pList);. 
4080: 20 70 4e 65 77 2d 3e 70 53 65 6c 65 63 74 20 3d   pNew->pSelect =
4090: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
40a0: 70 28 64 62 2c 20 70 2d 3e 70 53 65 6c 65 63 74  p(db, p->pSelect
40b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  );.  return pNew
40c0: 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
40d0: 54 6f 6b 65 6e 43 6f 70 79 28 73 71 6c 69 74 65  TokenCopy(sqlite
40e0: 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 54  3 *db, Token *pT
40f0: 6f 2c 20 54 6f 6b 65 6e 20 2a 70 46 72 6f 6d 29  o, Token *pFrom)
4100: 7b 0a 20 20 69 66 28 20 70 54 6f 2d 3e 64 79 6e  {.  if( pTo->dyn
4110: 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
4120: 28 63 68 61 72 2a 29 70 54 6f 2d 3e 7a 29 3b 0a  (char*)pTo->z);.
4130: 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 20 29    if( pFrom->z )
4140: 7b 0a 20 20 20 20 70 54 6f 2d 3e 6e 20 3d 20 70  {.    pTo->n = p
4150: 46 72 6f 6d 2d 3e 6e 3b 0a 20 20 20 20 70 54 6f  From->n;.    pTo
4160: 2d 3e 7a 20 3d 20 28 75 38 2a 29 73 71 6c 69 74  ->z = (u8*)sqlit
4170: 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20  e3DbStrNDup(db, 
4180: 28 63 68 61 72 2a 29 70 46 72 6f 6d 2d 3e 7a 2c  (char*)pFrom->z,
4190: 20 70 46 72 6f 6d 2d 3e 6e 29 3b 0a 20 20 20 20   pFrom->n);.    
41a0: 70 54 6f 2d 3e 64 79 6e 20 3d 20 31 3b 0a 20 20  pTo->dyn = 1;.  
41b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 6f 2d 3e  }else{.    pTo->
41c0: 7a 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 45 78 70  z = 0;.  }.}.Exp
41d0: 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78  rList *sqlite3Ex
41e0: 70 72 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65  prListDup(sqlite
41f0: 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20  3 *db, ExprList 
4200: 2a 70 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  *p){.  ExprList 
4210: 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20  *pNew;.  struct 
4220: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
4230: 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b  Item, *pOldItem;
4240: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
4250: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
4260: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
4270: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
4280: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
4290: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
42a0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
42b0: 65 77 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20 30  ew->iECursor = 0
42c0: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20  ;.  pNew->nExpr 
42d0: 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d  = pNew->nAlloc =
42e0: 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 4e 65   p->nExpr;.  pNe
42f0: 77 2d 3e 61 20 3d 20 70 49 74 65 6d 20 3d 20 73  w->a = pItem = s
4300: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
4310: 77 28 64 62 2c 20 20 70 2d 3e 6e 45 78 70 72 2a  w(db,  p->nExpr*
4320: 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20  sizeof(p->a[0]) 
4330: 29 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 3d 3d  );.  if( pItem==
4340: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
4350: 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20  _free(pNew);.   
4360: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20 0a   return 0;.  } .
4370: 20 20 70 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e    pOldItem = p->
4380: 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  a;.  for(i=0; i<
4390: 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  p->nExpr; i++, p
43a0: 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d  Item++, pOldItem
43b0: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
43c0: 4e 65 77 45 78 70 72 2c 20 2a 70 4f 6c 64 45 78  NewExpr, *pOldEx
43d0: 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70  pr;.    pItem->p
43e0: 45 78 70 72 20 3d 20 70 4e 65 77 45 78 70 72 20  Expr = pNewExpr 
43f0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
4400: 28 64 62 2c 20 70 4f 6c 64 45 78 70 72 20 3d 20  (db, pOldExpr = 
4410: 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72 29  pOldItem->pExpr)
4420: 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 45 78  ;.    if( pOldEx
4430: 70 72 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 26 26  pr->span.z!=0 &&
4440: 20 70 4e 65 77 45 78 70 72 20 29 7b 0a 20 20 20   pNewExpr ){.   
4450: 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 6d 61 6b     /* Always mak
4460: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
4470: 73 70 61 6e 20 66 6f 72 20 74 6f 70 2d 6c 65 76  span for top-lev
4480: 65 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  el expressions i
4490: 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65  n the.      ** e
44a0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20  xpression list. 
44b0: 20 54 68 65 20 6c 6f 67 69 63 20 69 6e 20 53 45   The logic in SE
44c0: 4c 45 43 54 20 70 72 6f 63 65 73 73 69 6e 67 20  LECT processing 
44d0: 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73 0a  that determines.
44e0: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 61 6d        ** the nam
44f0: 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  es of columns in
4500: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
4510: 6e 65 65 64 73 20 74 68 69 73 20 69 6e 66 6f 72  needs this infor
4520: 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  mation */.      
4530: 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79  sqlite3TokenCopy
4540: 28 64 62 2c 20 26 70 4e 65 77 45 78 70 72 2d 3e  (db, &pNewExpr->
4550: 73 70 61 6e 2c 20 26 70 4f 6c 64 45 78 70 72 2d  span, &pOldExpr-
4560: 3e 73 70 61 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  >span);.    }.  
4570: 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 45 78    assert( pNewEx
4580: 70 72 3d 3d 30 20 7c 7c 20 70 4e 65 77 45 78 70  pr==0 || pNewExp
4590: 72 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 0a 20 20  r->span.z!=0 .  
45a0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4f 6c            || pOl
45b0: 64 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 3d 3d 30  dExpr->span.z==0
45c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
45d0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
45e0: 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a   );.    pItem->z
45f0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
4600: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
4610: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
4620: 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65   pItem->sortOrde
4630: 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f  r = pOldItem->so
4640: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 70 49 74  rtOrder;.    pIt
4650: 65 6d 2d 3e 69 73 41 67 67 20 3d 20 70 4f 6c 64  em->isAgg = pOld
4660: 49 74 65 6d 2d 3e 69 73 41 67 67 3b 0a 20 20 20  Item->isAgg;.   
4670: 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30   pItem->done = 0
4680: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
4690: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  New;.}../*.** If
46a0: 20 63 75 72 73 6f 72 73 2c 20 74 72 69 67 67 65   cursors, trigge
46b0: 72 73 2c 20 76 69 65 77 73 20 61 6e 64 20 73 75  rs, views and su
46c0: 62 71 75 65 72 69 65 73 20 61 72 65 20 61 6c 6c  bqueries are all
46d0: 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 0a 2a 2a   omitted from.**
46e0: 20 74 68 65 20 62 75 69 6c 64 2c 20 74 68 65 6e   the build, then
46f0: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c   none of the fol
4700: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 2c  lowing routines,
4710: 20 65 78 63 65 70 74 20 66 6f 72 20 0a 2a 2a 20   except for .** 
4720: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
4730: 28 29 2c 20 63 61 6e 20 62 65 20 63 61 6c 6c 65  (), can be calle
4740: 64 2e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  d. sqlite3Select
4750: 44 75 70 28 29 20 69 73 20 73 6f 6d 65 74 69 6d  Dup() is sometim
4760: 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74  es.** called wit
4770: 68 20 61 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e  h a NULL argumen
4780: 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  t..*/.#if !defin
4790: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
47a0: 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
47b0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49  (SQLITE_OMIT_TRI
47c0: 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21 64 65 66  GGER) \. || !def
47d0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
47e0: 5f 53 55 42 51 55 45 52 59 29 0a 53 72 63 4c 69  _SUBQUERY).SrcLi
47f0: 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69  st *sqlite3SrcLi
4800: 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  stDup(sqlite3 *d
4810: 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a  b, SrcList *p){.
4820: 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b    SrcList *pNew;
4830: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
4840: 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 70 3d 3d  nByte;.  if( p==
4850: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
4860: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
4870: 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20  p) + (p->nSrc>0 
4880: 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  ? sizeof(p->a[0]
4890: 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20  ) * (p->nSrc-1) 
48a0: 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  : 0);.  pNew = s
48b0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
48c0: 77 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20  w(db, nByte );. 
48d0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
48e0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
48f0: 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41  >nSrc = pNew->nA
4900: 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a  lloc = p->nSrc;.
4910: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
4920: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
4930: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
4940: 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20  tem *pNewItem = 
4950: 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20  &pNew->a[i];.   
4960: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
4970: 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d  item *pOldItem =
4980: 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54   &p->a[i];.    T
4990: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
49a0: 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62  pNewItem->zDatab
49b0: 61 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ase = sqlite3DbS
49c0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
49d0: 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  em->zDatabase);.
49e0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e      pNewItem->zN
49f0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
4a00: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
4a10: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
4a20: 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  pNewItem->zAlias
4a30: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
4a40: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
4a50: 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e  >zAlias);.    pN
4a60: 65 77 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ewItem->jointype
4a70: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 6a 6f 69   = pOldItem->joi
4a80: 6e 74 79 70 65 3b 0a 20 20 20 20 70 4e 65 77 49  ntype;.    pNewI
4a90: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70  tem->iCursor = p
4aa0: 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  OldItem->iCursor
4ab0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
4ac0: 69 73 50 6f 70 75 6c 61 74 65 64 20 3d 20 70 4f  isPopulated = pO
4ad0: 6c 64 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61  ldItem->isPopula
4ae0: 74 65 64 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  ted;.    pTab = 
4af0: 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d  pNewItem->pTab =
4b00: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b   pOldItem->pTab;
4b10: 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b  .    if( pTab ){
4b20: 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65  .      pTab->nRe
4b30: 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  f++;.    }.    p
4b40: 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  NewItem->pSelect
4b50: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
4b60: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
4b70: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
4b80: 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20  pNewItem->pOn = 
4b90: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
4ba0: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e  b, pOldItem->pOn
4bb0: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
4bc0: 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c 69 74 65  >pUsing = sqlite
4bd0: 33 49 64 4c 69 73 74 44 75 70 28 64 62 2c 20 70  3IdListDup(db, p
4be0: 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29  OldItem->pUsing)
4bf0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
4c00: 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49 74  colUsed = pOldIt
4c10: 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d  em->colUsed;.  }
4c20: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
4c30: 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65  }.IdList *sqlite
4c40: 33 49 64 4c 69 73 74 44 75 70 28 73 71 6c 69 74  3IdListDup(sqlit
4c50: 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a  e3 *db, IdList *
4c60: 70 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e  p){.  IdList *pN
4c70: 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ew;.  int i;.  i
4c80: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
4c90: 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   0;.  pNew = sql
4ca0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
4cb0: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  db, sizeof(*pNew
4cc0: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
4cd0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
4ce0: 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 4e 65   pNew->nId = pNe
4cf0: 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e  w->nAlloc = p->n
4d00: 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20  Id;.  pNew->a = 
4d10: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
4d20: 61 77 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73 69  aw(db, p->nId*si
4d30: 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b  zeof(p->a[0]) );
4d40: 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d  .  if( pNew->a==
4d50: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
4d60: 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20  _free(pNew);.   
4d70: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
4d80: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
4d90: 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  Id; i++){.    st
4da0: 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d  ruct IdList_item
4db0: 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e   *pNewItem = &pN
4dc0: 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74  ew->a[i];.    st
4dd0: 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d  ruct IdList_item
4de0: 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d   *pOldItem = &p-
4df0: 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49  >a[i];.    pNewI
4e00: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
4e10: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
4e20: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pOldItem->zName
4e30: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
4e40: 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  >idx = pOldItem-
4e50: 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75  >idx;.  }.  retu
4e60: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63  rn pNew;.}.Selec
4e70: 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74  t *sqlite3Select
4e80: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
4e90: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53   Select *p){.  S
4ea0: 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 69  elect *pNew;.  i
4eb0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
4ec0: 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   0;.  pNew = sql
4ed0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
4ee0: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  db, sizeof(*p) )
4ef0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
4f00: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
4f10: 65 77 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d  ew->isDistinct =
4f20: 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a   p->isDistinct;.
4f30: 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d    pNew->pEList =
4f40: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
4f50: 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73  Dup(db, p->pELis
4f60: 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63  t);.  pNew->pSrc
4f70: 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
4f80: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 53 72 63  tDup(db, p->pSrc
4f90: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72  );.  pNew->pWher
4fa0: 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  e = sqlite3ExprD
4fb0: 75 70 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65  up(db, p->pWhere
4fc0: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75  );.  pNew->pGrou
4fd0: 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pBy = sqlite3Exp
4fe0: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
4ff0: 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 70 4e 65  pGroupBy);.  pNe
5000: 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c  w->pHaving = sql
5010: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
5020: 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 70  p->pHaving);.  p
5030: 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  New->pOrderBy = 
5040: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
5050: 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  up(db, p->pOrder
5060: 42 79 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20  By);.  pNew->op 
5070: 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d  = p->op;.  pNew-
5080: 3e 70 50 72 69 6f 72 20 3d 20 73 71 6c 69 74 65  >pPrior = sqlite
5090: 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
50a0: 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 70 4e 65  ->pPrior);.  pNe
50b0: 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69  w->pLimit = sqli
50c0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
50d0: 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70 4e 65  ->pLimit);.  pNe
50e0: 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 73 71 6c  w->pOffset = sql
50f0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
5100: 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 70  p->pOffset);.  p
5110: 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31  New->iLimit = -1
5120: 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65  ;.  pNew->iOffse
5130: 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  t = -1;.  pNew->
5140: 69 73 52 65 73 6f 6c 76 65 64 20 3d 20 70 2d 3e  isResolved = p->
5150: 69 73 52 65 73 6f 6c 76 65 64 3b 0a 20 20 70 4e  isResolved;.  pN
5160: 65 77 2d 3e 69 73 41 67 67 20 3d 20 70 2d 3e 69  ew->isAgg = p->i
5170: 73 41 67 67 3b 0a 20 20 70 4e 65 77 2d 3e 75 73  sAgg;.  pNew->us
5180: 65 73 45 70 68 6d 20 3d 20 30 3b 0a 20 20 70 4e  esEphm = 0;.  pN
5190: 65 77 2d 3e 64 69 73 61 6c 6c 6f 77 4f 72 64 65  ew->disallowOrde
51a0: 72 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  rBy = 0;.  pNew-
51b0: 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b  >pRightmost = 0;
51c0: 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65  .  pNew->addrOpe
51d0: 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20  nEphm[0] = -1;. 
51e0: 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45   pNew->addrOpenE
51f0: 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70  phm[1] = -1;.  p
5200: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  New->addrOpenEph
5210: 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 72 65 74  m[2] = -1;.  ret
5220: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73  urn pNew;.}.#els
5230: 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65  e.Select *sqlite
5240: 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74  3SelectDup(sqlit
5250: 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a  e3 *db, Select *
5260: 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d  p){.  assert( p=
5270: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  =0 );.  return 0
5280: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
5290: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65  ** Add a new ele
52a0: 6d 65 6e 74 20 74 6f 20 74 68 65 20 65 6e 64 20  ment to the end 
52b0: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
52c0: 20 6c 69 73 74 2e 20 20 49 66 20 70 4c 69 73 74   list.  If pList
52d0: 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79   is.** initially
52e0: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61   NULL, then crea
52f0: 74 65 20 61 20 6e 65 77 20 65 78 70 72 65 73 73  te a new express
5300: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 45 78 70  ion list..*/.Exp
5310: 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78  rList *sqlite3Ex
5320: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20  prListAppend(.  
5330: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
5340: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
5350: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
5360: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
5370: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
5380: 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70 65  to which to appe
5390: 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  nd. Might be NUL
53a0: 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  L */.  Expr *pEx
53b0: 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  pr,            /
53c0: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  * Expression to 
53d0: 62 65 20 61 70 70 65 6e 64 65 64 20 2a 2f 0a 20  be appended */. 
53e0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 20 20   Token *pName   
53f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 53 20 6b           /* AS k
5400: 65 79 77 6f 72 64 20 66 6f 72 20 74 68 65 20 65  eyword for the e
5410: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a  xpression */.){.
5420: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
5430: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
5440: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
5450: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
5460: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
5470: 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73  , sizeof(ExprLis
5480: 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
5490: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
54a0: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20  goto no_mem;.   
54b0: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
54c0: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 20  List->nAlloc==0 
54d0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69  );.  }.  if( pLi
54e0: 73 74 2d 3e 6e 41 6c 6c 6f 63 3c 3d 70 4c 69 73  st->nAlloc<=pLis
54f0: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
5500: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
5510: 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 69 6e 74  item *a;.    int
5520: 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c   n = pList->nAll
5530: 6f 63 2a 32 20 2b 20 34 3b 0a 20 20 20 20 61 20  oc*2 + 4;.    a 
5540: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
5550: 6f 63 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 2c  oc(db, pList->a,
5560: 20 6e 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d   n*sizeof(pList-
5570: 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28  >a[0]));.    if(
5580: 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67   a==0 ){.      g
5590: 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20  oto no_mem;.    
55a0: 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d  }.    pList->a =
55b0: 20 61 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e   a;.    pList->n
55c0: 41 6c 6c 6f 63 20 3d 20 6e 3b 0a 20 20 7d 0a 20  Alloc = n;.  }. 
55d0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
55e0: 61 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 45  a!=0 );.  if( pE
55f0: 78 70 72 20 7c 7c 20 70 4e 61 6d 65 20 29 7b 0a  xpr || pName ){.
5600: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
5610: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
5620: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
5630: 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 20  t->nExpr++];.   
5640: 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30   memset(pItem, 0
5650: 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29  , sizeof(*pItem)
5660: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e  );.    pItem->zN
5670: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
5680: 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
5690: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d  Name);.    pItem
56a0: 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ->pExpr = pExpr;
56b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c  .  }.  return pL
56c0: 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20  ist;..no_mem:   
56d0: 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c 65    .  /* Avoid le
56e0: 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66 20  aking memory if 
56f0: 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c 65  malloc has faile
5700: 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  d. */.  sqlite3E
5710: 78 70 72 44 65 6c 65 74 65 28 70 45 78 70 72 29  xprDelete(pExpr)
5720: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
5730: 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29  istDelete(pList)
5740: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
5750: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  ./*.** If the ex
5760: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 45  pression list pE
5770: 4c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f  List contains mo
5780: 72 65 20 74 68 61 6e 20 69 4c 69 6d 69 74 20 65  re than iLimit e
5790: 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76  lements,.** leav
57a0: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
57b0: 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f  ge in pParse..*/
57c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
57d0: 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68  rListCheckLength
57e0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
57f0: 65 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  e,.  ExprList *p
5800: 45 4c 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63  EList,.  const c
5810: 68 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a  har *zObject.){.
5820: 20 20 69 6e 74 20 6d 78 20 3d 20 70 50 61 72 73    int mx = pPars
5830: 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  e->db->aLimit[SQ
5840: 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d  LITE_LIMIT_COLUM
5850: 4e 5d 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74  N];.  if( pEList
5860: 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
5870: 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73 71 6c 69  r>mx ){.    sqli
5880: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
5890: 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f  se, "too many co
58a0: 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c 20 7a 4f  lumns in %s", zO
58b0: 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  bject);.  }.}...
58c0: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
58d0: 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73   three functions
58e0: 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 29  , heightOfExpr()
58f0: 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69  , heightOfExprLi
5900: 73 74 28 29 0a 2a 2a 20 61 6e 64 20 68 65 69 67  st().** and heig
5910: 68 74 4f 66 53 65 6c 65 63 74 28 29 2c 20 61 72  htOfSelect(), ar
5920: 65 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  e used to determ
5930: 69 6e 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  ine the maximum 
5940: 68 65 69 67 68 74 0a 2a 2a 20 6f 66 20 61 6e 79  height.** of any
5950: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
5960: 20 72 65 66 65 72 65 6e 63 65 64 20 62 79 20 74   referenced by t
5970: 68 65 20 73 74 72 75 63 74 75 72 65 20 70 61 73  he structure pas
5980: 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 66 69  sed as the.** fi
5990: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  rst argument..**
59a0: 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d 61 78 69  .** If this maxi
59b0: 6d 75 6d 20 68 65 69 67 68 74 20 69 73 20 67 72  mum height is gr
59c0: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63  eater than the c
59d0: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 70 6f 69  urrent value poi
59e0: 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 70 6e  nted.** to by pn
59f0: 48 65 69 67 68 74 2c 20 74 68 65 20 73 65 63 6f  Height, the seco
5a00: 6e 64 20 70 61 72 61 6d 65 74 65 72 2c 20 74 68  nd parameter, th
5a10: 65 6e 20 73 65 74 20 2a 70 6e 48 65 69 67 68 74  en set *pnHeight
5a20: 20 74 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75   to that.** valu
5a30: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
5a40: 64 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 45  d heightOfExpr(E
5a50: 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48  xpr *p, int *pnH
5a60: 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20  eight){.  if( p 
5a70: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 48  ){.    if( p->nH
5a80: 65 69 67 68 74 3e 2a 70 6e 48 65 69 67 68 74 20  eight>*pnHeight 
5a90: 29 7b 0a 20 20 20 20 20 20 2a 70 6e 48 65 69 67  ){.      *pnHeig
5aa0: 68 74 20 3d 20 70 2d 3e 6e 48 65 69 67 68 74 3b  ht = p->nHeight;
5ab0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61  .    }.  }.}.sta
5ac0: 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f  tic void heightO
5ad0: 66 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69  fExprList(ExprLi
5ae0: 73 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65  st *p, int *pnHe
5af0: 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29  ight){.  if( p )
5b00: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
5b10: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
5b20: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
5b30: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
5b40: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 6e  ->a[i].pExpr, pn
5b50: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20  Height);.    }. 
5b60: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
5b70: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
5b80: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 2a  Select *p, int *
5b90: 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28  pnHeight){.  if(
5ba0: 20 70 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74   p ){.    height
5bb0: 4f 66 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65  OfExpr(p->pWhere
5bc0: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
5bd0: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
5be0: 3e 70 48 61 76 69 6e 67 2c 20 70 6e 48 65 69 67  >pHaving, pnHeig
5bf0: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
5c00: 66 45 78 70 72 28 70 2d 3e 70 4c 69 6d 69 74 2c  fExpr(p->pLimit,
5c10: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
5c20: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
5c30: 70 4f 66 66 73 65 74 2c 20 70 6e 48 65 69 67 68  pOffset, pnHeigh
5c40: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
5c50: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69  ExprList(p->pELi
5c60: 73 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  st, pnHeight);. 
5c70: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c     heightOfExprL
5c80: 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c  ist(p->pGroupBy,
5c90: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
5ca0: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
5cb0: 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 6e  (p->pOrderBy, pn
5cc0: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
5cd0: 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e 70  ghtOfSelect(p->p
5ce0: 50 72 69 6f 72 2c 20 70 6e 48 65 69 67 68 74 29  Prior, pnHeight)
5cf0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
5d00: 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65 69  et the Expr.nHei
5d10: 67 68 74 20 76 61 72 69 61 62 6c 65 20 69 6e 20  ght variable in 
5d20: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70 61  the structure pa
5d30: 73 73 65 64 20 61 73 20 61 6e 20 0a 2a 2a 20 61  ssed as an .** a
5d40: 72 67 75 6d 65 6e 74 2e 20 41 6e 20 65 78 70 72  rgument. An expr
5d50: 65 73 73 69 6f 6e 20 77 69 74 68 20 6e 6f 20 63  ession with no c
5d60: 68 69 6c 64 72 65 6e 2c 20 45 78 70 72 2e 70 4c  hildren, Expr.pL
5d70: 69 73 74 20 6f 72 20 0a 2a 2a 20 45 78 70 72 2e  ist or .** Expr.
5d80: 70 53 65 6c 65 63 74 20 6d 65 6d 62 65 72 20 68  pSelect member h
5d90: 61 73 20 61 20 68 65 69 67 68 74 20 6f 66 20 31  as a height of 1
5da0: 2e 20 41 6e 79 20 6f 74 68 65 72 20 65 78 70 72  . Any other expr
5db0: 65 73 73 69 6f 6e 0a 2a 2a 20 68 61 73 20 61 20  ession.** has a 
5dc0: 68 65 69 67 68 74 20 65 71 75 61 6c 20 74 6f 20  height equal to 
5dd0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67  the maximum heig
5de0: 68 74 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20  ht of any other 
5df0: 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 64 20 45  .** referenced E
5e00: 78 70 72 20 70 6c 75 73 20 6f 6e 65 2e 0a 2a 2f  xpr plus one..*/
5e10: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
5e20: 72 53 65 74 48 65 69 67 68 74 28 45 78 70 72 20  rSetHeight(Expr 
5e30: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67  *p){.  int nHeig
5e40: 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74  ht = 0;.  height
5e50: 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c  OfExpr(p->pLeft,
5e60: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 68 65   &nHeight);.  he
5e70: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 52  ightOfExpr(p->pR
5e80: 69 67 68 74 2c 20 26 6e 48 65 69 67 68 74 29 3b  ight, &nHeight);
5e90: 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c  .  heightOfExprL
5ea0: 69 73 74 28 70 2d 3e 70 4c 69 73 74 2c 20 26 6e  ist(p->pList, &n
5eb0: 48 65 69 67 68 74 29 3b 0a 20 20 68 65 69 67 68  Height);.  heigh
5ec0: 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e 70 53 65  tOfSelect(p->pSe
5ed0: 6c 65 63 74 2c 20 26 6e 48 65 69 67 68 74 29 3b  lect, &nHeight);
5ee0: 0a 20 20 70 2d 3e 6e 48 65 69 67 68 74 20 3d 20  .  p->nHeight = 
5ef0: 6e 48 65 69 67 68 74 20 2b 20 31 3b 0a 7d 0a 0a  nHeight + 1;.}..
5f00: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
5f10: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20   maximum height 
5f20: 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  of any expressio
5f30: 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65  n tree reference
5f40: 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 65 6c 65  d.** by the sele
5f50: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  ct statement pas
5f60: 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
5f70: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
5f80: 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67  e3SelectExprHeig
5f90: 68 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  ht(Select *p){. 
5fa0: 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30   int nHeight = 0
5fb0: 3b 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65  ;.  heightOfSele
5fc0: 63 74 28 70 2c 20 26 6e 48 65 69 67 68 74 29 3b  ct(p, &nHeight);
5fd0: 0a 20 20 72 65 74 75 72 6e 20 6e 48 65 69 67 68  .  return nHeigh
5fe0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  t;.}../*.** Dele
5ff0: 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70  te an entire exp
6000: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f  ression list..*/
6010: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
6020: 72 4c 69 73 74 44 65 6c 65 74 65 28 45 78 70 72  rListDelete(Expr
6030: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
6040: 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
6050: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
6060: 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73  Item;.  if( pLis
6070: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
6080: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
6090: 61 21 3d 30 20 7c 7c 20 28 70 4c 69 73 74 2d 3e  a!=0 || (pList->
60a0: 6e 45 78 70 72 3d 3d 30 20 26 26 20 70 4c 69 73  nExpr==0 && pLis
60b0: 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 29 20 29 3b  t->nAlloc==0) );
60c0: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
60d0: 2d 3e 6e 45 78 70 72 3c 3d 70 4c 69 73 74 2d 3e  ->nExpr<=pList->
60e0: 6e 41 6c 6c 6f 63 20 29 3b 0a 20 20 66 6f 72 28  nAlloc );.  for(
60f0: 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
6100: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
6110: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
6120: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  +){.    sqlite3E
6130: 78 70 72 44 65 6c 65 74 65 28 70 49 74 65 6d 2d  xprDelete(pItem-
6140: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c  >pExpr);.    sql
6150: 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 6d 2d  ite3_free(pItem-
6160: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73  >zName);.  }.  s
6170: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 69 73  qlite3_free(pLis
6180: 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  t->a);.  sqlite3
6190: 5f 66 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a  _free(pList);.}.
61a0: 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
61b0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
61c0: 20 43 61 6c 6c 20 78 46 75 6e 63 20 66 6f 72 20   Call xFunc for 
61d0: 65 61 63 68 20 6e 6f 64 65 20 76 69 73 69 74 65  each node visite
61e0: 64 2e 20 20 78 46 75 6e 63 0a 2a 2a 20 69 73 20  d.  xFunc.** is 
61f0: 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 6f  called on the no
6200: 64 65 20 62 65 66 6f 72 65 20 78 46 75 6e 63 20  de before xFunc 
6210: 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  is called on the
6220: 20 6e 6f 64 65 73 20 63 68 69 6c 64 72 65 6e 2e   nodes children.
6230: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
6240: 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 78 46 75  n value from xFu
6250: 6e 63 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68  nc determines wh
6260: 65 74 68 65 72 20 74 68 65 20 74 72 65 65 20 77  ether the tree w
6270: 61 6c 6b 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 2a  alk continues..*
6280: 2a 20 30 20 6d 65 61 6e 73 20 63 6f 6e 74 69 6e  * 0 means contin
6290: 75 65 20 77 61 6c 6b 69 6e 67 20 74 68 65 20 74  ue walking the t
62a0: 72 65 65 2e 20 20 31 20 6d 65 61 6e 73 20 64 6f  ree.  1 means do
62b0: 20 6e 6f 74 20 77 61 6c 6b 20 63 68 69 6c 64 72   not walk childr
62c0: 65 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 63 75 72  en.** of the cur
62d0: 72 65 6e 74 20 6e 6f 64 65 20 62 75 74 20 63 6f  rent node but co
62e0: 6e 74 69 6e 75 65 20 77 69 74 68 20 73 69 62 6c  ntinue with sibl
62f0: 69 6e 67 73 2e 20 20 32 20 6d 65 61 6e 73 20 61  ings.  2 means a
6300: 62 61 6e 64 6f 6e 0a 2a 2a 20 74 68 65 20 74 72  bandon.** the tr
6310: 65 65 20 77 61 6c 6b 20 63 6f 6d 70 6c 65 74 65  ee walk complete
6320: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ly..**.** The re
6330: 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20  turn value from 
6340: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
6350: 31 20 74 6f 20 61 62 61 6e 64 6f 6e 20 74 68 65  1 to abandon the
6360: 20 74 72 65 65 20 77 61 6c 6b 0a 2a 2a 20 61 6e   tree walk.** an
6370: 64 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e  d 0 to continue.
6380: 0a 2a 2a 0a 2a 2a 20 4e 4f 54 49 43 45 3a 20 20  .**.** NOTICE:  
6390: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
63a0: 73 20 2a 6e 6f 74 2a 20 64 65 73 63 65 6e 64 20  s *not* descend 
63b0: 69 6e 74 6f 20 73 75 62 71 75 65 72 69 65 73 2e  into subqueries.
63c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
63d0: 61 6c 6b 45 78 70 72 4c 69 73 74 28 45 78 70 72  alkExprList(Expr
63e0: 4c 69 73 74 20 2a 2c 20 69 6e 74 20 28 2a 29 28  List *, int (*)(
63f0: 76 6f 69 64 20 2a 2c 20 45 78 70 72 2a 29 2c 20  void *, Expr*), 
6400: 76 6f 69 64 20 2a 29 3b 0a 73 74 61 74 69 63 20  void *);.static 
6410: 69 6e 74 20 77 61 6c 6b 45 78 70 72 54 72 65 65  int walkExprTree
6420: 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e  (Expr *pExpr, in
6430: 74 20 28 2a 78 46 75 6e 63 29 28 76 6f 69 64 2a  t (*xFunc)(void*
6440: 2c 45 78 70 72 2a 29 2c 20 76 6f 69 64 20 2a 70  ,Expr*), void *p
6450: 41 72 67 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Arg){.  int rc;.
6460: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
6470: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 63 20   return 0;.  rc 
6480: 3d 20 28 2a 78 46 75 6e 63 29 28 70 41 72 67 2c  = (*xFunc)(pArg,
6490: 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 72   pExpr);.  if( r
64a0: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  c==0 ){.    if( 
64b0: 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78  walkExprTree(pEx
64c0: 70 72 2d 3e 70 4c 65 66 74 2c 20 78 46 75 6e 63  pr->pLeft, xFunc
64d0: 2c 20 70 41 72 67 29 20 29 20 72 65 74 75 72 6e  , pArg) ) return
64e0: 20 31 3b 0a 20 20 20 20 69 66 28 20 77 61 6c 6b   1;.    if( walk
64f0: 45 78 70 72 54 72 65 65 28 70 45 78 70 72 2d 3e  ExprTree(pExpr->
6500: 70 52 69 67 68 74 2c 20 78 46 75 6e 63 2c 20 70  pRight, xFunc, p
6510: 41 72 67 29 20 29 20 72 65 74 75 72 6e 20 31 3b  Arg) ) return 1;
6520: 0a 20 20 20 20 69 66 28 20 77 61 6c 6b 45 78 70  .    if( walkExp
6530: 72 4c 69 73 74 28 70 45 78 70 72 2d 3e 70 4c 69  rList(pExpr->pLi
6540: 73 74 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29  st, xFunc, pArg)
6550: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
6560: 0a 20 20 72 65 74 75 72 6e 20 72 63 3e 31 3b 0a  .  return rc>1;.
6570: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 77 61  }../*.** Call wa
6580: 6c 6b 45 78 70 72 54 72 65 65 28 29 20 66 6f 72  lkExprTree() for
6590: 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f   every expressio
65a0: 6e 20 69 6e 20 6c 69 73 74 20 70 2e 0a 2a 2f 0a  n in list p..*/.
65b0: 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c 6b 45  static int walkE
65c0: 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74  xprList(ExprList
65d0: 20 2a 70 2c 20 69 6e 74 20 28 2a 78 46 75 6e 63   *p, int (*xFunc
65e0: 29 28 76 6f 69 64 20 2a 2c 20 45 78 70 72 2a 29  )(void *, Expr*)
65f0: 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
6600: 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
6610: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
6620: 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 21 70 20  pItem;.  if( !p 
6630: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f  ) return 0;.  fo
6640: 72 28 69 3d 70 2d 3e 6e 45 78 70 72 2c 20 70 49  r(i=p->nExpr, pI
6650: 74 65 6d 3d 70 2d 3e 61 3b 20 69 3e 30 3b 20 69  tem=p->a; i>0; i
6660: 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
6670: 20 20 69 66 28 20 77 61 6c 6b 45 78 70 72 54 72    if( walkExprTr
6680: 65 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c  ee(pItem->pExpr,
6690: 20 78 46 75 6e 63 2c 20 70 41 72 67 29 20 29 20   xFunc, pArg) ) 
66a0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
66b0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
66c0: 2a 2a 20 43 61 6c 6c 20 77 61 6c 6b 45 78 70 72  ** Call walkExpr
66d0: 54 72 65 65 28 29 20 66 6f 72 20 65 76 65 72 79  Tree() for every
66e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 53   expression in S
66f0: 65 6c 65 63 74 20 70 2c 20 6e 6f 74 20 69 6e 63  elect p, not inc
6700: 6c 75 64 69 6e 67 0a 2a 2a 20 65 78 70 72 65 73  luding.** expres
6710: 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 70  sions that are p
6720: 61 72 74 20 6f 66 20 73 75 62 2d 73 65 6c 65 63  art of sub-selec
6730: 74 73 20 69 6e 20 61 6e 79 20 46 52 4f 4d 20 63  ts in any FROM c
6740: 6c 61 75 73 65 20 6f 72 20 74 68 65 20 4c 49 4d  lause or the LIM
6750: 49 54 0a 2a 2a 20 6f 72 20 4f 46 46 53 45 54 20  IT.** or OFFSET 
6760: 65 78 70 72 65 73 73 69 6f 6e 73 2e 2e 0a 2a 2f  expressions...*/
6770: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c 6b  .static int walk
6780: 53 65 6c 65 63 74 45 78 70 72 28 53 65 6c 65 63  SelectExpr(Selec
6790: 74 20 2a 70 2c 20 69 6e 74 20 28 2a 78 46 75 6e  t *p, int (*xFun
67a0: 63 29 28 76 6f 69 64 20 2a 2c 20 45 78 70 72 2a  c)(void *, Expr*
67b0: 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  ), void *pArg){.
67c0: 20 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 70    walkExprList(p
67d0: 2d 3e 70 45 4c 69 73 74 2c 20 78 46 75 6e 63 2c  ->pEList, xFunc,
67e0: 20 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b 45 78   pArg);.  walkEx
67f0: 70 72 54 72 65 65 28 70 2d 3e 70 57 68 65 72 65  prTree(p->pWhere
6800: 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a  , xFunc, pArg);.
6810: 20 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 70    walkExprList(p
6820: 2d 3e 70 47 72 6f 75 70 42 79 2c 20 78 46 75 6e  ->pGroupBy, xFun
6830: 63 2c 20 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b  c, pArg);.  walk
6840: 45 78 70 72 54 72 65 65 28 70 2d 3e 70 48 61 76  ExprTree(p->pHav
6850: 69 6e 67 2c 20 78 46 75 6e 63 2c 20 70 41 72 67  ing, xFunc, pArg
6860: 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72 4c 69 73  );.  walkExprLis
6870: 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 78  t(p->pOrderBy, x
6880: 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 69  Func, pArg);.  i
6890: 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
68a0: 20 20 20 20 77 61 6c 6b 53 65 6c 65 63 74 45 78      walkSelectEx
68b0: 70 72 28 70 2d 3e 70 50 72 69 6f 72 2c 20 78 46  pr(p->pPrior, xF
68c0: 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 7d 0a  unc, pArg);.  }.
68d0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a    return 0;.}...
68e0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
68f0: 6e 65 20 69 73 20 64 65 73 69 67 6e 65 64 20 61  ne is designed a
6900: 73 20 61 6e 20 78 46 75 6e 63 20 66 6f 72 20 77  s an xFunc for w
6910: 61 6c 6b 45 78 70 72 54 72 65 65 28 29 2e 0a 2a  alkExprTree()..*
6920: 2a 0a 2a 2a 20 70 41 72 67 20 69 73 20 72 65 61  *.** pArg is rea
6930: 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  lly a pointer to
6940: 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 49 66   an integer.  If
6950: 20 77 65 20 63 61 6e 20 74 65 6c 6c 20 62 79 20   we can tell by 
6960: 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 61 74 20 70 45  looking.** at pE
6970: 78 70 72 20 74 68 61 74 20 74 68 65 20 65 78 70  xpr that the exp
6980: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e  ression that con
6990: 74 61 69 6e 73 20 70 45 78 70 72 20 69 73 20 6e  tains pExpr is n
69a0: 6f 74 20 61 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  ot a constant.**
69b0: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
69c0: 6e 20 73 65 74 20 2a 70 41 72 67 20 74 6f 20 30  n set *pArg to 0
69d0: 20 61 6e 64 20 72 65 74 75 72 6e 20 32 20 74 6f   and return 2 to
69e0: 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 74 72 65   abandon the tre
69f0: 65 20 77 61 6c 6b 2e 0a 2a 2a 20 49 66 20 70 45  e walk..** If pE
6a00: 78 70 72 20 64 6f 65 73 20 64 6f 65 73 20 6e 6f  xpr does does no
6a10: 74 20 64 69 73 71 75 61 6c 69 66 79 20 74 68 65  t disqualify the
6a20: 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d   expression from
6a30: 20 62 65 69 6e 67 20 61 20 63 6f 6e 73 74 61 6e   being a constan
6a40: 74 0a 2a 2a 20 74 68 65 6e 20 64 6f 20 6e 6f 74  t.** then do not
6a50: 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65  hing..**.** Afte
6a60: 72 20 77 61 6c 6b 69 6e 67 20 74 68 65 20 77 68  r walking the wh
6a70: 6f 6c 65 20 74 72 65 65 2c 20 69 66 20 6e 6f 20  ole tree, if no 
6a80: 6e 6f 64 65 73 20 61 72 65 20 66 6f 75 6e 64 20  nodes are found 
6a90: 74 68 61 74 20 64 69 73 71 75 61 6c 69 66 79 0a  that disqualify.
6aa0: 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ** the expressio
6ab0: 6e 20 61 73 20 63 6f 6e 73 74 61 6e 74 2c 20 74  n as constant, t
6ac0: 68 65 6e 20 77 65 20 61 73 73 75 6d 65 20 74 68  hen we assume th
6ad0: 65 20 77 68 6f 6c 65 20 65 78 70 72 65 73 73 69  e whole expressi
6ae0: 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 74 61 6e  on.** is constan
6af0: 74 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 45  t.  See sqlite3E
6b00: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 29 20  xprIsConstant() 
6b10: 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
6b20: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  nformation..*/.s
6b30: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f  tatic int exprNo
6b40: 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 76 6f 69  deIsConstant(voi
6b50: 64 20 2a 70 41 72 67 2c 20 45 78 70 72 20 2a 70  d *pArg, Expr *p
6b60: 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 2a 70 4e  Expr){.  int *pN
6b70: 20 3d 20 28 69 6e 74 2a 29 70 41 72 67 3b 0a 0a   = (int*)pArg;..
6b80: 20 20 2f 2a 20 49 66 20 2a 70 41 72 67 20 69 73    /* If *pArg is
6b90: 20 33 20 74 68 65 6e 20 61 6e 79 20 74 65 72 6d   3 then any term
6ba0: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
6bb0: 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66 72  on that comes fr
6bc0: 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f  om.  ** the ON o
6bd0: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  r USING clauses 
6be0: 6f 66 20 61 20 6a 6f 69 6e 20 64 69 73 71 75 61  of a join disqua
6bf0: 6c 69 66 69 65 73 20 74 68 65 20 65 78 70 72 65  lifies the expre
6c00: 73 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20  ssion.  ** from 
6c10: 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64  being considered
6c20: 20 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20   constant. */.  
6c30: 69 66 28 20 28 2a 70 4e 29 3d 3d 33 20 26 26 20  if( (*pN)==3 && 
6c40: 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72  ExprHasAnyProper
6c50: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  ty(pExpr, EP_Fro
6c60: 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 2a 70  mJoin) ){.    *p
6c70: 4e 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  N = 0;.    retur
6c80: 6e 20 32 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74  n 2;.  }..  swit
6c90: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
6ca0: 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72  .    /* Consider
6cb0: 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65   functions to be
6cc0: 20 63 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c   constant if all
6cd0: 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73   their arguments
6ce0: 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20   are constant.  
6cf0: 20 20 2a 2a 20 61 6e 64 20 2a 70 41 72 67 3d 3d    ** and *pArg==
6d00: 32 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  2 */.    case TK
6d10: 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20  _FUNCTION:.     
6d20: 20 69 66 28 20 28 2a 70 4e 29 3d 3d 32 20 29 20   if( (*pN)==2 ) 
6d30: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
6d40: 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20  /* Fall through 
6d50: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  */.    case TK_I
6d60: 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  D:.    case TK_C
6d70: 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20  OLUMN:.    case 
6d80: 54 4b 5f 44 4f 54 3a 0a 20 20 20 20 63 61 73 65  TK_DOT:.    case
6d90: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
6da0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  :.    case TK_AG
6db0: 47 5f 43 4f 4c 55 4d 4e 3a 0a 23 69 66 6e 64 65  G_COLUMN:.#ifnde
6dc0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
6dd0: 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
6de0: 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 63  TK_SELECT:.    c
6df0: 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 23  ase TK_EXISTS:.#
6e00: 65 6e 64 69 66 0a 20 20 20 20 20 20 2a 70 4e 20  endif.      *pN 
6e10: 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
6e20: 6e 20 32 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  n 2;.    case TK
6e30: 5f 49 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70  _IN:.      if( p
6e40: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b  Expr->pSelect ){
6e50: 0a 20 20 20 20 20 20 20 20 2a 70 4e 20 3d 20 30  .        *pN = 0
6e60: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
6e70: 20 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   2;.      }.    
6e80: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72  default:.      r
6e90: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  eturn 0;.  }.}..
6ea0: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
6eb0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
6ec0: 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
6ed0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
6ee0: 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20  nstant.** and 0 
6ef0: 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76  if it involves v
6f00: 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63  ariables or func
6f10: 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a  tion calls..**.*
6f20: 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
6f30: 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  es of this funct
6f40: 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75  ion, a double-qu
6f50: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
6f60: 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f   "abc").** is co
6f70: 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61  nsidered a varia
6f80: 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65  ble but a single
6f90: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
6fa0: 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a  ex: 'abc') is.**
6fb0: 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a   a constant..*/.
6fc0: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
6fd0: 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a  sConstant(Expr *
6fe0: 70 29 7b 0a 20 20 69 6e 74 20 69 73 43 6f 6e 73  p){.  int isCons
6ff0: 74 20 3d 20 31 3b 0a 20 20 77 61 6c 6b 45 78 70  t = 1;.  walkExp
7000: 72 54 72 65 65 28 70 2c 20 65 78 70 72 4e 6f 64  rTree(p, exprNod
7010: 65 49 73 43 6f 6e 73 74 61 6e 74 2c 20 26 69 73  eIsConstant, &is
7020: 43 6f 6e 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  Const);.  return
7030: 20 69 73 43 6f 6e 73 74 3b 0a 7d 0a 0a 2f 2a 0a   isConst;.}../*.
7040: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
7050: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
7060: 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70  urn 1 if the exp
7070: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
7080: 61 6e 74 0a 2a 2a 20 74 68 61 74 20 64 6f 65 73  ant.** that does
7090: 20 6e 6f 20 6f 72 69 67 69 6e 61 74 65 20 66 72   no originate fr
70a0: 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  om the ON or USI
70b0: 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20  NG clauses of a 
70c0: 6a 6f 69 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  join..** Return 
70d0: 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73  0 if it involves
70e0: 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75   variables or fu
70f0: 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 6f 72 20  nction calls or 
7100: 74 65 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e  terms from.** an
7110: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
7120: 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  use..*/.int sqli
7130: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
7140: 74 4e 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70  tNotJoin(Expr *p
7150: 29 7b 0a 20 20 69 6e 74 20 69 73 43 6f 6e 73 74  ){.  int isConst
7160: 20 3d 20 33 3b 0a 20 20 77 61 6c 6b 45 78 70 72   = 3;.  walkExpr
7170: 54 72 65 65 28 70 2c 20 65 78 70 72 4e 6f 64 65  Tree(p, exprNode
7180: 49 73 43 6f 6e 73 74 61 6e 74 2c 20 26 69 73 43  IsConstant, &isC
7190: 6f 6e 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  onst);.  return 
71a0: 69 73 43 6f 6e 73 74 21 3d 30 3b 0a 7d 0a 0a 2f  isConst!=0;.}../
71b0: 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
71c0: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
71d0: 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65  eturn 1 if the e
71e0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
71f0: 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75  stant.** or a fu
7200: 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68  nction call with
7210: 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65   constant argume
7220: 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 61 6e 64  nts.  Return and
7230: 20 30 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61   0 if there.** a
7240: 72 65 20 61 6e 79 20 76 61 72 69 61 62 6c 65 73  re any variables
7250: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
7260: 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
7270: 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75   function, a dou
7280: 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  ble-quoted strin
7290: 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a  g (ex: "abc").**
72a0: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
72b0: 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20   variable but a 
72c0: 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74  single-quoted st
72d0: 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29  ring (ex: 'abc')
72e0: 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e   is.** a constan
72f0: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
7300: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
7310: 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a  rFunction(Expr *
7320: 70 29 7b 0a 20 20 69 6e 74 20 69 73 43 6f 6e 73  p){.  int isCons
7330: 74 20 3d 20 32 3b 0a 20 20 77 61 6c 6b 45 78 70  t = 2;.  walkExp
7340: 72 54 72 65 65 28 70 2c 20 65 78 70 72 4e 6f 64  rTree(p, exprNod
7350: 65 49 73 43 6f 6e 73 74 61 6e 74 2c 20 26 69 73  eIsConstant, &is
7360: 43 6f 6e 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  Const);.  return
7370: 20 69 73 43 6f 6e 73 74 21 3d 30 3b 0a 7d 0a 0a   isConst!=0;.}..
7380: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
7390: 72 65 73 73 69 6f 6e 20 70 20 63 6f 64 65 73 20  ression p codes 
73a0: 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67  a constant integ
73b0: 65 72 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c  er that is small
73c0: 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69   enough.** to fi
73d0: 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e  t in a 32-bit in
73e0: 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 31 20  teger, return 1 
73f0: 61 6e 64 20 70 75 74 20 74 68 65 20 76 61 6c 75  and put the valu
7400: 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  e of the integer
7410: 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20  .** in *pValue. 
7420: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
7430: 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74  on is not an int
7440: 65 67 65 72 20 6f 72 20 69 66 20 69 74 20 69 73  eger or if it is
7450: 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66   too big.** to f
7460: 69 74 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33  it in a signed 3
7470: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72  2-bit integer, r
7480: 65 74 75 72 6e 20 30 20 61 6e 64 20 6c 65 61 76  eturn 0 and leav
7490: 65 20 2a 70 56 61 6c 75 65 20 75 6e 63 68 61 6e  e *pValue unchan
74a0: 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ged..*/.int sqli
74b0: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
74c0: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70  (Expr *p, int *p
74d0: 56 61 6c 75 65 29 7b 0a 20 20 73 77 69 74 63 68  Value){.  switch
74e0: 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  ( p->op ){.    c
74f0: 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20  ase TK_INTEGER: 
7500: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
7510: 74 65 33 47 65 74 49 6e 74 33 32 28 28 63 68 61  te3GetInt32((cha
7520: 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  r*)p->token.z, p
7530: 56 61 6c 75 65 29 20 29 7b 0a 20 20 20 20 20 20  Value) ){.      
7540: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
7550: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
7560: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
7570: 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20  TK_UPLUS: {.    
7580: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
7590: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d  ExprIsInteger(p-
75a0: 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29 3b  >pLeft, pValue);
75b0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
75c0: 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
75d0: 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20     int v;.      
75e0: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
75f0: 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66  sInteger(p->pLef
7600: 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20  t, &v) ){.      
7610: 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a    *pValue = -v;.
7620: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
7630: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7640: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7650: 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b   default: break;
7660: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
7670: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
7680: 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
7690: 65 6e 20 73 74 72 69 6e 67 20 69 73 20 61 20 72  en string is a r
76a0: 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ow-id column nam
76b0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
76c0: 33 49 73 52 6f 77 69 64 28 63 6f 6e 73 74 20 63  3IsRowid(const c
76d0: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73  har *z){.  if( s
76e0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c  qlite3StrICmp(z,
76f0: 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29   "_ROWID_")==0 )
7700: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
7710: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
7720: 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30 20 29  z, "ROWID")==0 )
7730: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
7740: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
7750: 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29 20 72  z, "OID")==0 ) r
7760: 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
7770: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  n 0;.}../*.** Gi
7780: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
7790: 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  a column of the 
77a0: 66 6f 72 6d 20 58 2e 59 2e 5a 20 6f 72 20 59 2e  form X.Y.Z or Y.
77b0: 5a 20 6f 72 20 6a 75 73 74 20 5a 2c 20 6c 6f 6f  Z or just Z, loo
77c0: 6b 20 75 70 0a 2a 2a 20 74 68 61 74 20 6e 61 6d  k up.** that nam
77d0: 65 20 69 6e 20 74 68 65 20 73 65 74 20 6f 66 20  e in the set of 
77e0: 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20 69 6e  source tables in
77f0: 20 70 53 72 63 4c 69 73 74 20 61 6e 64 20 6d 61   pSrcList and ma
7800: 6b 65 20 74 68 65 20 70 45 78 70 72 20 0a 2a 2a  ke the pExpr .**
7810: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
7820: 20 72 65 66 65 72 20 62 61 63 6b 20 74 6f 20 74   refer back to t
7830: 68 61 74 20 73 6f 75 72 63 65 20 63 6f 6c 75 6d  hat source colum
7840: 6e 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  n.  The followin
7850: 67 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65  g changes.** are
7860: 20 6d 61 64 65 20 74 6f 20 70 45 78 70 72 3a 0a   made to pExpr:.
7870: 2a 2a 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e  **.**    pExpr->
7880: 69 44 62 20 20 20 20 20 20 20 20 20 20 20 53 65  iDb           Se
7890: 74 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 64  t the index in d
78a0: 62 2d 3e 61 44 62 5b 5d 20 6f 66 20 74 68 65 20  b->aDb[] of the 
78b0: 64 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  database holding
78c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
78d0: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
78e0: 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 70 45 78  table..**    pEx
78f0: 70 72 2d 3e 69 54 61 62 6c 65 20 20 20 20 20 20  pr->iTable      
7900: 20 20 53 65 74 20 74 6f 20 74 68 65 20 63 75 72    Set to the cur
7910: 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  sor number for t
7920: 68 65 20 74 61 62 6c 65 20 6f 62 74 61 69 6e 65  he table obtaine
7930: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
7940: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 72 6f               fro
7950: 6d 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2a 20 20  m pSrcList..**  
7960: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
7970: 20 20 20 20 20 20 20 53 65 74 20 74 6f 20 74 68         Set to th
7980: 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  e column number 
7990: 77 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65  within the table
79a0: 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 6f  ..**    pExpr->o
79b0: 70 20 20 20 20 20 20 20 20 20 20 20 20 53 65 74  p            Set
79c0: 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 0a 2a   to TK_COLUMN..*
79d0: 2a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66  *    pExpr->pLef
79e0: 74 20 20 20 20 20 20 20 20 20 41 6e 79 20 65 78  t         Any ex
79f0: 70 72 65 73 73 69 6f 6e 20 74 68 69 73 20 70 6f  pression this po
7a00: 69 6e 74 73 20 74 6f 20 69 73 20 64 65 6c 65 74  ints to is delet
7a10: 65 64 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e  ed.**    pExpr->
7a20: 70 52 69 67 68 74 20 20 20 20 20 20 20 20 41 6e  pRight        An
7a30: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 69  y expression thi
7a40: 73 20 70 6f 69 6e 74 73 20 74 6f 20 69 73 20 64  s points to is d
7a50: 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  eleted..**.** Th
7a60: 65 20 70 44 62 54 6f 6b 65 6e 20 69 73 20 74 68  e pDbToken is th
7a70: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
7a80: 74 61 62 61 73 65 20 28 74 68 65 20 22 58 22 29  tabase (the "X")
7a90: 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61  .  This value ma
7aa0: 79 20 62 65 0a 2a 2a 20 4e 55 4c 4c 20 6d 65 61  y be.** NULL mea
7ab0: 6e 69 6e 67 20 74 68 61 74 20 6e 61 6d 65 20 69  ning that name i
7ac0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 59 2e  s of the form Y.
7ad0: 5a 20 6f 72 20 5a 2e 20 20 41 6e 79 20 61 76 61  Z or Z.  Any ava
7ae0: 69 6c 61 62 6c 65 20 64 61 74 61 62 61 73 65 0a  ilable database.
7af0: 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 2e 20  ** can be used. 
7b00: 20 54 68 65 20 70 54 61 62 6c 65 54 6f 6b 65 6e   The pTableToken
7b10: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
7b20: 74 68 65 20 74 61 62 6c 65 20 28 74 68 65 20 22  the table (the "
7b30: 59 22 29 2e 20 20 54 68 69 73 0a 2a 2a 20 76 61  Y").  This.** va
7b40: 6c 75 65 20 63 61 6e 20 62 65 20 4e 55 4c 4c 20  lue can be NULL 
7b50: 69 66 20 70 44 62 54 6f 6b 65 6e 20 69 73 20 61  if pDbToken is a
7b60: 6c 73 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 70 54  lso NULL.  If pT
7b70: 61 62 6c 65 54 6f 6b 65 6e 20 69 73 20 4e 55 4c  ableToken is NUL
7b80: 4c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  L it.** means th
7b90: 61 74 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 74  at the form of t
7ba0: 68 65 20 6e 61 6d 65 20 69 73 20 5a 20 61 6e 64  he name is Z and
7bb0: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 66 72   that columns fr
7bc0: 6f 6d 20 61 6e 79 20 74 61 62 6c 65 0a 2a 2a 20  om any table.** 
7bd0: 63 61 6e 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a  can be used..**.
7be0: 2a 2a 20 49 66 20 74 68 65 20 6e 61 6d 65 20 63  ** If the name c
7bf0: 61 6e 6e 6f 74 20 62 65 20 72 65 73 6f 6c 76 65  annot be resolve
7c00: 64 20 75 6e 61 6d 62 69 67 75 6f 75 73 6c 79 2c  d unambiguously,
7c10: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
7c20: 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50  message.** in pP
7c30: 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
7c40: 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 52 65 74 75 72  non-zero.  Retur
7c50: 6e 20 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73  n zero on succes
7c60: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
7c70: 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 0a 20 20 50   lookupName(.  P
7c80: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
7c90: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
7ca0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
7cb0: 54 6f 6b 65 6e 20 2a 70 44 62 54 6f 6b 65 6e 2c  Token *pDbToken,
7cc0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
7cd0: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
7ce0: 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2c 20 6f  taining table, o
7cf0: 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65  r NULL */.  Toke
7d00: 6e 20 2a 70 54 61 62 6c 65 54 6f 6b 65 6e 2c 20  n *pTableToken, 
7d10: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c   /* Name of tabl
7d20: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c  e containing col
7d30: 75 6d 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  umn, or NULL */.
7d40: 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e    Token *pColumn
7d50: 54 6f 6b 65 6e 2c 20 2f 2a 20 4e 61 6d 65 20 6f  Token, /* Name o
7d60: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 2a 2f  f the column. */
7d70: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
7d80: 70 4e 43 2c 20 20 20 20 2f 2a 20 54 68 65 20 6e  pNC,    /* The n
7d90: 61 6d 65 20 63 6f 6e 74 65 78 74 20 75 73 65 64  ame context used
7da0: 20 74 6f 20 72 65 73 6f 6c 76 65 20 74 68 65 20   to resolve the 
7db0: 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  name */.  Expr *
7dc0: 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20 2f  pExpr          /
7dd0: 2a 20 4d 61 6b 65 20 74 68 69 73 20 45 58 50 52  * Make this EXPR
7de0: 20 6e 6f 64 65 20 70 6f 69 6e 74 20 74 6f 20 74   node point to t
7df0: 68 65 20 73 65 6c 65 63 74 65 64 20 63 6f 6c 75  he selected colu
7e00: 6d 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  mn */.){.  char 
7e10: 2a 7a 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20  *zDb = 0;       
7e20: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
7e30: 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 22 58  atabase.  The "X
7e40: 22 20 69 6e 20 58 2e 59 2e 5a 20 2a 2f 0a 20 20  " in X.Y.Z */.  
7e50: 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 30 3b 20  char *zTab = 0; 
7e60: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
7e70: 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20  the table.  The 
7e80: 22 59 22 20 69 6e 20 58 2e 59 2e 5a 20 6f 72 20  "Y" in X.Y.Z or 
7e90: 59 2e 5a 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  Y.Z */.  char *z
7ea0: 43 6f 6c 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  Col = 0;      /*
7eb0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   Name of the col
7ec0: 75 6d 6e 2e 20 20 54 68 65 20 22 5a 22 20 2a 2f  umn.  The "Z" */
7ed0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
7ee0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
7ef0: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
7f00: 74 20 63 6e 74 20 3d 20 30 3b 20 20 20 20 20 20  t cnt = 0;      
7f10: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7f20: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  matching column 
7f30: 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 63  names */.  int c
7f40: 6e 74 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20  ntTab = 0;      
7f50: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74  /* Number of mat
7f60: 63 68 69 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65  ching table name
7f70: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
7f80: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
7f90: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
7fa0: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
7fb0: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
7fc0: 6d 3b 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20  m;       /* Use 
7fd0: 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  for looping over
7fe0: 20 70 53 72 63 4c 69 73 74 20 69 74 65 6d 73 20   pSrcList items 
7ff0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
8000: 69 73 74 5f 69 74 65 6d 20 2a 70 4d 61 74 63 68  ist_item *pMatch
8010: 20 3d 20 30 3b 20 20 2f 2a 20 54 68 65 20 6d 61   = 0;  /* The ma
8020: 74 63 68 69 6e 67 20 70 53 72 63 4c 69 73 74 20  tching pSrcList 
8030: 69 74 65 6d 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f  item */.  NameCo
8040: 6e 74 65 78 74 20 2a 70 54 6f 70 4e 43 20 3d 20  ntext *pTopNC = 
8050: 70 4e 43 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  pNC;        /* F
8060: 69 72 73 74 20 6e 61 6d 65 63 6f 6e 74 65 78 74  irst namecontext
8070: 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a   in the list */.
8080: 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d    Schema *pSchem
8090: 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  a = 0;          
80a0: 20 20 20 20 2f 2a 20 53 63 68 65 6d 61 20 6f 66      /* Schema of
80b0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
80c0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  */..  assert( pC
80d0: 6f 6c 75 6d 6e 54 6f 6b 65 6e 20 26 26 20 70 43  olumnToken && pC
80e0: 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e 7a 20 29 3b  olumnToken->z );
80f0: 20 2f 2a 20 54 68 65 20 5a 20 69 6e 20 58 2e 59   /* The Z in X.Y
8100: 2e 5a 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c  .Z cannot be NUL
8110: 4c 20 2a 2f 0a 20 20 7a 44 62 20 3d 20 73 71 6c  L */.  zDb = sql
8120: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
8130: 6e 28 64 62 2c 20 70 44 62 54 6f 6b 65 6e 29 3b  n(db, pDbToken);
8140: 0a 20 20 7a 54 61 62 20 3d 20 73 71 6c 69 74 65  .  zTab = sqlite
8150: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
8160: 62 2c 20 70 54 61 62 6c 65 54 6f 6b 65 6e 29 3b  b, pTableToken);
8170: 0a 20 20 7a 43 6f 6c 20 3d 20 73 71 6c 69 74 65  .  zCol = sqlite
8180: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
8190: 62 2c 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 29  b, pColumnToken)
81a0: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
81b0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
81c0: 67 6f 74 6f 20 6c 6f 6f 6b 75 70 6e 61 6d 65 5f  goto lookupname_
81d0: 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 70 45 78 70  end;.  }..  pExp
81e0: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2d 31 3b 0a  r->iTable = -1;.
81f0: 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20    while( pNC && 
8200: 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78  cnt==0 ){.    Ex
8210: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
8220: 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72      SrcList *pSr
8230: 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72  cList = pNC->pSr
8240: 63 4c 69 73 74 3b 0a 0a 20 20 20 20 69 66 28 20  cList;..    if( 
8250: 70 53 72 63 4c 69 73 74 20 29 7b 0a 20 20 20 20  pSrcList ){.    
8260: 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d    for(i=0, pItem
8270: 3d 70 53 72 63 4c 69 73 74 2d 3e 61 3b 20 69 3c  =pSrcList->a; i<
8280: 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pSrcList->nSrc; 
8290: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
82a0: 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54         Table *pT
82b0: 61 62 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ab;.        int 
82c0: 69 44 62 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c  iDb;.        Col
82d0: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 0a 20 20  umn *pCol;.  .  
82e0: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 49 74        pTab = pIt
82f0: 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  em->pTab;.      
8300: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d    assert( pTab!=
8310: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 44 62  0 );.        iDb
8320: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
8330: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
8340: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
8350: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
8360: 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20  ->nCol>0 );.    
8370: 20 20 20 20 69 66 28 20 7a 54 61 62 20 29 7b 0a      if( zTab ){.
8380: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
8390: 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20  tem->zAlias ){. 
83a0: 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
83b0: 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 49 74 65  *zTabName = pIte
83c0: 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20  m->zAlias;.     
83d0: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
83e0: 65 33 53 74 72 49 43 6d 70 28 7a 54 61 62 4e 61  e3StrICmp(zTabNa
83f0: 6d 65 2c 20 7a 54 61 62 29 21 3d 30 20 29 20 63  me, zTab)!=0 ) c
8400: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
8410: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8420: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62        char *zTab
8430: 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  Name = pTab->zNa
8440: 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
8450: 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20  if( zTabName==0 
8460: 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  || sqlite3StrICm
8470: 70 28 7a 54 61 62 4e 61 6d 65 2c 20 7a 54 61 62  p(zTabName, zTab
8480: 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
8490: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
84a0: 20 7a 44 62 21 3d 30 20 26 26 20 73 71 6c 69 74   zDb!=0 && sqlit
84b0: 65 33 53 74 72 49 43 6d 70 28 64 62 2d 3e 61 44  e3StrICmp(db->aD
84c0: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 7a 44  b[iDb].zName, zD
84d0: 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  b)!=0 ){.       
84e0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
84f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
8500: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8510: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
8520: 20 30 3d 3d 28 63 6e 74 54 61 62 2b 2b 29 20 29   0==(cntTab++) )
8530: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70  {.          pExp
8540: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 49 74 65  r->iTable = pIte
8550: 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
8560: 20 20 20 20 20 20 70 53 63 68 65 6d 61 20 3d 20        pSchema = 
8570: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3b 0a 20  pTab->pSchema;. 
8580: 20 20 20 20 20 20 20 20 20 70 4d 61 74 63 68 20           pMatch 
8590: 3d 20 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20  = pItem;.       
85a0: 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a   }.        for(j
85b0: 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61  =0, pCol=pTab->a
85c0: 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  Col; j<pTab->nCo
85d0: 6c 3b 20 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; j++, pCol++){
85e0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
85f0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
8600: 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29  ol->zName, zCol)
8610: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
8620: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
8630: 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Coll = pTab->aCo
8640: 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20  l[j].zColl;.    
8650: 20 20 20 20 20 20 20 20 49 64 4c 69 73 74 20 2a          IdList *
8660: 70 55 73 69 6e 67 3b 0a 20 20 20 20 20 20 20 20  pUsing;.        
8670: 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20      cnt++;.     
8680: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
8690: 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43  able = pItem->iC
86a0: 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  ursor;.         
86b0: 20 20 20 70 4d 61 74 63 68 20 3d 20 70 49 74 65     pMatch = pIte
86c0: 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  m;.            p
86d0: 53 63 68 65 6d 61 20 3d 20 70 54 61 62 2d 3e 70  Schema = pTab->p
86e0: 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20 20 20  Schema;.        
86f0: 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74      /* Substitut
8700: 65 20 74 68 65 20 72 6f 77 69 64 20 28 63 6f 6c  e the rowid (col
8710: 75 6d 6e 20 2d 31 29 20 66 6f 72 20 74 68 65 20  umn -1) for the 
8720: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
8730: 4b 45 59 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  KEY */.         
8740: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
8750: 6e 20 3d 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b  n = j==pTab->iPK
8760: 65 79 20 3f 20 2d 31 20 3a 20 6a 3b 0a 20 20 20  ey ? -1 : j;.   
8770: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
8780: 61 66 66 69 6e 69 74 79 20 3d 20 70 54 61 62 2d  affinity = pTab-
8790: 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66 69 6e 69 74  >aCol[j].affinit
87a0: 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  y;.            i
87b0: 66 28 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73  f( (pExpr->flags
87c0: 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65   & EP_ExpCollate
87d0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
87e0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 43 6f        pExpr->pCo
87f0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
8800: 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28  CollSeq(db, ENC(
8810: 64 62 29 2c 20 7a 43 6f 6c 6c 2c 2d 31 2c 20 30  db), zColl,-1, 0
8820: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
8830: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
8840: 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72   i<pSrcList->nSr
8850: 63 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  c-1 ){.         
8860: 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 5b 31       if( pItem[1
8870: 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ].jointype & JT_
8880: 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20 20 20  NATURAL ){.     
8890: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
88a0: 20 74 68 69 73 20 6d 61 74 63 68 20 6f 63 63 75   this match occu
88b0: 72 72 65 64 20 69 6e 20 74 68 65 20 6c 65 66 74  rred in the left
88c0: 20 74 61 62 6c 65 20 6f 66 20 61 20 6e 61 74 75   table of a natu
88d0: 72 61 6c 20 6a 6f 69 6e 2c 0a 20 20 20 20 20 20  ral join,.      
88e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
88f0: 6e 20 73 6b 69 70 20 74 68 65 20 72 69 67 68 74  n skip the right
8900: 20 74 61 62 6c 65 20 74 6f 20 61 76 6f 69 64 20   table to avoid 
8910: 61 20 64 75 70 6c 69 63 61 74 65 20 6d 61 74 63  a duplicate matc
8920: 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  h */.           
8930: 20 20 20 20 20 70 49 74 65 6d 2b 2b 3b 0a 20 20       pItem++;.  
8940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 2b                i+
8950: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  +;.             
8960: 20 7d 65 6c 73 65 20 69 66 28 20 28 70 55 73 69   }else if( (pUsi
8970: 6e 67 20 3d 20 70 49 74 65 6d 5b 31 5d 2e 70 55  ng = pItem[1].pU
8980: 73 69 6e 67 29 21 3d 30 20 29 7b 0a 20 20 20 20  sing)!=0 ){.    
8990: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
89a0: 66 20 74 68 69 73 20 6d 61 74 63 68 20 6f 63 63  f this match occ
89b0: 75 72 73 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20  urs on a column 
89c0: 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 55  that is in the U
89d0: 53 49 4e 47 20 63 6c 61 75 73 65 0a 20 20 20 20  SING clause.    
89e0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f              ** o
89f0: 66 20 61 20 6a 6f 69 6e 2c 20 73 6b 69 70 20 74  f a join, skip t
8a00: 68 65 20 73 65 61 72 63 68 20 6f 66 20 74 68 65  he search of the
8a10: 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20   right table of 
8a20: 74 68 65 20 6a 6f 69 6e 0a 20 20 20 20 20 20 20  the join.       
8a30: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61           ** to a
8a40: 76 6f 69 64 20 61 20 64 75 70 6c 69 63 61 74 65  void a duplicate
8a50: 20 6d 61 74 63 68 20 74 68 65 72 65 2e 20 2a 2f   match there. */
8a60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8a70: 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20   int k;.        
8a80: 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b          for(k=0;
8a90: 20 6b 3c 70 55 73 69 6e 67 2d 3e 6e 49 64 3b 20   k<pUsing->nId; 
8aa0: 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  k++){.          
8ab0: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
8ac0: 74 65 33 53 74 72 49 43 6d 70 28 70 55 73 69 6e  te3StrICmp(pUsin
8ad0: 67 2d 3e 61 5b 6b 5d 2e 7a 4e 61 6d 65 2c 20 7a  g->a[k].zName, z
8ae0: 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Col)==0 ){.     
8af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
8b00: 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Item++;.        
8b10: 20 20 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b              i++;
8b20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8b30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
8b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b60: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
8b70: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
8b80: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
8b90: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
8ba0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
8bb0: 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  .    }..#ifndef 
8bc0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
8bd0: 47 45 52 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  GER.    /* If we
8be0: 20 68 61 76 65 20 6e 6f 74 20 61 6c 72 65 61 64   have not alread
8bf0: 79 20 72 65 73 6f 6c 76 65 64 20 74 68 65 20 6e  y resolved the n
8c00: 61 6d 65 2c 20 74 68 65 6e 20 6d 61 79 62 65 20  ame, then maybe 
8c10: 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 61 20  .    ** it is a 
8c20: 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 74  new.* or old.* t
8c30: 72 69 67 67 65 72 20 61 72 67 75 6d 65 6e 74 20  rigger argument 
8c40: 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20 2a 2f  reference.    */
8c50: 0a 20 20 20 20 69 66 28 20 7a 44 62 3d 3d 30 20  .    if( zDb==0 
8c60: 26 26 20 7a 54 61 62 21 3d 30 20 26 26 20 63 6e  && zTab!=0 && cn
8c70: 74 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e  t==0 && pParse->
8c80: 74 72 69 67 53 74 61 63 6b 21 3d 30 20 29 7b 0a  trigStack!=0 ){.
8c90: 20 20 20 20 20 20 54 72 69 67 67 65 72 53 74 61        TriggerSta
8ca0: 63 6b 20 2a 70 54 72 69 67 67 65 72 53 74 61 63  ck *pTriggerStac
8cb0: 6b 20 3d 20 70 50 61 72 73 65 2d 3e 74 72 69 67  k = pParse->trig
8cc0: 53 74 61 63 6b 3b 0a 20 20 20 20 20 20 54 61 62  Stack;.      Tab
8cd0: 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20  le *pTab = 0;.  
8ce0: 20 20 20 20 75 33 32 20 2a 70 69 43 6f 6c 4d 61      u32 *piColMa
8cf0: 73 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  sk;.      if( pT
8d00: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6e 65 77  riggerStack->new
8d10: 49 64 78 20 21 3d 20 2d 31 20 26 26 20 73 71 6c  Idx != -1 && sql
8d20: 69 74 65 33 53 74 72 49 43 6d 70 28 22 6e 65 77  ite3StrICmp("new
8d30: 22 2c 20 7a 54 61 62 29 20 3d 3d 20 30 20 29 7b  ", zTab) == 0 ){
8d40: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
8d50: 69 54 61 62 6c 65 20 3d 20 70 54 72 69 67 67 65  iTable = pTrigge
8d60: 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64 78 3b 0a  rStack->newIdx;.
8d70: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8d80: 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70  pTriggerStack->p
8d90: 54 61 62 20 29 3b 0a 20 20 20 20 20 20 20 20 70  Tab );.        p
8da0: 54 61 62 20 3d 20 70 54 72 69 67 67 65 72 53 74  Tab = pTriggerSt
8db0: 61 63 6b 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  ack->pTab;.     
8dc0: 20 20 20 70 69 43 6f 6c 4d 61 73 6b 20 3d 20 26     piColMask = &
8dd0: 28 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e  (pTriggerStack->
8de0: 6e 65 77 43 6f 6c 4d 61 73 6b 29 3b 0a 20 20 20  newColMask);.   
8df0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 72     }else if( pTr
8e00: 69 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 49  iggerStack->oldI
8e10: 64 78 20 21 3d 20 2d 31 20 26 26 20 73 71 6c 69  dx != -1 && sqli
8e20: 74 65 33 53 74 72 49 43 6d 70 28 22 6f 6c 64 22  te3StrICmp("old"
8e30: 2c 20 7a 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20  , zTab)==0 ){.  
8e40: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
8e50: 62 6c 65 20 3d 20 70 54 72 69 67 67 65 72 53 74  ble = pTriggerSt
8e60: 61 63 6b 2d 3e 6f 6c 64 49 64 78 3b 0a 20 20 20  ack->oldIdx;.   
8e70: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72       assert( pTr
8e80: 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62  iggerStack->pTab
8e90: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62   );.        pTab
8ea0: 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63 6b   = pTriggerStack
8eb0: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
8ec0: 70 69 43 6f 6c 4d 61 73 6b 20 3d 20 26 28 70 54  piColMask = &(pT
8ed0: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64  riggerStack->old
8ee0: 43 6f 6c 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20  ColMask);.      
8ef0: 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  }..      if( pTa
8f00: 62 20 29 7b 20 0a 20 20 20 20 20 20 20 20 69 6e  b ){ .        in
8f10: 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  t iCol;.        
8f20: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 70  Column *pCol = p
8f30: 54 61 62 2d 3e 61 43 6f 6c 3b 0a 0a 20 20 20 20  Tab->aCol;..    
8f40: 20 20 20 20 70 53 63 68 65 6d 61 20 3d 20 70 54      pSchema = pT
8f50: 61 62 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20  ab->pSchema;.   
8f60: 20 20 20 20 20 63 6e 74 54 61 62 2b 2b 3b 0a 20       cntTab++;. 
8f70: 20 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d         for(iCol=
8f80: 30 3b 20 69 43 6f 6c 20 3c 20 70 54 61 62 2d 3e  0; iCol < pTab->
8f90: 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 2c 20 70 43  nCol; iCol++, pC
8fa0: 6f 6c 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20 20  ol++) {.        
8fb0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
8fc0: 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  ICmp(pCol->zName
8fd0: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20  , zCol)==0 ){.  
8fe0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
8ff0: 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 54  char *zColl = pT
9000: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
9010: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  Coll;.          
9020: 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20    cnt++;.       
9030: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
9040: 75 6d 6e 20 3d 20 69 43 6f 6c 3d 3d 70 54 61 62  umn = iCol==pTab
9050: 2d 3e 69 50 4b 65 79 20 3f 20 2d 31 20 3a 20 69  ->iPKey ? -1 : i
9060: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Col;.           
9070: 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
9080: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
9090: 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  ol].affinity;.  
90a0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
90b0: 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
90c0: 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3d 3d 30 20  _ExpCollate)==0 
90d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
90e0: 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20   pExpr->pColl = 
90f0: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
9100: 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20  eq(db, ENC(db), 
9110: 7a 43 6f 6c 6c 2c 2d 31 2c 20 30 29 3b 0a 20 20  zColl,-1, 0);.  
9120: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
9130: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
9140: 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20  Tab = pTab;.    
9150: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
9160: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
9170: 20 20 20 20 20 2a 70 69 43 6f 6c 4d 61 73 6b 20       *piColMask 
9180: 7c 3d 20 28 28 75 33 32 29 31 3c 3c 69 43 6f 6c  |= ((u32)1<<iCol
9190: 29 20 7c 20 28 69 43 6f 6c 3e 3d 33 32 3f 30 78  ) | (iCol>=32?0x
91a0: 66 66 66 66 66 66 66 66 3a 30 29 3b 0a 20 20 20  ffffffff:0);.   
91b0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
91c0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
91d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
91e0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
91f0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
9200: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
9210: 5f 54 52 49 47 47 45 52 29 20 2a 2f 0a 0a 20 20  _TRIGGER) */..  
9220: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 50 65 72 68    /*.    ** Perh
9230: 61 70 73 20 74 68 65 20 6e 61 6d 65 20 69 73 20  aps the name is 
9240: 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
9250: 68 65 20 52 4f 57 49 44 0a 20 20 20 20 2a 2f 0a  he ROWID.    */.
9260: 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26      if( cnt==0 &
9270: 26 20 63 6e 74 54 61 62 3d 3d 31 20 26 26 20 73  & cntTab==1 && s
9280: 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43  qlite3IsRowid(zC
9290: 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 63 6e 74  ol) ){.      cnt
92a0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 45 78 70   = 1;.      pExp
92b0: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b  r->iColumn = -1;
92c0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66  .      pExpr->af
92d0: 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f  finity = SQLITE_
92e0: 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  AFF_INTEGER;.   
92f0: 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
9300: 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 69  * If the input i
9310: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 5a 20  s of the form Z 
9320: 28 6e 6f 74 20 59 2e 5a 20 6f 72 20 58 2e 59 2e  (not Y.Z or X.Y.
9330: 5a 29 20 74 68 65 6e 20 74 68 65 20 6e 61 6d 65  Z) then the name
9340: 20 5a 0a 20 20 20 20 2a 2a 20 6d 69 67 68 74 20   Z.    ** might 
9350: 72 65 66 65 72 20 74 6f 20 61 6e 20 72 65 73 75  refer to an resu
9360: 6c 74 2d 73 65 74 20 61 6c 69 61 73 2e 20 20 54  lt-set alias.  T
9370: 68 69 73 20 68 61 70 70 65 6e 73 2c 20 66 6f 72  his happens, for
9380: 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a 20   example, when. 
9390: 20 20 20 2a 2a 20 77 65 20 61 72 65 20 72 65 73     ** we are res
93a0: 6f 6c 76 69 6e 67 20 6e 61 6d 65 73 20 69 6e 20  olving names in 
93b0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
93c0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
93d0: 67 20 63 6f 6d 6d 61 6e 64 3a 0a 20 20 20 20 2a  g command:.    *
93e0: 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 45 4c  *.    **     SEL
93f0: 45 43 54 20 61 2b 62 20 41 53 20 78 20 46 52 4f  ECT a+b AS x FRO
9400: 4d 20 74 61 62 6c 65 20 57 48 45 52 45 20 78 3c  M table WHERE x<
9410: 31 30 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  10;.    **.    *
9420: 2a 20 49 6e 20 63 61 73 65 73 20 6c 69 6b 65 20  * In cases like 
9430: 74 68 69 73 2c 20 72 65 70 6c 61 63 65 20 70 45  this, replace pE
9440: 78 70 72 20 77 69 74 68 20 61 20 63 6f 70 79 20  xpr with a copy 
9450: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
9460: 6e 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 66 6f  n that.    ** fo
9470: 72 6d 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  rms the result s
9480: 65 74 20 65 6e 74 72 79 20 28 22 61 2b 62 22 20  et entry ("a+b" 
9490: 69 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 29 20  in the example) 
94a0: 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d 65 64  and return immed
94b0: 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 4e  iately..    ** N
94c0: 6f 74 65 20 74 68 61 74 20 74 68 65 20 65 78 70  ote that the exp
94d0: 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 72  ression in the r
94e0: 65 73 75 6c 74 20 73 65 74 20 73 68 6f 75 6c 64  esult set should
94f0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
9500: 65 6e 0a 20 20 20 20 2a 2a 20 72 65 73 6f 6c 76  en.    ** resolv
9510: 65 64 20 62 79 20 74 68 65 20 74 69 6d 65 20 74  ed by the time t
9520: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
9530: 69 73 20 72 65 73 6f 6c 76 65 64 2e 0a 20 20 20  is resolved..   
9540: 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e 74 3d   */.    if( cnt=
9550: 3d 30 20 26 26 20 28 70 45 4c 69 73 74 20 3d 20  =0 && (pEList = 
9560: 70 4e 43 2d 3e 70 45 4c 69 73 74 29 21 3d 30 20  pNC->pEList)!=0 
9570: 26 26 20 7a 54 61 62 3d 3d 30 20 29 7b 0a 20 20  && zTab==0 ){.  
9580: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
9590: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b  EList->nExpr; j+
95a0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  +){.        char
95b0: 20 2a 7a 41 73 20 3d 20 70 45 4c 69 73 74 2d 3e   *zAs = pEList->
95c0: 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[j].zName;.    
95d0: 20 20 20 20 69 66 28 20 7a 41 73 21 3d 30 20 26      if( zAs!=0 &
95e0: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
95f0: 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29  (zAs, zCol)==0 )
9600: 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
9610: 20 2a 70 44 75 70 2c 20 2a 70 4f 72 69 67 3b 0a   *pDup, *pOrig;.
9620: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
9630: 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d  ( pExpr->pLeft==
9640: 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67  0 && pExpr->pRig
9650: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ht==0 );.       
9660: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
9670: 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20  ->pList==0 );.  
9680: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9690: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 3d 3d  pExpr->pSelect==
96a0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  0 );.          p
96b0: 4f 72 69 67 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Orig = pEList->a
96c0: 5b 6a 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [j].pExpr;.     
96d0: 20 20 20 20 20 69 66 28 20 21 70 4e 43 2d 3e 61       if( !pNC->a
96e0: 6c 6c 6f 77 41 67 67 20 26 26 20 45 78 70 72 48  llowAgg && ExprH
96f0: 61 73 50 72 6f 70 65 72 74 79 28 70 4f 72 69 67  asProperty(pOrig
9700: 2c 20 45 50 5f 41 67 67 29 20 29 7b 0a 20 20 20  , EP_Agg) ){.   
9710: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
9720: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
9730: 20 22 6d 69 73 75 73 65 20 6f 66 20 61 6c 69 61   "misuse of alia
9740: 73 65 64 20 61 67 67 72 65 67 61 74 65 20 25 73  sed aggregate %s
9750: 22 2c 20 7a 41 73 29 3b 0a 20 20 20 20 20 20 20  ", zAs);.       
9760: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
9770: 65 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  e(zCol);.       
9780: 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20       return 2;. 
9790: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
97a0: 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69       pDup = sqli
97b0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
97c0: 4f 72 69 67 29 3b 0a 20 20 20 20 20 20 20 20 20  Orig);.         
97d0: 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67   if( pExpr->flag
97e0: 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74  s & EP_ExpCollat
97f0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
9800: 20 70 44 75 70 2d 3e 70 43 6f 6c 6c 20 3d 20 70   pDup->pColl = p
9810: 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20  Expr->pColl;.   
9820: 20 20 20 20 20 20 20 20 20 70 44 75 70 2d 3e 66           pDup->f
9830: 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f  lags |= EP_ExpCo
9840: 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 20 20 20  llate;.         
9850: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
9860: 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e   pExpr->span.dyn
9870: 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
9880: 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 73 70  (char*)pExpr->sp
9890: 61 6e 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 20  an.z);.         
98a0: 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65   if( pExpr->toke
98b0: 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74 65 33 5f  n.dyn ) sqlite3_
98c0: 66 72 65 65 28 28 63 68 61 72 2a 29 70 45 78 70  free((char*)pExp
98d0: 72 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20  r->token.z);.   
98e0: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 45         memcpy(pE
98f0: 78 70 72 2c 20 70 44 75 70 2c 20 73 69 7a 65 6f  xpr, pDup, sizeo
9900: 66 28 2a 70 45 78 70 72 29 29 3b 0a 20 20 20 20  f(*pExpr));.    
9910: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
9920: 65 65 28 70 44 75 70 29 3b 0a 20 20 20 20 20 20  ee(pDup);.      
9930: 20 20 20 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20      cnt = 1;.   
9940: 20 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20         pMatch = 
9950: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  0;.          ass
9960: 65 72 74 28 20 7a 54 61 62 3d 3d 30 20 26 26 20  ert( zTab==0 && 
9970: 7a 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  zDb==0 );.      
9980: 20 20 20 20 67 6f 74 6f 20 6c 6f 6f 6b 75 70 6e      goto lookupn
9990: 61 6d 65 5f 65 6e 64 5f 32 3b 0a 20 20 20 20 20  ame_end_2;.     
99a0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 0a 20 20     }.      } .  
99b0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 76 61    }..    /* Adva
99c0: 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  nce to the next 
99d0: 6e 61 6d 65 20 63 6f 6e 74 65 78 74 2e 20 20 54  name context.  T
99e0: 68 65 20 6c 6f 6f 70 20 77 69 6c 6c 20 65 78 69  he loop will exi
99f0: 74 20 77 68 65 6e 20 65 69 74 68 65 72 0a 20 20  t when either.  
9a00: 20 20 2a 2a 20 77 65 20 68 61 76 65 20 61 20 6d    ** we have a m
9a10: 61 74 63 68 20 28 63 6e 74 3e 30 29 20 6f 72 20  atch (cnt>0) or 
9a20: 77 68 65 6e 20 77 65 20 72 75 6e 20 6f 75 74 20  when we run out 
9a30: 6f 66 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 73  of name contexts
9a40: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
9a50: 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20   cnt==0 ){.     
9a60: 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78   pNC = pNC->pNex
9a70: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
9a80: 2f 2a 0a 20 20 2a 2a 20 49 66 20 58 20 61 6e 64  /*.  ** If X and
9a90: 20 59 20 61 72 65 20 4e 55 4c 4c 20 28 69 6e 20   Y are NULL (in 
9aa0: 6f 74 68 65 72 20 77 6f 72 64 73 20 69 66 20 6f  other words if o
9ab0: 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  nly the column n
9ac0: 61 6d 65 20 5a 20 69 73 0a 20 20 2a 2a 20 73 75  ame Z is.  ** su
9ad0: 70 70 6c 69 65 64 29 20 61 6e 64 20 74 68 65 20  pplied) and the 
9ae0: 76 61 6c 75 65 20 6f 66 20 5a 20 69 73 20 65 6e  value of Z is en
9af0: 63 6c 6f 73 65 64 20 69 6e 20 64 6f 75 62 6c 65  closed in double
9b00: 2d 71 75 6f 74 65 73 2c 20 74 68 65 6e 0a 20 20  -quotes, then.  
9b10: 2a 2a 20 5a 20 69 73 20 61 20 73 74 72 69 6e 67  ** Z is a string
9b20: 20 6c 69 74 65 72 61 6c 20 69 66 20 69 74 20 64   literal if it d
9b30: 6f 65 73 6e 27 74 20 6d 61 74 63 68 20 61 6e 79  oesn't match any
9b40: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20   column names.  
9b50: 49 6e 20 74 68 61 74 0a 20 20 2a 2a 20 63 61 73  In that.  ** cas
9b60: 65 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65  e, we need to re
9b70: 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 20  turn right away 
9b80: 61 6e 64 20 6e 6f 74 20 6d 61 6b 65 20 61 6e 79  and not make any
9b90: 20 63 68 61 6e 67 65 73 20 74 6f 0a 20 20 2a 2a   changes to.  **
9ba0: 20 70 45 78 70 72 2e 0a 20 20 2a 2a 0a 20 20 2a   pExpr..  **.  *
9bb0: 2a 20 42 65 63 61 75 73 65 20 6e 6f 20 72 65 66  * Because no ref
9bc0: 65 72 65 6e 63 65 20 77 61 73 20 6d 61 64 65 20  erence was made 
9bd0: 74 6f 20 6f 75 74 65 72 20 63 6f 6e 74 65 78 74  to outer context
9be0: 73 2c 20 74 68 65 20 70 4e 43 2d 3e 6e 52 65 66  s, the pNC->nRef
9bf0: 0a 20 20 2a 2a 20 66 69 65 6c 64 73 20 61 72 65  .  ** fields are
9c00: 20 6e 6f 74 20 63 68 61 6e 67 65 64 20 69 6e 20   not changed in 
9c10: 61 6e 79 20 63 6f 6e 74 65 78 74 2e 0a 20 20 2a  any context..  *
9c20: 2f 0a 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26  /.  if( cnt==0 &
9c30: 26 20 7a 54 61 62 3d 3d 30 20 26 26 20 70 43 6f  & zTab==0 && pCo
9c40: 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d  lumnToken->z[0]=
9c50: 3d 27 22 27 20 29 7b 0a 20 20 20 20 73 71 6c 69  ='"' ){.    sqli
9c60: 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c 29 3b 0a  te3_free(zCol);.
9c70: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
9c80: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63 6e 74  }..  /*.  ** cnt
9c90: 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 72 65 20  ==0 means there 
9ca0: 77 61 73 20 6e 6f 74 20 6d 61 74 63 68 2e 20 20  was not match.  
9cb0: 63 6e 74 3e 31 20 6d 65 61 6e 73 20 74 68 65 72  cnt>1 means ther
9cc0: 65 20 77 65 72 65 20 74 77 6f 20 6f 72 0a 20 20  e were two or.  
9cd0: 2a 2a 20 6d 6f 72 65 20 6d 61 74 63 68 65 73 2e  ** more matches.
9ce0: 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 77 65    Either way, we
9cf0: 20 68 61 76 65 20 61 6e 20 65 72 72 6f 72 2e 0a   have an error..
9d00: 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74 21 3d    */.  if( cnt!=
9d10: 31 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  1 ){.    const c
9d20: 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 7a  har *zErr;.    z
9d30: 45 72 72 20 3d 20 63 6e 74 3d 3d 30 20 3f 20 22  Err = cnt==0 ? "
9d40: 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e 22 20  no such column" 
9d50: 3a 20 22 61 6d 62 69 67 75 6f 75 73 20 63 6f 6c  : "ambiguous col
9d60: 75 6d 6e 20 6e 61 6d 65 22 3b 0a 20 20 20 20 69  umn name";.    i
9d70: 66 28 20 7a 44 62 20 29 7b 0a 20 20 20 20 20 20  f( zDb ){.      
9d80: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
9d90: 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73 2e  pParse, "%s: %s.
9da0: 25 73 2e 25 73 22 2c 20 7a 45 72 72 2c 20 7a 44  %s.%s", zErr, zD
9db0: 62 2c 20 7a 54 61 62 2c 20 7a 43 6f 6c 29 3b 0a  b, zTab, zCol);.
9dc0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 54      }else if( zT
9dd0: 61 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ab ){.      sqli
9de0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
9df0: 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73 22 2c  se, "%s: %s.%s",
9e00: 20 7a 45 72 72 2c 20 7a 54 61 62 2c 20 7a 43 6f   zErr, zTab, zCo
9e10: 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  l);.    }else{. 
9e20: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
9e30: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
9e40: 3a 20 25 73 22 2c 20 7a 45 72 72 2c 20 7a 43 6f  : %s", zErr, zCo
9e50: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  l);.    }.    pT
9e60: 6f 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  opNC->nErr++;.  
9e70: 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c  }..  /* If a col
9e80: 75 6d 6e 20 66 72 6f 6d 20 61 20 74 61 62 6c 65  umn from a table
9e90: 20 69 6e 20 70 53 72 63 4c 69 73 74 20 69 73 20   in pSrcList is 
9ea0: 72 65 66 65 72 65 6e 63 65 64 2c 20 74 68 65 6e  referenced, then
9eb0: 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 74 68 69   record.  ** thi
9ec0: 73 20 66 61 63 74 20 69 6e 20 74 68 65 20 70 53  s fact in the pS
9ed0: 72 63 4c 69 73 74 2e 61 5b 5d 2e 63 6f 6c 55 73  rcList.a[].colUs
9ee0: 65 64 20 62 69 74 6d 61 73 6b 2e 20 20 43 6f 6c  ed bitmask.  Col
9ef0: 75 6d 6e 20 30 20 63 61 75 73 65 73 0a 20 20 2a  umn 0 causes.  *
9f00: 2a 20 62 69 74 20 30 20 74 6f 20 62 65 20 73 65  * bit 0 to be se
9f10: 74 2e 20 20 43 6f 6c 75 6d 6e 20 31 20 73 65 74  t.  Column 1 set
9f20: 73 20 62 69 74 20 31 2e 20 20 41 6e 64 20 73 6f  s bit 1.  And so
9f30: 20 66 6f 72 74 68 2e 20 20 49 66 20 74 68 65 0a   forth.  If the.
9f40: 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62    ** column numb
9f50: 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68  er is greater th
9f60: 61 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  an the number of
9f70: 20 62 69 74 73 20 69 6e 20 74 68 65 20 62 69 74   bits in the bit
9f80: 6d 61 73 6b 0a 20 20 2a 2a 20 74 68 65 6e 20 73  mask.  ** then s
9f90: 65 74 20 74 68 65 20 68 69 67 68 2d 6f 72 64 65  et the high-orde
9fa0: 72 20 62 69 74 20 6f 66 20 74 68 65 20 62 69 74  r bit of the bit
9fb0: 6d 61 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  mask..  */.  if(
9fc0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e   pExpr->iColumn>
9fd0: 3d 30 20 26 26 20 70 4d 61 74 63 68 21 3d 30 20  =0 && pMatch!=0 
9fe0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70  ){.    int n = p
9ff0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
a000: 20 20 20 69 66 28 20 6e 3e 3d 73 69 7a 65 6f 66     if( n>=sizeof
a010: 28 42 69 74 6d 61 73 6b 29 2a 38 20 29 7b 0a 20  (Bitmask)*8 ){. 
a020: 20 20 20 20 20 6e 20 3d 20 73 69 7a 65 6f 66 28       n = sizeof(
a030: 42 69 74 6d 61 73 6b 29 2a 38 2d 31 3b 0a 20 20  Bitmask)*8-1;.  
a040: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
a050: 70 4d 61 74 63 68 2d 3e 69 43 75 72 73 6f 72 3d  pMatch->iCursor=
a060: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29  =pExpr->iTable )
a070: 3b 0a 20 20 20 20 70 4d 61 74 63 68 2d 3e 63 6f  ;.    pMatch->co
a080: 6c 55 73 65 64 20 7c 3d 20 28 28 42 69 74 6d 61  lUsed |= ((Bitma
a090: 73 6b 29 31 29 3c 3c 6e 3b 0a 20 20 7d 0a 0a 6c  sk)1)<<n;.  }..l
a0a0: 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 3a 0a 20  ookupname_end:. 
a0b0: 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64   /* Clean up and
a0c0: 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73   return.  */.  s
a0d0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 44 62 29  qlite3_free(zDb)
a0e0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
a0f0: 28 7a 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65  (zTab);.  sqlite
a100: 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 78 70  3ExprDelete(pExp
a110: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 70 45 78  r->pLeft);.  pEx
a120: 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20  pr->pLeft = 0;. 
a130: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
a140: 74 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  te(pExpr->pRight
a150: 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52 69 67  );.  pExpr->pRig
a160: 68 74 20 3d 20 30 3b 0a 20 20 70 45 78 70 72 2d  ht = 0;.  pExpr-
a170: 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b  >op = TK_COLUMN;
a180: 0a 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 5f  .lookupname_end_
a190: 32 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  2:.  sqlite3_fre
a1a0: 65 28 7a 43 6f 6c 29 3b 0a 20 20 69 66 28 20 63  e(zCol);.  if( c
a1b0: 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 61 73 73  nt==1 ){.    ass
a1c0: 65 72 74 28 20 70 4e 43 21 3d 30 20 29 3b 0a 20  ert( pNC!=0 );. 
a1d0: 20 20 20 73 71 6c 69 74 65 33 41 75 74 68 52 65     sqlite3AuthRe
a1e0: 61 64 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ad(pParse, pExpr
a1f0: 2c 20 70 53 63 68 65 6d 61 2c 20 70 4e 43 2d 3e  , pSchema, pNC->
a200: 70 53 72 63 4c 69 73 74 29 3b 0a 20 20 20 20 69  pSrcList);.    i
a210: 66 28 20 70 4d 61 74 63 68 20 26 26 20 21 70 4d  f( pMatch && !pM
a220: 61 74 63 68 2d 3e 70 53 65 6c 65 63 74 20 29 7b  atch->pSelect ){
a230: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 54  .      pExpr->pT
a240: 61 62 20 3d 20 70 4d 61 74 63 68 2d 3e 70 54 61  ab = pMatch->pTa
a250: 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  b;.    }.    /* 
a260: 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 6e 52  Increment the nR
a270: 65 66 20 76 61 6c 75 65 20 6f 6e 20 61 6c 6c 20  ef value on all 
a280: 6e 61 6d 65 20 63 6f 6e 74 65 78 74 73 20 66 72  name contexts fr
a290: 6f 6d 20 54 6f 70 4e 43 20 75 70 20 74 6f 0a 20  om TopNC up to. 
a2a0: 20 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 20     ** the point 
a2b0: 77 68 65 72 65 20 74 68 65 20 6e 61 6d 65 20 6d  where the name m
a2c0: 61 74 63 68 65 64 2e 20 2a 2f 0a 20 20 20 20 66  atched. */.    f
a2d0: 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 61 73  or(;;){.      as
a2e0: 73 65 72 74 28 20 70 54 6f 70 4e 43 21 3d 30 20  sert( pTopNC!=0 
a2f0: 29 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e 43 2d  );.      pTopNC-
a300: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 69  >nRef++;.      i
a310: 66 28 20 70 54 6f 70 4e 43 3d 3d 70 4e 43 20 29  f( pTopNC==pNC )
a320: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 54   break;.      pT
a330: 6f 70 4e 43 20 3d 20 70 54 6f 70 4e 43 2d 3e 70  opNC = pTopNC->p
a340: 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
a350: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20 65 6c  return 0;.  } el
a360: 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  se {.    return 
a370: 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
a380: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
a390: 64 65 73 69 67 6e 65 64 20 61 73 20 61 6e 20 78  designed as an x
a3a0: 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b 45 78 70  Func for walkExp
a3b0: 72 54 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 52  rTree()..**.** R
a3c0: 65 73 6f 6c 76 65 20 73 79 6d 62 6f 6c 69 63 20  esolve symbolic 
a3d0: 6e 61 6d 65 73 20 69 6e 74 6f 20 54 4b 5f 43 4f  names into TK_CO
a3e0: 4c 55 4d 4e 20 6f 70 65 72 61 74 6f 72 73 20 66  LUMN operators f
a3f0: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  or the current.*
a400: 2a 20 6e 6f 64 65 20 69 6e 20 74 68 65 20 65 78  * node in the ex
a410: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
a420: 52 65 74 75 72 6e 20 30 20 74 6f 20 63 6f 6e 74  Return 0 to cont
a430: 69 6e 75 65 20 74 68 65 20 73 65 61 72 63 68 20  inue the search 
a440: 64 6f 77 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65  down.** the tree
a450: 20 6f 72 20 32 20 74 6f 20 61 62 6f 72 74 20 74   or 2 to abort t
a460: 68 65 20 74 72 65 65 20 77 61 6c 6b 2e 0a 2a 2a  he tree walk..**
a470: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
a480: 20 61 6c 73 6f 20 64 6f 65 73 20 65 72 72 6f 72   also does error
a490: 20 63 68 65 63 6b 69 6e 67 20 61 6e 64 20 6e 61   checking and na
a4a0: 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 66 6f  me resolution fo
a4b0: 72 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6e 61  r.** function na
a4c0: 6d 65 73 2e 20 20 54 68 65 20 6f 70 65 72 61 74  mes.  The operat
a4d0: 6f 72 20 66 6f 72 20 61 67 67 72 65 67 61 74 65  or for aggregate
a4e0: 20 66 75 6e 63 74 69 6f 6e 73 20 69 73 20 63 68   functions is ch
a4f0: 61 6e 67 65 64 0a 2a 2a 20 74 6f 20 54 4b 5f 41  anged.** to TK_A
a500: 47 47 5f 46 55 4e 43 54 49 4f 4e 2e 0a 2a 2f 0a  GG_FUNCTION..*/.
a510: 73 74 61 74 69 63 20 69 6e 74 20 6e 61 6d 65 52  static int nameR
a520: 65 73 6f 6c 76 65 72 53 74 65 70 28 76 6f 69 64  esolverStep(void
a530: 20 2a 70 41 72 67 2c 20 45 78 70 72 20 2a 70 45   *pArg, Expr *pE
a540: 78 70 72 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e 74  xpr){.  NameCont
a550: 65 78 74 20 2a 70 4e 43 20 3d 20 28 4e 61 6d 65  ext *pNC = (Name
a560: 43 6f 6e 74 65 78 74 2a 29 70 41 72 67 3b 0a 20  Context*)pArg;. 
a570: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a   Parse *pParse;.
a580: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
a590: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 61 73  ) return 1;.  as
a5a0: 73 65 72 74 28 20 70 4e 43 21 3d 30 20 29 3b 0a  sert( pNC!=0 );.
a5b0: 20 20 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e    pParse = pNC->
a5c0: 70 50 61 72 73 65 3b 0a 0a 20 20 69 66 28 20 45  pParse;..  if( E
a5d0: 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74  xprHasAnyPropert
a5e0: 79 28 70 45 78 70 72 2c 20 45 50 5f 52 65 73 6f  y(pExpr, EP_Reso
a5f0: 6c 76 65 64 29 20 29 20 72 65 74 75 72 6e 20 31  lved) ) return 1
a600: 3b 0a 20 20 45 78 70 72 53 65 74 50 72 6f 70 65  ;.  ExprSetPrope
a610: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 52 65  rty(pExpr, EP_Re
a620: 73 6f 6c 76 65 64 29 3b 0a 23 69 66 6e 64 65 66  solved);.#ifndef
a630: 20 4e 44 45 42 55 47 0a 20 20 69 66 28 20 70 4e   NDEBUG.  if( pN
a640: 43 2d 3e 70 53 72 63 4c 69 73 74 20 26 26 20 70  C->pSrcList && p
a650: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 2d 3e 6e 41  NC->pSrcList->nA
a660: 6c 6c 6f 63 3e 30 20 29 7b 0a 20 20 20 20 53 72  lloc>0 ){.    Sr
a670: 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20  cList *pSrcList 
a680: 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b  = pNC->pSrcList;
a690: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
a6a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 43 2d 3e  for(i=0; i<pNC->
a6b0: 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pSrcList->nSrc; 
a6c0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
a6d0: 72 74 28 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b  rt( pSrcList->a[
a6e0: 69 5d 2e 69 43 75 72 73 6f 72 3e 3d 30 20 26 26  i].iCursor>=0 &&
a6f0: 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pSrcList->a[i].
a700: 69 43 75 72 73 6f 72 3c 70 50 61 72 73 65 2d 3e  iCursor<pParse->
a710: 6e 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  nTab);.    }.  }
a720: 0a 23 65 6e 64 69 66 0a 20 20 73 77 69 74 63 68  .#endif.  switch
a730: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
a740: 20 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 71 75 6f     /* Double-quo
a750: 74 65 64 20 73 74 72 69 6e 67 73 20 28 65 78 3a  ted strings (ex:
a760: 20 22 61 62 63 22 29 20 61 72 65 20 75 73 65 64   "abc") are used
a770: 20 61 73 20 69 64 65 6e 74 69 66 69 65 72 73 20   as identifiers 
a780: 69 66 0a 20 20 20 20 2a 2a 20 70 6f 73 73 69 62  if.    ** possib
a790: 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74  le.  Otherwise t
a7a0: 68 65 79 20 72 65 6d 61 69 6e 20 61 73 20 73 74  hey remain as st
a7b0: 72 69 6e 67 73 2e 20 20 53 69 6e 67 6c 65 2d 71  rings.  Single-q
a7c0: 75 6f 74 65 64 0a 20 20 20 20 2a 2a 20 73 74 72  uoted.    ** str
a7d0: 69 6e 67 73 20 28 65 78 3a 20 27 61 62 63 27 29  ings (ex: 'abc')
a7e0: 20 61 72 65 20 61 6c 77 61 79 73 20 73 74 72 69   are always stri
a7f0: 6e 67 20 6c 69 74 65 72 61 6c 73 2e 0a 20 20 20  ng literals..   
a800: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
a810: 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20  STRING: {.      
a820: 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  if( pExpr->token
a830: 2e 7a 5b 30 5d 3d 3d 27 5c 27 27 20 29 20 62 72  .z[0]=='\'' ) br
a840: 65 61 6b 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61  eak;.      /* Fa
a850: 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65  ll thru into the
a860: 20 54 4b 5f 49 44 20 63 61 73 65 20 69 66 20 74   TK_ID case if t
a870: 68 69 73 20 69 73 20 61 20 64 6f 75 62 6c 65 2d  his is a double-
a880: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 2a 2f  quoted string */
a890: 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 41 20  .    }.    /* A 
a8a0: 6c 6f 6e 65 20 69 64 65 6e 74 69 66 69 65 72 20  lone identifier 
a8b0: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
a8c0: 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a   column..    */.
a8d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 20      case TK_ID: 
a8e0: 7b 0a 20 20 20 20 20 20 6c 6f 6f 6b 75 70 4e 61  {.      lookupNa
a8f0: 6d 65 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c  me(pParse, 0, 0,
a900: 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20   &pExpr->token, 
a910: 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  pNC, pExpr);.   
a920: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
a930: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 41 20 74   }.  .    /* A t
a940: 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 63 6f  able name and co
a950: 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20 20 20 20 49  lumn name:     I
a960: 44 2e 49 44 0a 20 20 20 20 2a 2a 20 4f 72 20 61  D.ID.    ** Or a
a970: 20 64 61 74 61 62 61 73 65 2c 20 74 61 62 6c 65   database, table
a980: 20 61 6e 64 20 63 6f 6c 75 6d 6e 3a 20 20 49 44   and column:  ID
a990: 2e 49 44 2e 49 44 0a 20 20 20 20 2a 2f 0a 20 20  .ID.ID.    */.  
a9a0: 20 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a 20 7b    case TK_DOT: {
a9b0: 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 43  .      Token *pC
a9c0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 54 6f 6b  olumn;.      Tok
a9d0: 65 6e 20 2a 70 54 61 62 6c 65 3b 0a 20 20 20 20  en *pTable;.    
a9e0: 20 20 54 6f 6b 65 6e 20 2a 70 44 62 3b 0a 20 20    Token *pDb;.  
a9f0: 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
aa00: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 69 66 28 20  ;..      /* if( 
aa10: 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 62 72  pSrcList==0 ) br
aa20: 65 61 6b 3b 20 2a 2f 0a 20 20 20 20 20 20 70 52  eak; */.      pR
aa30: 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52  ight = pExpr->pR
aa40: 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20  ight;.      if( 
aa50: 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 49  pRight->op==TK_I
aa60: 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  D ){.        pDb
aa70: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 54   = 0;.        pT
aa80: 61 62 6c 65 20 3d 20 26 70 45 78 70 72 2d 3e 70  able = &pExpr->p
aa90: 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20  Left->token;.   
aaa0: 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d 20 26       pColumn = &
aab0: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 3b 0a 20  pRight->token;. 
aac0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
aad0: 20 20 20 20 61 73 73 65 72 74 28 20 70 52 69 67      assert( pRig
aae0: 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29  ht->op==TK_DOT )
aaf0: 3b 0a 20 20 20 20 20 20 20 20 70 44 62 20 3d 20  ;.        pDb = 
ab00: 26 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 74  &pExpr->pLeft->t
ab10: 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 70 54  oken;.        pT
ab20: 61 62 6c 65 20 3d 20 26 70 52 69 67 68 74 2d 3e  able = &pRight->
ab30: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  pLeft->token;.  
ab40: 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d 20        pColumn = 
ab50: 26 70 52 69 67 68 74 2d 3e 70 52 69 67 68 74 2d  &pRight->pRight-
ab60: 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 0a  >token;.      }.
ab70: 20 20 20 20 20 20 6c 6f 6f 6b 75 70 4e 61 6d 65        lookupName
ab80: 28 70 50 61 72 73 65 2c 20 70 44 62 2c 20 70 54  (pParse, pDb, pT
ab90: 61 62 6c 65 2c 20 70 43 6f 6c 75 6d 6e 2c 20 70  able, pColumn, p
aba0: 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  NC, pExpr);.    
abb0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
abc0: 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76  }..    /* Resolv
abd0: 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73  e function names
abe0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
abf0: 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a   TK_CONST_FUNC:.
ac00: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
ac10: 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78  TION: {.      Ex
ac20: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
ac30: 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 20 20 20  pExpr->pList;   
ac40: 20 2f 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74   /* The argument
ac50: 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 69   list */.      i
ac60: 6e 74 20 6e 20 3d 20 70 4c 69 73 74 20 3f 20 70  nt n = pList ? p
ac70: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b  List->nExpr : 0;
ac80: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
ac90: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  rguments */.    
aca0: 20 20 69 6e 74 20 6e 6f 5f 73 75 63 68 5f 66 75    int no_such_fu
acb0: 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  nc = 0;       /*
acc0: 20 54 72 75 65 20 69 66 20 6e 6f 20 73 75 63 68   True if no such
acd0: 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73 74 73   function exists
ace0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 77 72   */.      int wr
acf0: 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 30  ong_num_args = 0
ad00: 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  ;     /* True if
ad10: 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66   wrong number of
ad20: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
ad30: 20 20 20 20 69 6e 74 20 69 73 5f 61 67 67 20 3d      int is_agg =
ad40: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
ad50: 2f 2a 20 54 72 75 65 20 69 66 20 69 73 20 61 6e  /* True if is an
ad60: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
ad70: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ion */.      int
ad80: 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 75   i;.      int au
ad90: 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
ada0: 20 20 20 20 20 20 2f 2a 20 41 75 74 68 6f 72 69        /* Authori
adb0: 7a 61 74 69 6f 6e 20 74 6f 20 75 73 65 20 74 68  zation to use th
adc0: 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  e function */.  
add0: 20 20 20 20 69 6e 74 20 6e 49 64 3b 20 20 20 20      int nId;    
ade0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adf0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61  /* Number of cha
ae00: 72 61 63 74 65 72 73 20 69 6e 20 66 75 6e 63 74  racters in funct
ae10: 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ion name */.    
ae20: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
ae30: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d;            /*
ae40: 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61   The function na
ae50: 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e  me. */.      Fun
ae60: 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20 20 20  cDef *pDef;     
ae70: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f           /* Info
ae80: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
ae90: 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  e function */.  
aea0: 20 20 20 20 69 6e 74 20 65 6e 63 20 3d 20 45 4e      int enc = EN
aeb0: 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 20 20  C(pParse->db);  
aec0: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
aed0: 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 0a 20 20 20  encoding */..   
aee0: 20 20 20 7a 49 64 20 3d 20 28 63 68 61 72 2a 29     zId = (char*)
aef0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a  pExpr->token.z;.
af00: 20 20 20 20 20 20 6e 49 64 20 3d 20 70 45 78 70        nId = pExp
af10: 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20  r->token.n;.    
af20: 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
af30: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61  FindFunction(pPa
af40: 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49  rse->db, zId, nI
af50: 64 2c 20 6e 2c 20 65 6e 63 2c 20 30 29 3b 0a 20  d, n, enc, 0);. 
af60: 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30       if( pDef==0
af70: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66   ){.        pDef
af80: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
af90: 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64  nction(pParse->d
afa0: 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 2d 31 2c  b, zId, nId, -1,
afb0: 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20   enc, 0);.      
afc0: 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29 7b    if( pDef==0 ){
afd0: 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 5f 73 75  .          no_su
afe0: 63 68 5f 66 75 6e 63 20 3d 20 31 3b 0a 20 20 20  ch_func = 1;.   
aff0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b000: 20 20 20 20 20 20 77 72 6f 6e 67 5f 6e 75 6d 5f        wrong_num_
b010: 61 72 67 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  args = 1;.      
b020: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
b030: 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67 67 20  .        is_agg 
b040: 3d 20 70 44 65 66 2d 3e 78 46 75 6e 63 3d 3d 30  = pDef->xFunc==0
b050: 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
b060: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
b070: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20  THORIZATION.    
b080: 20 20 69 66 28 20 70 44 65 66 20 29 7b 0a 20 20    if( pDef ){.  
b090: 20 20 20 20 20 20 61 75 74 68 20 3d 20 73 71 6c        auth = sql
b0a0: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
b0b0: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 46 55 4e  arse, SQLITE_FUN
b0c0: 43 54 49 4f 4e 2c 20 30 2c 20 70 44 65 66 2d 3e  CTION, 0, pDef->
b0d0: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20  zName, 0);.     
b0e0: 20 20 20 69 66 28 20 61 75 74 68 21 3d 53 51 4c     if( auth!=SQL
b0f0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
b100: 20 20 20 20 69 66 28 20 61 75 74 68 3d 3d 53 51      if( auth==SQ
b110: 4c 49 54 45 5f 44 45 4e 59 20 29 7b 0a 20 20 20  LITE_DENY ){.   
b120: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b130: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
b140: 20 22 6e 6f 74 20 61 75 74 68 6f 72 69 7a 65 64   "not authorized
b150: 20 74 6f 20 75 73 65 20 66 75 6e 63 74 69 6f 6e   to use function
b160: 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  : %s",.         
b170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b180: 20 20 20 20 20 20 20 20 20 20 20 70 44 65 66 2d             pDef-
b190: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
b1a0: 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b       pNC->nErr++
b1b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
b1c0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
b1d0: 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20  p = TK_NULL;.   
b1e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
b1f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b200: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
b210: 69 66 28 20 69 73 5f 61 67 67 20 26 26 20 21 70  if( is_agg && !p
b220: 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 29 7b 0a  NC->allowAgg ){.
b230: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
b240: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
b250: 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72 65  "misuse of aggre
b260: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 25 2e  gate function %.
b270: 2a 73 28 29 22 2c 20 6e 49 64 2c 7a 49 64 29 3b  *s()", nId,zId);
b280: 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45  .        pNC->nE
b290: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 73  rr++;.        is
b2a0: 5f 61 67 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  _agg = 0;.      
b2b0: 7d 65 6c 73 65 20 69 66 28 20 6e 6f 5f 73 75 63  }else if( no_suc
b2c0: 68 5f 66 75 6e 63 20 29 7b 0a 20 20 20 20 20 20  h_func ){.      
b2d0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
b2e0: 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
b2f0: 63 68 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a  ch function: %.*
b300: 73 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20  s", nId, zId);. 
b310: 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72         pNC->nErr
b320: 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ++;.      }else 
b330: 69 66 28 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72  if( wrong_num_ar
b340: 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  gs ){.        sq
b350: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
b360: 61 72 73 65 2c 22 77 72 6f 6e 67 20 6e 75 6d 62  arse,"wrong numb
b370: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
b380: 74 6f 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73  to function %.*s
b390: 28 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ()",.           
b3a0: 20 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20    nId, zId);.   
b3b0: 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b       pNC->nErr++
b3c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b3d0: 69 66 28 20 69 73 5f 61 67 67 20 29 7b 0a 20 20  if( is_agg ){.  
b3e0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
b3f0: 3d 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  = TK_AGG_FUNCTIO
b400: 4e 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e  N;.        pNC->
b410: 68 61 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20  hasAgg = 1;.    
b420: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73    }.      if( is
b430: 5f 61 67 67 20 29 20 70 4e 43 2d 3e 61 6c 6c 6f  _agg ) pNC->allo
b440: 77 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  wAgg = 0;.      
b450: 66 6f 72 28 69 3d 30 3b 20 70 4e 43 2d 3e 6e 45  for(i=0; pNC->nE
b460: 72 72 3d 3d 30 20 26 26 20 69 3c 6e 3b 20 69 2b  rr==0 && i<n; i+
b470: 2b 29 7b 0a 20 20 20 20 20 20 20 20 77 61 6c 6b  +){.        walk
b480: 45 78 70 72 54 72 65 65 28 70 4c 69 73 74 2d 3e  ExprTree(pList->
b490: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 6e 61 6d 65  a[i].pExpr, name
b4a0: 52 65 73 6f 6c 76 65 72 53 74 65 70 2c 20 70 4e  ResolverStep, pN
b4b0: 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  C);.      }.    
b4c0: 20 20 69 66 28 20 69 73 5f 61 67 67 20 29 20 70    if( is_agg ) p
b4d0: 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 3d 20 31  NC->allowAgg = 1
b4e0: 3b 0a 20 20 20 20 20 20 2f 2a 20 46 49 58 20 4d  ;.      /* FIX M
b4f0: 45 3a 20 20 43 6f 6d 70 75 74 65 20 70 45 78 70  E:  Compute pExp
b500: 72 2d 3e 61 66 66 69 6e 69 74 79 20 62 61 73 65  r->affinity base
b510: 64 20 6f 6e 20 74 68 65 20 65 78 70 65 63 74 65  d on the expecte
b520: 64 20 72 65 74 75 72 6e 0a 20 20 20 20 20 20 2a  d return.      *
b530: 2a 20 74 79 70 65 20 6f 66 20 74 68 65 20 66 75  * type of the fu
b540: 6e 63 74 69 6f 6e 20 0a 20 20 20 20 20 20 2a 2f  nction .      */
b550: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 73  .      return is
b560: 5f 61 67 67 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  _agg;.    }.#ifn
b570: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
b580: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
b590: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20  e TK_SELECT:.   
b5a0: 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
b5b0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
b5c0: 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
b5d0: 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  if( pExpr->pSele
b5e0: 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ct ){.        in
b5f0: 74 20 6e 52 65 66 20 3d 20 70 4e 43 2d 3e 6e 52  t nRef = pNC->nR
b600: 65 66 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ef;.#ifndef SQLI
b610: 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20  TE_OMIT_CHECK.  
b620: 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 69        if( pNC->i
b630: 73 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 20 20  sCheck ){.      
b640: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
b650: 4d 73 67 28 70 50 61 72 73 65 2c 22 73 75 62 71  Msg(pParse,"subq
b660: 75 65 72 69 65 73 20 70 72 6f 68 69 62 69 74 65  ueries prohibite
b670: 64 20 69 6e 20 43 48 45 43 4b 20 63 6f 6e 73 74  d in CHECK const
b680: 72 61 69 6e 74 73 22 29 3b 0a 20 20 20 20 20 20  raints");.      
b690: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
b6a0: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
b6b0: 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20  Resolve(pParse, 
b6c0: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20  pExpr->pSelect, 
b6d0: 70 4e 43 29 3b 0a 20 20 20 20 20 20 20 20 61 73  pNC);.        as
b6e0: 73 65 72 74 28 20 70 4e 43 2d 3e 6e 52 65 66 3e  sert( pNC->nRef>
b6f0: 3d 6e 52 65 66 20 29 3b 0a 20 20 20 20 20 20 20  =nRef );.       
b700: 20 69 66 28 20 6e 52 65 66 21 3d 70 4e 43 2d 3e   if( nRef!=pNC->
b710: 6e 52 65 66 20 29 7b 0a 20 20 20 20 20 20 20 20  nRef ){.        
b720: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
b730: 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53  y(pExpr, EP_VarS
b740: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
b750: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
b760: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
b770: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b780: 5f 43 48 45 43 4b 0a 20 20 20 20 63 61 73 65 20  _CHECK.    case 
b790: 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20  TK_VARIABLE: {. 
b7a0: 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 69 73       if( pNC->is
b7b0: 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  Check ){.       
b7c0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
b7d0: 28 70 50 61 72 73 65 2c 22 70 61 72 61 6d 65 74  (pParse,"paramet
b7e0: 65 72 73 20 70 72 6f 68 69 62 69 74 65 64 20 69  ers prohibited i
b7f0: 6e 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  n CHECK constrai
b800: 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  nts");.      }. 
b810: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b820: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72  }.#endif.  }.  r
b830: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
b840: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
b850: 61 6c 6b 73 20 61 6e 20 65 78 70 72 65 73 73 69  alks an expressi
b860: 6f 6e 20 74 72 65 65 20 61 6e 64 20 72 65 73 6f  on tree and reso
b870: 6c 76 65 73 20 72 65 66 65 72 65 6e 63 65 73 20  lves references 
b880: 74 6f 0a 2a 2a 20 74 61 62 6c 65 20 63 6f 6c 75  to.** table colu
b890: 6d 6e 73 2e 20 20 4e 6f 64 65 73 20 6f 66 20 74  mns.  Nodes of t
b8a0: 68 65 20 66 6f 72 6d 20 49 44 2e 49 44 20 6f 72  he form ID.ID or
b8b0: 20 49 44 20 72 65 73 6f 6c 76 65 20 69 6e 74 6f   ID resolve into
b8c0: 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20   an.** index to 
b8d0: 74 68 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65  the table in the
b8e0: 20 74 61 62 6c 65 20 6c 69 73 74 20 61 6e 64 20   table list and 
b8f0: 61 20 63 6f 6c 75 6d 6e 20 6f 66 66 73 65 74 2e  a column offset.
b900: 20 20 54 68 65 20 0a 2a 2a 20 45 78 70 72 2e 6f    The .** Expr.o
b910: 70 63 6f 64 65 20 66 6f 72 20 73 75 63 68 20 6e  pcode for such n
b920: 6f 64 65 73 20 69 73 20 63 68 61 6e 67 65 64 20  odes is changed 
b930: 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 20 20 54  to TK_COLUMN.  T
b940: 68 65 20 45 78 70 72 2e 69 54 61 62 6c 65 0a 2a  he Expr.iTable.*
b950: 2a 20 76 61 6c 75 65 20 69 73 20 63 68 61 6e 67  * value is chang
b960: 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  ed to the index 
b970: 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  of the reference
b980: 64 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62 4c  d table in pTabL
b990: 69 73 74 0a 2a 2a 20 70 6c 75 73 20 74 68 65 20  ist.** plus the 
b9a0: 22 62 61 73 65 22 20 76 61 6c 75 65 2e 20 20 54  "base" value.  T
b9b0: 68 65 20 62 61 73 65 20 76 61 6c 75 65 20 77 69  he base value wi
b9c0: 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 62 65  ll ultimately be
b9d0: 63 6f 6d 65 20 74 68 65 0a 2a 2a 20 56 44 42 45  come the.** VDBE
b9e0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
b9f0: 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68 61 74  or a cursor that
ba00: 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74   is pointing int
ba10: 6f 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64  o the referenced
ba20: 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 54 68 65 20  .** table.  The 
ba30: 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c  Expr.iColumn val
ba40: 75 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  ue is changed to
ba50: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
ba60: 65 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 6f 66 20  e column .** of 
ba70: 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74  the referenced t
ba80: 61 62 6c 65 2e 20 20 54 68 65 20 45 78 70 72 2e  able.  The Expr.
ba90: 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 66 6f  iColumn value fo
baa0: 72 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a  r the special.**
bab0: 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 69 73   ROWID column is
bac0: 20 2d 31 2e 20 20 41 6e 79 20 49 4e 54 45 47 45   -1.  Any INTEGE
bad0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  R PRIMARY KEY co
bae0: 6c 75 6d 6e 20 69 73 20 74 72 69 65 64 20 61 73  lumn is tried as
baf0: 20 61 6e 0a 2a 2a 20 61 6c 69 61 73 20 66 6f 72   an.** alias for
bb00: 20 52 4f 57 49 44 2e 0a 2a 2a 0a 2a 2a 20 41 6c   ROWID..**.** Al
bb10: 73 6f 20 72 65 73 6f 6c 76 65 20 66 75 6e 63 74  so resolve funct
bb20: 69 6f 6e 20 6e 61 6d 65 73 20 61 6e 64 20 63 68  ion names and ch
bb30: 65 63 6b 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  eck the function
bb40: 73 20 66 6f 72 20 70 72 6f 70 65 72 0a 2a 2a 20  s for proper.** 
bb50: 75 73 61 67 65 2e 20 20 4d 61 6b 65 20 73 75 72  usage.  Make sur
bb60: 65 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 20 6e  e all function n
bb70: 61 6d 65 73 20 61 72 65 20 72 65 63 6f 67 6e 69  ames are recogni
bb80: 7a 65 64 20 61 6e 64 20 61 6c 6c 20 66 75 6e 63  zed and all func
bb90: 74 69 6f 6e 73 0a 2a 2a 20 68 61 76 65 20 74 68  tions.** have th
bba0: 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72  e correct number
bbb0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 20   of arguments.  
bbc0: 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  Leave an error m
bbd0: 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61  essage.** in pPa
bbe0: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20 69 66 20  rse->zErrMsg if 
bbf0: 61 6e 79 74 68 69 6e 67 20 69 73 20 61 6d 69 73  anything is amis
bc00: 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  s.  Return the n
bc10: 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
bc20: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
bc30: 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  pression contain
bc40: 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  s aggregate func
bc50: 74 69 6f 6e 73 20 74 68 65 6e 20 73 65 74 20 74  tions then set t
bc60: 68 65 20 45 50 5f 41 67 67 0a 2a 2a 20 70 72 6f  he EP_Agg.** pro
bc70: 70 65 72 74 79 20 6f 6e 20 74 68 65 20 65 78 70  perty on the exp
bc80: 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  ression..*/.int 
bc90: 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c  sqlite3ExprResol
bca0: 76 65 4e 61 6d 65 73 28 20 0a 20 20 4e 61 6d 65  veNames( .  Name
bcb0: 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20  Context *pNC,   
bcc0: 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61 63 65      /* Namespace
bcd0: 20 74 6f 20 72 65 73 6f 6c 76 65 20 65 78 70 72   to resolve expr
bce0: 65 73 73 69 6f 6e 73 20 69 6e 2e 20 2a 2f 0a 20  essions in. */. 
bcf0: 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20   Expr *pExpr    
bd00: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
bd10: 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65  expression to be
bd20: 20 61 6e 61 6c 79 7a 65 64 2e 20 2a 2f 0a 29 7b   analyzed. */.){
bd30: 0a 20 20 69 6e 74 20 73 61 76 65 64 48 61 73 41  .  int savedHasA
bd40: 67 67 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72  gg;..  if( pExpr
bd50: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
bd60: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45  #if SQLITE_MAX_E
bd70: 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 7b 0a  XPR_DEPTH>0.  {.
bd80: 20 20 20 20 69 6e 74 20 6d 78 44 65 70 74 68 20      int mxDepth 
bd90: 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64  = pNC->pParse->d
bda0: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
bdb0: 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54  _LIMIT_EXPR_DEPT
bdc0: 48 5d 3b 0a 20 20 20 20 69 66 28 20 28 70 45 78  H];.    if( (pEx
bdd0: 70 72 2d 3e 6e 48 65 69 67 68 74 2b 70 4e 43 2d  pr->nHeight+pNC-
bde0: 3e 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74  >pParse->nHeight
bdf0: 29 3e 6d 78 44 65 70 74 68 20 29 7b 0a 20 20 20  )>mxDepth ){.   
be00: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
be10: 73 67 28 70 4e 43 2d 3e 70 50 61 72 73 65 2c 20  sg(pNC->pParse, 
be20: 0a 20 20 20 20 20 20 20 20 20 22 45 78 70 72 65  .         "Expre
be30: 73 73 69 6f 6e 20 74 72 65 65 20 69 73 20 74 6f  ssion tree is to
be40: 6f 20 6c 61 72 67 65 20 28 6d 61 78 69 6d 75 6d  o large (maximum
be50: 20 64 65 70 74 68 20 25 64 29 22 2c 20 6d 78 44   depth %d)", mxD
be60: 65 70 74 68 0a 20 20 20 20 20 20 29 3b 0a 20 20  epth.      );.  
be70: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
be80: 20 20 7d 0a 20 20 20 20 70 4e 43 2d 3e 70 50 61    }.    pNC->pPa
be90: 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20  rse->nHeight += 
bea0: 70 45 78 70 72 2d 3e 6e 48 65 69 67 68 74 3b 0a  pExpr->nHeight;.
beb0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 61 76    }.#endif.  sav
bec0: 65 64 48 61 73 41 67 67 20 3d 20 70 4e 43 2d 3e  edHasAgg = pNC->
bed0: 68 61 73 41 67 67 3b 0a 20 20 70 4e 43 2d 3e 68  hasAgg;.  pNC->h
bee0: 61 73 41 67 67 20 3d 20 30 3b 0a 20 20 77 61 6c  asAgg = 0;.  wal
bef0: 6b 45 78 70 72 54 72 65 65 28 70 45 78 70 72 2c  kExprTree(pExpr,
bf00: 20 6e 61 6d 65 52 65 73 6f 6c 76 65 72 53 74 65   nameResolverSte
bf10: 70 2c 20 70 4e 43 29 3b 0a 23 69 66 20 53 51 4c  p, pNC);.#if SQL
bf20: 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
bf30: 54 48 3e 30 0a 20 20 70 4e 43 2d 3e 70 50 61 72  TH>0.  pNC->pPar
bf40: 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 70  se->nHeight -= p
bf50: 45 78 70 72 2d 3e 6e 48 65 69 67 68 74 3b 0a 23  Expr->nHeight;.#
bf60: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 4e 43 2d  endif.  if( pNC-
bf70: 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20 20 45  >nErr>0 ){.    E
bf80: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
bf90: 45 78 70 72 2c 20 45 50 5f 45 72 72 6f 72 29 3b  Expr, EP_Error);
bfa0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 43 2d 3e  .  }.  if( pNC->
bfb0: 68 61 73 41 67 67 20 29 7b 0a 20 20 20 20 45 78  hasAgg ){.    Ex
bfc0: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
bfd0: 78 70 72 2c 20 45 50 5f 41 67 67 29 3b 0a 20 20  xpr, EP_Agg);.  
bfe0: 7d 65 6c 73 65 20 69 66 28 20 73 61 76 65 64 48  }else if( savedH
bff0: 61 73 41 67 67 20 29 7b 0a 20 20 20 20 70 4e 43  asAgg ){.    pNC
c000: 2d 3e 68 61 73 41 67 67 20 3d 20 31 3b 0a 20 20  ->hasAgg = 1;.  
c010: 7d 0a 20 20 72 65 74 75 72 6e 20 45 78 70 72 48  }.  return ExprH
c020: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
c030: 2c 20 45 50 5f 45 72 72 6f 72 29 3b 0a 7d 0a 0a  , EP_Error);.}..
c040: 2f 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20  /*.** A pointer 
c050: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
c060: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73   structure is us
c070: 65 64 20 74 6f 20 70 61 73 73 20 69 6e 66 6f 72  ed to pass infor
c080: 6d 61 74 69 6f 6e 0a 2a 2a 20 74 68 72 6f 75 67  mation.** throug
c090: 68 20 77 61 6c 6b 45 78 70 72 54 72 65 65 20 69  h walkExprTree i
c0a0: 6e 74 6f 20 63 6f 64 65 53 75 62 71 75 65 72 79  nto codeSubquery
c0b0: 53 74 65 70 28 29 2e 0a 2a 2f 0a 74 79 70 65 64  Step()..*/.typed
c0c0: 65 66 20 73 74 72 75 63 74 20 51 75 65 72 79 43  ef struct QueryC
c0d0: 6f 64 65 72 20 51 75 65 72 79 43 6f 64 65 72 3b  oder QueryCoder;
c0e0: 0a 73 74 72 75 63 74 20 51 75 65 72 79 43 6f 64  .struct QueryCod
c0f0: 65 72 20 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  er {.  Parse *pP
c100: 61 72 73 65 3b 20 20 20 20 20 20 20 2f 2a 20 54  arse;       /* T
c110: 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
c120: 78 74 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  xt */.  NameCont
c130: 65 78 74 20 2a 70 4e 43 3b 20 20 20 20 2f 2a 20  ext *pNC;    /* 
c140: 4e 61 6d 65 73 70 61 63 65 20 6f 66 20 66 69 72  Namespace of fir
c150: 73 74 20 65 6e 63 6c 6f 73 69 6e 67 20 71 75 65  st enclosing que
c160: 72 79 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 64 65 66  ry */.};..#ifdef
c170: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
c180: 6e 74 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  nt sqlite3_enabl
c190: 65 5f 69 6e 5f 6f 70 74 20 3d 20 31 3b 0a 23 65  e_in_opt = 1;.#e
c1a0: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 73 71  lse.  #define sq
c1b0: 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 69 6e 5f  lite3_enable_in_
c1c0: 6f 70 74 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a  opt 1.#endif../*
c1d0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
c1e0: 6e 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  n is used by the
c1f0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
c200: 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e 29 20  of the IN (...) 
c210: 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 49 74 27  operator..** It'
c220: 73 20 6a 6f 62 20 69 73 20 74 6f 20 66 69 6e 64  s job is to find
c230: 20 6f 72 20 63 72 65 61 74 65 20 61 20 62 2d 74   or create a b-t
c240: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ree structure th
c250: 61 74 20 6d 61 79 20 62 65 20 75 73 65 64 0a 2a  at may be used.*
c260: 2a 20 65 69 74 68 65 72 20 74 6f 20 74 65 73 74  * either to test
c270: 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20   for membership 
c280: 6f 66 20 74 68 65 20 28 2e 2e 2e 29 20 73 65 74  of the (...) set
c290: 20 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20 74   or to iterate t
c2a0: 68 72 6f 75 67 68 0a 2a 2a 20 69 74 73 20 6d 65  hrough.** its me
c2b0: 6d 62 65 72 73 2c 20 73 6b 69 70 70 69 6e 67 20  mbers, skipping 
c2c0: 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a  duplicates..**.*
c2d0: 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f 70 65  * The cursor ope
c2e0: 6e 65 64 20 6f 6e 20 74 68 65 20 73 74 72 75 63  ned on the struc
c2f0: 74 75 72 65 20 28 64 61 74 61 62 61 73 65 20 74  ture (database t
c300: 61 62 6c 65 2c 20 64 61 74 61 62 61 73 65 20 69  able, database i
c310: 6e 64 65 78 20 0a 2a 2a 20 6f 72 20 65 70 68 65  ndex .** or ephe
c320: 72 6d 61 6c 20 74 61 62 6c 65 29 20 69 73 20 73  rmal table) is s
c330: 74 6f 72 65 64 20 69 6e 20 70 58 2d 3e 69 54 61  tored in pX->iTa
c340: 62 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73 20  ble before this 
c350: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
c360: 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  ..** The returne
c370: 64 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65  d value indicate
c380: 73 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  s the structure 
c390: 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  type, as follows
c3a0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  :.**.**   IN_IND
c3b0: 45 58 5f 52 4f 57 49 44 20 2d 20 54 68 65 20 63  EX_ROWID - The c
c3c0: 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  ursor was opened
c3d0: 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74   on a database t
c3e0: 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e  able..**   IN_IN
c3f0: 44 45 58 5f 49 4e 44 45 58 20 2d 20 54 68 65 20  DEX_INDEX - The 
c400: 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65  cursor was opene
c410: 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20  d on a database 
c420: 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49  index..**   IN_I
c430: 4e 44 45 58 5f 45 50 48 20 2d 20 20 20 54 68 65  NDEX_EPH -   The
c440: 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e   cursor was open
c450: 65 64 20 6f 6e 20 61 20 73 70 65 63 69 61 6c 6c  ed on a speciall
c460: 79 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a  y created and.**
c470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c480: 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20 65 70      populated ep
c490: 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a  heremal table..*
c4a0: 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67  *.** An existing
c4b0: 20 73 74 72 75 63 74 75 72 65 20 6d 61 79 20 6f   structure may o
c4c0: 6e 6c 79 20 62 65 20 75 73 65 64 20 69 66 20 74  nly be used if t
c4d0: 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66 20  he SELECT is of 
c4e0: 74 68 65 20 73 69 6d 70 6c 65 0a 2a 2a 20 66 6f  the simple.** fo
c4f0: 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  rm:.**.**     SE
c500: 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52  LECT <column> FR
c510: 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a  OM <table>.**.**
c520: 20 49 66 20 74 68 65 20 6d 75 73 74 42 65 55 6e   If the mustBeUn
c530: 69 71 75 65 20 70 61 72 61 6d 65 74 65 72 20 69  ique parameter i
c540: 73 20 66 61 6c 73 65 2c 20 74 68 65 20 73 74 72  s false, the str
c550: 75 63 74 75 72 65 20 77 69 6c 6c 20 62 65 20 75  ucture will be u
c560: 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74  sed .** for fast
c570: 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20   set membership 
c580: 74 65 73 74 73 2e 20 49 6e 20 74 68 69 73 20 63  tests. In this c
c590: 61 73 65 20 61 6e 20 65 70 68 65 72 65 6d 61 6c  ase an epheremal
c5a0: 20 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a 2a 20   table must .** 
c5b0: 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20 3c  be used unless <
c5c0: 63 6f 6c 75 6d 6e 3e 20 69 73 20 61 6e 20 49 4e  column> is an IN
c5d0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
c5e0: 59 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 63 61  Y or an index ca
c5f0: 6e 20 0a 2a 2a 20 62 65 20 66 6f 75 6e 64 20 77  n .** be found w
c600: 69 74 68 20 3c 63 6f 6c 75 6d 6e 3e 20 61 73 20  ith <column> as 
c610: 69 74 73 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f  its left-most co
c620: 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6d  lumn..**.** If m
c630: 75 73 74 42 65 55 6e 69 71 75 65 20 69 73 20 74  ustBeUnique is t
c640: 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 73 74  rue, then the st
c650: 72 75 63 74 75 72 65 20 77 69 6c 6c 20 62 65 20  ructure will be 
c660: 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 0a  used to iterate.
c670: 2a 2a 20 74 68 72 6f 75 67 68 20 74 68 65 20 73  ** through the s
c680: 65 74 20 6d 65 6d 62 65 72 73 2c 20 73 6b 69 70  et members, skip
c690: 70 69 6e 67 20 61 6e 79 20 64 75 70 6c 69 63 61  ping any duplica
c6a0: 74 65 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  tes. In this cas
c6b0: 65 20 61 6e 0a 2a 2a 20 65 70 68 65 72 65 6d 61  e an.** epherema
c6c0: 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20  l table must be 
c6d0: 75 73 65 64 20 75 6e 6c 65 73 73 20 74 68 65 20  used unless the 
c6e0: 73 65 6c 65 63 74 65 64 20 3c 63 6f 6c 75 6d 6e  selected <column
c6f0: 3e 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a  > is guaranteed.
c700: 2a 2a 20 74 6f 20 62 65 20 75 6e 69 71 75 65 20  ** to be unique 
c710: 2d 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  - either because
c720: 20 69 74 20 69 73 20 61 6e 20 49 4e 54 45 47 45   it is an INTEGE
c730: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  R PRIMARY KEY or
c740: 20 69 74 0a 2a 2a 20 69 73 20 75 6e 69 71 75 65   it.** is unique
c750: 20 62 79 20 76 69 72 74 75 65 20 6f 66 20 61 20   by virtue of a 
c760: 63 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20 69 6d  constraint or im
c770: 70 6c 69 63 69 74 20 69 6e 64 65 78 2e 0a 2a 2f  plicit index..*/
c780: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
c790: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e  OMIT_SUBQUERY.in
c7a0: 74 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49  t sqlite3FindInI
c7b0: 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
c7c0: 73 65 2c 20 45 78 70 72 20 2a 70 58 2c 20 69 6e  se, Expr *pX, in
c7d0: 74 20 6d 75 73 74 42 65 55 6e 69 71 75 65 29 7b  t mustBeUnique){
c7e0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 0a 20 20  .  Select *p;.  
c7f0: 69 6e 74 20 65 54 79 70 65 20 3d 20 30 3b 0a 20  int eType = 0;. 
c800: 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72   int iTab = pPar
c810: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 0a 20 20 2f  se->nTab++;..  /
c820: 2a 20 54 68 65 20 66 6f 6c 6c 77 69 6e 67 20 69  * The follwing i
c830: 66 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f  f(...) expressio
c840: 6e 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  n is true if the
c850: 20 53 45 4c 45 43 54 20 69 73 20 6f 66 20 74 68   SELECT is of th
c860: 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 66  e .  ** simple f
c870: 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  orm:.  **.  **  
c880: 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d     SELECT <colum
c890: 6e 3e 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a  n> FROM <table>.
c8a0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    **.  ** If thi
c8b0: 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 69  s is the case, i
c8c0: 74 20 6d 61 79 20 62 65 20 70 6f 73 73 69 62 6c  t may be possibl
c8d0: 65 20 74 6f 20 75 73 65 20 61 6e 20 65 78 69 73  e to use an exis
c8e0: 74 69 6e 67 20 74 61 62 6c 65 0a 20 20 2a 2a 20  ting table.  ** 
c8f0: 6f 72 20 69 6e 64 65 78 20 69 6e 73 74 65 61 64  or index instead
c900: 20 6f 66 20 67 65 6e 65 72 61 74 69 6e 67 20 61   of generating a
c910: 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c  n epheremal tabl
c920: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  e..  */.  if( sq
c930: 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 69 6e 5f  lite3_enable_in_
c940: 6f 70 74 0a 20 20 20 26 26 20 28 70 3d 70 58 2d  opt.   && (p=pX-
c950: 3e 70 53 65 6c 65 63 74 29 21 3d 30 20 26 26 20  >pSelect)!=0 && 
c960: 21 70 2d 3e 70 50 72 69 6f 72 0a 20 20 20 26 26  !p->pPrior.   &&
c970: 20 21 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20   !p->isDistinct 
c980: 26 26 20 21 70 2d 3e 69 73 41 67 67 20 26 26 20  && !p->isAgg && 
c990: 21 70 2d 3e 70 47 72 6f 75 70 42 79 0a 20 20 20  !p->pGroupBy.   
c9a0: 26 26 20 70 2d 3e 70 53 72 63 20 26 26 20 70 2d  && p->pSrc && p-
c9b0: 3e 70 53 72 63 2d 3e 6e 53 72 63 3d 3d 31 20 26  >pSrc->nSrc==1 &
c9c0: 26 20 21 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d  & !p->pSrc->a[0]
c9d0: 2e 70 53 65 6c 65 63 74 0a 20 20 20 26 26 20 70  .pSelect.   && p
c9e0: 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  ->pSrc->a[0].pTa
c9f0: 62 20 26 26 20 21 70 2d 3e 70 53 72 63 2d 3e 61  b && !p->pSrc->a
ca00: 5b 30 5d 2e 70 54 61 62 2d 3e 70 53 65 6c 65 63  [0].pTab->pSelec
ca10: 74 0a 20 20 20 26 26 20 70 2d 3e 70 45 4c 69 73  t.   && p->pELis
ca20: 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 26 26 20 70  t->nExpr==1 && p
ca30: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
ca40: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
ca50: 55 4d 4e 0a 20 20 20 26 26 20 21 70 2d 3e 70 4c  UMN.   && !p->pL
ca60: 69 6d 69 74 20 26 26 20 21 70 2d 3e 70 4f 66 66  imit && !p->pOff
ca70: 73 65 74 20 26 26 20 21 70 2d 3e 70 57 68 65 72  set && !p->pWher
ca80: 65 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  e.  ){.    sqlit
ca90: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
caa0: 3e 64 62 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a  >db;.    Index *
cab0: 70 49 64 78 3b 0a 20 20 20 20 45 78 70 72 20 2a  pIdx;.    Expr *
cac0: 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73  pExpr = p->pELis
cad0: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
cae0: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45     int iCol = pE
caf0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
cb00: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
cb10: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
cb20: 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73  e);..    /* This
cb30: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
cb40: 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 74 77  y called from tw
cb50: 6f 20 70 6c 61 63 65 73 2e 20 49 6e 20 62 6f 74  o places. In bot
cb60: 68 20 63 61 73 65 73 20 74 68 65 20 76 64 62 65  h cases the vdbe
cb70: 0a 20 20 20 20 2a 2a 20 68 61 73 20 61 6c 72 65  .    ** has alre
cb80: 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
cb90: 65 64 2e 20 53 6f 20 61 73 73 75 6d 65 20 73 71  ed. So assume sq
cba0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 29 20 69  lite3GetVdbe() i
cbb0: 73 20 61 6c 77 61 79 73 0a 20 20 20 20 2a 2a 20  s always.    ** 
cbc0: 73 75 63 63 65 73 73 66 75 6c 20 68 65 72 65 2e  successful here.
cbd0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
cbe0: 72 74 28 76 29 3b 0a 20 20 20 20 69 66 28 20 69  rt(v);.    if( i
cbf0: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 69  Col<0 ){.      i
cc00: 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  nt iMem = ++pPar
cc10: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
cc20: 69 6e 74 20 69 41 64 64 72 3b 0a 20 20 20 20 20  int iAddr;.     
cc30: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
cc40: 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  ->pSrc->a[0].pTa
cc50: 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62  b;.      int iDb
cc60: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
cc70: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
cc80: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
cc90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65    sqlite3VdbeUse
cca0: 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a  sBtree(v, iDb);.
ccb0: 0a 20 20 20 20 20 20 69 41 64 64 72 20 3d 20 73  .      iAddr = s
ccc0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
ccd0: 28 76 2c 20 4f 50 5f 49 66 2c 20 69 4d 65 6d 29  (v, OP_If, iMem)
cce0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
ccf0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
cd00: 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 4d 65 6d  Integer, 1, iMem
cd10: 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
cd20: 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
cd30: 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54  e, iTab, iDb, pT
cd40: 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  ab, OP_OpenRead)
cd50: 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d 20  ;.      eType = 
cd60: 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a  IN_INDEX_ROWID;.
cd70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
cd80: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41  beJumpHere(v, iA
cd90: 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ddr);.    }else{
cda0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  .      /* The co
cdb0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
cdc0: 20 75 73 65 64 20 62 79 20 74 68 65 20 63 6f 6d   used by the com
cdd0: 70 61 72 69 73 6f 6e 2e 20 49 66 20 61 6e 20 69  parison. If an i
cde0: 6e 64 65 78 20 69 73 20 74 6f 20 0a 20 20 20 20  ndex is to .    
cdf0: 20 20 2a 2a 20 62 65 20 75 73 65 64 20 69 6e 20    ** be used in 
ce00: 70 6c 61 63 65 20 6f 66 20 61 20 74 65 6d 70 2d  place of a temp-
ce10: 74 61 62 6c 65 2c 20 69 74 20 6d 75 73 74 20 62  table, it must b
ce20: 65 20 6f 72 64 65 72 65 64 20 61 63 63 6f 72 64  e ordered accord
ce30: 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ing.      ** to 
ce40: 74 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  this collation s
ce50: 65 71 75 65 6e 63 65 2e 0a 20 20 20 20 20 20 2a  equence..      *
ce60: 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  /.      CollSeq 
ce70: 2a 70 52 65 71 20 3d 20 73 71 6c 69 74 65 33 42  *pReq = sqlite3B
ce80: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
ce90: 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  Seq(pParse, pX->
cea0: 70 4c 65 66 74 2c 20 70 45 78 70 72 29 3b 0a 0a  pLeft, pExpr);..
ceb0: 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
cec0: 68 61 74 20 74 68 65 20 61 66 66 69 6e 69 74 79  hat the affinity
ced0: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73   that will be us
cee0: 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68  ed to perform th
cef0: 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70  e .      ** comp
cf00: 61 72 69 73 6f 6e 20 69 73 20 74 68 65 20 73 61  arison is the sa
cf10: 6d 65 20 61 73 20 74 68 65 20 61 66 66 69 6e 69  me as the affini
cf20: 74 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ty of the column
cf30: 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 69 74  . If.      ** it
cf40: 20 69 73 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e   is not, it is n
cf50: 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75  ot possible to u
cf60: 73 65 20 61 6e 79 20 69 6e 64 65 78 2e 0a 20 20  se any index..  
cf70: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62      */.      Tab
cf80: 6c 65 20 2a 70 54 61 62 20 3d 20 70 2d 3e 70 53  le *pTab = p->pS
cf90: 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20  rc->a[0].pTab;. 
cfa0: 20 20 20 20 20 63 68 61 72 20 61 66 66 20 3d 20       char aff = 
cfb0: 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69  comparisonAffini
cfc0: 74 79 28 70 58 29 3b 0a 20 20 20 20 20 20 69 6e  ty(pX);.      in
cfd0: 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20  t affinity_ok = 
cfe0: 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  (pTab->aCol[iCol
cff0: 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 61 66 66 7c  ].affinity==aff|
d000: 7c 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46  |aff==SQLITE_AFF
d010: 5f 4e 4f 4e 45 29 3b 0a 0a 20 20 20 20 20 20 66  _NONE);..      f
d020: 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
d030: 6e 64 65 78 3b 20 70 49 64 78 20 26 26 20 65 54  ndex; pIdx && eT
d040: 79 70 65 3d 3d 30 20 26 26 20 61 66 66 69 6e 69  ype==0 && affini
d050: 74 79 5f 6f 6b 3b 20 70 49 64 78 3d 70 49 64 78  ty_ok; pIdx=pIdx
d060: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
d070: 20 20 69 66 28 20 28 70 49 64 78 2d 3e 61 69 43    if( (pIdx->aiC
d080: 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 29 0a  olumn[0]==iCol).
d090: 20 20 20 20 20 20 20 20 20 26 26 20 28 70 52 65           && (pRe
d0a0: 71 3d 3d 73 71 6c 69 74 65 33 46 69 6e 64 43 6f  q==sqlite3FindCo
d0b0: 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62  llSeq(db, ENC(db
d0c0: 29 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b  ), pIdx->azColl[
d0d0: 30 5d 2c 20 2d 31 2c 20 30 29 29 0a 20 20 20 20  0], -1, 0)).    
d0e0: 20 20 20 20 20 26 26 20 28 21 6d 75 73 74 42 65       && (!mustBe
d0f0: 55 6e 69 71 75 65 20 7c 7c 20 28 70 49 64 78 2d  Unique || (pIdx-
d100: 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 26 26 20 70  >nColumn==1 && p
d110: 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  Idx->onError!=OE
d120: 5f 4e 6f 6e 65 29 29 0a 20 20 20 20 20 20 20 20  _None)).        
d130: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
d140: 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20   iDb;.          
d150: 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61  int iMem = ++pPa
d160: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
d170: 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 3b 0a       int iAddr;.
d180: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
d190: 70 4b 65 79 3b 0a 20 20 0a 20 20 20 20 20 20 20  pKey;.  .       
d1a0: 20 20 20 70 4b 65 79 20 3d 20 28 63 68 61 72 20     pKey = (char 
d1b0: 2a 29 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65  *)sqlite3IndexKe
d1c0: 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yinfo(pParse, pI
d1d0: 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  dx);.          i
d1e0: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
d1f0: 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49  maToIndex(db, pI
d200: 64 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  dx->pSchema);.  
d210: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d220: 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20  dbeUsesBtree(v, 
d230: 69 44 62 29 3b 0a 0a 20 20 20 20 20 20 20 20 20  iDb);..         
d240: 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33   iAddr = sqlite3
d250: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
d260: 5f 49 66 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20  _If, iMem);.    
d270: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d280: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
d290: 74 65 67 65 72 2c 20 31 2c 20 69 4d 65 6d 29 3b  teger, 1, iMem);
d2a0: 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 73 71  .  .          sq
d2b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
d2c0: 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75  v, OP_SetNumColu
d2d0: 6d 6e 73 2c 20 30 2c 20 70 49 64 78 2d 3e 6e 43  mns, 0, pIdx->nC
d2e0: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20  olumn);.        
d2f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d300: 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65  Op4(v, OP_OpenRe
d310: 61 64 2c 20 69 54 61 62 2c 20 70 49 64 78 2d 3e  ad, iTab, pIdx->
d320: 74 6e 75 6d 2c 20 69 44 62 2c 0a 20 20 20 20 20  tnum, iDb,.     
d330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d340: 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 2c 50            pKey,P
d350: 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
d360: 46 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64  F);.          Vd
d370: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
d380: 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29  s", pIdx->zName)
d390: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 54 79  );.          eTy
d3a0: 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e  pe = IN_INDEX_IN
d3b0: 44 45 58 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  DEX;..          
d3c0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
d3d0: 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20  ere(v, iAddr);. 
d3e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
d3f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
d400: 28 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20  ( eType==0 ){.  
d410: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62    sqlite3CodeSub
d420: 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
d430: 58 29 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20  X);.    eType = 
d440: 49 4e 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20  IN_INDEX_EPH;.  
d450: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 58 2d 3e 69  }else{.    pX->i
d460: 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20  Table = iTab;.  
d470: 7d 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70 65  }.  return eType
d480: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
d490: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
d4a0: 66 6f 72 20 73 63 61 6c 61 72 20 73 75 62 71 75  for scalar subqu
d4b0: 65 72 69 65 73 20 75 73 65 64 20 61 73 20 61 6e  eries used as an
d4c0: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61   expression.** a
d4d0: 6e 64 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e  nd IN operators.
d4e0: 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a    Examples:.**.*
d4f0: 2a 20 20 20 20 20 28 53 45 4c 45 43 54 20 61 20  *     (SELECT a 
d500: 46 52 4f 4d 20 62 29 20 20 20 20 20 20 20 20 20  FROM b)         
d510: 20 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a 20   -- subquery.** 
d520: 20 20 20 20 45 58 49 53 54 53 20 28 53 45 4c 45      EXISTS (SELE
d530: 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 2d  CT a FROM b)   -
d540: 2d 20 45 58 49 53 54 53 20 73 75 62 71 75 65 72  - EXISTS subquer
d550: 79 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 34  y.**     x IN (4
d560: 2c 35 2c 31 31 29 20 20 20 20 20 20 20 20 20 20  ,5,11)          
d570: 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74      -- IN operat
d580: 6f 72 20 77 69 74 68 20 6c 69 73 74 20 6f 6e 20  or with list on 
d590: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 0a  right-hand side.
d5a0: 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c  **     x IN (SEL
d5b0: 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20  ECT a FROM b)   
d5c0: 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72    -- IN operator
d5d0: 20 77 69 74 68 20 73 75 62 71 75 65 72 79 20 6f   with subquery o
d5e0: 6e 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a  n the right.**.*
d5f0: 2a 20 54 68 65 20 70 45 78 70 72 20 70 61 72 61  * The pExpr para
d600: 6d 65 74 65 72 20 64 65 73 63 72 69 62 65 73 20  meter describes 
d610: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
d620: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
d630: 20 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20   IN.** operator 
d640: 6f 72 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a  or subquery..*/.
d650: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d660: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 76 6f 69  MIT_SUBQUERY.voi
d670: 64 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62  d sqlite3CodeSub
d680: 73 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50  select(Parse *pP
d690: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
d6a0: 72 29 7b 0a 20 20 69 6e 74 20 74 65 73 74 41 64  r){.  int testAd
d6b0: 64 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  dr = 0;         
d6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d6d0: 20 4f 6e 65 2d 74 69 6d 65 20 74 65 73 74 20 61   One-time test a
d6e0: 64 64 72 65 73 73 20 2a 2f 0a 20 20 56 64 62 65  ddress */.  Vdbe
d6f0: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
d700: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
d710: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
d720: 6e 3b 0a 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63  n;...  /* This c
d730: 6f 64 65 20 6d 75 73 74 20 62 65 20 72 75 6e 20  ode must be run 
d740: 69 6e 20 69 74 73 20 65 6e 74 69 72 65 74 79 20  in its entirety 
d750: 65 76 65 72 79 20 74 69 6d 65 20 69 74 20 69 73  every time it is
d760: 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a   encountered.  *
d770: 2a 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20  * if any of the 
d780: 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75  following is tru
d790: 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  e:.  **.  **    
d7a0: 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e  *  The right-han
d7b0: 64 20 73 69 64 65 20 69 73 20 61 20 63 6f 72 72  d side is a corr
d7c0: 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 0a  elated subquery.
d7d0: 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72    **    *  The r
d7e0: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69  ight-hand side i
d7f0: 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  s an expression 
d800: 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  list containing 
d810: 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20  variables.  **  
d820: 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69    *  We are insi
d830: 64 65 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a  de a trigger.  *
d840: 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66  *.  ** If all of
d850: 20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 66   the above are f
d860: 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61  alse, then we ca
d870: 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20  n run this code 
d880: 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73  just once.  ** s
d890: 61 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c  ave the results,
d8a0: 20 61 6e 64 20 72 65 75 73 65 20 74 68 65 20 73   and reuse the s
d8b0: 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75  ame result on su
d8c0: 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74  bsequent invocat
d8d0: 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
d8e0: 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70   !ExprHasAnyProp
d8f0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56  erty(pExpr, EP_V
d900: 61 72 53 65 6c 65 63 74 29 20 26 26 20 21 70 50  arSelect) && !pP
d910: 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20  arse->trigStack 
d920: 29 7b 0a 20 20 20 20 69 6e 74 20 6d 65 6d 20 3d  ){.    int mem =
d930: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
d940: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
d950: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c  AddOp1(v, OP_If,
d960: 20 6d 65 6d 29 3b 0a 20 20 20 20 74 65 73 74 41   mem);.    testA
d970: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
d980: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
d990: 74 65 67 65 72 2c 20 31 2c 20 6d 65 6d 29 3b 0a  teger, 1, mem);.
d9a0: 20 20 20 20 61 73 73 65 72 74 28 20 74 65 73 74      assert( test
d9b0: 41 64 64 72 3e 30 20 7c 7c 20 70 50 61 72 73 65  Addr>0 || pParse
d9c0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
d9d0: 65 64 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 77 69  ed );.  }..  swi
d9e0: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
d9f0: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  {.    case TK_IN
da00: 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 61  : {.      char a
da10: 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 4b  ffinity;.      K
da20: 65 79 49 6e 66 6f 20 6b 65 79 49 6e 66 6f 3b 0a  eyInfo keyInfo;.
da30: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 20        int addr; 
da40: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
da50: 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65  s of OP_OpenEphe
da60: 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  meral instructio
da70: 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 61 66 66 69  n */..      affi
da80: 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78  nity = sqlite3Ex
da90: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
daa0: 2d 3e 70 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20  ->pLeft);..     
dab0: 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 69 73   /* Whether this
dac0: 20 69 73 20 61 6e 20 27 78 20 49 4e 28 53 45 4c   is an 'x IN(SEL
dad0: 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27  ECT...)' or an '
dae0: 78 20 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29  x IN(<exprlist>)
daf0: 27 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65  '.      ** expre
db00: 73 73 69 6f 6e 20 69 74 20 69 73 20 68 61 6e 64  ssion it is hand
db10: 6c 65 64 20 74 68 65 20 73 61 6d 65 20 77 61 79  led the same way
db20: 2e 20 41 20 76 69 72 74 75 61 6c 20 74 61 62 6c  . A virtual tabl
db30: 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 66  e is .      ** f
db40: 69 6c 6c 65 64 20 77 69 74 68 20 73 69 6e 67 6c  illed with singl
db50: 65 2d 66 69 65 6c 64 20 69 6e 64 65 78 20 6b 65  e-field index ke
db60: 79 73 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  ys representing 
db70: 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20  the results.    
db80: 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 53 45    ** from the SE
db90: 4c 45 43 54 20 6f 72 20 74 68 65 20 3c 65 78 70  LECT or the <exp
dba0: 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a 2a  rlist>..      **
dbb0: 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65  .      ** If the
dbc0: 20 27 78 27 20 65 78 70 72 65 73 73 69 6f 6e 20   'x' expression 
dbd0: 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  is a column valu
dbe0: 65 2c 20 6f 72 20 74 68 65 20 53 45 4c 45 43 54  e, or the SELECT
dbf0: 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  ....      ** sta
dc00: 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 61  tement returns a
dc10: 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74   column value, t
dc20: 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79  hen the affinity
dc30: 20 6f 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a   of that.      *
dc40: 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64  * column is used
dc50: 20 74 6f 20 62 75 69 6c 64 20 74 68 65 20 69 6e   to build the in
dc60: 64 65 78 20 6b 65 79 73 2e 20 49 66 20 62 6f 74  dex keys. If bot
dc70: 68 20 27 78 27 20 61 6e 64 20 74 68 65 0a 20 20  h 'x' and the.  
dc80: 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e      ** SELECT...
dc90: 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63   statement are c
dca0: 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d  olumns, then num
dcb0: 65 72 69 63 20 61 66 66 69 6e 69 74 79 20 69 73  eric affinity is
dcc0: 20 75 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 69   used.      ** i
dcd0: 66 20 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20  f either column 
dce0: 68 61 73 20 4e 55 4d 45 52 49 43 20 6f 72 20 49  has NUMERIC or I
dcf0: 4e 54 45 47 45 52 20 61 66 66 69 6e 69 74 79 2e  NTEGER affinity.
dd00: 20 49 66 20 6e 65 69 74 68 65 72 0a 20 20 20 20   If neither.    
dd10: 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68 65    ** 'x' nor the
dd20: 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65   SELECT... state
dd30: 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73  ment are columns
dd40: 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61  , then numeric a
dd50: 66 66 69 6e 69 74 79 0a 20 20 20 20 20 20 2a 2a  ffinity.      **
dd60: 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20 20   is used..      
dd70: 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  */.      pExpr->
dd80: 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d  iTable = pParse-
dd90: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61  >nTab++;.      a
dda0: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
ddb0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
ddc0: 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 45 78  enEphemeral, pEx
ddd0: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 31 29 3b 0a  pr->iTable, 1);.
dde0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6b 65        memset(&ke
ddf0: 79 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  yInfo, 0, sizeof
de00: 28 6b 65 79 49 6e 66 6f 29 29 3b 0a 20 20 20 20  (keyInfo));.    
de10: 20 20 6b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64    keyInfo.nField
de20: 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 69 66 28   = 1;..      if(
de30: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20   pExpr->pSelect 
de40: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61  ){.        /* Ca
de50: 73 65 20 31 3a 20 20 20 20 20 65 78 70 72 20 49  se 1:     expr I
de60: 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20  N (SELECT ...). 
de70: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
de80: 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    ** Generate co
de90: 64 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  de to write the 
dea0: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
deb0: 65 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74  elect into the t
dec0: 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20  emporary.       
ded0: 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61   ** table alloca
dee0: 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61  ted and opened a
def0: 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  bove..        */
df00: 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 44  .        SelectD
df10: 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20  est dest;.      
df20: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
df30: 73 74 3b 0a 0a 20 20 20 20 20 20 20 20 73 71 6c  st;..        sql
df40: 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
df50: 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 53 65  it(&dest, SRT_Se
df60: 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t, pExpr->iTable
df70: 29 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e  );.        dest.
df80: 61 66 66 69 6e 69 74 79 20 3d 20 28 69 6e 74 29  affinity = (int)
df90: 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20  affinity;.      
dfa0: 20 20 61 73 73 65 72 74 28 20 28 70 45 78 70 72    assert( (pExpr
dfb0: 2d 3e 69 54 61 62 6c 65 26 30 78 30 30 30 30 46  ->iTable&0x0000F
dfc0: 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61  FFF)==pExpr->iTa
dfd0: 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ble );.        i
dfe0: 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
dff0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
e000: 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 2c 20  pSelect, &dest, 
e010: 30 2c 20 30 2c 20 30 2c 20 30 29 20 29 7b 0a 20  0, 0, 0, 0) ){. 
e020: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b           return;
e030: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e040: 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70     pEList = pExp
e050: 72 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  r->pSelect->pELi
e060: 73 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  st;.        if( 
e070: 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
e080: 2d 3e 6e 45 78 70 72 3e 30 20 29 7b 20 0a 20 20  ->nExpr>0 ){ .  
e090: 20 20 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e          keyInfo.
e0a0: 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74  aColl[0] = sqlit
e0b0: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
e0c0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
e0d0: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20 20  Expr->pLeft,.   
e0e0: 20 20 20 20 20 20 20 20 20 20 20 70 45 4c 69 73             pELis
e0f0: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  t->a[0].pExpr);.
e100: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e110: 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d  }else if( pExpr-
e120: 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  >pList ){.      
e130: 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20    /* Case 2:    
e140: 20 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69   expr IN (exprli
e150: 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  st).        **. 
e160: 20 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 65 61         ** For ea
e170: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 62  ch expression, b
e180: 75 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b 65  uild an index ke
e190: 79 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c 75  y from the evalu
e1a0: 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20  ation and.      
e1b0: 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69 6e    ** store it in
e1c0: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
e1d0: 61 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e 20  able. If <expr> 
e1e0: 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65  is a column, the
e1f0: 6e 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a  n use.        **
e200: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66   that columns af
e210: 66 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69 6c  finity when buil
e220: 64 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73 2e  ding index keys.
e230: 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f   If <expr> is no
e240: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63  t.        ** a c
e250: 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72  olumn, use numer
e260: 69 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20  ic affinity..   
e270: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
e280: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 45  int i;.        E
e290: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
e2a0: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20   pExpr->pList;. 
e2b0: 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78         struct Ex
e2c0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
e2d0: 65 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  em;.        int 
e2e0: 72 31 2c 20 72 32 3b 0a 0a 20 20 20 20 20 20 20  r1, r2;..       
e2f0: 20 69 66 28 20 21 61 66 66 69 6e 69 74 79 20 29   if( !affinity )
e300: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 69  {.          affi
e310: 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46  nity = SQLITE_AF
e320: 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  F_NONE;.        
e330: 7d 0a 20 20 20 20 20 20 20 20 6b 65 79 49 6e 66  }.        keyInf
e340: 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 70 45 78  o.aColl[0] = pEx
e350: 70 72 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c  pr->pLeft->pColl
e360: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f  ;..        /* Lo
e370: 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  op through each 
e380: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65  expression in <e
e390: 78 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20  xprlist>. */.   
e3a0: 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
e3b0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
e3c0: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20  se);.        r2 
e3d0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
e3e0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
e3f0: 20 20 20 20 20 66 6f 72 28 69 3d 70 4c 69 73 74       for(i=pList
e400: 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70  ->nExpr, pItem=p
e410: 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d  List->a; i>0; i-
e420: 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
e430: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 32         Expr *pE2
e440: 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
e450: 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ..          /* I
e460: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
e470: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74   is not constant
e480: 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65   then we will ne
e490: 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20  ed to.          
e4a0: 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 65 20 74  ** disable the t
e4b0: 65 73 74 20 74 68 61 74 20 77 61 73 20 67 65 6e  est that was gen
e4c0: 65 72 61 74 65 64 20 61 62 6f 76 65 20 74 68 61  erated above tha
e4d0: 74 20 6d 61 6b 65 73 20 73 75 72 65 0a 20 20 20  t makes sure.   
e4e0: 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63         ** this c
e4f0: 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63 75 74 65  ode only execute
e500: 73 20 6f 6e 63 65 2e 20 20 42 65 63 61 75 73 65  s once.  Because
e510: 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74   for a non-const
e520: 61 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ant.          **
e530: 20 65 78 70 72 65 73 73 69 6f 6e 20 77 65 20 6e   expression we n
e540: 65 65 64 20 74 6f 20 72 65 72 75 6e 20 74 68 69  eed to rerun thi
e550: 73 20 63 6f 64 65 20 65 61 63 68 20 74 69 6d 65  s code each time
e560: 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
e570: 20 20 20 20 20 20 20 20 20 69 66 28 20 74 65 73           if( tes
e580: 74 41 64 64 72 20 26 26 20 21 73 71 6c 69 74 65  tAddr && !sqlite
e590: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
e5a0: 70 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pE2) ){.        
e5b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
e5c0: 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 74  hangeToNoop(v, t
e5d0: 65 73 74 41 64 64 72 2d 31 2c 20 32 29 3b 0a 20  estAddr-1, 2);. 
e5e0: 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 41             testA
e5f0: 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ddr = 0;.       
e600: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
e610: 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20  /* Evaluate the 
e620: 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 69  expression and i
e630: 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68  nsert it into th
e640: 65 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a  e temp table */.
e650: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
e660: 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68  ->disableColCach
e670: 65 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 73  e++;.          s
e680: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
e690: 50 61 72 73 65 2c 20 70 45 32 2c 20 72 31 29 3b  Parse, pE2, r1);
e6a0: 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73  .          pPars
e6b0: 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63  e->disableColCac
e6c0: 68 65 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20  he--;.          
e6d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e6e0: 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
e6f0: 72 64 2c 20 72 31 2c 20 31 2c 20 72 32 2c 20 26  rd, r1, 1, r2, &
e700: 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20  affinity, 1);.  
e710: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
e720: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
e730: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
e740: 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  1, 1);.         
e750: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e760: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
e770: 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  rt, pExpr->iTabl
e780: 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20  e, r2);.        
e790: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
e7a0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
e7b0: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
e7c0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
e7d0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
e7e0: 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a  e, r2);.      }.
e7f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e800: 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64  eChangeP4(v, add
e810: 72 2c 20 28 76 6f 69 64 20 2a 29 26 6b 65 79 49  r, (void *)&keyI
e820: 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
e830: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
e840: 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54     }..    case T
e850: 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61  K_EXISTS:.    ca
e860: 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a  se TK_SELECT: {.
e870: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61        /* This ha
e880: 73 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72  s to be a scalar
e890: 20 53 45 4c 45 43 54 2e 20 20 47 65 6e 65 72 61   SELECT.  Genera
e8a0: 74 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74  te code to put t
e8b0: 68 65 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c 75  he.      ** valu
e8c0: 65 20 6f 66 20 74 68 69 73 20 73 65 6c 65 63 74  e of this select
e8d0: 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c   in a memory cel
e8e0: 6c 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68 65  l and record the
e8f0: 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a   number.      **
e900: 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63   of the memory c
e910: 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a  ell in iColumn..
e920: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
e930: 74 61 74 69 63 20 63 6f 6e 73 74 20 54 6f 6b 65  tatic const Toke
e940: 6e 20 6f 6e 65 20 3d 20 7b 20 28 75 38 2a 29 22  n one = { (u8*)"
e950: 31 22 2c 20 30 2c 20 31 20 7d 3b 0a 20 20 20 20  1", 0, 1 };.    
e960: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a    Select *pSel;.
e970: 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
e980: 20 64 65 73 74 3b 0a 0a 20 20 20 20 20 20 70 53   dest;..      pS
e990: 65 6c 20 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c  el = pExpr->pSel
e9a0: 65 63 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ect;.      sqlit
e9b0: 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
e9c0: 28 26 64 65 73 74 2c 20 30 2c 20 2b 2b 70 50 61  (&dest, 0, ++pPa
e9d0: 72 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20  rse->nMem);.    
e9e0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
e9f0: 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20  =TK_SELECT ){.  
ea00: 20 20 20 20 20 20 64 65 73 74 2e 65 44 65 73 74        dest.eDest
ea10: 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20   = SRT_Mem;.    
ea20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ea30: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
ea40: 2c 20 30 2c 20 64 65 73 74 2e 69 50 61 72 6d 29  , 0, dest.iParm)
ea50: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
ea60: 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20  mment((v, "Init 
ea70: 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 22  subquery result"
ea80: 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
ea90: 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44  .        dest.eD
eaa0: 65 73 74 20 3d 20 53 52 54 5f 45 78 69 73 74 73  est = SRT_Exists
eab0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
eac0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
ead0: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 64 65  P_Integer, 0, de
eae0: 73 74 2e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  st.iParm);.     
eaf0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
eb00: 76 2c 20 22 49 6e 69 74 20 45 58 49 53 54 53 20  v, "Init EXISTS 
eb10: 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20  result"));.     
eb20: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
eb30: 45 78 70 72 44 65 6c 65 74 65 28 70 53 65 6c 2d  ExprDelete(pSel-
eb40: 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >pLimit);.      
eb50: 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73  pSel->pLimit = s
eb60: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
eb70: 73 65 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20  se, TK_INTEGER, 
eb80: 30 2c 20 30 2c 20 26 6f 6e 65 29 3b 0a 20 20 20  0, 0, &one);.   
eb90: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65     if( sqlite3Se
eba0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
ebb0: 6c 2c 20 26 64 65 73 74 2c 20 30 2c 20 30 2c 20  l, &dest, 0, 0, 
ebc0: 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  0, 0) ){.       
ebd0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
ebe0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43  .      pExpr->iC
ebf0: 6f 6c 75 6d 6e 20 3d 20 64 65 73 74 2e 69 50 61  olumn = dest.iPa
ec00: 72 6d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  rm;.      break;
ec10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
ec20: 28 20 74 65 73 74 41 64 64 72 20 29 7b 0a 20 20  ( testAddr ){.  
ec30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
ec40: 70 48 65 72 65 28 76 2c 20 74 65 73 74 41 64 64  pHere(v, testAdd
ec50: 72 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  r-1);.  }..  ret
ec60: 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  urn;.}.#endif /*
ec70: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
ec80: 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  QUERY */../*.** 
ec90: 44 75 70 6c 69 63 61 74 65 20 61 6e 20 38 2d 62  Duplicate an 8-b
eca0: 79 74 65 20 76 61 6c 75 65 0a 2a 2f 0a 73 74 61  yte value.*/.sta
ecb0: 74 69 63 20 63 68 61 72 20 2a 64 75 70 38 62 79  tic char *dup8by
ecc0: 74 65 73 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e  tes(Vdbe *v, con
ecd0: 73 74 20 63 68 61 72 20 2a 69 6e 29 7b 0a 20 20  st char *in){.  
ece0: 63 68 61 72 20 2a 6f 75 74 20 3d 20 73 71 6c 69  char *out = sqli
ecf0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 73  te3DbMallocRaw(s
ed00: 71 6c 69 74 65 33 56 64 62 65 44 62 28 76 29 2c  qlite3VdbeDb(v),
ed10: 20 38 29 3b 0a 20 20 69 66 28 20 6f 75 74 20 29   8);.  if( out )
ed20: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 6f 75 74  {.    memcpy(out
ed30: 2c 20 69 6e 2c 20 38 29 3b 0a 20 20 7d 0a 20 20  , in, 8);.  }.  
ed40: 72 65 74 75 72 6e 20 6f 75 74 3b 0a 7d 0a 0a 2f  return out;.}../
ed50: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e  *.** Generate an
ed60: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61   instruction tha
ed70: 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 66  t will put the f
ed80: 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a  loating point.**
ed90: 20 76 61 6c 75 65 20 64 65 73 63 72 69 62 65 64   value described
eda0: 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e   by z[0..n-1] in
edb0: 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d  to register iMem
edc0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20  ..**.** The z[] 
edd0: 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62  string will prob
ede0: 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f  ably not be zero
edf0: 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42 75  -terminated.  Bu
ee00: 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63  t the .** z[n] c
ee10: 68 61 72 61 63 74 65 72 20 69 73 20 67 75 61 72  haracter is guar
ee20: 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73 6f 6d  anteed to be som
ee30: 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65 73  ething that does
ee40: 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b   not look.** lik
ee50: 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69  e the continuati
ee60: 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  on of the number
ee70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
ee80: 20 63 6f 64 65 52 65 61 6c 28 56 64 62 65 20 2a   codeReal(Vdbe *
ee90: 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  v, const char *z
eea0: 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20 6e 65 67  , int n, int neg
eeb0: 61 74 65 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65  ateFlag, int iMe
eec0: 6d 29 7b 0a 20 20 61 73 73 65 72 74 28 20 7a 20  m){.  assert( z 
eed0: 7c 7c 20 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  || v==0 || sqlit
eee0: 65 33 56 64 62 65 44 62 28 76 29 2d 3e 6d 61 6c  e3VdbeDb(v)->mal
eef0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
ef00: 66 28 20 7a 20 29 7b 0a 20 20 20 20 64 6f 75 62  f( z ){.    doub
ef10: 6c 65 20 76 61 6c 75 65 3b 0a 20 20 20 20 63 68  le value;.    ch
ef20: 61 72 20 2a 7a 56 3b 0a 20 20 20 20 61 73 73 65  ar *zV;.    asse
ef30: 72 74 28 20 21 69 73 64 69 67 69 74 28 7a 5b 6e  rt( !isdigit(z[n
ef40: 5d 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ]) );.    sqlite
ef50: 33 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65 29  3AtoF(z, &value)
ef60: 3b 0a 20 20 20 20 69 66 28 20 6e 65 67 61 74 65  ;.    if( negate
ef70: 46 6c 61 67 20 29 20 76 61 6c 75 65 20 3d 20 2d  Flag ) value = -
ef80: 76 61 6c 75 65 3b 0a 20 20 20 20 7a 56 20 3d 20  value;.    zV = 
ef90: 64 75 70 38 62 79 74 65 73 28 76 2c 20 28 63 68  dup8bytes(v, (ch
efa0: 61 72 2a 29 26 76 61 6c 75 65 29 3b 0a 20 20 20  ar*)&value);.   
efb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
efc0: 70 34 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30  p4(v, OP_Real, 0
efd0: 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50  , iMem, 0, zV, P
efe0: 34 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 0a  4_REAL);.  }.}..
eff0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
f000: 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  an instruction t
f010: 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65  hat will put the
f020: 20 69 6e 74 65 67 65 72 20 64 65 73 63 72 69 62   integer describ
f030: 65 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30  e by.** text z[0
f040: 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69  ..n-1] into regi
f050: 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a  ster iMem..**.**
f060: 20 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20   The z[] string 
f070: 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f  will probably no
f080: 74 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e  t be zero-termin
f090: 61 74 65 64 2e 20 20 42 75 74 20 74 68 65 20 0a  ated.  But the .
f0a0: 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65  ** z[n] characte
f0b0: 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  r is guaranteed 
f0c0: 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 20  to be something 
f0d0: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f  that does not lo
f0e0: 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63  ok.** like the c
f0f0: 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74  ontinuation of t
f100: 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74  he number..*/.st
f110: 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e  atic void codeIn
f120: 74 65 67 65 72 28 56 64 62 65 20 2a 76 2c 20 63  teger(Vdbe *v, c
f130: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
f140: 74 20 6e 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67  t n, int negFlag
f150: 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 61  , int iMem){.  a
f160: 73 73 65 72 74 28 20 7a 20 7c 7c 20 76 3d 3d 30  ssert( z || v==0
f170: 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65 44   || sqlite3VdbeD
f180: 62 28 76 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  b(v)->mallocFail
f190: 65 64 20 29 3b 0a 20 20 69 66 28 20 7a 20 29 7b  ed );.  if( z ){
f1a0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
f1b0: 61 73 73 65 72 74 28 20 21 69 73 64 69 67 69 74  assert( !isdigit
f1c0: 28 7a 5b 6e 5d 29 20 29 3b 0a 20 20 20 20 69 66  (z[n]) );.    if
f1d0: 28 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33  ( sqlite3GetInt3
f1e0: 32 28 7a 2c 20 26 69 29 20 29 7b 0a 20 20 20 20  2(z, &i) ){.    
f1f0: 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 20    if( negFlag ) 
f200: 69 20 3d 20 2d 69 3b 0a 20 20 20 20 20 20 73 71  i = -i;.      sq
f210: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
f220: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69  v, OP_Integer, i
f230: 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 7d 65 6c  , iMem);.    }el
f240: 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 46 69  se if( sqlite3Fi
f250: 74 73 49 6e 36 34 42 69 74 73 28 7a 2c 20 6e 65  tsIn64Bits(z, ne
f260: 67 46 6c 61 67 29 20 29 7b 0a 20 20 20 20 20 20  gFlag) ){.      
f270: 69 36 34 20 76 61 6c 75 65 3b 0a 20 20 20 20 20  i64 value;.     
f280: 20 63 68 61 72 20 2a 7a 56 3b 0a 20 20 20 20 20   char *zV;.     
f290: 20 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 7a   sqlite3Atoi64(z
f2a0: 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 20  , &value);.     
f2b0: 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 20 76   if( negFlag ) v
f2c0: 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20  alue = -value;. 
f2d0: 20 20 20 20 20 7a 56 20 3d 20 64 75 70 38 62 79       zV = dup8by
f2e0: 74 65 73 28 76 2c 20 28 63 68 61 72 2a 29 26 76  tes(v, (char*)&v
f2f0: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  alue);.      sql
f300: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
f310: 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69  , OP_Int64, 0, i
f320: 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 49  Mem, 0, zV, P4_I
f330: 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65 6c 73 65  NT64);.    }else
f340: 7b 0a 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c  {.      codeReal
f350: 28 76 2c 20 7a 2c 20 6e 2c 20 6e 65 67 46 6c 61  (v, z, n, negFla
f360: 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a  g, iMem);.    }.
f370: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65    }.}.../*.** Ge
f380: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
f390: 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20 74 68   will extract th
f3a0: 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c  e iColumn-th col
f3b0: 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c  umn from.** tabl
f3c0: 65 20 70 54 61 62 20 61 6e 64 20 73 74 6f 72 65  e pTab and store
f3d0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75   the column valu
f3e0: 65 20 69 6e 20 61 20 72 65 67 69 73 74 65 72 2e  e in a register.
f3f0: 20 20 41 6e 20 65 66 66 6f 72 74 0a 2a 2a 20 69    An effort.** i
f400: 73 20 6d 61 64 65 20 74 6f 20 73 74 6f 72 65 20  s made to store 
f410: 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  the column value
f420: 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65   in register iRe
f430: 67 2c 20 62 75 74 20 74 68 69 73 20 69 73 0a 2a  g, but this is.*
f440: 2a 20 6e 6f 74 20 67 75 61 72 61 6e 74 65 65 64  * not guaranteed
f450: 2e 20 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  .  The location 
f460: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61  of the column va
f470: 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  lue is returned.
f480: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  .**.** There mus
f490: 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63 75 72  t be an open cur
f4a0: 73 6f 72 20 74 6f 20 70 54 61 62 20 69 6e 20 69  sor to pTab in i
f4b0: 54 61 62 6c 65 20 77 68 65 6e 20 74 68 69 73 20  Table when this 
f4c0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
f4d0: 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c 75 6d  lled.  If iColum
f4e0: 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73  n<0 then code is
f4f0: 20 67 65 6e 65 72 61 74 65 64 20 74 68 61 74 20   generated that 
f500: 65 78 74 72 61 63 74 73 20 74 68 65 20 72 6f 77  extracts the row
f510: 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  id..**.** This r
f520: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 61 74 74  outine might att
f530: 65 6d 70 74 20 74 6f 20 72 65 75 73 65 20 74 68  empt to reuse th
f540: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63  e value of the c
f550: 6f 6c 75 6d 6e 20 74 68 61 74 0a 2a 2a 20 68 61  olumn that.** ha
f560: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6c  s already been l
f570: 6f 61 64 65 64 20 69 6e 74 6f 20 61 20 72 65 67  oaded into a reg
f580: 69 73 74 65 72 2e 20 20 54 68 65 20 76 61 6c 75  ister.  The valu
f590: 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 0a 2a 2a  e will always.**
f5a0: 20 62 65 20 75 73 65 64 20 69 66 20 69 74 20 68   be used if it h
f5b0: 61 73 20 6e 6f 74 20 75 6e 64 65 72 67 6f 6e 65  as not undergone
f5c0: 20 61 6e 79 20 61 66 66 69 6e 69 74 79 20 63 68   any affinity ch
f5d0: 61 6e 67 65 73 2e 20 20 42 75 74 20 69 66 0a 2a  anges.  But if.*
f5e0: 2a 20 61 6e 20 61 66 66 69 6e 69 74 79 20 63 68  * an affinity ch
f5f0: 61 6e 67 65 20 68 61 73 20 6f 63 63 75 72 72 65  ange has occurre
f600: 64 2c 20 74 68 65 6e 20 74 68 65 20 63 61 63 68  d, then the cach
f610: 65 64 20 76 61 6c 75 65 20 77 69 6c 6c 20 6f 6e  ed value will on
f620: 6c 79 20 62 65 0a 2a 2a 20 75 73 65 64 20 69 66  ly be.** used if
f630: 20 61 6c 6c 6f 77 41 66 66 43 68 6e 67 20 69 73   allowAffChng is
f640: 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   true..*/.int sq
f650: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
f660: 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20  Column(.  Parse 
f670: 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61  *pParse,   /* Pa
f680: 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
f690: 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
f6a0: 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  t */.  Table *pT
f6b0: 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72  ab,     /* Descr
f6c0: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61  iption of the ta
f6d0: 62 6c 65 20 77 65 20 61 72 65 20 72 65 61 64 69  ble we are readi
f6e0: 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ng from */.  int
f6f0: 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a   iColumn,     /*
f700: 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61   Index of the ta
f710: 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  ble column */.  
f720: 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
f730: 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70   /* The cursor p
f740: 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74  ointing to the t
f750: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  able */.  int iR
f760: 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 74  eg,        /* St
f770: 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65 72 65  ore results here
f780: 20 2a 2f 0a 20 20 69 6e 74 20 61 6c 6c 6f 77 41   */.  int allowA
f790: 66 66 43 68 6e 67 20 2f 2a 20 54 72 75 65 20 69  ffChng /* True i
f7a0: 66 20 70 72 69 6f 72 20 61 66 66 69 6e 69 74 79  f prior affinity
f7b0: 20 63 68 61 6e 67 65 73 20 61 72 65 20 4f 4b 20   changes are OK 
f7c0: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
f7d0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
f7e0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
f7f0: 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
f800: 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  ..  for(i=0, p=p
f810: 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
f820: 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c  ; i<pParse->nCol
f830: 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29  Cache; i++, p++)
f840: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61  {.    if( p->iTa
f850: 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70  ble==iTable && p
f860: 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75  ->iColumn==iColu
f870: 6d 6e 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  mn.           &&
f880: 20 28 21 70 2d 3e 61 66 66 43 68 61 6e 67 65 20   (!p->affChange 
f890: 7c 7c 20 61 6c 6c 6f 77 41 66 66 43 68 6e 67 29  || allowAffChng)
f8a0: 20 29 7b 0a 23 69 66 20 30 0a 20 20 20 20 20 20   ){.#if 0.      
f8b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f8c0: 30 28 76 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20  0(v, OP_Noop);. 
f8d0: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
f8e0: 28 28 76 2c 20 22 4f 50 54 3a 20 74 61 62 25 64  ((v, "OPT: tab%d
f8f0: 2e 63 6f 6c 25 64 20 2d 3e 20 72 25 64 22 2c 20  .col%d -> r%d", 
f900: 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c  iTable, iColumn,
f910: 20 70 2d 3e 69 52 65 67 29 29 3b 0a 23 65 6e 64   p->iReg));.#end
f920: 69 66 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  if.      return 
f930: 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20  p->iReg;.    }. 
f940: 20 7d 20 20 0a 20 20 61 73 73 65 72 74 28 20 76   }  .  assert( v
f950: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 43 6f  !=0 );.  if( iCo
f960: 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 69 6e  lumn<0 ){.    in
f970: 74 20 6f 70 20 3d 20 28 70 54 61 62 20 26 26 20  t op = (pTab && 
f980: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 29  IsVirtual(pTab))
f990: 20 3f 20 4f 50 5f 56 52 6f 77 69 64 20 3a 20 4f   ? OP_VRowid : O
f9a0: 50 5f 52 6f 77 69 64 3b 0a 20 20 20 20 73 71 6c  P_Rowid;.    sql
f9b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f9c0: 2c 20 6f 70 2c 20 69 54 61 62 6c 65 2c 20 69 52  , op, iTable, iR
f9d0: 65 67 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  eg);.  }else if(
f9e0: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
f9f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fa00: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
fa10: 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c  iTable, iColumn,
fa20: 20 69 52 65 67 29 3b 0a 20 20 7d 65 6c 73 65 7b   iReg);.  }else{
fa30: 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 49 73  .    int op = Is
fa40: 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 3f 20  Virtual(pTab) ? 
fa50: 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f  OP_VColumn : OP_
fa60: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69  Column;.    sqli
fa70: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
fa80: 20 6f 70 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f   op, iTable, iCo
fa90: 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 20  lumn, iReg);.   
faa0: 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65   sqlite3ColumnDe
fab0: 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69  fault(v, pTab, i
fac0: 43 6f 6c 75 6d 6e 29 3b 0a 23 69 66 6e 64 65 66  Column);.#ifndef
fad0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
fae0: 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
faf0: 69 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  if( pTab->aCol[i
fb00: 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79  Column].affinity
fb10: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  ==SQLITE_AFF_REA
fb20: 4c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L ){.      sqlit
fb30: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
fb40: 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 2c  OP_RealAffinity,
fb50: 20 69 52 65 67 29 3b 0a 20 20 20 20 7d 0a 23 65   iReg);.    }.#e
fb60: 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66 28 20 70  ndif.  }.  if( p
fb70: 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f  Parse->disableCo
fb80: 6c 43 61 63 68 65 3d 3d 30 20 29 7b 0a 20 20 20  lCache==0 ){.   
fb90: 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 6f   i = pParse->iCo
fba0: 6c 43 61 63 68 65 3b 0a 20 20 20 20 70 20 3d 20  lCache;.    p = 
fbb0: 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  &pParse->aColCac
fbc0: 68 65 5b 69 5d 3b 0a 20 20 20 20 70 2d 3e 69 54  he[i];.    p->iT
fbd0: 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20  able = iTable;. 
fbe0: 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20     p->iColumn = 
fbf0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 2d 3e  iColumn;.    p->
fc00: 69 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 20  iReg = iReg;.   
fc10: 20 69 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69 3e   i++;.    if( i>
fc20: 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61 72 73  =ArraySize(pPars
fc30: 65 2d 3e 61 43 6f 6c 43 61 63 68 65 29 20 29 20  e->aColCache) ) 
fc40: 69 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 69  i = 0;.    if( i
fc50: 3e 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63  >pParse->nColCac
fc60: 68 65 20 29 20 70 50 61 72 73 65 2d 3e 6e 43 6f  he ) pParse->nCo
fc70: 6c 43 61 63 68 65 20 3d 20 69 3b 0a 20 20 20 20  lCache = i;.    
fc80: 70 50 61 72 73 65 2d 3e 69 43 6f 6c 43 61 63 68  pParse->iColCach
fc90: 65 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  e = i;.  }.  ret
fca0: 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a  urn iReg;.}../*.
fcb0: 2a 2a 20 44 69 73 61 62 6c 65 20 28 2b 31 29 20  ** Disable (+1) 
fcc0: 6f 72 20 65 6e 61 62 6c 65 20 28 2d 31 29 20 74  or enable (-1) t
fcd0: 68 65 20 61 64 64 69 6e 67 20 6f 66 20 6e 65 77  he adding of new
fce0: 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 65 6e   column cache en
fcf0: 74 72 69 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tries..*/.void s
fd00: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 75 6d 6e  qlite3ExprColumn
fd10: 43 61 63 68 65 44 69 73 61 62 6c 65 28 50 61 72  CacheDisable(Par
fd20: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
fd30: 64 69 73 61 62 6c 65 29 7b 0a 20 20 61 73 73 65  disable){.  asse
fd40: 72 74 28 20 64 69 73 61 62 6c 65 3d 3d 2d 31 20  rt( disable==-1 
fd50: 7c 7c 20 64 69 73 61 62 6c 65 3d 3d 2b 31 20 29  || disable==+1 )
fd60: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
fd70: 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61  se->disableColCa
fd80: 63 68 65 3e 30 20 7c 7c 20 64 69 73 61 62 6c 65  che>0 || disable
fd90: 3d 3d 31 20 29 3b 0a 20 20 70 50 61 72 73 65 2d  ==1 );.  pParse-
fda0: 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65  >disableColCache
fdb0: 20 2b 3d 20 64 69 73 61 62 6c 65 3b 0a 7d 0a 0a   += disable;.}..
fdc0: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 6c 6c 20  /*.** Clear all 
fdd0: 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 65 6e 74  column cache ent
fde0: 72 69 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ries associated 
fdf0: 77 69 74 68 20 74 68 65 20 76 64 62 65 0a 2a 2a  with the vdbe.**
fe00: 20 63 75 72 73 6f 72 20 77 69 74 68 20 63 75 72   cursor with cur
fe10: 73 6f 72 20 6e 75 6d 62 65 72 20 69 54 61 62 6c  sor number iTabl
fe20: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
fe30: 65 33 45 78 70 72 43 6c 65 61 72 43 6f 6c 75 6d  e3ExprClearColum
fe40: 6e 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50  nCache(Parse *pP
fe50: 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62 6c 65  arse, int iTable
fe60: 29 7b 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3c  ){.  if( iTable<
fe70: 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  0 ){.    pParse-
fe80: 3e 6e 43 6f 6c 43 61 63 68 65 20 3d 20 30 3b 0a  >nColCache = 0;.
fe90: 20 20 20 20 70 50 61 72 73 65 2d 3e 69 43 6f 6c      pParse->iCol
fea0: 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  Cache = 0;.  }el
feb0: 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  se{.    int i;. 
fec0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
fed0: 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b  arse->nColCache;
fee0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
fef0: 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63   pParse->aColCac
ff00: 68 65 5b 69 5d 2e 69 54 61 62 6c 65 3d 3d 69 54  he[i].iTable==iT
ff10: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
ff20: 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
ff30: 65 5b 69 5d 20 3d 20 70 50 61 72 73 65 2d 3e 61  e[i] = pParse->a
ff40: 43 6f 6c 43 61 63 68 65 5b 2d 2d 70 50 61 72 73  ColCache[--pPars
ff50: 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 5d 3b 0a 20  e->nColCache];. 
ff60: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69         pParse->i
ff70: 43 6f 6c 43 61 63 68 65 20 3d 20 70 50 61 72 73  ColCache = pPars
ff80: 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 0a 20 20  e->nColCache;.  
ff90: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
ffa0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20  }../*.** Record 
ffb0: 74 68 65 20 66 61 63 74 20 74 68 61 74 20 61 6e  the fact that an
ffc0: 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65   affinity change
ffd0: 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 6f 6e   has occurred on
ffe0: 20 69 43 6f 75 6e 74 0a 2a 2a 20 72 65 67 69 73   iCount.** regis
fff0: 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 77 69  ters starting wi
10000 74 68 20 69 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f  th iStart..*/.vo
10010 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
10020 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
10030 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
10040 20 69 6e 74 20 69 53 74 61 72 74 2c 20 69 6e 74   int iStart, int
10050 20 69 43 6f 75 6e 74 29 7b 0a 20 20 69 6e 74 20   iCount){.  int 
10060 69 45 6e 64 20 3d 20 69 53 74 61 72 74 20 2b 20  iEnd = iStart + 
10070 69 43 6f 75 6e 74 20 2d 20 31 3b 0a 20 20 69 6e  iCount - 1;.  in
10080 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
10090 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61  i<pParse->nColCa
100a0 63 68 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  che; i++){.    i
100b0 6e 74 20 72 20 3d 20 70 50 61 72 73 65 2d 3e 61  nt r = pParse->a
100c0 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65 67  ColCache[i].iReg
100d0 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 53 74  ;.    if( r>=iSt
100e0 61 72 74 20 26 26 20 72 3c 3d 69 45 6e 64 20 29  art && r<=iEnd )
100f0 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
10100 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 61 66 66  aColCache[i].aff
10110 43 68 61 6e 67 65 20 3d 20 31 3b 0a 20 20 20 20  Change = 1;.    
10120 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  }.  }.}../*.** G
10130 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
10140 6d 6f 76 65 73 20 63 6f 6e 74 65 6e 74 20 66 72  moves content fr
10150 6f 6d 20 6f 6e 65 20 72 65 67 69 73 74 65 72 20  om one register 
10160 74 6f 20 61 6e 6f 74 68 65 72 2e 0a 2a 2a 20 4b  to another..** K
10170 65 65 70 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  eep the column c
10180 61 63 68 65 20 75 70 2d 74 6f 2d 64 61 74 65 2e  ache up-to-date.
10190 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
101a0 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 50 61 72  ExprCodeMove(Par
101b0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
101c0 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b  iFrom, int iTo){
101d0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
101e0 69 46 72 6f 6d 3d 3d 69 54 6f 20 29 20 72 65 74  iFrom==iTo ) ret
101f0 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  urn;.  sqlite3Vd
10200 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d  beAddOp2(pParse-
10210 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c  >pVdbe, OP_Move,
10220 20 69 46 72 6f 6d 2c 20 69 54 6f 29 3b 0a 20 20   iFrom, iTo);.  
10230 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
10240 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b  e->nColCache; i+
10250 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72  +){.    if( pPar
10260 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d  se->aColCache[i]
10270 2e 69 52 65 67 3d 3d 69 46 72 6f 6d 20 29 7b 0a  .iReg==iFrom ){.
10280 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 43        pParse->aC
10290 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65 67 20  olCache[i].iReg 
102a0 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d  = iTo;.    }.  }
102b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
102c0 20 74 72 75 65 20 69 66 20 61 6e 79 20 72 65 67   true if any reg
102d0 69 73 74 65 72 20 69 6e 20 74 68 65 20 72 61 6e  ister in the ran
102e0 67 65 20 69 46 72 6f 6d 2e 2e 69 54 6f 20 28 69  ge iFrom..iTo (i
102f0 6e 63 6c 75 73 69 76 65 29 0a 2a 2a 20 69 73 20  nclusive).** is 
10300 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
10310 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
10320 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10330 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68  usedAsColumnCach
10340 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
10350 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20   int iFrom, int 
10360 69 54 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  iTo){.  int i;. 
10370 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72   for(i=0; i<pPar
10380 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69  se->nColCache; i
10390 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d  ++){.    int r =
103a0 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63   pParse->aColCac
103b0 68 65 5b 69 5d 2e 69 52 65 67 3b 0a 20 20 20 20  he[i].iReg;.    
103c0 69 66 28 20 72 3e 3d 69 46 72 6f 6d 20 26 26 20  if( r>=iFrom && 
103d0 72 3c 3d 69 54 6f 20 29 20 72 65 74 75 72 6e 20  r<=iTo ) return 
103e0 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
103f0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 72  0;.}../*.** Ther
10400 65 73 20 69 73 20 61 20 76 61 6c 75 65 20 69 6e  es is a value in
10410 20 72 65 67 69 73 74 65 72 20 69 43 75 72 72 65   register iCurre
10420 6e 74 2e 20 20 57 65 20 75 6c 74 69 6d 61 74 65  nt.  We ultimate
10430 6c 79 20 77 61 6e 74 0a 2a 2a 20 74 68 65 20 76  ly want.** the v
10440 61 6c 75 65 20 74 6f 20 62 65 20 69 6e 20 72 65  alue to be in re
10450 67 69 73 74 65 72 20 69 54 61 72 67 65 74 2e 20  gister iTarget. 
10460 20 49 74 20 6d 69 67 68 74 20 62 65 20 74 68 61   It might be tha
10470 74 0a 2a 2a 20 69 43 75 72 72 65 6e 74 20 61 6e  t.** iCurrent an
10480 64 20 69 54 61 72 67 65 74 20 61 72 65 20 74 68  d iTarget are th
10490 65 20 73 61 6d 65 20 72 65 67 69 73 74 65 72 2e  e same register.
104a0 0a 2a 2a 0a 2a 2a 20 57 65 20 61 72 65 20 67 6f  .**.** We are go
104b0 69 6e 67 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  ing to modify th
104c0 65 20 76 61 6c 75 65 2c 20 73 6f 20 77 65 20 6e  e value, so we n
104d0 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  eed to make sure
104e0 20 69 74 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20   it.** is not a 
104f0 63 61 63 68 65 64 20 72 65 67 69 73 74 65 72 2e  cached register.
10500 20 20 49 66 20 69 43 75 72 72 65 6e 74 20 69 73    If iCurrent is
10510 20 61 20 63 61 63 68 65 64 20 72 65 67 69 73 74   a cached regist
10520 65 72 2c 0a 2a 2a 20 74 68 65 6e 20 74 72 79 20  er,.** then try 
10530 74 6f 20 6d 6f 76 65 20 74 68 65 20 76 61 6c 75  to move the valu
10540 65 20 6f 76 65 72 20 74 6f 20 69 54 61 72 67 65  e over to iTarge
10550 74 2e 20 20 49 66 20 69 54 61 72 67 65 74 20 69  t.  If iTarget i
10560 73 20 61 0a 2a 2a 20 63 61 63 68 65 64 20 72 65  s a.** cached re
10570 67 69 73 74 65 72 2c 20 74 68 65 6e 20 63 6c 65  gister, then cle
10580 61 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  ar the correspon
10590 64 69 6e 67 20 63 61 63 68 65 20 6c 69 6e 65 2e  ding cache line.
105a0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
105b0 65 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20  e register that 
105c0 74 68 65 20 76 61 6c 75 65 20 65 6e 64 73 20 75  the value ends u
105d0 70 20 69 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  p in..*/.int sql
105e0 69 74 65 33 45 78 70 72 57 72 69 74 61 62 6c 65  ite3ExprWritable
105f0 52 65 67 69 73 74 65 72 28 50 61 72 73 65 20 2a  Register(Parse *
10600 70 50 61 72 73 65 2c 20 69 6e 74 20 69 43 75 72  pParse, int iCur
10610 72 65 6e 74 2c 20 69 6e 74 20 69 54 61 72 67 65  rent, int iTarge
10620 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  t){.  int i;.  a
10630 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
10640 56 64 62 65 21 3d 30 20 29 3b 0a 20 20 69 66 28  Vdbe!=0 );.  if(
10650 20 21 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61   !usedAsColumnCa
10660 63 68 65 28 70 50 61 72 73 65 2c 20 69 43 75 72  che(pParse, iCur
10670 72 65 6e 74 2c 20 69 43 75 72 72 65 6e 74 29 20  rent, iCurrent) 
10680 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 69 43  ){.    return iC
10690 75 72 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 69 66  urrent;.  }.  if
106a0 28 20 69 43 75 72 72 65 6e 74 21 3d 69 54 61 72  ( iCurrent!=iTar
106b0 67 65 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  get ){.    sqlit
106c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61  e3VdbeAddOp2(pPa
106d0 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53  rse->pVdbe, OP_S
106e0 43 6f 70 79 2c 20 69 43 75 72 72 65 6e 74 2c 20  Copy, iCurrent, 
106f0 69 54 61 72 67 65 74 29 3b 0a 20 20 7d 0a 20 20  iTarget);.  }.  
10700 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
10710 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b  e->nColCache; i+
10720 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72  +){.    if( pPar
10730 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d  se->aColCache[i]
10740 2e 69 52 65 67 3d 3d 69 54 61 72 67 65 74 20 29  .iReg==iTarget )
10750 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
10760 61 43 6f 6c 43 61 63 68 65 5b 69 5d 20 3d 20 70  aColCache[i] = p
10770 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
10780 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43  [--pParse->nColC
10790 61 63 68 65 5d 3b 0a 20 20 20 20 20 20 70 50 61  ache];.      pPa
107a0 72 73 65 2d 3e 69 43 6f 6c 43 61 63 68 65 20 3d  rse->iColCache =
107b0 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63   pParse->nColCac
107c0 68 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  he;.    }.  }.  
107d0 72 65 74 75 72 6e 20 69 54 61 72 67 65 74 3b 0a  return iTarget;.
107e0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
107f0 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20  e code into the 
10800 63 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20  current Vdbe to 
10810 65 76 61 6c 75 61 74 65 20 74 68 65 20 67 69 76  evaluate the giv
10820 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  en.** expression
10830 2e 20 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74  .  Attempt to st
10840 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
10850 69 6e 20 72 65 67 69 73 74 65 72 20 22 74 61 72  in register "tar
10860 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  get"..** Return 
10870 74 68 65 20 72 65 67 69 73 74 65 72 20 77 68 65  the register whe
10880 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 73  re results are s
10890 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74  tored..**.** Wit
108a0 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  h this routine, 
108b0 74 68 65 72 65 20 69 73 20 6e 6f 20 67 75 61 72  there is no guar
108c0 61 6e 74 65 65 64 20 74 68 61 74 20 72 65 73 75  anteed that resu
108d0 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73  lts will.** be s
108e0 74 6f 72 65 64 20 69 6e 20 74 61 72 67 65 74 2e  tored in target.
108f0 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d 69 67    The result mig
10900 68 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ht be stored in 
10910 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65  some other.** re
10920 67 69 73 74 65 72 20 69 66 20 69 74 20 69 73 20  gister if it is 
10930 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f  convenient to do
10940 20 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e   so.  The callin
10950 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75  g function.** mu
10960 73 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74  st check the ret
10970 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76  urn code and mov
10980 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f  e the results to
10990 20 74 68 65 20 64 65 73 69 72 65 64 0a 2a 2a 20   the desired.** 
109a0 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74  register..*/.int
109b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
109c0 54 61 72 67 65 74 28 50 61 72 73 65 20 2a 70 50  Target(Parse *pP
109d0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
109e0 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
109f0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
10a00 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54  se->pVdbe;  /* T
10a10 68 65 20 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73  he VM under cons
10a20 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
10a30 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
10a40 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
10a50 70 63 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65  pcode being code
10a60 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67  d */.  int inReg
10a70 20 3d 20 74 61 72 67 65 74 3b 20 20 20 20 20 20   = target;      
10a80 20 2f 2a 20 52 65 73 75 6c 74 73 20 73 74 6f 72   /* Results stor
10a90 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  ed in register i
10aa0 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65  nReg */.  int re
10ab0 67 46 72 65 65 31 20 3d 20 30 3b 20 20 20 20 20  gFree1 = 0;     
10ac0 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65      /* If non-ze
10ad0 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d  ro free this tem
10ae0 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
10af0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  */.  int regFree
10b00 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  2 = 0;         /
10b10 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72  * If non-zero fr
10b20 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  ee this temporar
10b30 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  y register */.  
10b40 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 2c 20  int r1, r2, r3, 
10b50 72 34 3b 20 20 20 20 20 20 20 2f 2a 20 56 61 72  r4;       /* Var
10b60 69 6f 75 73 20 72 65 67 69 73 74 65 72 20 6e 75  ious register nu
10b70 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65  mbers */..  asse
10b80 72 74 28 20 76 21 3d 30 20 7c 7c 20 70 50 61 72  rt( v!=0 || pPar
10b90 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
10ba0 69 6c 65 64 20 29 3b 0a 20 20 61 73 73 65 72 74  iled );.  assert
10bb0 28 20 74 61 72 67 65 74 3e 30 20 26 26 20 74 61  ( target>0 && ta
10bc0 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d  rget<=pParse->nM
10bd0 65 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  em );.  if( v==0
10be0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
10bf0 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a  if( pExpr==0 ){.
10c00 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c      op = TK_NULL
10c10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
10c20 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
10c30 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20   }.  switch( op 
10c40 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
10c50 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  GG_COLUMN: {.   
10c60 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67     AggInfo *pAgg
10c70 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41  Info = pExpr->pA
10c80 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74  ggInfo;.      st
10c90 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
10ca0 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e   *pCol = &pAggIn
10cb0 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e  fo->aCol[pExpr->
10cc0 69 41 67 67 5d 3b 0a 20 20 20 20 20 20 69 66 28  iAgg];.      if(
10cd0 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65   !pAggInfo->dire
10ce0 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  ctMode ){.      
10cf0 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e    assert( pCol->
10d00 69 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20  iMem>0 );.      
10d10 20 20 69 6e 52 65 67 20 3d 20 70 43 6f 6c 2d 3e    inReg = pCol->
10d20 69 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 62 72  iMem;.        br
10d30 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eak;.      }else
10d40 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75   if( pAggInfo->u
10d50 73 65 53 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a  seSortingIdx ){.
10d60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
10d70 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
10d80 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f  Column, pAggInfo
10d90 2d 3e 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20  ->sortingIdx,.  
10da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10db0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
10dc0 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c  ->iSorterColumn,
10dd0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
10de0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
10df0 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 77  .      /* Otherw
10e00 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 75 20 69  ise, fall thru i
10e10 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d  nto the TK_COLUM
10e20 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a  N case */.    }.
10e30 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
10e40 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  MN: {.      if( 
10e50 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3c 30 20  pExpr->iTable<0 
10e60 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
10e70 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  is only happens 
10e80 77 68 65 6e 20 63 6f 64 69 6e 67 20 63 68 65 63  when coding chec
10e90 6b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  k constraints */
10ea0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
10eb0 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3e   pParse->ckBase>
10ec0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52  0 );.        inR
10ed0 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  eg = pExpr->iCol
10ee0 75 6d 6e 20 2b 20 70 50 61 72 73 65 2d 3e 63 6b  umn + pParse->ck
10ef0 42 61 73 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Base;.      }els
10f00 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  e{.        inReg
10f10 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
10f20 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72  deGetColumn(pPar
10f30 73 65 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c  se, pExpr->pTab,
10f40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f60 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
10f70 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
10f80 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20   target,.       
10f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fa0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
10fb0 3e 66 6c 61 67 73 20 26 20 45 50 5f 41 6e 79 41  >flags & EP_AnyA
10fc0 66 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ff);.      }.   
10fd0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
10fe0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
10ff0 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64  GER: {.      cod
11000 65 49 6e 74 65 67 65 72 28 76 2c 20 28 63 68 61  eInteger(v, (cha
11010 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  r*)pExpr->token.
11020 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  z, pExpr->token.
11030 6e 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  n, 0, target);. 
11040 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11050 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  }.    case TK_FL
11060 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64  OAT: {.      cod
11070 65 52 65 61 6c 28 76 2c 20 28 63 68 61 72 2a 29  eReal(v, (char*)
11080 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  pExpr->token.z, 
11090 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20  pExpr->token.n, 
110a0 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
110b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
110c0 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
110d0 47 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  G: {.      sqlit
110e0 65 33 44 65 71 75 6f 74 65 45 78 70 72 28 70 50  e3DequoteExpr(pP
110f0 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 29  arse->db, pExpr)
11100 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
11110 64 62 65 41 64 64 4f 70 34 28 76 2c 4f 50 5f 53  dbeAddOp4(v,OP_S
11120 74 72 69 6e 67 38 2c 20 30 2c 20 74 61 72 67 65  tring8, 0, targe
11130 74 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  t, 0,.          
11140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
11150 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65  har*)pExpr->toke
11160 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  n.z, pExpr->toke
11170 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  n.n);.      brea
11180 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
11190 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20  e TK_NULL: {.   
111a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
111b0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
111c0 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
111d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
111e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
111f0 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c  MIT_BLOB_LITERAL
11200 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
11210 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  B: {.      int n
11220 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
11230 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63 68 61  ar *z;.      cha
11240 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20 20 20  r *zBlob;.      
11250 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 74  assert( pExpr->t
11260 6f 6b 65 6e 2e 6e 3e 3d 33 20 29 3b 0a 20 20 20  oken.n>=3 );.   
11270 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
11280 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d 3d 27 78  ->token.z[0]=='x
11290 27 20 7c 7c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  ' || pExpr->toke
112a0 6e 2e 7a 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20  n.z[0]=='X' );. 
112b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
112c0 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 31 5d 3d 3d  pr->token.z[1]==
112d0 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 61 73  '\'' );.      as
112e0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 74 6f 6b  sert( pExpr->tok
112f0 65 6e 2e 7a 5b 70 45 78 70 72 2d 3e 74 6f 6b 65  en.z[pExpr->toke
11300 6e 2e 6e 2d 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a  n.n-1]=='\'' );.
11310 20 20 20 20 20 20 6e 20 3d 20 70 45 78 70 72 2d        n = pExpr-
11320 3e 74 6f 6b 65 6e 2e 6e 20 2d 20 33 3b 0a 20 20  >token.n - 3;.  
11330 20 20 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 70      z = (char*)p
11340 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 2b 20  Expr->token.z + 
11350 32 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d  2;.      zBlob =
11360 20 73 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f   sqlite3HexToBlo
11370 62 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  b(sqlite3VdbeDb(
11380 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  v), z, n);.     
11390 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
113a0 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e  p4(v, OP_Blob, n
113b0 2f 32 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 7a  /2, target, 0, z
113c0 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43  Blob, P4_DYNAMIC
113d0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
113e0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
113f0 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c   case TK_VARIABL
11400 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
11410 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11420 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78  OP_Variable, pEx
11430 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72 67  pr->iTable, targ
11440 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  et);.      if( p
11450 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3e 31 20  Expr->token.n>1 
11460 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
11470 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
11480 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 45 78  , -1, (char*)pEx
11490 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
114a0 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20  pr->token.n);.  
114b0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
114c0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
114d0 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b  e TK_REGISTER: {
114e0 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70  .      inReg = p
114f0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Expr->iTable;.  
11500 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11510 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11520 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61  OMIT_CAST.    ca
11530 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20  se TK_CAST: {.  
11540 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
11550 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20  ns of the form: 
11560 20 20 43 41 53 54 28 70 4c 65 66 74 20 41 53 20    CAST(pLeft AS 
11570 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20  token) */.      
11580 69 6e 74 20 61 66 66 2c 20 74 6f 5f 6f 70 3b 0a  int aff, to_op;.
11590 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71        inReg = sq
115a0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
115b0 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
115c0 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74  r->pLeft, target
115d0 29 3b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 73  );.      aff = s
115e0 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
115f0 70 65 28 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  pe(&pExpr->token
11600 29 3b 0a 20 20 20 20 20 20 74 6f 5f 6f 70 20 3d  );.      to_op =
11610 20 61 66 66 20 2d 20 53 51 4c 49 54 45 5f 41 46   aff - SQLITE_AF
11620 46 5f 54 45 58 54 20 2b 20 4f 50 5f 54 6f 54 65  F_TEXT + OP_ToTe
11630 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  xt;.      assert
11640 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 54 65  ( to_op==OP_ToTe
11650 78 74 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51  xt    || aff!=SQ
11660 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 20 20  LITE_AFF_TEXT   
11670 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
11680 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c  ( to_op==OP_ToBl
11690 6f 62 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51  ob    || aff!=SQ
116a0 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 20 20  LITE_AFF_NONE   
116b0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
116c0 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75  ( to_op==OP_ToNu
116d0 6d 65 72 69 63 20 7c 7c 20 61 66 66 21 3d 53 51  meric || aff!=SQ
116e0 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
116f0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
11700 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 49 6e  ( to_op==OP_ToIn
11710 74 20 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51  t     || aff!=SQ
11720 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
11730 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
11740 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 52 65  ( to_op==OP_ToRe
11750 61 6c 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51  al    || aff!=SQ
11760 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 20 20  LITE_AFF_REAL   
11770 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
11780 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 74  3VdbeAddOp1(v, t
11790 6f 5f 6f 70 2c 20 69 6e 52 65 67 29 3b 0a 20 20  o_op, inReg);.  
117a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
117b0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
117c0 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20  E_OMIT_CAST */. 
117d0 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
117e0 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
117f0 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
11800 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
11810 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
11820 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
11830 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
11840 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20  K_LT==OP_Lt );. 
11850 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
11860 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20  LE==OP_Le );.   
11870 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54     assert( TK_GT
11880 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20 20  ==OP_Gt );.     
11890 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d   assert( TK_GE==
118a0 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20 20 20 61  OP_Ge );.      a
118b0 73 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50  ssert( TK_EQ==OP
118c0 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Eq );.      ass
118d0 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e  ert( TK_NE==OP_N
118e0 65 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  e );.      codeC
118f0 6f 6d 70 61 72 65 4f 70 65 72 61 6e 64 73 28 70  ompareOperands(p
11900 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
11910 65 66 74 2c 20 26 72 31 2c 20 26 72 65 67 46 72  eft, &r1, &regFr
11920 65 65 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ee1,.           
11930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11940 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52         pExpr->pR
11950 69 67 68 74 2c 20 26 72 32 2c 20 26 72 65 67 46  ight, &r2, &regF
11960 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64  ree2);.      cod
11970 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
11980 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
11990 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
119a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
119b0 20 20 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65      r1, r2, inRe
119c0 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50  g, SQLITE_STOREP
119d0 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  2);.      break;
119e0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
119f0 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65  TK_AND:.    case
11a00 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65   TK_OR:.    case
11a10 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61   TK_PLUS:.    ca
11a20 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20  se TK_STAR:.    
11a30 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20  case TK_MINUS:. 
11a40 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a     case TK_REM:.
11a50 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41      case TK_BITA
11a60 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ND:.    case TK_
11a70 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73 65 20  BITOR:.    case 
11a80 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63 61  TK_SLASH:.    ca
11a90 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20  se TK_LSHIFT:.  
11aa0 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54    case TK_RSHIFT
11ab0 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  : .    case TK_C
11ac0 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20 61  ONCAT: {.      a
11ad0 73 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f  ssert( TK_AND==O
11ae0 50 5f 41 6e 64 20 29 3b 0a 20 20 20 20 20 20 61  P_And );.      a
11af0 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50  ssert( TK_OR==OP
11b00 5f 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Or );.      ass
11b10 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50  ert( TK_PLUS==OP
11b20 5f 41 64 64 20 29 3b 0a 20 20 20 20 20 20 61 73  _Add );.      as
11b30 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d  sert( TK_MINUS==
11b40 4f 50 5f 53 75 62 74 72 61 63 74 20 29 3b 0a 20  OP_Subtract );. 
11b50 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
11b60 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65  REM==OP_Remainde
11b70 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  r );.      asser
11b80 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50  t( TK_BITAND==OP
11b90 5f 42 69 74 41 6e 64 20 29 3b 0a 20 20 20 20 20  _BitAnd );.     
11ba0 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4f   assert( TK_BITO
11bb0 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 0a 20  R==OP_BitOr );. 
11bc0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
11bd0 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65  SLASH==OP_Divide
11be0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
11bf0 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f  ( TK_LSHIFT==OP_
11c00 53 68 69 66 74 4c 65 66 74 20 29 3b 0a 20 20 20  ShiftLeft );.   
11c10 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 53     assert( TK_RS
11c20 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69  HIFT==OP_ShiftRi
11c30 67 68 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ght );.      ass
11c40 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d  ert( TK_CONCAT==
11c50 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 0a 20 20 20  OP_Concat );.   
11c60 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
11c70 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
11c80 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
11c90 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
11ca0 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
11cb0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
11cc0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
11cd0 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
11ce0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11cf0 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72  eAddOp3(v, op, r
11d00 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a  2, r1, target);.
11d10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11d20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
11d30 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45  MINUS: {.      E
11d40 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
11d50 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
11d60 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29   assert( pLeft )
11d70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66  ;.      if( pLef
11d80 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20  t->op==TK_FLOAT 
11d90 7c 7c 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  || pLeft->op==TK
11da0 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
11db0 20 20 20 20 54 6f 6b 65 6e 20 2a 70 20 3d 20 26      Token *p = &
11dc0 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  pLeft->token;.  
11dd0 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d        if( pLeft-
11de0 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b  >op==TK_FLOAT ){
11df0 0a 20 20 20 20 20 20 20 20 20 20 63 6f 64 65 52  .          codeR
11e00 65 61 6c 28 76 2c 20 28 63 68 61 72 2a 29 70 2d  eal(v, (char*)p-
11e10 3e 7a 2c 20 70 2d 3e 6e 2c 20 31 2c 20 74 61 72  >z, p->n, 1, tar
11e20 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  get);.        }e
11e30 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
11e40 6f 64 65 49 6e 74 65 67 65 72 28 76 2c 20 28 63  odeInteger(v, (c
11e50 68 61 72 2a 29 70 2d 3e 7a 2c 20 70 2d 3e 6e 2c  har*)p->z, p->n,
11e60 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   1, target);.   
11e70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
11e80 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 67 46  se{.        regF
11e90 72 65 65 31 20 3d 20 72 31 20 3d 20 73 71 6c 69  ree1 = r1 = sqli
11ea0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
11eb0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
11ec0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
11ed0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
11ee0 30 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  0, r1);.        
11ef0 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
11f00 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
11f10 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
11f20 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
11f30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11f40 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74 72  dOp3(v, OP_Subtr
11f50 61 63 74 2c 20 72 32 2c 20 72 31 2c 20 74 61 72  act, r2, r1, tar
11f60 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  get);.      }.  
11f70 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67      inReg = targ
11f80 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  et;.      break;
11f90 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
11fa0 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63  TK_BITNOT:.    c
11fb0 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
11fc0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42      assert( TK_B
11fd0 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74  ITNOT==OP_BitNot
11fe0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
11ff0 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74  ( TK_NOT==OP_Not
12000 20 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20   );.      inReg 
12010 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
12020 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
12030 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61  pExpr->pLeft, ta
12040 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69 6e 52  rget);.      inR
12050 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
12060 57 72 69 74 61 62 6c 65 52 65 67 69 73 74 65 72  WritableRegister
12070 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20  (pParse, inReg, 
12080 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73  target);.      s
12090 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
120a0 28 76 2c 20 6f 70 2c 20 69 6e 52 65 67 29 3b 0a  (v, op, inReg);.
120b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
120c0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
120d0 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
120e0 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
120f0 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
12100 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49      assert( TK_I
12110 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c  SNULL==OP_IsNull
12120 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
12130 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50  ( TK_NOTNULL==OP
12140 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20  _NotNull );.    
12150 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12160 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
12170 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 1, target);. 
12180 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
12190 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
121a0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
121b0 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
121c0 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
121d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
121e0 2c 20 6f 70 2c 20 72 31 29 3b 0a 20 20 20 20 20  , op, r1);.     
121f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12200 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
12210 20 74 61 72 67 65 74 2c 20 2d 31 29 3b 0a 20 20   target, -1);.  
12220 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
12230 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
12240 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
12250 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
12260 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  _AGG_FUNCTION: {
12270 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a  .      AggInfo *
12280 70 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70  pInfo = pExpr->p
12290 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69  AggInfo;.      i
122a0 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20  f( pInfo==0 ){. 
122b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
122c0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
122d0 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72 65 67  misuse of aggreg
122e0 61 74 65 3a 20 25 54 22 2c 0a 20 20 20 20 20 20  ate: %T",.      
122f0 20 20 20 20 20 20 26 70 45 78 70 72 2d 3e 73 70        &pExpr->sp
12300 61 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  an);.      }else
12310 7b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20  {.        inReg 
12320 3d 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70  = pInfo->aFunc[p
12330 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d  Expr->iAgg].iMem
12340 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12350 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
12360 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46   case TK_CONST_F
12370 55 4e 43 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UNC:.    case TK
12380 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
12390 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
123a0 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  st = pExpr->pLis
123b0 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78  t;.      int nEx
123c0 70 72 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69  pr = pList ? pLi
123d0 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20  st->nExpr : 0;. 
123e0 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44       FuncDef *pD
123f0 65 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 49  ef;.      int nI
12400 64 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  d;.      const c
12410 68 61 72 20 2a 7a 49 64 3b 0a 20 20 20 20 20 20  har *zId;.      
12420 69 6e 74 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20  int constMask = 
12430 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  0;.      int i;.
12440 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
12450 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
12460 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45        u8 enc = E
12470 4e 43 28 64 62 29 3b 0a 20 20 20 20 20 20 43 6f  NC(db);.      Co
12480 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30  llSeq *pColl = 0
12490 3b 0a 0a 20 20 20 20 20 20 7a 49 64 20 3d 20 28  ;..      zId = (
124a0 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b  char*)pExpr->tok
124b0 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 6e 49 64 20  en.z;.      nId 
124c0 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  = pExpr->token.n
124d0 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73  ;.      pDef = s
124e0 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
124f0 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  on(pParse->db, z
12500 49 64 2c 20 6e 49 64 2c 20 6e 45 78 70 72 2c 20  Id, nId, nExpr, 
12510 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  enc, 0);.      a
12520 73 73 65 72 74 28 20 70 44 65 66 21 3d 30 20 29  ssert( pDef!=0 )
12530 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73  ;.      if( pLis
12540 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 45 78  t ){.        nEx
12550 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  pr = pList->nExp
12560 72 3b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  r;.        r1 = 
12570 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
12580 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 45 78 70  nge(pParse, nExp
12590 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
125a0 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
125b0 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73  ist(pParse, pLis
125c0 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 65  t, r1);.      }e
125d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 45 78  lse{.        nEx
125e0 70 72 20 3d 20 72 31 20 3d 20 30 3b 0a 20 20 20  pr = r1 = 0;.   
125f0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
12600 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
12610 54 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50  TABLE.      /* P
12620 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64  ossibly overload
12630 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 66   the function if
12640 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
12650 65 6e 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ent is.      ** 
12660 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
12670 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a  column..      **
12680 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e  .      ** For in
12690 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c  fix functions (L
126a0 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58  IKE, GLOB, REGEX
126b0 50 2c 20 61 6e 64 20 4d 41 54 43 48 29 20 75 73  P, and MATCH) us
126c0 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73  e the.      ** s
126d0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20  econd argument, 
126e0 6e 6f 74 20 74 68 65 20 66 69 72 73 74 2c 20 61  not the first, a
126f0 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74  s the argument t
12700 6f 20 74 65 73 74 20 74 6f 0a 20 20 20 20 20 20  o test to.      
12710 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20  ** see if it is 
12720 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69  a column in a vi
12730 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68  rtual table.  Th
12740 69 73 20 69 73 20 64 6f 6e 65 20 62 65 63 61 75  is is done becau
12750 73 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  se.      ** the 
12760 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  left operand of 
12770 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20  infix functions 
12780 28 74 68 65 20 6f 70 65 72 61 6e 64 20 77 65 20  (the operand we 
12790 77 61 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a  want to.      **
127a0 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61   control overloa
127b0 64 69 6e 67 29 20 65 6e 64 73 20 75 70 20 61 73  ding) ends up as
127c0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
127d0 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 20 20  ment to the.    
127e0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20    ** function.  
127f0 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22  The expression "
12800 41 20 67 6c 6f 62 20 42 22 20 69 73 20 65 71 75  A glob B" is equ
12810 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20  ivalent to .    
12820 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e    ** "glob(B,A).
12830 20 20 57 65 20 77 61 6e 74 20 74 6f 20 75 73 65    We want to use
12840 20 74 68 65 20 41 20 69 6e 20 22 41 20 67 6c 6f   the A in "A glo
12850 62 20 42 22 20 74 6f 20 74 65 73 74 0a 20 20 20  b B" to test.   
12860 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69     ** for functi
12870 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20  on overloading. 
12880 20 42 75 74 20 77 65 20 75 73 65 20 74 68 65 20   But we use the 
12890 42 20 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28  B term in "glob(
128a0 42 2c 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a  B,A)"..      */.
128b0 20 20 20 20 20 20 69 66 28 20 6e 45 78 70 72 3e        if( nExpr>
128c0 3d 32 20 26 26 20 28 70 45 78 70 72 2d 3e 66 6c  =2 && (pExpr->fl
128d0 61 67 73 20 26 20 45 50 5f 49 6e 66 69 78 46 75  ags & EP_InfixFu
128e0 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  nc) ){.        p
128f0 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61  Def = sqlite3Vta
12900 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f  bOverloadFunctio
12910 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 45 78 70  n(db, pDef, nExp
12920 72 2c 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  r, pList->a[1].p
12930 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Expr);.      }el
12940 73 65 20 69 66 28 20 6e 45 78 70 72 3e 30 20 29  se if( nExpr>0 )
12950 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d  {.        pDef =
12960 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72   sqlite3VtabOver
12970 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  loadFunction(db,
12980 20 70 44 65 66 2c 20 6e 45 78 70 72 2c 20 70 4c   pDef, nExpr, pL
12990 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
129a0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
129b0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
129c0 69 3c 6e 45 78 70 72 20 26 26 20 69 3c 33 32 3b  i<nExpr && i<32;
129d0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
129e0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
129f0 43 6f 6e 73 74 61 6e 74 28 70 4c 69 73 74 2d 3e  Constant(pList->
12a00 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  a[i].pExpr) ){. 
12a10 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61           constMa
12a20 73 6b 20 7c 3d 20 28 31 3c 3c 69 29 3b 0a 20 20  sk |= (1<<i);.  
12a30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12a40 69 66 28 20 70 44 65 66 2d 3e 6e 65 65 64 43 6f  if( pDef->needCo
12a50 6c 6c 53 65 71 20 26 26 20 21 70 43 6f 6c 6c 20  llSeq && !pColl 
12a60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  ){.          pCo
12a70 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
12a80 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
12a90 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
12aa0 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
12ab0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
12ac0 70 44 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65  pDef->needCollSe
12ad0 71 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  q ){.        if(
12ae0 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20   !pColl ) pColl 
12af0 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44  = pParse->db->pD
12b00 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20  fltColl; .      
12b10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12b20 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65  Op4(v, OP_CollSe
12b30 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61  q, 0, 0, 0, (cha
12b40 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  r *)pColl, P4_CO
12b50 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a  LLSEQ);.      }.
12b60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12b70 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75  eAddOp4(v, OP_Fu
12b80 6e 63 74 69 6f 6e 2c 20 63 6f 6e 73 74 4d 61 73  nction, constMas
12b90 6b 2c 20 72 31 2c 20 74 61 72 67 65 74 2c 0a 20  k, r1, target,. 
12ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12bb0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 44         (char*)pD
12bc0 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  ef, P4_FUNCDEF);
12bd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
12be0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 6e 45  beChangeP5(v, nE
12bf0 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xpr);.      if( 
12c00 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
12c10 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
12c20 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
12c30 20 72 31 2c 20 6e 45 78 70 72 29 3b 0a 20 20 20   r1, nExpr);.   
12c40 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
12c50 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
12c60 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
12c70 2c 20 72 31 2c 20 6e 45 78 70 72 29 3b 0a 20 20  , r1, nExpr);.  
12c80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
12c90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12ca0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
12cb0 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53    case TK_EXISTS
12cc0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  :.    case TK_SE
12cd0 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 69 66  LECT: {.      if
12ce0 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
12cf0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
12d00 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
12d10 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  ect(pParse, pExp
12d20 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
12d30 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72 2d    inReg = pExpr-
12d40 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
12d50 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
12d60 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
12d70 20 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32 2c       int j1, j2,
12d80 20 6a 33 2c 20 6a 34 2c 20 6a 35 3b 0a 20 20 20   j3, j4, j5;.   
12d90 20 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79     char affinity
12da0 3b 0a 20 20 20 20 20 20 69 6e 74 20 65 54 79 70  ;.      int eTyp
12db0 65 3b 0a 0a 20 20 20 20 20 20 65 54 79 70 65 20  e;..      eType 
12dc0 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49  = sqlite3FindInI
12dd0 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 45 78  ndex(pParse, pEx
12de0 70 72 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 2f  pr, 0);..      /
12df0 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  * Figure out the
12e00 20 61 66 66 69 6e 69 74 79 20 74 6f 20 75 73 65   affinity to use
12e10 20 74 6f 20 63 72 65 61 74 65 20 61 20 6b 65 79   to create a key
12e20 20 66 72 6f 6d 20 74 68 65 20 72 65 73 75 6c 74   from the result
12e30 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  s.      ** of th
12e40 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 61 66  e expression. af
12e50 66 69 6e 69 74 79 53 74 72 20 73 74 6f 72 65 73  finityStr stores
12e60 20 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67   a static string
12e70 20 73 75 69 74 61 62 6c 65 20 66 6f 72 0a 20 20   suitable for.  
12e80 20 20 20 20 2a 2a 20 50 34 20 6f 66 20 4f 50 5f      ** P4 of OP_
12e90 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 20 20 20 20  MakeRecord..    
12ea0 20 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 69 6e    */.      affin
12eb0 69 74 79 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e  ity = comparison
12ec0 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b  Affinity(pExpr);
12ed0 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ..      sqlite3V
12ee0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12ef0 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67  Integer, 1, targ
12f00 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  et);..      /* C
12f10 6f 64 65 20 74 68 65 20 3c 65 78 70 72 3e 20 66  ode the <expr> f
12f20 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20 28  rom "<expr> IN (
12f30 2e 2e 2e 29 22 2e 20 54 68 65 20 74 65 6d 70 6f  ...)". The tempo
12f40 72 61 72 79 20 74 61 62 6c 65 0a 20 20 20 20 20  rary table.     
12f50 20 2a 2a 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   ** pExpr->iTabl
12f60 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76  e contains the v
12f70 61 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20  alues that make 
12f80 75 70 20 74 68 65 20 28 2e 2e 2e 29 20 73 65 74  up the (...) set
12f90 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
12fa0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
12fb0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
12fc0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
12fd0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
12fe0 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64    j1 = sqlite3Vd
12ff0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
13000 6f 74 4e 75 6c 6c 2c 20 72 31 29 3b 0a 20 20 20  otNull, r1);.   
13010 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13020 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
13030 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
13040 20 20 20 6a 32 20 20 3d 20 73 71 6c 69 74 65 33     j2  = sqlite3
13050 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
13060 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 20 20 73 71  _Goto);.      sq
13070 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
13080 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 20 20  e(v, j1);.      
13090 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e  if( eType==IN_IN
130a0 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20  DEX_ROWID ){.   
130b0 20 20 20 20 20 6a 33 20 3d 20 73 71 6c 69 74 65       j3 = sqlite
130c0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
130d0 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 31 29  P_MustBeInt, r1)
130e0 3b 0a 20 20 20 20 20 20 20 20 6a 34 20 3d 20 73  ;.        j4 = s
130f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
13100 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  (v, OP_NotExists
13110 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
13120 20 30 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20   0, r1);.       
13130 20 6a 35 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j5 = sqlite3Vdb
13140 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f  eAddOp0(v, OP_Go
13150 74 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  to);.        sql
13160 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
13170 28 76 2c 20 6a 33 29 3b 0a 20 20 20 20 20 20 20  (v, j3);.       
13180 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
13190 48 65 72 65 28 76 2c 20 6a 34 29 3b 0a 20 20 20  Here(v, j4);.   
131a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
131b0 20 20 72 32 20 3d 20 72 65 67 46 72 65 65 32 20    r2 = regFree2 
131c0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
131d0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
131e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
131f0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
13200 65 52 65 63 6f 72 64 2c 20 72 31 2c 20 31 2c 20  eRecord, r1, 1, 
13210 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31  r2, &affinity, 1
13220 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
13230 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
13240 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
13250 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  , r1, 1);.      
13260 20 20 6a 35 20 3d 20 73 71 6c 69 74 65 33 56 64    j5 = sqlite3Vd
13270 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 46  beAddOp3(v, OP_F
13280 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61  ound, pExpr->iTa
13290 62 6c 65 2c 20 30 2c 20 72 32 29 3b 0a 20 20 20  ble, 0, r2);.   
132a0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
132b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
132c0 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65  OP_AddImm, targe
132d0 74 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 73 71  t, -1);.      sq
132e0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
132f0 65 28 76 2c 20 6a 32 29 3b 0a 20 20 20 20 20 20  e(v, j2);.      
13300 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
13310 65 72 65 28 76 2c 20 6a 35 29 3b 0a 20 20 20 20  ere(v, j5);.    
13320 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
13330 65 6e 64 69 66 0a 20 20 20 20 2f 2a 0a 20 20 20  endif.    /*.   
13340 20 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e   **    x BETWEEN
13350 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a   y AND z.    **.
13360 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 65      ** This is e
13370 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20  quivalent to.   
13380 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e   **.    **    x>
13390 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20  =y AND x<=z.    
133a0 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73 20 73  **.    ** X is s
133b0 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
133c0 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20  pLeft..    ** Y 
133d0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
133e0 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  pr->pList->a[0].
133f0 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20  pExpr..    ** Z 
13400 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
13410 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  pr->pList->a[1].
13420 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  pExpr..    */.  
13430 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45    case TK_BETWEE
13440 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20  N: {.      Expr 
13450 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
13460 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 73 74 72  pLeft;.      str
13470 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
13480 6d 20 2a 70 4c 49 74 65 6d 20 3d 20 70 45 78 70  m *pLItem = pExp
13490 72 2d 3e 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  r->pList->a;.   
134a0 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
134b0 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b  = pLItem->pExpr;
134c0 0a 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ..      codeComp
134d0 61 72 65 4f 70 65 72 61 6e 64 73 28 70 50 61 72  areOperands(pPar
134e0 73 65 2c 20 70 4c 65 66 74 2c 20 26 72 31 2c 20  se, pLeft, &r1, 
134f0 26 72 65 67 46 72 65 65 31 2c 0a 20 20 20 20 20  &regFree1,.     
13500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13510 20 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69               pRi
13520 67 68 74 2c 20 26 72 32 2c 20 26 72 65 67 46 72  ght, &r2, &regFr
13530 65 65 32 29 3b 0a 20 20 20 20 20 20 72 33 20 3d  ee2);.      r3 =
13540 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
13550 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
13560 20 20 72 34 20 3d 20 73 71 6c 69 74 65 33 47 65    r4 = sqlite3Ge
13570 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
13580 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
13590 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66  are(pParse, pLef
135a0 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 65  t, pRight, OP_Ge
135b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
135c0 20 20 20 20 72 31 2c 20 72 32 2c 20 72 33 2c 20      r1, r2, r3, 
135d0 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b  SQLITE_STOREP2);
135e0 0a 20 20 20 20 20 20 70 4c 49 74 65 6d 2b 2b 3b  .      pLItem++;
135f0 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20  .      pRight = 
13600 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20  pLItem->pExpr;. 
13610 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
13620 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
13630 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20  e, regFree2);.  
13640 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
13650 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
13660 72 73 65 2c 20 70 52 69 67 68 74 2c 20 26 72 65  rse, pRight, &re
13670 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63  gFree2);.      c
13680 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
13690 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
136a0 2c 20 4f 50 5f 4c 65 2c 20 72 31 2c 20 72 32 2c  , OP_Le, r1, r2,
136b0 20 72 34 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52   r4, SQLITE_STOR
136c0 45 50 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  EP2);.      sqli
136d0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
136e0 20 4f 50 5f 41 6e 64 2c 20 72 33 2c 20 72 34 2c   OP_And, r3, r4,
136f0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
13700 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
13710 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 33  mpReg(pParse, r3
13720 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13730 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
13740 50 61 72 73 65 2c 20 72 34 29 3b 0a 20 20 20 20  Parse, r4);.    
13750 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
13760 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53     case TK_UPLUS
13770 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20  : {.      inReg 
13780 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
13790 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
137a0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61  pExpr->pLeft, ta
137b0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65  rget);.      bre
137c0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
137d0 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a  *.    ** Form A:
137e0 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 78  .    **   CASE x
137f0 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31   WHEN e1 THEN r1
13800 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32   WHEN e2 THEN r2
13810 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45   ... WHEN eN THE
13820 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a  N rN ELSE y END.
13830 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f      **.    ** Fo
13840 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43  rm B:.    **   C
13850 41 53 45 20 57 48 45 4e 20 65 31 20 54 48 45 4e  ASE WHEN e1 THEN
13860 20 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e   r1 WHEN e2 THEN
13870 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20   r2 ... WHEN eN 
13880 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45  THEN rN ELSE y E
13890 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ND.    **.    **
138a0 20 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20 62   Form A is can b
138b0 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  e transformed in
138c0 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  to the equivalen
138d0 74 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c  t form B as foll
138e0 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41  ows:.    **   CA
138f0 53 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48 45  SE WHEN x=e1 THE
13900 4e 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20 54  N r1 WHEN x=e2 T
13910 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a  HEN r2 ....    *
13920 2a 20 20 20 20 20 20 20 20 57 48 45 4e 20 78 3d  *        WHEN x=
13930 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20  eN THEN rN ELSE 
13940 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20  y END.    **.   
13950 20 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78 69   ** X (if it exi
13960 73 74 73 29 20 69 73 20 69 6e 20 70 45 78 70 72  sts) is in pExpr
13970 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20  ->pLeft..    ** 
13980 59 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70  Y is in pExpr->p
13990 52 69 67 68 74 2e 20 20 54 68 65 20 59 20 69 73  Right.  The Y is
139a0 20 61 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20   also optional. 
139b0 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 0a   If there is no.
139c0 20 20 20 20 2a 2a 20 45 4c 53 45 20 63 6c 61 75      ** ELSE clau
139d0 73 65 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20  se and no other 
139e0 74 65 72 6d 20 6d 61 74 63 68 65 73 2c 20 74 68  term matches, th
139f0 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  en the result of
13a00 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 78 70 72   the.    ** expr
13a10 73 73 69 6f 6e 20 69 73 20 4e 55 4c 4c 2e 0a 20  ssion is NULL.. 
13a20 20 20 20 2a 2a 20 45 69 20 69 73 20 69 6e 20 70     ** Ei is in p
13a30 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  Expr->pList->a[i
13a40 2a 32 5d 20 61 6e 64 20 52 69 20 69 73 20 70 45  *2] and Ri is pE
13a50 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a  xpr->pList->a[i*
13a60 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  2+1]..    **.   
13a70 20 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f   ** The result o
13a80 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
13a90 20 69 73 20 74 68 65 20 52 69 20 66 6f 72 20 74   is the Ri for t
13aa0 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  he first matchin
13ab0 67 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f 72 20  g Ei,.    ** or 
13ac0 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d  if there is no m
13ad0 61 74 63 68 69 6e 67 20 45 69 2c 20 74 68 65 20  atching Ei, the 
13ae0 45 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f 72 20  ELSE term Y, or 
13af0 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 20 20  if there is.    
13b00 2a 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72 6d 2c  ** no ELSE term,
13b10 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20   NULL..    */.  
13b20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 45 3a 20    case TK_CASE: 
13b30 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 6e 64 4c  {.      int endL
13b40 61 62 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20  abel;           
13b50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54            /* GOT
13b60 4f 20 6c 61 62 65 6c 20 66 6f 72 20 65 6e 64 20  O label for end 
13b70 6f 66 20 43 41 53 45 20 73 74 6d 74 20 2a 2f 0a  of CASE stmt */.
13b80 20 20 20 20 20 20 69 6e 74 20 6e 65 78 74 43 61        int nextCa
13b90 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
13ba0 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20          /* GOTO 
13bb0 6c 61 62 65 6c 20 66 6f 72 20 6e 65 78 74 20 57  label for next W
13bc0 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  HEN clause */.  
13bd0 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b 20 20      int nExpr;  
13be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13bf0 20 20 20 20 20 20 2f 2a 20 32 78 20 6e 75 6d 62        /* 2x numb
13c00 65 72 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73  er of WHEN terms
13c10 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   */.      int i;
13c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
13c40 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
13c50 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
13c60 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  EList;          
13c70 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
13c80 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a  f WHEN terms */.
13c90 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
13ca0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73  rList_item *aLis
13cb0 74 65 6c 65 6d 3b 20 20 2f 2a 20 41 72 72 61 79  telem;  /* Array
13cc0 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a   of WHEN terms *
13cd0 2f 0a 20 20 20 20 20 20 45 78 70 72 20 6f 70 43  /.      Expr opC
13ce0 6f 6d 70 61 72 65 3b 20 20 20 20 20 20 20 20 20  ompare;         
13cf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
13d00 20 58 3d 3d 45 69 20 65 78 70 72 65 73 73 69 6f   X==Ei expressio
13d10 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  n */.      Expr 
13d20 63 61 63 68 65 58 3b 20 20 20 20 20 20 20 20 20  cacheX;         
13d30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13d40 43 61 63 68 65 64 20 65 78 70 72 65 73 73 69 6f  Cached expressio
13d50 6e 20 58 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  n X */.      Exp
13d60 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  r *pX;          
13d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13d80 2a 20 54 68 65 20 58 20 65 78 70 72 65 73 73 69  * The X expressi
13d90 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  on */.      Expr
13da0 20 2a 70 54 65 73 74 3b 20 20 20 20 20 20 20 20   *pTest;        
13db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13dc0 20 58 3d 3d 45 69 20 28 66 6f 72 6d 20 41 29 20   X==Ei (form A) 
13dd0 6f 72 20 6a 75 73 74 20 45 69 20 28 66 6f 72 6d  or just Ei (form
13de0 20 42 29 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73   B) */..      as
13df0 73 65 72 74 28 70 45 78 70 72 2d 3e 70 4c 69 73  sert(pExpr->pLis
13e00 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
13e10 28 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  ((pExpr->pList->
13e20 6e 45 78 70 72 20 25 20 32 29 20 3d 3d 20 30 29  nExpr % 2) == 0)
13e30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  ;.      assert(p
13e40 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  Expr->pList->nEx
13e50 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70  pr > 0);.      p
13e60 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70  EList = pExpr->p
13e70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 4c 69 73  List;.      aLis
13e80 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e  telem = pEList->
13e90 61 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d  a;.      nExpr =
13ea0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
13eb0 20 20 20 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d        endLabel =
13ec0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
13ed0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
13ee0 69 66 28 20 28 70 58 20 3d 20 70 45 78 70 72 2d  if( (pX = pExpr-
13ef0 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20  >pLeft)!=0 ){.  
13f00 20 20 20 20 20 20 63 61 63 68 65 58 20 3d 20 2a        cacheX = *
13f10 70 58 3b 0a 20 20 20 20 20 20 20 20 63 61 63 68  pX;.        cach
13f20 65 58 2e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69  eX.iTable = sqli
13f30 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
13f40 70 50 61 72 73 65 2c 20 70 58 2c 20 26 72 65 67  pParse, pX, &reg
13f50 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Free1);.        
13f60 63 61 63 68 65 58 2e 6f 70 20 3d 20 54 4b 5f 52  cacheX.op = TK_R
13f70 45 47 49 53 54 45 52 3b 0a 20 20 20 20 20 20 20  EGISTER;.       
13f80 20 63 61 63 68 65 58 2e 69 43 6f 6c 75 6d 6e 20   cacheX.iColumn 
13f90 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6f 70 43  = 0;.        opC
13fa0 6f 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b 5f 45  ompare.op = TK_E
13fb0 51 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d  Q;.        opCom
13fc0 70 61 72 65 2e 70 4c 65 66 74 20 3d 20 26 63 61  pare.pLeft = &ca
13fd0 63 68 65 58 3b 0a 20 20 20 20 20 20 20 20 70 54  cheX;.        pT
13fe0 65 73 74 20 3d 20 26 6f 70 43 6f 6d 70 61 72 65  est = &opCompare
13ff0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14000 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 75 6d  sqlite3ExprColum
14010 6e 43 61 63 68 65 44 69 73 61 62 6c 65 28 70 50  nCacheDisable(pP
14020 61 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20  arse, 1);.      
14030 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
14040 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20  ; i=i+2){.      
14050 20 20 69 66 28 20 70 58 20 29 7b 0a 20 20 20 20    if( pX ){.    
14060 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e        opCompare.
14070 70 52 69 67 68 74 20 3d 20 61 4c 69 73 74 65 6c  pRight = aListel
14080 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  em[i].pExpr;.   
14090 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
140a0 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 61 4c        pTest = aL
140b0 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72  istelem[i].pExpr
140c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
140d0 20 20 20 20 6e 65 78 74 43 61 73 65 20 3d 20 73      nextCase = s
140e0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
140f0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
14100 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
14110 73 65 28 70 50 61 72 73 65 2c 20 70 54 65 73 74  se(pParse, pTest
14120 2c 20 6e 65 78 74 43 61 73 65 2c 20 53 51 4c 49  , nextCase, SQLI
14130 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
14140 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
14150 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
14160 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70  aListelem[i+1].p
14170 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
14180 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
14190 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
141a0 6f 74 6f 2c 20 30 2c 20 65 6e 64 4c 61 62 65 6c  oto, 0, endLabel
141b0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
141c0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
141d0 65 6c 28 76 2c 20 6e 65 78 74 43 61 73 65 29 3b  el(v, nextCase);
141e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
141f0 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  f( pExpr->pRight
14200 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
14210 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
14220 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
14230 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  t, target);.    
14240 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14250 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14260 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
14270 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
14280 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
14290 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
142a0 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20  (v, endLabel);. 
142b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
142c0 43 6f 6c 75 6d 6e 43 61 63 68 65 44 69 73 61 62  ColumnCacheDisab
142d0 6c 65 28 70 50 61 72 73 65 2c 20 2d 31 29 3b 0a  le(pParse, -1);.
142e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
142f0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
14300 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20  E_OMIT_TRIGGER. 
14310 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45     case TK_RAISE
14320 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70  : {.      if( !p
14330 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b  Parse->trigStack
14340 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
14350 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
14360 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
14370 20 20 20 20 20 20 20 20 20 20 20 22 52 41 49 53             "RAIS
14380 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  E() may only be 
14390 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 74 72  used within a tr
143a0 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b  igger-program");
143b0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
143c0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
143d0 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
143e0 75 6d 6e 21 3d 4f 45 5f 49 67 6e 6f 72 65 20 29  umn!=OE_Ignore )
143f0 7b 0a 20 20 20 20 20 20 20 20 20 61 73 73 65 72  {.         asser
14400 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  t( pExpr->iColum
14410 6e 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 7c  n==OE_Rollback |
14420 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
14430 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
14440 6e 20 3d 3d 20 4f 45 5f 41 62 6f 72 74 20 7c 7c  n == OE_Abort ||
14450 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14460 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
14470 20 3d 3d 20 4f 45 5f 46 61 69 6c 20 29 3b 0a 20   == OE_Fail );. 
14480 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
14490 65 71 75 6f 74 65 45 78 70 72 28 70 50 61 72 73  equoteExpr(pPars
144a0 65 2d 3e 64 62 2c 20 70 45 78 70 72 29 3b 0a 20  e->db, pExpr);. 
144b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
144c0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
144d0 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 43 4f 4e  Halt, SQLITE_CON
144e0 53 54 52 41 49 4e 54 2c 20 70 45 78 70 72 2d 3e  STRAINT, pExpr->
144f0 69 43 6f 6c 75 6d 6e 2c 20 30 2c 0a 20 20 20 20  iColumn, 0,.    
14500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14510 20 20 20 20 28 63 68 61 72 2a 29 70 45 78 70 72      (char*)pExpr
14520 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72  ->token.z, pExpr
14530 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20  ->token.n);.    
14540 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
14550 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
14560 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45  r->iColumn == OE
14570 5f 49 67 6e 6f 72 65 20 29 3b 0a 20 20 20 20 20  _Ignore );.     
14580 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14590 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 6e 74  ddOp2(v, OP_Cont
145a0 65 78 74 50 6f 70 2c 20 30 2c 20 30 29 3b 0a 20  extPop, 0, 0);. 
145b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
145c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
145d0 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d  Goto, 0, pParse-
145e0 3e 74 72 69 67 53 74 61 63 6b 2d 3e 69 67 6e 6f  >trigStack->igno
145f0 72 65 4a 75 6d 70 29 3b 0a 20 20 20 20 20 20 20  reJump);.       
14600 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
14610 2c 20 22 72 61 69 73 65 28 49 47 4e 4f 52 45 29  , "raise(IGNORE)
14620 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  "));.      }.   
14630 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
14640 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c  #endif.  }.  sql
14650 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
14660 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
14670 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  ee1);.  sqlite3R
14680 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
14690 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b  arse, regFree2);
146a0 0a 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b  .  return inReg;
146b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
146c0 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75  te code to evalu
146d0 61 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ate an expressio
146e0 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  n and store the 
146f0 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20  results.** into 
14700 61 20 72 65 67 69 73 74 65 72 2e 20 20 52 65 74  a register.  Ret
14710 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
14720 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 74 68   number where th
14730 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 61 72 65  e results.** are
14740 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   stored..**.** I
14750 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69  f the register i
14760 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65  s a temporary re
14770 67 69 73 74 65 72 20 74 68 61 74 20 63 61 6e 20  gister that can 
14780 62 65 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c 0a  be deallocated,.
14790 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 69 74  ** then write it
147a0 73 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70  s number into *p
147b0 52 65 67 2e 20 20 49 66 20 74 68 65 20 72 65 73  Reg.  If the res
147c0 75 6c 74 20 72 65 67 69 73 74 65 72 20 69 73 20  ult register is 
147d0 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61  not.** a tempora
147e0 72 79 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ry, then set *pR
147f0 65 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 69  eg to zero..*/.i
14800 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
14810 64 65 54 65 6d 70 28 50 61 72 73 65 20 2a 70 50  deTemp(Parse *pP
14820 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
14830 72 2c 20 69 6e 74 20 2a 70 52 65 67 29 7b 0a 20  r, int *pReg){. 
14840 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
14850 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
14860 73 65 29 3b 0a 20 20 69 6e 74 20 72 32 20 3d 20  se);.  int r2 = 
14870 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
14880 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
14890 78 70 72 2c 20 72 31 29 3b 0a 20 20 69 66 28 20  xpr, r1);.  if( 
148a0 72 32 3d 3d 72 31 20 29 7b 0a 20 20 20 20 2a 70  r2==r1 ){.    *p
148b0 52 65 67 20 3d 20 72 31 3b 0a 20 20 7d 65 6c 73  Reg = r1;.  }els
148c0 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  e{.    sqlite3Re
148d0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
148e0 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 2a 70  rse, r1);.    *p
148f0 52 65 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Reg = 0;.  }.  r
14900 65 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a  eturn r2;.}../*.
14910 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
14920 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75   that will evalu
14930 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  ate expression p
14940 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74  Expr and store t
14950 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e  he.** results in
14960 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74   register target
14970 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  .  The results a
14980 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  re guaranteed to
14990 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65   appear.** in re
149a0 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a  gister target..*
149b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
149c0 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70 50 61  rCode(Parse *pPa
149d0 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
149e0 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
149f0 20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a 20 20 61   int inReg;..  a
14a00 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
14a10 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73  && target<=pPars
14a20 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 6e 52  e->nMem );.  inR
14a30 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
14a40 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
14a50 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
14a60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
14a70 72 73 65 2d 3e 70 56 64 62 65 20 7c 7c 20 70 50  rse->pVdbe || pP
14a80 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
14a90 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
14aa0 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20 26 26  inReg!=target &&
14ab0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29   pParse->pVdbe )
14ac0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
14ad0 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e  eAddOp2(pParse->
14ae0 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c  pVdbe, OP_SCopy,
14af0 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b   inReg, target);
14b00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 74 61  .  }.  return ta
14b10 72 67 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rget;.}../*.** G
14b20 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
14b30 74 20 65 76 61 6c 75 74 65 73 20 74 68 65 20 67  t evalutes the g
14b40 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
14b50 61 6e 64 20 70 75 74 73 20 74 68 65 20 72 65 73  and puts the res
14b60 75 6c 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74  ult.** in regist
14b70 65 72 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a  er target..**.**
14b80 20 41 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f 70   Also make a cop
14b90 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  y of the express
14ba0 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 74 6f  ion results into
14bb0 20 61 6e 6f 74 68 65 72 20 22 63 61 63 68 65 22   another "cache"
14bc0 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64   register.** and
14bd0 20 6d 6f 64 69 66 79 20 74 68 65 20 65 78 70 72   modify the expr
14be0 65 73 73 69 6f 6e 20 73 6f 20 74 68 61 74 20 74  ession so that t
14bf0 68 65 20 6e 65 78 74 20 74 69 6d 65 20 69 74 20  he next time it 
14c00 69 73 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a 2a  is evaluated,.**
14c10 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 61   the result is a
14c20 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61 63   copy of the cac
14c30 68 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a  he register..**.
14c40 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
14c50 69 73 20 75 73 65 64 20 66 6f 72 20 65 78 70 72  is used for expr
14c60 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65  essions that are
14c70 20 75 73 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a   used multiple .
14c80 2a 2a 20 74 69 6d 65 73 2e 20 20 54 68 65 79 20  ** times.  They 
14c90 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 6f 6e  are evaluated on
14ca0 63 65 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c  ce and the resul
14cb0 74 73 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ts of the expres
14cc0 73 69 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75 73  sion.** are reus
14cd0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
14ce0 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43 61 63  e3ExprCodeAndCac
14cf0 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  he(Parse *pParse
14d00 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
14d10 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64  nt target){.  Vd
14d20 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
14d30 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 6e 52  pVdbe;.  int inR
14d40 65 67 3b 0a 20 20 69 6e 52 65 67 20 3d 20 73 71  eg;.  inReg = sq
14d50 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
14d60 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
14d70 67 65 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20  get);.  assert( 
14d80 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 69 66  target>0 );.  if
14d90 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
14da0 52 45 47 49 53 54 45 52 20 29 7b 20 20 0a 20 20  REGISTER ){  .  
14db0 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 20 20 20 20    int iMem;.    
14dc0 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
14dd0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
14de0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14df0 4f 50 5f 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20  OP_Copy, inReg, 
14e00 69 4d 65 6d 29 3b 0a 20 20 20 20 70 45 78 70 72  iMem);.    pExpr
14e10 2d 3e 69 54 61 62 6c 65 20 3d 20 69 4d 65 6d 3b  ->iTable = iMem;
14e20 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c  .    pExpr->iCol
14e30 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b  umn = pExpr->op;
14e40 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d  .    pExpr->op =
14e50 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20   TK_REGISTER;.  
14e60 7d 0a 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67  }.  return inReg
14e70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 45  ;.}../*.** If pE
14e80 78 70 72 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  xpr is a constan
14e90 74 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  t expression, th
14ea0 65 6e 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  en evaluate the 
14eb0 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 6e  expression.** in
14ec0 74 6f 20 61 20 72 65 67 69 73 74 65 72 20 61 6e  to a register an
14ed0 64 20 63 6f 6e 76 65 72 74 20 74 68 65 20 65 78  d convert the ex
14ee0 70 72 65 73 73 69 6f 6e 20 69 6e 74 6f 20 61 20  pression into a 
14ef0 54 4b 5f 52 45 47 49 53 54 45 52 0a 2a 2a 20 65  TK_REGISTER.** e
14f00 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 73 74  xpression..*/.st
14f10 61 74 69 63 20 69 6e 74 20 65 76 61 6c 43 6f 6e  atic int evalCon
14f20 73 74 45 78 70 72 28 76 6f 69 64 20 2a 70 41 72  stExpr(void *pAr
14f30 67 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  g, Expr *pExpr){
14f40 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
14f50 20 3d 20 28 50 61 72 73 65 2a 29 70 41 72 67 3b   = (Parse*)pArg;
14f60 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
14f70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b  ==TK_REGISTER ){
14f80 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
14f90 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
14fa0 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
14fb0 74 4a 6f 69 6e 28 70 45 78 70 72 29 20 29 7b 0a  tJoin(pExpr) ){.
14fc0 20 20 20 20 69 6e 74 20 72 31 20 3d 20 2b 2b 70      int r1 = ++p
14fd0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
14fe0 20 69 6e 74 20 72 32 3b 0a 20 20 20 20 72 32 20   int r2;.    r2 
14ff0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
15000 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
15010 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 20 20  pExpr, r1);.    
15020 69 66 28 20 72 31 21 3d 72 32 20 29 20 70 50 61  if( r1!=r2 ) pPa
15030 72 73 65 2d 3e 6e 4d 65 6d 2d 2d 3b 0a 20 20 20  rse->nMem--;.   
15040 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
15050 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20  = pExpr->op;.   
15060 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
15070 52 45 47 49 53 54 45 52 3b 0a 20 20 20 20 70 45  REGISTER;.    pE
15080 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 72 32  xpr->iTable = r2
15090 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
150a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
150b0 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 65 76 61 6c  }../*.** Preeval
150c0 75 61 74 65 20 63 6f 6e 73 74 61 6e 74 20 73 75  uate constant su
150d0 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77 69 74  bexpressions wit
150e0 68 69 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74  hin pExpr and st
150f0 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  ore the.** resul
15100 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 73 2e  ts in registers.
15110 20 20 4d 6f 64 69 66 79 20 70 45 78 70 72 20 73    Modify pExpr s
15120 6f 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74  o that the const
15130 61 6e 74 20 73 75 62 65 78 70 72 65 73 69 6f 6e  ant subexpresion
15140 73 0a 2a 2a 20 61 72 65 20 54 4b 5f 52 45 47 49  s.** are TK_REGI
15150 53 54 45 52 20 6f 70 63 6f 64 65 73 20 74 68 61  STER opcodes tha
15160 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 70  t refer to the p
15170 72 65 63 6f 6d 70 75 74 65 64 20 76 61 6c 75 65  recomputed value
15180 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
15190 65 33 45 78 70 72 43 6f 64 65 43 6f 6e 73 74 61  e3ExprCodeConsta
151a0 6e 74 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  nts(Parse *pPars
151b0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
151c0 0a 20 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65  .   walkExprTree
151d0 28 70 45 78 70 72 2c 20 65 76 61 6c 43 6f 6e 73  (pExpr, evalCons
151e0 74 45 78 70 72 2c 20 70 50 61 72 73 65 29 3b 0a  tExpr, pParse);.
151f0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
15200 74 65 20 63 6f 64 65 20 74 68 61 74 20 70 75 73  te code that pus
15210 68 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66  hes the value of
15220 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f   every element o
15230 66 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65  f the given.** e
15240 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 69  xpression list i
15250 6e 74 6f 20 61 20 73 65 71 75 65 6e 63 65 20 6f  nto a sequence o
15260 66 20 72 65 67 69 73 74 65 72 73 20 62 65 67 69  f registers begi
15270 6e 6e 69 6e 67 20 61 74 20 74 61 72 67 65 74 2e  nning at target.
15280 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
15290 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
152a0 65 6e 74 73 20 65 76 61 6c 75 61 74 65 64 2e 0a  ents evaluated..
152b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
152c0 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a  prCodeExprList(.
152d0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
152e0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
152f0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
15300 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
15310 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
15320 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64  n list to be cod
15330 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74 61 72 67  ed */.  int targ
15340 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68  et         /* Wh
15350 65 72 65 20 74 6f 20 77 72 69 74 65 20 72 65 73  ere to write res
15360 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  ults */.){.  str
15370 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
15380 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
15390 69 2c 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  i, n;.  assert( 
153a0 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50 61 72  pList!=0 || pPar
153b0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
153c0 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 4c  iled );.  if( pL
153d0 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ist==0 ){.    re
153e0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 73  turn 0;.  }.  as
153f0 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29  sert( target>0 )
15400 3b 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e  ;.  n = pList->n
15410 45 78 70 72 3b 0a 20 20 66 6f 72 28 70 49 74 65  Expr;.  for(pIte
15420 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 6e 3b  m=pList->a, i=n;
15430 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d   i>0; i--, pItem
15440 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
15450 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
15460 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 74   pItem->pExpr, t
15470 61 72 67 65 74 29 3b 0a 20 20 20 20 74 61 72 67  arget);.    targ
15480 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  et++;.  }.  retu
15490 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn n;.}../*.** G
154a0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
154b0 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65   a boolean expre
154c0 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20  ssion such that 
154d0 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a  a jump is made.*
154e0 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22  * to the label "
154f0 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70  dest" if the exp
15500 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20  ression is true 
15510 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a  but execution.**
15520 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69   continues strai
15530 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20  ght thru if the 
15540 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61  expression is fa
15550 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  lse..**.** If th
15560 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61  e expression eva
15570 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28  luates to NULL (
15580 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72  neither true nor
15590 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a   false), then.**
155a0 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69   take the jump i
155b0 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c  f the jumpIfNull
155c0 20 66 6c 61 67 20 69 73 20 53 51 4c 49 54 45 5f   flag is SQLITE_
155d0 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  JUMPIFNULL..**.*
155e0 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70 65  * This code depe
155f0 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20  nds on the fact 
15600 74 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b  that certain tok
15610 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54  en values (ex: T
15620 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65  K_EQ).** are the
15630 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20   same as opcode 
15640 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45  values (ex: OP_E
15650 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  q) that implemen
15660 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  t the correspond
15670 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  ing.** operation
15680 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65  .  Special comme
15690 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e  nts in vdbe.c an
156a0 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  d the mkopcodeh.
156b0 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a  awk script in.**
156c0 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73   the make proces
156d0 73 20 63 61 75 73 65 20 74 68 65 73 65 20 76 61  s cause these va
156e0 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20  lues to align.  
156f0 41 73 73 65 72 74 28 29 73 20 69 6e 20 74 68 65  Assert()s in the
15700 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76   code.** below v
15710 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e  erify that the n
15720 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e  umbers are align
15730 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f  ed correctly..*/
15740 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
15750 72 49 66 54 72 75 65 28 50 61 72 73 65 20 2a 70  rIfTrue(Parse *p
15760 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
15770 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e  pr, int dest, in
15780 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
15790 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
157a0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
157b0 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  op = 0;.  int re
157c0 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e  gFree1 = 0;.  in
157d0 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a  t regFree2 = 0;.
157e0 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20    int r1, r2;.. 
157f0 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e   assert( jumpIfN
15800 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50  ull==SQLITE_JUMP
15810 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66  IFNULL || jumpIf
15820 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Null==0 );.  if(
15830 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d   v==0 || pExpr==
15840 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6f 70  0 ) return;.  op
15850 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20   = pExpr->op;.  
15860 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
15870 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b    case TK_AND: {
15880 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20  .      int d2 = 
15890 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
158a0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73  abel(v);.      s
158b0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
158c0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
158d0 3e 70 4c 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49  >pLeft, d2,jumpI
158e0 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d  fNull^SQLITE_JUM
158f0 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
15900 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43  pParse->disableC
15910 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20 20 20 20 20  olCache++;.     
15920 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
15930 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
15940 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
15950 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
15960 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62     pParse->disab
15970 6c 65 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20 20  leColCache--;.  
15980 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
15990 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
159a0 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  2);.      break;
159b0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
159c0 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 73  TK_OR: {.      s
159d0 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
159e0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
159f0 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
15a00 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
15a10 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43  pParse->disableC
15a20 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20 20 20 20 20  olCache++;.     
15a30 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
15a40 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
15a50 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
15a60 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
15a70 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62     pParse->disab
15a80 6c 65 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20 20  leColCache--;.  
15a90 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
15aa0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
15ab0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
15ac0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
15ad0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
15ae0 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
15af0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
15b00 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
15b10 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
15b20 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
15b30 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
15b40 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73  e TK_GE:.    cas
15b50 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
15b60 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20  e TK_EQ: {.     
15b70 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d   assert( TK_LT==
15b80 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20 61  OP_Lt );.      a
15b90 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50  ssert( TK_LE==OP
15ba0 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Le );.      ass
15bb0 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47  ert( TK_GT==OP_G
15bc0 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
15bd0 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20  t( TK_GE==OP_Ge 
15be0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
15bf0 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b   TK_EQ==OP_Eq );
15c00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
15c10 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20  K_NE==OP_Ne );. 
15c20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
15c30 4f 70 65 72 61 6e 64 73 28 70 50 61 72 73 65 2c  Operands(pParse,
15c40 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
15c50 72 31 2c 20 26 72 65 67 46 72 65 65 31 2c 0a 20  r1, &regFree1,. 
15c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c80 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
15c90 26 72 32 2c 20 26 72 65 67 46 72 65 65 32 29 3b  &r2, &regFree2);
15ca0 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
15cb0 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
15cc0 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
15cd0 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
15ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31                r1
15cf0 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r2, dest, jump
15d00 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
15d10 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
15d20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
15d30 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
15d40 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ULL: {.      ass
15d50 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d  ert( TK_ISNULL==
15d60 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20  OP_IsNull );.   
15d70 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
15d80 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c  TNULL==OP_NotNul
15d90 6c 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  l );.      r1 = 
15da0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
15db0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
15dc0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
15dd0 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee1);.      sqli
15de0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15df0 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a   op, r1, dest);.
15e00 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15e10 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
15e20 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
15e30 2f 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e 20  /*    x BETWEEN 
15e40 79 20 41 4e 44 20 7a 0a 20 20 20 20 20 20 2a 2a  y AND z.      **
15e50 0a 20 20 20 20 20 20 2a 2a 20 49 73 20 65 71 75  .      ** Is equ
15e60 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20  ivalent to .    
15e70 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
15e80 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20   x>=y AND x<=z. 
15e90 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
15ea0 20 43 6f 64 65 20 69 74 20 61 73 20 73 75 63 68   Code it as such
15eb0 2c 20 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f  , taking care to
15ec0 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73   do the common s
15ed0 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20  ubexpression.   
15ee0 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 61 74 69     ** elementati
15ef0 6f 6e 20 6f 66 20 78 2e 0a 20 20 20 20 20 20 2a  on of x..      *
15f00 2f 0a 20 20 20 20 20 20 45 78 70 72 20 65 78 70  /.      Expr exp
15f10 72 41 6e 64 3b 0a 20 20 20 20 20 20 45 78 70 72  rAnd;.      Expr
15f20 20 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 20 20 20   compLeft;.     
15f30 20 45 78 70 72 20 63 6f 6d 70 52 69 67 68 74 3b   Expr compRight;
15f40 0a 20 20 20 20 20 20 45 78 70 72 20 65 78 70 72  .      Expr expr
15f50 58 3b 0a 0a 20 20 20 20 20 20 65 78 70 72 58 20  X;..      exprX 
15f60 3d 20 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b  = *pExpr->pLeft;
15f70 0a 20 20 20 20 20 20 65 78 70 72 41 6e 64 2e 6f  .      exprAnd.o
15f80 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20  p = TK_AND;.    
15f90 20 20 65 78 70 72 41 6e 64 2e 70 4c 65 66 74 20    exprAnd.pLeft 
15fa0 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 20  = &compLeft;.   
15fb0 20 20 20 65 78 70 72 41 6e 64 2e 70 52 69 67 68     exprAnd.pRigh
15fc0 74 20 3d 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a  t = &compRight;.
15fd0 20 20 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 6f        compLeft.o
15fe0 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 20 20 20  p = TK_GE;.     
15ff0 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65 66 74 20   compLeft.pLeft 
16000 3d 20 26 65 78 70 72 58 3b 0a 20 20 20 20 20 20  = &exprX;.      
16010 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68 74 20  compLeft.pRight 
16020 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  = pExpr->pList->
16030 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[0].pExpr;.    
16040 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d    compRight.op =
16050 20 54 4b 5f 4c 45 3b 0a 20 20 20 20 20 20 63 6f   TK_LE;.      co
16060 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20 3d 20  mpRight.pLeft = 
16070 26 65 78 70 72 58 3b 0a 20 20 20 20 20 20 63 6f  &exprX;.      co
16080 6d 70 52 69 67 68 74 2e 70 52 69 67 68 74 20 3d  mpRight.pRight =
16090 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
160a0 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [1].pExpr;.     
160b0 20 65 78 70 72 58 2e 69 54 61 62 6c 65 20 3d 20   exprX.iTable = 
160c0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
160d0 65 6d 70 28 70 50 61 72 73 65 2c 20 26 65 78 70  emp(pParse, &exp
160e0 72 58 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  rX, &regFree1);.
160f0 20 20 20 20 20 20 65 78 70 72 58 2e 6f 70 20 3d        exprX.op =
16100 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20   TK_REGISTER;.  
16110 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
16120 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 26 65  fTrue(pParse, &e
16130 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75  xprAnd, dest, ju
16140 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
16150 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
16160 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
16170 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
16180 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
16190 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46  se, pExpr, &regF
161a0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  ree1);.      sql
161b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
161c0 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20 64 65 73  , OP_If, r1, des
161d0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  t, jumpIfNull!=0
161e0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
161f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
16200 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
16210 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
16220 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  e1);.  sqlite3Re
16230 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
16240 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 20  rse, regFree2); 
16250 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72   .}../*.** Gener
16260 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62  ate code for a b
16270 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f  oolean expressio
16280 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75  n such that a ju
16290 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f  mp is made.** to
162a0 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74   the label "dest
162b0 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  " if the express
162c0 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74  ion is false but
162d0 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f   execution.** co
162e0 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74  ntinues straight
162f0 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70   thru if the exp
16300 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e  ression is true.
16310 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
16320 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74  pression evaluat
16330 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74  es to NULL (neit
16340 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c  her true nor fal
16350 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70  se) then.** jump
16360 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69   if jumpIfNull i
16370 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  s SQLITE_JUMPIFN
16380 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f  ULL or fall thro
16390 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c  ugh if jumpIfNul
163a0 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f  l.** is 0..*/.vo
163b0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  id sqlite3ExprIf
163c0 46 61 6c 73 65 28 50 61 72 73 65 20 2a 70 50 61  False(Parse *pPa
163d0 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
163e0 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20  , int dest, int 
163f0 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56  jumpIfNull){.  V
16400 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
16410 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70  >pVdbe;.  int op
16420 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46   = 0;.  int regF
16430 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ree1 = 0;.  int 
16440 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20  regFree2 = 0;.  
16450 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61  int r1, r2;..  a
16460 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c  ssert( jumpIfNul
16470 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  l==SQLITE_JUMPIF
16480 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75  NULL || jumpIfNu
16490 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 76  ll==0 );.  if( v
164a0 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20  ==0 || pExpr==0 
164b0 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
164c0 54 68 65 20 76 61 6c 75 65 20 6f 66 20 70 45 78  The value of pEx
164d0 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72  pr->op and op ar
164e0 65 20 72 65 6c 61 74 65 64 20 61 73 20 66 6f 6c  e related as fol
164f0 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lows:.  **.  ** 
16500 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
16510 20 20 20 20 20 20 20 20 20 20 20 6f 70 0a 20 20             op.  
16520 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  **       -------
16530 2d 2d 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d  --          ----
16540 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20  ------.  **     
16550 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20    TK_ISNULL     
16560 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a       OP_NotNull.
16570 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f    **       TK_NO
16580 54 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 4f 50  TNULL         OP
16590 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20  _IsNull.  **    
165a0 20 20 20 54 4b 5f 4e 45 20 20 20 20 20 20 20 20     TK_NE        
165b0 20 20 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a        OP_Eq.  **
165c0 20 20 20 20 20 20 20 54 4b 5f 45 51 20 20 20 20         TK_EQ    
165d0 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a            OP_Ne.
165e0 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 54    **       TK_GT
165f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
16600 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Le.  **       T
16610 4b 5f 4c 45 20 20 20 20 20 20 20 20 20 20 20 20  K_LE            
16620 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20    OP_Gt.  **    
16630 20 20 20 54 4b 5f 47 45 20 20 20 20 20 20 20 20     TK_GE        
16640 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a        OP_Lt.  **
16650 20 20 20 20 20 20 20 54 4b 5f 4c 54 20 20 20 20         TK_LT    
16660 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 65 0a            OP_Ge.
16670 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74    **.  ** For ot
16680 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20 70 45  her values of pE
16690 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75  xpr->op, op is u
166a0 6e 64 65 66 69 6e 65 64 20 61 6e 64 20 75 6e 75  ndefined and unu
166b0 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61  sed..  ** The va
166c0 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f  lue of TK_ and O
166d0 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65  P_ constants are
166e0 20 61 72 72 61 6e 67 65 64 20 73 75 63 68 20 74   arranged such t
166f0 68 61 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20  hat we.  ** can 
16700 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 70 70  compute the mapp
16710 69 6e 67 20 61 62 6f 76 65 20 75 73 69 6e 67 20  ing above using 
16720 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78  the following ex
16730 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41  pression..  ** A
16740 73 73 65 72 74 28 29 73 20 76 65 72 69 66 79 20  ssert()s verify 
16750 74 68 61 74 20 74 68 65 20 63 6f 6d 70 75 74 61  that the computa
16760 74 69 6f 6e 20 69 73 20 63 6f 72 72 65 63 74 2e  tion is correct.
16770 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70  .  */.  op = ((p
16780 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e  Expr->op+(TK_ISN
16790 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49  ULL&1))^1)-(TK_I
167a0 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20  SNULL&1);..  /* 
167b0 56 65 72 69 66 79 20 63 6f 72 72 65 63 74 20 61  Verify correct a
167c0 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20  lignment of TK_ 
167d0 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74  and OP_ constant
167e0 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s.  */.  assert(
167f0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49   pExpr->op!=TK_I
16800 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  SNULL || op==OP_
16810 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73  NotNull );.  ass
16820 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
16830 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70  TK_NOTNULL || op
16840 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20  ==OP_IsNull );. 
16850 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
16860 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d  op!=TK_NE || op=
16870 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73 73 65  =OP_Eq );.  asse
16880 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
16890 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e  K_EQ || op==OP_N
168a0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
168b0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20  Expr->op!=TK_LT 
168c0 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a  || op==OP_Ge );.
168d0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
168e0 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70  >op!=TK_LE || op
168f0 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73 73  ==OP_Gt );.  ass
16900 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
16910 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_GT || op==OP_
16920 4c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Le );.  assert( 
16930 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45  pExpr->op!=TK_GE
16940 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b   || op==OP_Lt );
16950 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
16960 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
16970 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20  e TK_AND: {.    
16980 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
16990 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
169a0 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
169b0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
169c0 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61      pParse->disa
169d0 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20  bleColCache++;. 
169e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
169f0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
16a00 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
16a10 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
16a20 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
16a30 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d  disableColCache-
16a40 2d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  -;.      break;.
16a50 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
16a60 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_OR: {.      in
16a70 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64  t d2 = sqlite3Vd
16a80 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
16a90 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
16aa0 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
16ab0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32  pExpr->pLeft, d2
16ac0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c  , jumpIfNull^SQL
16ad0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
16ae0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  .      pParse->d
16af0 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b  isableColCache++
16b00 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
16b10 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
16b20 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
16b30 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
16b40 6c 6c 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  ll);.      pPars
16b50 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63  e->disableColCac
16b60 68 65 2d 2d 3b 0a 20 20 20 20 20 20 73 71 6c 69  he--;.      sqli
16b70 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
16b80 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20  bel(v, d2);.    
16b90 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
16ba0 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
16bb0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
16bc0 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
16bd0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
16be0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
16bf0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
16c00 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
16c10 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LT:.    case T
16c20 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LE:.    case T
16c30 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GT:.    case T
16c40 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GE:.    case T
16c50 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_NE:.    case T
16c60 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 63 6f  K_EQ: {.      co
16c70 64 65 43 6f 6d 70 61 72 65 4f 70 65 72 61 6e 64  deCompareOperand
16c80 73 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  s(pParse, pExpr-
16c90 3e 70 4c 65 66 74 2c 20 26 72 31 2c 20 26 72 65  >pLeft, &r1, &re
16ca0 67 46 72 65 65 31 2c 0a 20 20 20 20 20 20 20 20  gFree1,.        
16cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16cc0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
16cd0 3e 70 52 69 67 68 74 2c 20 26 72 32 2c 20 26 72  >pRight, &r2, &r
16ce0 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
16cf0 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
16d00 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
16d10 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
16d20 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20   op,.           
16d30 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64         r1, r2, d
16d40 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
16d50 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
16d60 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
16d70 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
16d80 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a  e TK_NOTNULL: {.
16d90 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
16da0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
16db0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
16dc0 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
16dd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
16de0 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20  beAddOp2(v, op, 
16df0 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  r1, dest);.     
16e00 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
16e10 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45    case TK_BETWEE
16e20 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 20 20  N: {.      /*   
16e30 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44   x BETWEEN y AND
16e40 20 7a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20   z.      **.    
16e50 20 20 2a 2a 20 49 73 20 65 71 75 69 76 61 6c 65    ** Is equivale
16e60 6e 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 0a  nt to .      **.
16e70 20 20 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79        **    x>=y
16e80 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 20 20   AND x<=z.      
16e90 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 43 6f 64 65  **.      ** Code
16ea0 20 69 74 20 61 73 20 73 75 63 68 2c 20 74 61 6b   it as such, tak
16eb0 69 6e 67 20 63 61 72 65 20 74 6f 20 64 6f 20 74  ing care to do t
16ec0 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70  he common subexp
16ed0 72 65 73 73 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  ression.      **
16ee0 20 65 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66   elementation of
16ef0 20 78 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20   x..      */.   
16f00 20 20 20 45 78 70 72 20 65 78 70 72 41 6e 64 3b     Expr exprAnd;
16f10 0a 20 20 20 20 20 20 45 78 70 72 20 63 6f 6d 70  .      Expr comp
16f20 4c 65 66 74 3b 0a 20 20 20 20 20 20 45 78 70 72  Left;.      Expr
16f30 20 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 20 20   compRight;.    
16f40 20 20 45 78 70 72 20 65 78 70 72 58 3b 0a 0a 20    Expr exprX;.. 
16f50 20 20 20 20 20 65 78 70 72 58 20 3d 20 2a 70 45       exprX = *pE
16f60 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
16f70 20 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54    exprAnd.op = T
16f80 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 65 78 70  K_AND;.      exp
16f90 72 41 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f  rAnd.pLeft = &co
16fa0 6d 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 65 78  mpLeft;.      ex
16fb0 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20 26  prAnd.pRight = &
16fc0 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 20 20 20  compRight;.     
16fd0 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54   compLeft.op = T
16fe0 4b 5f 47 45 3b 0a 20 20 20 20 20 20 63 6f 6d 70  K_GE;.      comp
16ff0 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65 78  Left.pLeft = &ex
17000 70 72 58 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c  prX;.      compL
17010 65 66 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78  eft.pRight = pEx
17020 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  pr->pList->a[0].
17030 70 45 78 70 72 3b 0a 20 20 20 20 20 20 63 6f 6d  pExpr;.      com
17040 70 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c  pRight.op = TK_L
17050 45 3b 0a 20 20 20 20 20 20 63 6f 6d 70 52 69 67  E;.      compRig
17060 68 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72  ht.pLeft = &expr
17070 58 3b 0a 20 20 20 20 20 20 63 6f 6d 70 52 69 67  X;.      compRig
17080 68 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70  ht.pRight = pExp
17090 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  r->pList->a[1].p
170a0 45 78 70 72 3b 0a 20 20 20 20 20 20 65 78 70 72  Expr;.      expr
170b0 58 2e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69 74  X.iTable = sqlit
170c0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
170d0 50 61 72 73 65 2c 20 26 65 78 70 72 58 2c 20 26  Parse, &exprX, &
170e0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
170f0 20 65 78 70 72 58 2e 6f 70 20 3d 20 54 4b 5f 52   exprX.op = TK_R
17100 45 47 49 53 54 45 52 3b 0a 20 20 20 20 20 20 73  EGISTER;.      s
17110 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
17120 65 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41  e(pParse, &exprA
17130 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  nd, dest, jumpIf
17140 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
17150 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
17160 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72  fault: {.      r
17170 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
17180 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
17190 70 45 78 70 72 2c 20 26 72 65 67 46 72 65 65 31  pExpr, &regFree1
171a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
171b0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
171c0 5f 49 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73 74  _IfNot, r1, dest
171d0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29  , jumpIfNull!=0)
171e0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
171f0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
17200 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
17210 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
17220 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  1);.  sqlite3Rel
17230 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
17240 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 7d  se, regFree2);.}
17250 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65  ../*.** Do a dee
17260 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20  p comparison of 
17270 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74  two expression t
17280 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20 54 52  rees.  Return TR
17290 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a 2a  UE (non-zero).**
172a0 20 69 66 20 74 68 65 79 20 61 72 65 20 69 64 65   if they are ide
172b0 6e 74 69 63 61 6c 20 61 6e 64 20 72 65 74 75 72  ntical and retur
172c0 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65 79 20  n FALSE if they 
172d0 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61  differ in any wa
172e0 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  y..**.** Sometim
172f0 65 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  es this routine 
17300 77 69 6c 6c 20 72 65 74 75 72 6e 20 46 41 4c 53  will return FALS
17310 45 20 65 76 65 6e 20 69 66 20 74 68 65 20 74 77  E even if the tw
17320 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  o expressions.**
17330 20 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75 69   really are equi
17340 76 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20 63  valent.  If we c
17350 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61 74  annot prove that
17360 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
17370 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63 61   are.** identica
17380 6c 2c 20 77 65 20 72 65 74 75 72 6e 20 46 41 4c  l, we return FAL
17390 53 45 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61  SE just to be sa
173a0 66 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20  fe.  So if this 
173b0 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
173c0 6e 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 79  ns false, then y
173d0 6f 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79  ou do not really
173e0 20 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74 61 69   know for certai
173f0 6e 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20  n if the two.** 
17400 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20  expressions are 
17410 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 69  the same.  But i
17420 66 20 79 6f 75 20 67 65 74 20 61 20 54 52 55 45  f you get a TRUE
17430 20 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f   return, then yo
17440 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72 65  u.** can be sure
17450 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
17460 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20   are the same.  
17470 49 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77 68  In the places wh
17480 65 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ere.** this rout
17490 69 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74 20  ine is used, it 
174a0 64 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74 6f  does not hurt to
174b0 20 67 65 74 20 61 6e 20 65 78 74 72 61 20 46 41   get an extra FA
174c0 4c 53 45 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75  LSE - that.** ju
174d0 73 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20  st might result 
174e0 69 6e 20 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79  in some slightly
174f0 20 73 6c 6f 77 65 72 20 63 6f 64 65 2e 20 20 42   slower code.  B
17500 75 74 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20  ut returning.** 
17510 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 54 52 55  an incorrect TRU
17520 45 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  E could lead to 
17530 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a  a malfunction..*
17540 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
17550 72 43 6f 6d 70 61 72 65 28 45 78 70 72 20 2a 70  rCompare(Expr *p
17560 41 2c 20 45 78 70 72 20 2a 70 42 29 7b 0a 20 20  A, Expr *pB){.  
17570 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d  int i;.  if( pA=
17580 3d 30 7c 7c 70 42 3d 3d 30 20 29 7b 0a 20 20 20  =0||pB==0 ){.   
17590 20 72 65 74 75 72 6e 20 70 42 3d 3d 70 41 3b 0a   return pB==pA;.
175a0 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70    }.  if( pA->op
175b0 21 3d 70 42 2d 3e 6f 70 20 29 20 72 65 74 75 72  !=pB->op ) retur
175c0 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 41 2d 3e  n 0;.  if( (pA->
175d0 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69  flags & EP_Disti
175e0 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73  nct)!=(pB->flags
175f0 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 20   & EP_Distinct) 
17600 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
17610 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f  ( !sqlite3ExprCo
17620 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c  mpare(pA->pLeft,
17630 20 70 42 2d 3e 70 4c 65 66 74 29 20 29 20 72 65   pB->pLeft) ) re
17640 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73  turn 0;.  if( !s
17650 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
17660 65 28 70 41 2d 3e 70 52 69 67 68 74 2c 20 70 42  e(pA->pRight, pB
17670 2d 3e 70 52 69 67 68 74 29 20 29 20 72 65 74 75  ->pRight) ) retu
17680 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e  rn 0;.  if( pA->
17690 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 69 66 28  pList ){.    if(
176a0 20 70 42 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 20   pB->pList==0 ) 
176b0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66  return 0;.    if
176c0 28 20 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  ( pA->pList->nEx
176d0 70 72 21 3d 70 42 2d 3e 70 4c 69 73 74 2d 3e 6e  pr!=pB->pList->n
176e0 45 78 70 72 20 29 20 72 65 74 75 72 6e 20 30 3b  Expr ) return 0;
176f0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
17700 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pA->pList->nExpr
17710 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
17720 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f  ( !sqlite3ExprCo
17730 6d 70 61 72 65 28 70 41 2d 3e 70 4c 69 73 74 2d  mpare(pA->pList-
17740 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 42 2d  >a[i].pExpr, pB-
17750 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  >pList->a[i].pEx
17760 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pr) ){.        r
17770 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
17780 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
17790 66 28 20 70 42 2d 3e 70 4c 69 73 74 20 29 7b 0a  f( pB->pList ){.
177a0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
177b0 7d 0a 20 20 69 66 28 20 70 41 2d 3e 70 53 65 6c  }.  if( pA->pSel
177c0 65 63 74 20 7c 7c 20 70 42 2d 3e 70 53 65 6c 65  ect || pB->pSele
177d0 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ct ) return 0;. 
177e0 20 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65 21   if( pA->iTable!
177f0 3d 70 42 2d 3e 69 54 61 62 6c 65 20 7c 7c 20 70  =pB->iTable || p
17800 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e  A->iColumn!=pB->
17810 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e  iColumn ) return
17820 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70   0;.  if( pA->op
17830 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  !=TK_COLUMN && p
17840 41 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 7b 0a 20 20  A->token.z ){.  
17850 20 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e    if( pB->token.
17860 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  z==0 ) return 0;
17870 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 74 6f 6b  .    if( pB->tok
17880 65 6e 2e 6e 21 3d 70 41 2d 3e 74 6f 6b 65 6e 2e  en.n!=pA->token.
17890 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  n ) return 0;.  
178a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
178b0 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 41 2d  NICmp((char*)pA-
178c0 3e 74 6f 6b 65 6e 2e 7a 2c 28 63 68 61 72 2a 29  >token.z,(char*)
178d0 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 2c 70 42 2d 3e  pB->token.z,pB->
178e0 74 6f 6b 65 6e 2e 6e 29 21 3d 30 20 29 7b 0a 20  token.n)!=0 ){. 
178f0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
17900 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
17910 6e 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  n 1;.}.../*.** A
17920 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
17930 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f   to the pAggInfo
17940 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20  ->aCol[] array. 
17950 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
17960 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  x of.** the new 
17970 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  element.  Return
17980 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62   a negative numb
17990 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69  er if malloc fai
179a0 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
179b0 74 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75  t addAggInfoColu
179c0 6d 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  mn(sqlite3 *db, 
179d0 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b  AggInfo *pInfo){
179e0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66  .  int i;.  pInf
179f0 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65  o->aCol = sqlite
17a00 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a  3ArrayAllocate(.
17a10 20 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20         db,.     
17a20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20    pInfo->aCol,. 
17a30 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e        sizeof(pIn
17a40 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20  fo->aCol[0]),.  
17a50 20 20 20 20 20 33 2c 0a 20 20 20 20 20 20 20 26       3,.       &
17a60 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a  pInfo->nColumn,.
17a70 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e         &pInfo->n
17a80 43 6f 6c 75 6d 6e 41 6c 6c 6f 63 2c 0a 20 20 20  ColumnAlloc,.   
17a90 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65      &i.  );.  re
17aa0 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f  turn i;.}    ../
17ab0 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65  *.** Add a new e
17ac0 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41  lement to the pA
17ad0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20  ggInfo->aFunc[] 
17ae0 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74  array.  Return t
17af0 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74  he index of.** t
17b00 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20  he new element. 
17b10 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69   Return a negati
17b20 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c  ve number if mal
17b30 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  loc fails..*/.st
17b40 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49  atic int addAggI
17b50 6e 66 6f 46 75 6e 63 28 73 71 6c 69 74 65 33 20  nfoFunc(sqlite3 
17b60 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49  *db, AggInfo *pI
17b70 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  nfo){.  int i;. 
17b80 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d 20   pInfo->aFunc = 
17b90 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f  sqlite3ArrayAllo
17ba0 63 61 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c  cate(.       db,
17bb0 20 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e   .       pInfo->
17bc0 61 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 73 69  aFunc,.       si
17bd0 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e  zeof(pInfo->aFun
17be0 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 33 2c  c[0]),.       3,
17bf0 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e  .       &pInfo->
17c00 6e 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 26 70  nFunc,.       &p
17c10 49 6e 66 6f 2d 3e 6e 46 75 6e 63 41 6c 6c 6f 63  Info->nFuncAlloc
17c20 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b  ,.       &i.  );
17c30 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20  .  return i;.}  
17c40 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69    ../*.** This i
17c50 73 20 61 6e 20 78 46 75 6e 63 20 66 6f 72 20 77  s an xFunc for w
17c60 61 6c 6b 45 78 70 72 54 72 65 65 28 29 20 75 73  alkExprTree() us
17c70 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
17c80 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72 41  .** sqlite3ExprA
17c90 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
17ca0 28 29 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  ().  See sqlite3
17cb0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
17cc0 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64  gates.** for add
17cd0 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
17ce0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ion..**.** This 
17cf0 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73  routine analyzes
17d00 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 66   the aggregate f
17d10 75 6e 63 74 69 6f 6e 20 61 74 20 70 45 78 70 72  unction at pExpr
17d20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17d30 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
17d40 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 45 78 70  (void *pArg, Exp
17d50 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
17d60 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   i;.  NameContex
17d70 74 20 2a 70 4e 43 20 3d 20 28 4e 61 6d 65 43 6f  t *pNC = (NameCo
17d80 6e 74 65 78 74 20 2a 29 70 41 72 67 3b 0a 20 20  ntext *)pArg;.  
17d90 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
17da0 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53  pNC->pParse;.  S
17db0 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74  rcList *pSrcList
17dc0 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
17dd0 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  ;.  AggInfo *pAg
17de0 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41 67  gInfo = pNC->pAg
17df0 67 49 6e 66 6f 3b 0a 0a 20 20 73 77 69 74 63 68  gInfo;..  switch
17e00 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
17e10 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43     case TK_AGG_C
17e20 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20  OLUMN:.    case 
17e30 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
17e40 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
17e50 65 65 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ee if the column
17e60 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68   is in one of th
17e70 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  e tables in the 
17e80 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 63 6c  FROM.      ** cl
17e90 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72  ause of the aggr
17ea0 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 20  egate query */. 
17eb0 20 20 20 20 20 69 66 28 20 70 53 72 63 4c 69 73       if( pSrcLis
17ec0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  t ){.        str
17ed0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
17ee0 20 2a 70 49 74 65 6d 20 3d 20 70 53 72 63 4c 69   *pItem = pSrcLi
17ef0 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 66  st->a;.        f
17f00 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69  or(i=0; i<pSrcLi
17f10 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
17f20 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
17f30 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
17f40 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20  o_col *pCol;.   
17f50 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
17f60 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d  ->iTable==pItem-
17f70 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  >iCursor ){.    
17f80 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
17f90 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
17fa0 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  t, it means that
17fb0 20 70 45 78 70 72 20 72 65 66 65 72 73 20 74 6f   pExpr refers to
17fc0 20 61 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20   a table.       
17fd0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20       ** that is 
17fe0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
17ff0 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65 67  se of the aggreg
18000 61 74 65 20 71 75 65 72 79 2e 20 20 0a 20 20 20  ate query.  .   
18010 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20           **.    
18020 20 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b 65 20          ** Make 
18030 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  an entry for the
18040 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67 67 49   column in pAggI
18050 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20 74  nfo->aCol[] if t
18060 68 65 72 65 0a 20 20 20 20 20 20 20 20 20 20 20  here.           
18070 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20 65 6e   ** is not an en
18080 74 72 79 20 74 68 65 72 65 20 61 6c 72 65 61 64  try there alread
18090 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  y..            *
180a0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  /.            in
180b0 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t k;.           
180c0 20 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e 66 6f   pCol = pAggInfo
180d0 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  ->aCol;.        
180e0 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
180f0 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
18100 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; k++, pCol++){.
18110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
18120 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d  ( pCol->iTable==
18130 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26  pExpr->iTable &&
18140 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18150 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e     pCol->iColumn
18160 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ==pExpr->iColumn
18170 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
18180 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
18190 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
181a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
181b0 20 20 20 20 20 69 66 28 20 28 6b 3e 3d 70 41 67       if( (k>=pAg
181c0 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a  gInfo->nColumn).
181d0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
181e0 28 6b 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 43  (k = addAggInfoC
181f0 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d 3e 64 62  olumn(pParse->db
18200 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20  , pAggInfo))>=0 
18210 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a  .            ){.
18220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
18230 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e  ol = &pAggInfo->
18240 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20  aCol[k];.       
18250 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61         pCol->pTa
18260 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b  b = pExpr->pTab;
18270 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
18280 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45  Col->iTable = pE
18290 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  xpr->iTable;.   
182a0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
182b0 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72  >iColumn = pExpr
182c0 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
182d0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
182e0 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
182f0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  nMem;.          
18300 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65      pCol->iSorte
18310 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20  rColumn = -1;.  
18320 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
18330 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ->pExpr = pExpr;
18340 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
18350 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72  f( pAggInfo->pGr
18360 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20  oupBy ){.       
18370 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 2c 20           int j, 
18380 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n;.             
18390 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 42     ExprList *pGB
183a0 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72   = pAggInfo->pGr
183b0 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 20  oupBy;.         
183c0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78         struct Ex
183d0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 65  prList_item *pTe
183e0 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20 20 20  rm = pGB->a;.   
183f0 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d               n =
18400 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20 20 20   pGB->nExpr;.   
18410 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
18420 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20  (j=0; j<n; j++, 
18430 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
18440 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
18450 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45   *pE = pTerm->pE
18460 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
18470 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f         if( pE->o
18480 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
18490 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70  pE->iTable==pExp
184a0 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20  r->iTable &&.   
184b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184c0 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d     pE->iColumn==
184d0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29  pExpr->iColumn )
184e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
184f0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
18500 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20  terColumn = j;. 
18510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18520 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
18530 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
18540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
18550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
18560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
18570 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43  ( pCol->iSorterC
18580 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20  olumn<0 ){.     
18590 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
185a0 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d  >iSorterColumn =
185b0 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74   pAggInfo->nSort
185c0 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20  ingColumn++;.   
185d0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
185e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
185f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20         /* There 
18600 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72 79 20  is now an entry 
18610 66 6f 72 20 70 45 78 70 72 20 69 6e 20 70 41 67  for pExpr in pAg
18620 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65  gInfo->aCol[] (e
18630 69 74 68 65 72 0a 20 20 20 20 20 20 20 20 20 20  ither.          
18640 20 20 2a 2a 20 62 65 63 61 75 73 65 20 69 74 20    ** because it 
18650 77 61 73 20 74 68 65 72 65 20 62 65 66 6f 72 65  was there before
18660 20 6f 72 20 62 65 63 61 75 73 65 20 77 65 20 6a   or because we j
18670 75 73 74 20 63 72 65 61 74 65 64 20 69 74 29 2e  ust created it).
18680 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
18690 43 6f 6e 76 65 72 74 20 74 68 65 20 70 45 78 70  Convert the pExp
186a0 72 20 74 6f 20 62 65 20 61 20 54 4b 5f 41 47 47  r to be a TK_AGG
186b0 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72 69 6e  _COLUMN referrin
186c0 67 20 74 6f 20 74 68 61 74 0a 20 20 20 20 20 20  g to that.      
186d0 20 20 20 20 20 20 2a 2a 20 70 41 67 67 49 6e 66        ** pAggInf
186e0 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e  o->aCol[] entry.
186f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
18700 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
18710 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41  r->pAggInfo = pA
18720 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  ggInfo;.        
18730 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
18740 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20  TK_AGG_COLUMN;. 
18750 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
18760 2d 3e 69 41 67 67 20 3d 20 6b 3b 0a 20 20 20 20  ->iAgg = k;.    
18770 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
18780 20 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e           } /* en
18790 64 69 66 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  dif pExpr->iTabl
187a0 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  e==pItem->iCurso
187b0 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f  r */.        } /
187c0 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20  * end loop over 
187d0 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20  pSrcList */.    
187e0 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
187f0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   1;.    }.    ca
18800 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
18810 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  ON: {.      /* T
18820 68 65 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d  he pNC->nDepth==
18830 30 20 74 65 73 74 20 63 61 75 73 65 73 20 61 67  0 test causes ag
18840 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
18850 73 20 69 6e 20 73 75 62 71 75 65 72 69 65 73 0a  s in subqueries.
18860 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69        ** to be i
18870 67 6e 6f 72 65 64 20 2a 2f 0a 20 20 20 20 20 20  gnored */.      
18880 69 66 28 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d  if( pNC->nDepth=
18890 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
188a0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
188b0 20 70 45 78 70 72 20 69 73 20 61 20 64 75 70 6c   pExpr is a dupl
188c0 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65 72  icate of another
188d0 20 61 67 67 72 65 67 61 74 65 20 0a 20 20 20 20   aggregate .    
188e0 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20      ** function 
188f0 74 68 61 74 20 69 73 20 61 6c 72 65 61 64 79 20  that is already 
18900 69 6e 20 74 68 65 20 70 41 67 67 49 6e 66 6f 20  in the pAggInfo 
18910 73 74 72 75 63 74 75 72 65 0a 20 20 20 20 20 20  structure.      
18920 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74 72    */.        str
18930 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
18940 20 2a 70 49 74 65 6d 20 3d 20 70 41 67 67 49 6e   *pItem = pAggIn
18950 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20 20 20  fo->aFunc;.     
18960 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41     for(i=0; i<pA
18970 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
18980 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
18990 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
189a0 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
189b0 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78  Item->pExpr, pEx
189c0 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pr) ){.         
189d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
189e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
189f0 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70          if( i>=p
18a00 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29  AggInfo->nFunc )
18a10 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70  {.          /* p
18a20 45 78 70 72 20 69 73 20 6f 72 69 67 69 6e 61 6c  Expr is original
18a30 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e  .  Make a new en
18a40 74 72 79 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  try in pAggInfo-
18a50 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20  >aFunc[].       
18a60 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
18a70 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61  u8 enc = ENC(pPa
18a80 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20  rse->db);.      
18a90 20 20 20 20 69 20 3d 20 61 64 64 41 67 67 49 6e      i = addAggIn
18aa0 66 6f 46 75 6e 63 28 70 50 61 72 73 65 2d 3e 64  foFunc(pParse->d
18ab0 62 2c 20 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20  b, pAggInfo);.  
18ac0 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 30          if( i>=0
18ad0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
18ae0 70 49 74 65 6d 20 3d 20 26 70 41 67 67 49 6e 66  pItem = &pAggInf
18af0 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20  o->aFunc[i];.   
18b00 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
18b10 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
18b20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
18b30 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73  ->iMem = ++pPars
18b40 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20  e->nMem;.       
18b50 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e       pItem->pFun
18b60 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  c = sqlite3FindF
18b70 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e  unction(pParse->
18b80 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
18b90 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 45         (char*)pE
18ba0 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45  xpr->token.z, pE
18bb0 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 0a 20 20  xpr->token.n,.  
18bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18bd0 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 3f 20   pExpr->pList ? 
18be0 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45  pExpr->pList->nE
18bf0 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29  xpr : 0, enc, 0)
18c00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
18c10 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26  ( pExpr->flags &
18c20 20 45 50 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a   EP_Distinct ){.
18c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
18c40 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  tem->iDistinct =
18c50 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
18c60 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
18c70 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
18c80 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e    pItem->iDistin
18c90 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  ct = -1;.       
18ca0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
18cb0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
18cc0 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78       /* Make pEx
18cd0 70 72 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  pr point to the 
18ce0 61 70 70 72 6f 70 72 69 61 74 65 20 70 41 67 67  appropriate pAgg
18cf0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e  Info->aFunc[] en
18d00 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  try.        */. 
18d10 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41         pExpr->iA
18d20 67 67 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  gg = i;.        
18d30 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20  pExpr->pAggInfo 
18d40 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20  = pAggInfo;.    
18d50 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
18d60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
18d70 0a 20 20 2f 2a 20 52 65 63 75 72 73 69 76 65 6c  .  /* Recursivel
18d80 79 20 77 61 6c 6b 20 73 75 62 71 75 65 72 69 65  y walk subquerie
18d90 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 54 4b  s looking for TK
18da0 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 74 68  _COLUMN nodes th
18db0 61 74 20 6e 65 65 64 0a 20 20 2a 2a 20 74 6f 20  at need.  ** to 
18dc0 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b  be changed to TK
18dd0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20 42 75  _AGG_COLUMN.  Bu
18de0 74 20 69 6e 63 72 65 6d 65 6e 74 20 6e 44 65 70  t increment nDep
18df0 74 68 20 73 6f 20 74 68 61 74 0a 20 20 2a 2a 20  th so that.  ** 
18e00 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
18e10 6e 6f 64 65 73 20 69 6e 20 73 75 62 71 75 65 72  nodes in subquer
18e20 69 65 73 20 77 69 6c 6c 20 62 65 20 75 6e 63 68  ies will be unch
18e30 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  anged..  */.  if
18e40 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  ( pExpr->pSelect
18e50 20 29 7b 0a 20 20 20 20 70 4e 43 2d 3e 6e 44 65   ){.    pNC->nDe
18e60 70 74 68 2b 2b 3b 0a 20 20 20 20 77 61 6c 6b 53  pth++;.    walkS
18e70 65 6c 65 63 74 45 78 70 72 28 70 45 78 70 72 2d  electExpr(pExpr-
18e80 3e 70 53 65 6c 65 63 74 2c 20 61 6e 61 6c 79 7a  >pSelect, analyz
18e90 65 41 67 67 72 65 67 61 74 65 2c 20 70 4e 43 29  eAggregate, pNC)
18ea0 3b 0a 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74  ;.    pNC->nDept
18eb0 68 2d 2d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  h--;.  }.  retur
18ec0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  n 0;.}../*.** An
18ed0 61 6c 79 7a 65 20 74 68 65 20 67 69 76 65 6e 20  alyze the given 
18ee0 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69  expression looki
18ef0 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65  ng for aggregate
18f00 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a   functions and.*
18f10 2a 20 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20  * for variables 
18f20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
18f30 61 64 64 65 64 20 74 6f 20 74 68 65 20 70 50 61  added to the pPa
18f40 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61  rse->aAgg[] arra
18f50 79 2e 0a 2a 2a 20 4d 61 6b 65 20 61 64 64 69 74  y..** Make addit
18f60 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20 74 6f  ional entries to
18f70 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67   the pParse->aAg
18f80 67 5b 5d 20 61 72 72 61 79 20 61 73 20 6e 65 63  g[] array as nec
18f90 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  essary..**.** Th
18fa0 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
18fb0 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  d only be called
18fc0 20 61 66 74 65 72 20 74 68 65 20 65 78 70 72 65   after the expre
18fd0 73 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a  ssion has been.*
18fe0 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79 20 73 71  * analyzed by sq
18ff0 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65  lite3ExprResolve
19000 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64  Names()..*/.void
19010 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
19020 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 4e 61  yzeAggregates(Na
19030 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
19040 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
19050 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78  walkExprTree(pEx
19060 70 72 2c 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  pr, analyzeAggre
19070 67 61 74 65 2c 20 70 4e 43 29 3b 0a 7d 0a 0a 2f  gate, pNC);.}../
19080 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65  *.** Call sqlite
19090 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
190a0 65 67 61 74 65 73 28 29 20 66 6f 72 20 65 76 65  egates() for eve
190b0 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ry expression in
190c0 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f   an.** expressio
190d0 6e 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 20  n list.  Return 
190e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
190f0 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rors..**.** If a
19100 6e 20 65 72 72 6f 72 20 69 73 20 66 6f 75 6e 64  n error is found
19110 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20 69  , the analysis i
19120 73 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a  s cut short..*/.
19130 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
19140 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e  AnalyzeAggList(N
19150 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
19160 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
19170 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  ){.  struct Expr
19180 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
19190 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
191a0 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
191b0 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  r(pItem=pList->a
191c0 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  , i=0; i<pList->
191d0 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
191e0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  m++){.      sqli
191f0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
19200 67 72 65 67 61 74 65 73 28 70 4e 43 2c 20 70 49  gregates(pNC, pI
19210 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
19220 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
19230 41 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c  Allocate or deal
19240 6c 6f 63 61 74 65 20 74 65 6d 70 6f 72 61 72 79  locate temporary
19250 20 75 73 65 20 72 65 67 69 73 74 65 72 73 20 64   use registers d
19260 75 72 69 6e 67 20 63 6f 64 65 20 67 65 6e 65 72  uring code gener
19270 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ation..*/.int sq
19280 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
19290 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
192a0 20 20 69 6e 74 20 69 2c 20 72 3b 0a 20 20 69 66    int i, r;.  if
192b0 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  ( pParse->nTempR
192c0 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  eg==0 ){.    ret
192d0 75 72 6e 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  urn ++pParse->nM
192e0 65 6d 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  em;.  }.  for(i=
192f0 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54 65  0; i<pParse->nTe
19300 6d 70 52 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  mpReg; i++){.   
19310 20 72 20 3d 20 70 50 61 72 73 65 2d 3e 61 54 65   r = pParse->aTe
19320 6d 70 52 65 67 5b 69 5d 3b 0a 20 20 20 20 69 66  mpReg[i];.    if
19330 28 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61  ( usedAsColumnCa
19340 63 68 65 28 70 50 61 72 73 65 2c 20 72 2c 20 72  che(pParse, r, r
19350 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
19360 7d 0a 20 20 69 66 28 20 69 3e 3d 70 50 61 72 73  }.  if( i>=pPars
19370 65 2d 3e 6e 54 65 6d 70 52 65 67 20 29 7b 0a 20  e->nTempReg ){. 
19380 20 20 20 72 65 74 75 72 6e 20 2b 2b 70 50 61 72     return ++pPar
19390 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20  se->nMem;.  }.  
193a0 77 68 69 6c 65 28 20 69 3c 70 50 61 72 73 65 2d  while( i<pParse-
193b0 3e 6e 54 65 6d 70 52 65 67 2d 31 20 29 7b 0a 20  >nTempReg-1 ){. 
193c0 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70     pParse->aTemp
193d0 52 65 67 5b 69 5d 20 3d 20 70 50 61 72 73 65 2d  Reg[i] = pParse-
193e0 3e 61 54 65 6d 70 52 65 67 5b 69 2b 31 5d 3b 0a  >aTempReg[i+1];.
193f0 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54    }.  pParse->nT
19400 65 6d 70 52 65 67 2d 2d 3b 0a 20 20 72 65 74 75  empReg--;.  retu
19410 72 6e 20 72 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  rn r;.}.void sql
19420 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
19430 65 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eg(Parse *pParse
19440 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69  , int iReg){.  i
19450 66 28 20 69 52 65 67 20 26 26 20 70 50 61 72 73  f( iReg && pPars
19460 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61  e->nTempReg<Arra
19470 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54  ySize(pParse->aT
19480 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20 61  empReg) ){.    a
19490 73 73 65 72 74 28 20 69 52 65 67 3e 30 20 29 3b  ssert( iReg>0 );
194a0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65  .    pParse->aTe
194b0 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54  mpReg[pParse->nT
194c0 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67  empReg++] = iReg
194d0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
194e0 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c 6c  llocate or deall
194f0 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66  ocate a block of
19500 20 6e 52 65 67 20 63 6f 6e 73 65 63 75 74 69 76   nReg consecutiv
19510 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2f 0a 69  e registers.*/.i
19520 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d  nt sqlite3GetTem
19530 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50  pRange(Parse *pP
19540 61 72 73 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b  arse, int nReg){
19550 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69  .  int i, n;.  i
19560 20 3d 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67   = pParse->iRang
19570 65 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50 61 72  eReg;.  n = pPar
19580 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b 0a 20  se->nRangeReg;. 
19590 20 69 66 28 20 6e 52 65 67 3c 3d 6e 20 26 26 20   if( nReg<=n && 
195a0 21 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63  !usedAsColumnCac
195b0 68 65 28 70 50 61 72 73 65 2c 20 69 2c 20 69 2b  he(pParse, i, i+
195c0 6e 2d 31 29 20 29 7b 0a 20 20 20 20 70 50 61 72  n-1) ){.    pPar
195d0 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 2b 3d  se->iRangeReg +=
195e0 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73   nReg;.    pPars
195f0 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 2d 3d 20  e->nRangeReg -= 
19600 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nReg;.  }else{. 
19610 20 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 6e     i = pParse->n
19620 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73  Mem+1;.    pPars
19630 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b  e->nMem += nReg;
19640 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b  .  }.  return i;
19650 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  .}.void sqlite3R
19660 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
19670 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
19680 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65  nt iReg, int nRe
19690 67 29 7b 0a 20 20 69 66 28 20 6e 52 65 67 3e 70  g){.  if( nReg>p
196a0 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
196b0 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
196c0 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e 52 65 67  nRangeReg = nReg
196d0 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52  ;.    pParse->iR
196e0 61 6e 67 65 52 65 67 20 3d 20 69 52 65 67 3b 0a  angeReg = iReg;.
196f0 20 20 7d 0a 7d 0a                                  }.}.