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

Artifact 64843f848a36edf1fe4d95bfd3e7a9090580c4a3:


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 33 20 32 30 30 38 2f 30 34 2f 30 31 20  .363 2008/04/01 
0220: 31 32 3a 32 34 3a 31 31 20 64 72 68 20 45 78 70  12:24:11 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 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
117b0 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
117c0 67 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67  ge(pParse, inReg
117d0 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 1);.      brea
117e0 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
117f0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
11800 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  AST */.    case 
11810 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
11820 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
11830 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
11840 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
11850 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
11860 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 61  TK_EQ: {.      a
11870 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50  ssert( TK_LT==OP
11880 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Lt );.      ass
11890 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c  ert( TK_LE==OP_L
118a0 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
118b0 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20  t( TK_GT==OP_Gt 
118c0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
118d0 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b   TK_GE==OP_Ge );
118e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
118f0 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20  K_EQ==OP_Eq );. 
11900 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
11910 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20  NE==OP_Ne );.   
11920 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 4f 70     codeCompareOp
11930 65 72 61 6e 64 73 28 70 50 61 72 73 65 2c 20 70  erands(pParse, p
11940 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 31  Expr->pLeft, &r1
11950 2c 20 26 72 65 67 46 72 65 65 31 2c 0a 20 20 20  , &regFree1,.   
11960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
11980 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
11990 32 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  2, &regFree2);. 
119a0 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
119b0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
119c0 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52  pLeft, pExpr->pR
119d0 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20  ight, op,.      
119e0 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
119f0 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49 54  r2, inReg, SQLIT
11a00 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20  E_STOREP2);.    
11a10 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
11a20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a     case TK_AND:.
11a30 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a      case TK_OR:.
11a40 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53      case TK_PLUS
11a50 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  :.    case TK_ST
11a60 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AR:.    case TK_
11a70 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20  MINUS:.    case 
11a80 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65  TK_REM:.    case
11a90 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20   TK_BITAND:.    
11aa0 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20  case TK_BITOR:. 
11ab0 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48     case TK_SLASH
11ac0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53  :.    case TK_LS
11ad0 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54  HIFT:.    case T
11ae0 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63  K_RSHIFT: .    c
11af0 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b  ase TK_CONCAT: {
11b00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
11b10 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b  K_AND==OP_And );
11b20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
11b30 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 0a 20  K_OR==OP_Or );. 
11b40 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
11b50 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 0a  PLUS==OP_Add );.
11b60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
11b70 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72  _MINUS==OP_Subtr
11b80 61 63 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  act );.      ass
11b90 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f  ert( TK_REM==OP_
11ba0 52 65 6d 61 69 6e 64 65 72 20 29 3b 0a 20 20 20  Remainder );.   
11bb0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49     assert( TK_BI
11bc0 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20  TAND==OP_BitAnd 
11bd0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
11be0 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69   TK_BITOR==OP_Bi
11bf0 74 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  tOr );.      ass
11c00 65 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f  ert( TK_SLASH==O
11c10 50 5f 44 69 76 69 64 65 20 29 3b 0a 20 20 20 20  P_Divide );.    
11c20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48    assert( TK_LSH
11c30 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66  IFT==OP_ShiftLef
11c40 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
11c50 74 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50  t( TK_RSHIFT==OP
11c60 5f 53 68 69 66 74 52 69 67 68 74 20 29 3b 0a 20  _ShiftRight );. 
11c70 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
11c80 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61  CONCAT==OP_Conca
11c90 74 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  t );.      r1 = 
11ca0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
11cb0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
11cc0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
11cd0 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
11ce0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
11cf0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
11d00 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
11d10 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 73 71  Free2);.      sq
11d20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
11d30 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74  v, op, r2, r1, t
11d40 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72  arget);.      br
11d50 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
11d60 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b  ase TK_UMINUS: {
11d70 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
11d80 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
11d90 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
11da0 20 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20   pLeft );.      
11db0 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  if( pLeft->op==T
11dc0 4b 5f 46 4c 4f 41 54 20 7c 7c 20 70 4c 65 66 74  K_FLOAT || pLeft
11dd0 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52  ->op==TK_INTEGER
11de0 20 29 7b 0a 20 20 20 20 20 20 20 20 54 6f 6b 65   ){.        Toke
11df0 6e 20 2a 70 20 3d 20 26 70 4c 65 66 74 2d 3e 74  n *p = &pLeft->t
11e00 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 69 66  oken;.        if
11e10 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pLeft->op==TK_
11e20 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20  FLOAT ){.       
11e30 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 28     codeReal(v, (
11e40 63 68 61 72 2a 29 70 2d 3e 7a 2c 20 70 2d 3e 6e  char*)p->z, p->n
11e50 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 1, target);.  
11e60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11e70 20 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67         codeInteg
11e80 65 72 28 76 2c 20 28 63 68 61 72 2a 29 70 2d 3e  er(v, (char*)p->
11e90 7a 2c 20 70 2d 3e 6e 2c 20 31 2c 20 74 61 72 67  z, p->n, 1, targ
11ea0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  et);.        }. 
11eb0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
11ec0 20 20 20 20 72 65 67 46 72 65 65 31 20 3d 20 72      regFree1 = r
11ed0 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
11ee0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
11ef0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
11f00 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
11f10 6e 74 65 67 65 72 2c 20 30 2c 20 72 31 29 3b 0a  nteger, 0, r1);.
11f20 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c          r2 = sql
11f30 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
11f40 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
11f50 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 32  pLeft, &regFree2
11f60 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
11f70 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
11f80 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72 32 2c  OP_Subtract, r2,
11f90 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20   r1, target);.  
11fa0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65      }.      inRe
11fb0 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20  g = target;.    
11fc0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
11fd0 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f     case TK_BITNO
11fe0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  T:.    case TK_N
11ff0 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  OT: {.      asse
12000 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f  rt( TK_BITNOT==O
12010 50 5f 42 69 74 4e 6f 74 20 29 3b 0a 20 20 20 20  P_BitNot );.    
12020 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54    assert( TK_NOT
12030 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 0a 20 20 20 20  ==OP_Not );.    
12040 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
12050 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
12060 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
12070 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20  Left, target);. 
12080 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
12090 69 74 65 33 45 78 70 72 57 72 69 74 61 62 6c 65  ite3ExprWritable
120a0 52 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2c  Register(pParse,
120b0 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b   inReg, target);
120c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
120d0 62 65 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20  beAddOp1(v, op, 
120e0 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72  inReg);.      br
120f0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
12100 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
12110 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
12120 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  LL: {.      int 
12130 61 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65  addr;.      asse
12140 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f  rt( TK_ISNULL==O
12150 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20  P_IsNull );.    
12160 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54    assert( TK_NOT
12170 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c  NULL==OP_NotNull
12180 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
12190 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
121a0 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61  P_Integer, 1, ta
121b0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 31 20  rget);.      r1 
121c0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
121d0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
121e0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
121f0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 61 64  Free1);.      ad
12200 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
12210 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31  AddOp1(v, op, r1
12220 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12230 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12240 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c  _AddImm, target,
12250 20 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   -1);.      sqli
12260 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
12270 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20  v, addr);.      
12280 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
12290 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
122a0 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41  CTION: {.      A
122b0 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20  ggInfo *pInfo = 
122c0 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b  pExpr->pAggInfo;
122d0 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f  .      if( pInfo
122e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
122f0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
12300 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f  Parse, "misuse o
12310 66 20 61 67 67 72 65 67 61 74 65 3a 20 25 54 22  f aggregate: %T"
12320 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 70  ,.            &p
12330 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20  Expr->span);.   
12340 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12350 20 20 69 6e 52 65 67 20 3d 20 70 49 6e 66 6f 2d    inReg = pInfo-
12360 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41  >aFunc[pExpr->iA
12370 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20 20  gg].iMem;.      
12380 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
12390 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
123a0 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20  _CONST_FUNC:.   
123b0 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
123c0 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c  N: {.      ExprL
123d0 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
123e0 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20  pr->pList;.     
123f0 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 4c 69   int nExpr = pLi
12400 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70  st ? pList->nExp
12410 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 46 75 6e  r : 0;.      Fun
12420 63 44 65 66 20 2a 70 44 65 66 3b 0a 20 20 20 20  cDef *pDef;.    
12430 20 20 69 6e 74 20 6e 49 64 3b 0a 20 20 20 20 20    int nId;.     
12440 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
12450 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6f 6e 73  ;.      int cons
12460 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20  tMask = 0;.     
12470 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 71   int i;.      sq
12480 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
12490 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 75 38  se->db;.      u8
124a0 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a   enc = ENC(db);.
124b0 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
124c0 43 6f 6c 6c 20 3d 20 30 3b 0a 0a 20 20 20 20 20  Coll = 0;..     
124d0 20 7a 49 64 20 3d 20 28 63 68 61 72 2a 29 70 45   zId = (char*)pE
124e0 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20  xpr->token.z;.  
124f0 20 20 20 20 6e 49 64 20 3d 20 70 45 78 70 72 2d      nId = pExpr-
12500 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20  >token.n;.      
12510 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69  pDef = sqlite3Fi
12520 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73  ndFunction(pPars
12530 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c  e->db, zId, nId,
12540 20 6e 45 78 70 72 2c 20 65 6e 63 2c 20 30 29 3b   nExpr, enc, 0);
12550 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
12560 44 65 66 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Def!=0 );.      
12570 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
12580 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70 4c 69       nExpr = pLi
12590 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  st->nExpr;.     
125a0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
125b0 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
125c0 73 65 2c 20 6e 45 78 70 72 29 3b 0a 20 20 20 20  se, nExpr);.    
125d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
125e0 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
125f0 73 65 2c 20 70 4c 69 73 74 2c 20 72 31 29 3b 0a  se, pList, r1);.
12600 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
12610 20 20 20 20 20 6e 45 78 70 72 20 3d 20 72 31 20       nExpr = r1 
12620 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  = 0;.      }.#if
12630 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12640 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
12650 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20      /* Possibly 
12660 6f 76 65 72 6c 6f 61 64 20 74 68 65 20 66 75 6e  overload the fun
12670 63 74 69 6f 6e 20 69 66 20 74 68 65 20 66 69 72  ction if the fir
12680 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 20  st argument is. 
12690 20 20 20 20 20 2a 2a 20 61 20 76 69 72 74 75 61       ** a virtua
126a0 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a  l table column..
126b0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
126c0 2a 20 46 6f 72 20 69 6e 66 69 78 20 66 75 6e 63  * For infix func
126d0 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f  tions (LIKE, GLO
126e0 42 2c 20 52 45 47 45 58 50 2c 20 61 6e 64 20 4d  B, REGEXP, and M
126f0 41 54 43 48 29 20 75 73 65 20 74 68 65 0a 20 20  ATCH) use the.  
12700 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72      ** second ar
12710 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20  gument, not the 
12720 66 69 72 73 74 2c 20 61 73 20 74 68 65 20 61 72  first, as the ar
12730 67 75 6d 65 6e 74 20 74 6f 20 74 65 73 74 20 74  gument to test t
12740 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69  o.      ** see i
12750 66 20 69 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e  f it is a column
12760 20 69 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61   in a virtual ta
12770 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20 64 6f  ble.  This is do
12780 6e 65 20 62 65 63 61 75 73 65 0a 20 20 20 20 20  ne because.     
12790 20 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f 70 65   ** the left ope
127a0 72 61 6e 64 20 6f 66 20 69 6e 66 69 78 20 66 75  rand of infix fu
127b0 6e 63 74 69 6f 6e 73 20 28 74 68 65 20 6f 70 65  nctions (the ope
127c0 72 61 6e 64 20 77 65 20 77 61 6e 74 20 74 6f 0a  rand we want to.
127d0 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c        ** control
127e0 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e   overloading) en
127f0 64 73 20 75 70 20 61 73 20 74 68 65 20 73 65 63  ds up as the sec
12800 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
12810 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e  the.      ** fun
12820 63 74 69 6f 6e 2e 20 20 54 68 65 20 65 78 70 72  ction.  The expr
12830 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42  ession "A glob B
12840 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  " is equivalent 
12850 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c  to .      ** "gl
12860 6f 62 28 42 2c 41 29 2e 20 20 57 65 20 77 61 6e  ob(B,A).  We wan
12870 74 20 74 6f 20 75 73 65 20 74 68 65 20 41 20 69  t to use the A i
12880 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 74 6f 20  n "A glob B" to 
12890 74 65 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f  test.      ** fo
128a0 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c  r function overl
128b0 6f 61 64 69 6e 67 2e 20 20 42 75 74 20 77 65 20  oading.  But we 
128c0 75 73 65 20 74 68 65 20 42 20 74 65 72 6d 20 69  use the B term i
128d0 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20  n "glob(B,A)".. 
128e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
128f0 28 20 6e 45 78 70 72 3e 3d 32 20 26 26 20 28 70  ( nExpr>=2 && (p
12900 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
12910 5f 49 6e 66 69 78 46 75 6e 63 29 20 29 7b 0a 20  _InfixFunc) ){. 
12920 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71         pDef = sq
12930 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61  lite3VtabOverloa
12940 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44  dFunction(db, pD
12950 65 66 2c 20 6e 45 78 70 72 2c 20 70 4c 69 73 74  ef, nExpr, pList
12960 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[1].pExpr);. 
12970 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
12980 45 78 70 72 3e 30 20 29 7b 0a 20 20 20 20 20 20  Expr>0 ){.      
12990 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
129a0 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63  VtabOverloadFunc
129b0 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e  tion(db, pDef, n
129c0 45 78 70 72 2c 20 70 4c 69 73 74 2d 3e 61 5b 30  Expr, pList->a[0
129d0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
129e0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66  }.#endif.      f
129f0 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 20  or(i=0; i<nExpr 
12a00 26 26 20 69 3c 33 32 3b 20 69 2b 2b 29 7b 0a 20  && i<32; i++){. 
12a10 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
12a20 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
12a30 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  (pList->a[i].pEx
12a40 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pr) ){.         
12a50 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 28 31   constMask |= (1
12a60 3c 3c 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  <<i);.        }.
12a70 20 20 20 20 20 20 20 20 69 66 28 20 70 44 65 66          if( pDef
12a80 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 26 26  ->needCollSeq &&
12a90 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
12aa0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
12ab0 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
12ac0 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61  pParse, pList->a
12ad0 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
12ae0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
12af0 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 6e 65      if( pDef->ne
12b00 65 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20  edCollSeq ){.   
12b10 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
12b20 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65  ) pColl = pParse
12b30 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
12b40 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
12b50 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
12b60 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c  P_CollSeq, 0, 0,
12b70 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c   0, (char *)pCol
12b80 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
12b90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
12ba0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
12bb0 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20  v, OP_Function, 
12bc0 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74  constMask, r1, t
12bd0 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20  arget,.         
12be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
12bf0 63 68 61 72 2a 29 70 44 65 66 2c 20 50 34 5f 46  char*)pDef, P4_F
12c00 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 73  UNCDEF);.      s
12c10 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
12c20 50 35 28 76 2c 20 6e 45 78 70 72 29 3b 0a 20 20  P5(v, nExpr);.  
12c30 20 20 20 20 69 66 28 20 6e 45 78 70 72 20 29 7b      if( nExpr ){
12c40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12c50 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
12c60 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 45 78  (pParse, r1, nEx
12c70 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
12c80 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
12c90 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
12ca0 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 45  e(pParse, r1, nE
12cb0 78 70 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61  xpr);.      brea
12cc0 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
12cd0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
12ce0 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
12cf0 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61  K_EXISTS:.    ca
12d00 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a  se TK_SELECT: {.
12d10 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
12d20 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20  >iColumn==0 ){. 
12d30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
12d40 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
12d50 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  se, pExpr);.    
12d60 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67 20    }.      inReg 
12d70 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
12d80 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
12d90 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
12da0 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _IN: {.      int
12db0 20 6a 31 2c 20 6a 32 2c 20 6a 33 2c 20 6a 34 2c   j1, j2, j3, j4,
12dc0 20 6a 35 3b 0a 20 20 20 20 20 20 63 68 61 72 20   j5;.      char 
12dd0 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20  affinity;.      
12de0 69 6e 74 20 65 54 79 70 65 3b 0a 0a 20 20 20 20  int eType;..    
12df0 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65    eType = sqlite
12e00 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61  3FindInIndex(pPa
12e10 72 73 65 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  rse, pExpr, 0);.
12e20 0a 20 20 20 20 20 20 2f 2a 20 46 69 67 75 72 65  .      /* Figure
12e30 20 6f 75 74 20 74 68 65 20 61 66 66 69 6e 69 74   out the affinit
12e40 79 20 74 6f 20 75 73 65 20 74 6f 20 63 72 65 61  y to use to crea
12e50 74 65 20 61 20 6b 65 79 20 66 72 6f 6d 20 74 68  te a key from th
12e60 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20  e results.      
12e70 2a 2a 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ** of the expres
12e80 73 69 6f 6e 2e 20 61 66 66 69 6e 69 74 79 53 74  sion. affinitySt
12e90 72 20 73 74 6f 72 65 73 20 61 20 73 74 61 74 69  r stores a stati
12ea0 63 20 73 74 72 69 6e 67 20 73 75 69 74 61 62 6c  c string suitabl
12eb0 65 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 50  e for.      ** P
12ec0 34 20 6f 66 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4 of OP_MakeReco
12ed0 72 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  rd..      */.   
12ee0 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 63 6f     affinity = co
12ef0 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79  mparisonAffinity
12f00 28 70 45 78 70 72 29 3b 0a 0a 20 20 20 20 20 20  (pExpr);..      
12f10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12f20 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
12f30 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 0a 20 20   1, target);..  
12f40 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
12f50 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78  <expr> from "<ex
12f60 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 20 54  pr> IN (...)". T
12f70 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
12f80 6c 65 0a 20 20 20 20 20 20 2a 2a 20 70 45 78 70  le.      ** pExp
12f90 72 2d 3e 69 54 61 62 6c 65 20 63 6f 6e 74 61 69  r->iTable contai
12fa0 6e 73 20 74 68 65 20 76 61 6c 75 65 73 20 74 68  ns the values th
12fb0 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 28  at make up the (
12fc0 2e 2e 2e 29 20 73 65 74 2e 0a 20 20 20 20 20 20  ...) set..      
12fd0 2a 2f 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  */.      r1 = sq
12fe0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
12ff0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
13000 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
13010 31 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d 20 73  1);.      j1 = s
13020 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
13030 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20  (v, OP_NotNull, 
13040 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
13050 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13060 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67  OP_Null, 0, targ
13070 65 74 29 3b 0a 20 20 20 20 20 20 6a 32 20 20 3d  et);.      j2  =
13080 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13090 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a  p0(v, OP_Goto);.
130a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
130b0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29  eJumpHere(v, j1)
130c0 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  ;.      if( eTyp
130d0 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49  e==IN_INDEX_ROWI
130e0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 33 20  D ){.        j3 
130f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
13100 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op1(v, OP_MustBe
13110 49 6e 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  Int, r1);.      
13120 20 20 6a 34 20 3d 20 73 71 6c 69 74 65 33 56 64    j4 = sqlite3Vd
13130 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
13140 6f 74 45 78 69 73 74 73 2c 20 70 45 78 70 72 2d  otExists, pExpr-
13150 3e 69 54 61 62 6c 65 2c 20 30 2c 20 72 31 29 3b  >iTable, 0, r1);
13160 0a 20 20 20 20 20 20 20 20 6a 35 20 3d 20 73 71  .        j5 = sq
13170 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
13180 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20  v, OP_Goto);.   
13190 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
131a0 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 33 29 3b  JumpHere(v, j3);
131b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
131c0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
131d0 6a 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  j4);.      }else
131e0 7b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 72  {.        r2 = r
131f0 65 67 46 72 65 65 32 20 3d 20 73 71 6c 69 74 65  egFree2 = sqlite
13200 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
13210 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
13220 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
13230 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
13240 20 72 31 2c 20 31 2c 20 72 32 2c 20 26 61 66 66   r1, 1, r2, &aff
13250 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20  inity, 1);.     
13260 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
13270 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
13280 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 31 29  e(pParse, r1, 1)
13290 3b 0a 20 20 20 20 20 20 20 20 6a 35 20 3d 20 73  ;.        j5 = s
132a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
132b0 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45  (v, OP_Found, pE
132c0 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 20  xpr->iTable, 0, 
132d0 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r2);.      }.   
132e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
132f0 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
13300 6d 2c 20 74 61 72 67 65 74 2c 20 2d 31 29 3b 0a  m, target, -1);.
13310 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13320 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 32 29  eJumpHere(v, j2)
13330 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
13340 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
13350 35 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  5);.      break;
13360 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
13370 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78    /*.    **    x
13380 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a   BETWEEN y AND z
13390 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
133a0 68 69 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e  his is equivalen
133b0 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t to.    **.    
133c0 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78  **    x>=y AND x
133d0 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  <=z.    **.    *
133e0 2a 20 58 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * X is stored in
133f0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20   pExpr->pLeft.. 
13400 20 20 20 2a 2a 20 59 20 69 73 20 73 74 6f 72 65     ** Y is store
13410 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73  d in pExpr->pLis
13420 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20  t->a[0].pExpr.. 
13430 20 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65     ** Z is store
13440 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73  d in pExpr->pLis
13450 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20  t->a[1].pExpr.. 
13460 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54     */.    case T
13470 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20  K_BETWEEN: {.   
13480 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
13490 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
134a0 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
134b0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 49 74 65  List_item *pLIte
134c0 6d 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  m = pExpr->pList
134d0 2d 3e 61 3b 0a 20 20 20 20 20 20 45 78 70 72 20  ->a;.      Expr 
134e0 2a 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d  *pRight = pLItem
134f0 2d 3e 70 45 78 70 72 3b 0a 0a 20 20 20 20 20 20  ->pExpr;..      
13500 63 6f 64 65 43 6f 6d 70 61 72 65 4f 70 65 72 61  codeCompareOpera
13510 6e 64 73 28 70 50 61 72 73 65 2c 20 70 4c 65 66  nds(pParse, pLef
13520 74 2c 20 26 72 31 2c 20 26 72 65 67 46 72 65 65  t, &r1, &regFree
13530 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
13540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13550 20 20 20 20 20 70 52 69 67 68 74 2c 20 26 72 32       pRight, &r2
13560 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
13570 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33      r3 = sqlite3
13580 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
13590 65 29 3b 0a 20 20 20 20 20 20 72 34 20 3d 20 73  e);.      r4 = s
135a0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
135b0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
135c0 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
135d0 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  se, pLeft, pRigh
135e0 74 2c 20 4f 50 5f 47 65 2c 0a 20 20 20 20 20 20  t, OP_Ge,.      
135f0 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
13600 72 32 2c 20 72 33 2c 20 53 51 4c 49 54 45 5f 53  r2, r3, SQLITE_S
13610 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20 70  TOREP2);.      p
13620 4c 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70  LItem++;.      p
13630 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e  Right = pLItem->
13640 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c  pExpr;.      sql
13650 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
13660 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
13670 65 65 32 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee2);.      r2 =
13680 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
13690 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 52 69  Temp(pParse, pRi
136a0 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
136b0 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
136c0 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  re(pParse, pLeft
136d0 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c  , pRight, OP_Le,
136e0 20 72 31 2c 20 72 32 2c 20 72 34 2c 20 53 51 4c   r1, r2, r4, SQL
136f0 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20  ITE_STOREP2);.  
13700 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13710 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 6e 64 2c  ddOp3(v, OP_And,
13720 20 72 33 2c 20 72 34 2c 20 74 61 72 67 65 74 29   r3, r4, target)
13730 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
13740 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
13750 61 72 73 65 2c 20 72 33 29 3b 0a 20 20 20 20 20  arse, r3);.     
13760 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
13770 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
13780 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  4);.      break;
13790 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
137a0 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20  TK_UPLUS: {.    
137b0 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
137c0 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
137d0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
137e0 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20  Left, target);. 
137f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13800 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
13810 20 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20   Form A:.    ** 
13820 20 20 43 41 53 45 20 78 20 57 48 45 4e 20 65 31    CASE x WHEN e1
13830 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32   THEN r1 WHEN e2
13840 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45   THEN r2 ... WHE
13850 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53  N eN THEN rN ELS
13860 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20  E y END.    **. 
13870 20 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20     ** Form B:.  
13880 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e    **   CASE WHEN
13890 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e   e1 THEN r1 WHEN
138a0 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20   e2 THEN r2 ... 
138b0 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20  WHEN eN THEN rN 
138c0 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a  ELSE y END.    *
138d0 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20  *.    ** Form A 
138e0 69 73 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66  is can be transf
138f0 6f 72 6d 65 64 20 69 6e 74 6f 20 74 68 65 20 65  ormed into the e
13900 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42  quivalent form B
13910 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   as follows:.   
13920 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20   **   CASE WHEN 
13930 78 3d 65 31 20 54 48 45 4e 20 72 31 20 57 48 45  x=e1 THEN r1 WHE
13940 4e 20 78 3d 65 32 20 54 48 45 4e 20 72 32 20 2e  N x=e2 THEN r2 .
13950 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ...    **       
13960 20 57 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20   WHEN x=eN THEN 
13970 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20  rN ELSE y END.  
13980 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69    **.    ** X (i
13990 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20  f it exists) is 
139a0 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e  in pExpr->pLeft.
139b0 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 69 6e 20  .    ** Y is in 
139c0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2e 20 20  pExpr->pRight.  
139d0 54 68 65 20 59 20 69 73 20 61 6c 73 6f 20 6f 70  The Y is also op
139e0 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74 68 65 72  tional.  If ther
139f0 65 20 69 73 20 6e 6f 0a 20 20 20 20 2a 2a 20 45  e is no.    ** E
13a00 4c 53 45 20 63 6c 61 75 73 65 20 61 6e 64 20 6e  LSE clause and n
13a10 6f 20 6f 74 68 65 72 20 74 65 72 6d 20 6d 61 74  o other term mat
13a20 63 68 65 73 2c 20 74 68 65 6e 20 74 68 65 20 72  ches, then the r
13a30 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 20  esult of the.   
13a40 20 2a 2a 20 65 78 70 72 73 73 69 6f 6e 20 69 73   ** exprssion is
13a50 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69   NULL..    ** Ei
13a60 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c   is in pExpr->pL
13a70 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20  ist->a[i*2] and 
13a80 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c 69  Ri is pExpr->pLi
13a90 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20  st->a[i*2+1]..  
13aa0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
13ab0 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65 78  result of the ex
13ac0 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20  pression is the 
13ad0 52 69 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  Ri for the first
13ae0 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20 20   matching Ei,.  
13af0 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72 65    ** or if there
13b00 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20   is no matching 
13b10 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65 72  Ei, the ELSE ter
13b20 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72 65  m Y, or if there
13b30 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c   is.    ** no EL
13b40 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20  SE term, NULL.. 
13b50 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54     */.    case T
13b60 4b 5f 43 41 53 45 3a 20 7b 0a 20 20 20 20 20 20  K_CASE: {.      
13b70 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20 20 20  int endLabel;   
13b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b90 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20    /* GOTO label 
13ba0 66 6f 72 20 65 6e 64 20 6f 66 20 43 41 53 45 20  for end of CASE 
13bb0 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  stmt */.      in
13bc0 74 20 6e 65 78 74 43 61 73 65 3b 20 20 20 20 20  t nextCase;     
13bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13be0 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f  /* GOTO label fo
13bf0 72 20 6e 65 78 74 20 57 48 45 4e 20 63 6c 61 75  r next WHEN clau
13c00 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  se */.      int 
13c10 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20  nExpr;          
13c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13c30 20 32 78 20 6e 75 6d 62 65 72 20 6f 66 20 57 48   2x number of WH
13c40 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  EN terms */.    
13c50 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
13c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c70 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
13c80 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ter */.      Exp
13c90 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20  rList *pEList;  
13ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13cb0 2a 20 4c 69 73 74 20 6f 66 20 57 48 45 4e 20 74  * List of WHEN t
13cc0 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 73 74  erms */.      st
13cd0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
13ce0 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 20 20  em *aListelem;  
13cf0 2f 2a 20 41 72 72 61 79 20 6f 66 20 57 48 45 4e  /* Array of WHEN
13d00 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20   terms */.      
13d10 45 78 70 72 20 6f 70 43 6f 6d 70 61 72 65 3b 20  Expr opCompare; 
13d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d30 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69 20 65    /* The X==Ei e
13d40 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
13d50 20 20 20 45 78 70 72 20 63 61 63 68 65 58 3b 20     Expr cacheX; 
13d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d70 20 20 20 20 20 2f 2a 20 43 61 63 68 65 64 20 65       /* Cached e
13d80 78 70 72 65 73 73 69 6f 6e 20 58 20 2a 2f 0a 20  xpression X */. 
13d90 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20       Expr *pX;  
13da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13db0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 20         /* The X 
13dc0 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
13dd0 20 20 20 20 45 78 70 72 20 2a 70 54 65 73 74 3b      Expr *pTest;
13de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13df0 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28        /* X==Ei (
13e00 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73 74 20  form A) or just 
13e10 45 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 0a  Ei (form B) */..
13e20 20 20 20 20 20 20 61 73 73 65 72 74 28 70 45 78        assert(pEx
13e30 70 72 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20  pr->pList);.    
13e40 20 20 61 73 73 65 72 74 28 28 70 45 78 70 72 2d    assert((pExpr-
13e50 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 25 20  >pList->nExpr % 
13e60 32 29 20 3d 3d 20 30 29 3b 0a 20 20 20 20 20 20  2) == 0);.      
13e70 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e 70 4c  assert(pExpr->pL
13e80 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b  ist->nExpr > 0);
13e90 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20  .      pEList = 
13ea0 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20  pExpr->pList;.  
13eb0 20 20 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20      aListelem = 
13ec0 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20  pEList->a;.     
13ed0 20 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d   nExpr = pEList-
13ee0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6e  >nExpr;.      en
13ef0 64 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33  dLabel = sqlite3
13f00 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
13f10 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 20  ;.      if( (pX 
13f20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21  = pExpr->pLeft)!
13f30 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61  =0 ){.        ca
13f40 63 68 65 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20  cheX = *pX;.    
13f50 20 20 20 20 63 61 63 68 65 58 2e 69 54 61 62 6c      cacheX.iTabl
13f60 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  e = sqlite3ExprC
13f70 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
13f80 70 58 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  pX, &regFree1);.
13f90 20 20 20 20 20 20 20 20 63 61 63 68 65 58 2e 6f          cacheX.o
13fa0 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b  p = TK_REGISTER;
13fb0 0a 20 20 20 20 20 20 20 20 63 61 63 68 65 58 2e  .        cacheX.
13fc0 69 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20 20  iColumn = 0;.   
13fd0 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f       opCompare.o
13fe0 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20  p = TK_EQ;.     
13ff0 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65     opCompare.pLe
14000 66 74 20 3d 20 26 63 61 63 68 65 58 3b 0a 20 20  ft = &cacheX;.  
14010 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 26 6f        pTest = &o
14020 70 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20 20  pCompare;.      
14030 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
14040 78 70 72 43 6f 6c 75 6d 6e 43 61 63 68 65 44 69  xprColumnCacheDi
14050 73 61 62 6c 65 28 70 50 61 72 73 65 2c 20 31 29  sable(pParse, 1)
14060 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
14070 20 69 3c 6e 45 78 70 72 3b 20 69 3d 69 2b 32 29   i<nExpr; i=i+2)
14080 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 58  {.        if( pX
14090 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 70   ){.          op
140a0 43 6f 6d 70 61 72 65 2e 70 52 69 67 68 74 20 3d  Compare.pRight =
140b0 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45   aListelem[i].pE
140c0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  xpr;.        }el
140d0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54  se{.          pT
140e0 65 73 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b  est = aListelem[
140f0 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
14100 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74    }.        next
14110 43 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Case = sqlite3Vd
14120 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
14130 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
14140 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
14150 65 2c 20 70 54 65 73 74 2c 20 6e 65 78 74 43 61  e, pTest, nextCa
14160 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  se, SQLITE_JUMPI
14170 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20  FNULL);.        
14180 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
14190 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65  pParse, aListele
141a0 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74 61  m[i+1].pExpr, ta
141b0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73  rget);.        s
141c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
141d0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
141e0 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20  endLabel);.     
141f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
14200 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e 65  solveLabel(v, ne
14210 78 74 43 61 73 65 29 3b 0a 20 20 20 20 20 20 7d  xtCase);.      }
14220 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
14230 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ->pRight ){.    
14240 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
14250 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
14260 72 2d 3e 70 52 69 67 68 74 2c 20 74 61 72 67 65  r->pRight, targe
14270 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
14280 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14290 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
142a0 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74  _Null, 0, target
142b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
142c0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
142d0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4c  lveLabel(v, endL
142e0 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  abel);.      sql
142f0 69 74 65 33 45 78 70 72 43 6f 6c 75 6d 6e 43 61  ite3ExprColumnCa
14300 63 68 65 44 69 73 61 62 6c 65 28 70 50 61 72 73  cheDisable(pPars
14310 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 62 72  e, -1);.      br
14320 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
14330 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
14340 52 49 47 47 45 52 0a 20 20 20 20 63 61 73 65 20  RIGGER.    case 
14350 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20  TK_RAISE: {.    
14360 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 74    if( !pParse->t
14370 72 69 67 53 74 61 63 6b 20 29 7b 0a 20 20 20 20  rigStack ){.    
14380 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
14390 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
143a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143b0 20 20 20 22 52 41 49 53 45 28 29 20 6d 61 79 20     "RAISE() may 
143c0 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 74  only be used wit
143d0 68 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72  hin a trigger-pr
143e0 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 20  ogram");.       
143f0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
14400 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   }.      if( pEx
14410 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 4f 45 5f  pr->iColumn!=OE_
14420 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20  Ignore ){.      
14430 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
14440 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 4f 45 5f 52 6f  ->iColumn==OE_Ro
14450 6c 6c 62 61 63 6b 20 7c 7c 0a 20 20 20 20 20 20  llback ||.      
14460 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
14470 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f  ->iColumn == OE_
14480 41 62 6f 72 74 20 7c 7c 0a 20 20 20 20 20 20 20  Abort ||.       
14490 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
144a0 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 46  >iColumn == OE_F
144b0 61 69 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ail );.         
144c0 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 45 78  sqlite3DequoteEx
144d0 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  pr(pParse->db, p
144e0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
144f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14500 34 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51  4(v, OP_Halt, SQ
14510 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c  LITE_CONSTRAINT,
14520 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c   pExpr->iColumn,
14530 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
14540 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
14550 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  r*)pExpr->token.
14560 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  z, pExpr->token.
14570 6e 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  n);.      } else
14580 20 7b 0a 20 20 20 20 20 20 20 20 20 61 73 73 65   {.         asse
14590 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  rt( pExpr->iColu
145a0 6d 6e 20 3d 3d 20 4f 45 5f 49 67 6e 6f 72 65 20  mn == OE_Ignore 
145b0 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  );.         sqli
145c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
145d0 20 4f 50 5f 43 6f 6e 74 65 78 74 50 6f 70 2c 20   OP_ContextPop, 
145e0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  0, 0);.         
145f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14600 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
14610 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61   pParse->trigSta
14620 63 6b 2d 3e 69 67 6e 6f 72 65 4a 75 6d 70 29 3b  ck->ignoreJump);
14630 0a 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  .         VdbeCo
14640 6d 6d 65 6e 74 28 28 76 2c 20 22 72 61 69 73 65  mment((v, "raise
14650 28 49 47 4e 4f 52 45 29 22 29 29 3b 0a 20 20 20  (IGNORE)"));.   
14660 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
14670 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
14680 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
14690 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
146a0 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20  e, regFree1);.  
146b0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
146c0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
146d0 67 46 72 65 65 32 29 3b 0a 20 20 72 65 74 75 72  gFree2);.  retur
146e0 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  n inReg;.}../*.*
146f0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
14700 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 65  to evaluate an e
14710 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 74  xpression and st
14720 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ore the results.
14730 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74  ** into a regist
14740 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  er.  Return the 
14750 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20  register number 
14760 77 68 65 72 65 20 74 68 65 20 72 65 73 75 6c 74  where the result
14770 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 2e  s.** are stored.
14780 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
14790 67 69 73 74 65 72 20 69 73 20 61 20 74 65 6d 70  gister is a temp
147a0 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 74  orary register t
147b0 68 61 74 20 63 61 6e 20 62 65 20 64 65 61 6c 6c  hat can be deall
147c0 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20  ocated,.** then 
147d0 77 72 69 74 65 20 69 74 73 20 6e 75 6d 62 65 72  write its number
147e0 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20 20 49 66   into *pReg.  If
147f0 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 67 69   the result regi
14800 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 61  ster is not.** a
14810 20 74 65 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e   temporary, then
14820 20 73 65 74 20 2a 70 52 65 67 20 74 6f 20 7a 65   set *pReg to ze
14830 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ro..*/.int sqlit
14840 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 50  e3ExprCodeTemp(P
14850 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
14860 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a  pr *pExpr, int *
14870 70 52 65 67 29 7b 0a 20 20 69 6e 74 20 72 31 20  pReg){.  int r1 
14880 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
14890 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69  Reg(pParse);.  i
148a0 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45  nt r2 = sqlite3E
148b0 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
148c0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31 29  arse, pExpr, r1)
148d0 3b 0a 20 20 69 66 28 20 72 32 3d 3d 72 31 20 29  ;.  if( r2==r1 )
148e0 7b 0a 20 20 20 20 2a 70 52 65 67 20 3d 20 72 31  {.    *pReg = r1
148f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
14900 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
14910 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
14920 3b 0a 20 20 20 20 2a 70 52 65 67 20 3d 20 30 3b  ;.    *pReg = 0;
14930 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 32  .  }.  return r2
14940 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
14950 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
14960 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70 72  ll evaluate expr
14970 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64  ession pExpr and
14980 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65   store the.** re
14990 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65  sults in registe
149a0 72 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72  r target.  The r
149b0 65 73 75 6c 74 73 20 61 72 65 20 67 75 61 72 61  esults are guara
149c0 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a  nteed to appear.
149d0 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ** in register t
149e0 61 72 67 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  arget..*/.int sq
149f0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 50 61  lite3ExprCode(Pa
14a00 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
14a10 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61  r *pExpr, int ta
14a20 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e 52  rget){.  int inR
14a30 65 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74  eg;..  assert( t
14a40 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65  arget>0 && targe
14a50 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  t<=pParse->nMem 
14a60 29 3b 0a 20 20 69 6e 52 65 67 20 3d 20 73 71 6c  );.  inReg = sql
14a70 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
14a80 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
14a90 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 61 73 73  , target);.  ass
14aa0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64  ert( pParse->pVd
14ab0 62 65 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  be || pParse->db
14ac0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
14ad0 3b 0a 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74  ;.  if( inReg!=t
14ae0 61 72 67 65 74 20 26 26 20 70 50 61 72 73 65 2d  arget && pParse-
14af0 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 73 71  >pVdbe ){.    sq
14b00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14b10 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
14b20 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20  P_SCopy, inReg, 
14b30 74 61 72 67 65 74 29 3b 0a 20 20 7d 0a 20 20 72  target);.  }.  r
14b40 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 7d 0a  eturn target;.}.
14b50 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
14b60 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 74  code that evalut
14b70 65 73 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  es the given exp
14b80 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 75 74 73  ression and puts
14b90 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69   the result.** i
14ba0 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
14bb0 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61  t..**.** Also ma
14bc0 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
14bd0 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 73 75   expression resu
14be0 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72  lts into another
14bf0 20 22 63 61 63 68 65 22 20 72 65 67 69 73 74 65   "cache" registe
14c00 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20  r.** and modify 
14c10 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73  the expression s
14c20 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20  o that the next 
14c30 74 69 6d 65 20 69 74 20 69 73 20 65 76 61 6c 75  time it is evalu
14c40 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73  ated,.** the res
14c50 75 6c 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ult is a copy of
14c60 20 74 68 65 20 63 61 63 68 65 20 72 65 67 69 73   the cache regis
14c70 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ter..**.** This 
14c80 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
14c90 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20  for expressions 
14ca0 74 68 61 74 20 61 72 65 20 75 73 65 64 20 6d 75  that are used mu
14cb0 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73  ltiple .** times
14cc0 2e 20 20 54 68 65 79 20 61 72 65 20 65 76 61 6c  .  They are eval
14cd0 75 61 74 65 64 20 6f 6e 63 65 20 61 6e 64 20 74  uated once and t
14ce0 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
14cf0 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  e expression.** 
14d00 61 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 69  are reused..*/.i
14d10 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
14d20 64 65 41 6e 64 43 61 63 68 65 28 50 61 72 73 65  deAndCache(Parse
14d30 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
14d40 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65  pExpr, int targe
14d50 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  t){.  Vdbe *v = 
14d60 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
14d70 20 69 6e 74 20 69 6e 52 65 67 3b 0a 20 20 69 6e   int inReg;.  in
14d80 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
14d90 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
14da0 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
14db0 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30  assert( target>0
14dc0 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d   );.  if( pExpr-
14dd0 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op!=TK_REGISTER
14de0 20 29 7b 20 20 0a 20 20 20 20 69 6e 74 20 69 4d   ){  .    int iM
14df0 65 6d 3b 0a 20 20 20 20 69 4d 65 6d 20 3d 20 2b  em;.    iMem = +
14e00 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
14e10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14e20 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
14e30 20 69 6e 52 65 67 2c 20 69 4d 65 6d 29 3b 0a 20   inReg, iMem);. 
14e40 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
14e50 20 3d 20 69 4d 65 6d 3b 0a 20 20 20 20 70 45 78   = iMem;.    pEx
14e60 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45  pr->iColumn = pE
14e70 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 70 45 78  xpr->op;.    pEx
14e80 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49  pr->op = TK_REGI
14e90 53 54 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  STER;.  }.  retu
14ea0 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a  rn inReg;.}../*.
14eb0 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61  ** If pExpr is a
14ec0 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73   constant expres
14ed0 73 69 6f 6e 2c 20 74 68 65 6e 20 65 76 61 6c 75  sion, then evalu
14ee0 61 74 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ate the expressi
14ef0 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67  on.** into a reg
14f00 69 73 74 65 72 20 61 6e 64 20 63 6f 6e 76 65 72  ister and conver
14f10 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
14f20 20 69 6e 74 6f 20 61 20 54 4b 5f 52 45 47 49 53   into a TK_REGIS
14f30 54 45 52 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  TER.** expressio
14f40 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
14f50 20 65 76 61 6c 43 6f 6e 73 74 45 78 70 72 28 76   evalConstExpr(v
14f60 6f 69 64 20 2a 70 41 72 67 2c 20 45 78 70 72 20  oid *pArg, Expr 
14f70 2a 70 45 78 70 72 29 7b 0a 20 20 50 61 72 73 65  *pExpr){.  Parse
14f80 20 2a 70 50 61 72 73 65 20 3d 20 28 50 61 72 73   *pParse = (Pars
14f90 65 2a 29 70 41 72 67 3b 0a 20 20 69 66 28 20 70  e*)pArg;.  if( p
14fa0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47  Expr->op==TK_REG
14fb0 49 53 54 45 52 20 29 7b 0a 20 20 20 20 72 65 74  ISTER ){.    ret
14fc0 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
14fd0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
14fe0 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45  nstantNotJoin(pE
14ff0 78 70 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  xpr) ){.    int 
15000 72 31 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  r1 = ++pParse->n
15010 4d 65 6d 3b 0a 20 20 20 20 69 6e 74 20 72 32 3b  Mem;.    int r2;
15020 0a 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65  .    r2 = sqlite
15030 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
15040 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72  pParse, pExpr, r
15050 31 29 3b 0a 20 20 20 20 69 66 28 20 72 31 21 3d  1);.    if( r1!=
15060 72 32 20 29 20 70 50 61 72 73 65 2d 3e 6e 4d 65  r2 ) pParse->nMe
15070 6d 2d 2d 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  m--;.    pExpr->
15080 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d  iColumn = pExpr-
15090 3e 6f 70 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  >op;.    pExpr->
150a0 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52  op = TK_REGISTER
150b0 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61  ;.    pExpr->iTa
150c0 62 6c 65 20 3d 20 72 32 3b 0a 20 20 20 20 72 65  ble = r2;.    re
150d0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
150e0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
150f0 20 50 72 65 65 76 61 6c 75 61 74 65 20 63 6f 6e   Preevaluate con
15100 73 74 61 6e 74 20 73 75 62 65 78 70 72 65 73 73  stant subexpress
15110 69 6f 6e 73 20 77 69 74 68 69 6e 20 70 45 78 70  ions within pExp
15120 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a  r and store the.
15130 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65  ** results in re
15140 67 69 73 74 65 72 73 2e 20 20 4d 6f 64 69 66 79  gisters.  Modify
15150 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 74   pExpr so that t
15160 68 65 20 63 6f 6e 73 74 61 6e 74 20 73 75 62 65  he constant sube
15170 78 70 72 65 73 69 6f 6e 73 0a 2a 2a 20 61 72 65  xpresions.** are
15180 20 54 4b 5f 52 45 47 49 53 54 45 52 20 6f 70 63   TK_REGISTER opc
15190 6f 64 65 73 20 74 68 61 74 20 72 65 66 65 72 20  odes that refer 
151a0 74 6f 20 74 68 65 20 70 72 65 63 6f 6d 70 75 74  to the precomput
151b0 65 64 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 76 6f  ed values..*/.vo
151c0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
151d0 64 65 43 6f 6e 73 74 61 6e 74 73 28 50 61 72 73  deConstants(Pars
151e0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
151f0 2a 70 45 78 70 72 29 7b 0a 20 20 20 77 61 6c 6b  *pExpr){.   walk
15200 45 78 70 72 54 72 65 65 28 70 45 78 70 72 2c 20  ExprTree(pExpr, 
15210 65 76 61 6c 43 6f 6e 73 74 45 78 70 72 2c 20 70  evalConstExpr, p
15220 50 61 72 73 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  Parse);.}.../*.*
15230 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
15240 74 68 61 74 20 70 75 73 68 65 73 20 74 68 65 20  that pushes the 
15250 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65  value of every e
15260 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69  lement of the gi
15270 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
15280 6e 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 73 65  n list into a se
15290 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74  quence of regist
152a0 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ers beginning at
152b0 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52   target..**.** R
152c0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
152d0 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65 76 61   of elements eva
152e0 6c 75 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  luated..*/.int s
152f0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
15300 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  prList(.  Parse 
15310 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20  *pParse,     /* 
15320 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
15330 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
15340 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68 65 20 65  List,   /* The e
15350 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74  xpression list t
15360 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
15370 69 6e 74 20 74 61 72 67 65 74 20 20 20 20 20 20  int target      
15380 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77     /* Where to w
15390 72 69 74 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a  rite results */.
153a0 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  ){.  struct Expr
153b0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
153c0 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20  ;.  int i, n;.  
153d0 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
153e0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
153f0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
15400 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
15410 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
15420 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 74 61    }.  assert( ta
15430 72 67 65 74 3e 30 20 29 3b 0a 20 20 6e 20 3d 20  rget>0 );.  n = 
15440 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
15450 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
15460 3e 61 2c 20 69 3d 6e 3b 20 69 3e 30 3b 20 69 2d  >a, i=n; i>0; i-
15470 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
15480 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
15490 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
154a0 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
154b0 20 20 20 20 74 61 72 67 65 74 2b 2b 3b 0a 20 20      target++;.  
154c0 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  }.  return n;.}.
154d0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
154e0 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65  code for a boole
154f0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75  an expression su
15500 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69  ch that a jump i
15510 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65  s made.** to the
15520 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66   label "dest" if
15530 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
15540 69 73 20 74 72 75 65 20 62 75 74 20 65 78 65 63  is true but exec
15550 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75  ution.** continu
15560 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75  es straight thru
15570 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
15580 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a  on is false..**.
15590 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
155a0 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74  sion evaluates t
155b0 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20  o NULL (neither 
155c0 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c  true nor false),
155d0 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68   then.** take th
155e0 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75  e jump if the ju
155f0 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73  mpIfNull flag is
15600 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
15610 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  LL..**.** This c
15620 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  ode depends on t
15630 68 65 20 66 61 63 74 20 74 68 61 74 20 63 65 72  he fact that cer
15640 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65  tain token value
15650 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a  s (ex: TK_EQ).**
15660 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73   are the same as
15670 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20 28   opcode values (
15680 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74 20  ex: OP_Eq) that 
15690 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f  implement the co
156a0 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f  rresponding.** o
156b0 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63 69  peration.  Speci
156c0 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76  al comments in v
156d0 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b  dbe.c and the mk
156e0 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69  opcodeh.awk scri
156f0 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b  pt in.** the mak
15700 65 20 70 72 6f 63 65 73 73 20 63 61 75 73 65 20  e process cause 
15710 74 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f 20  these values to 
15720 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28 29  align.  Assert()
15730 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a  s in the code.**
15740 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74 68   below verify th
15750 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20 61  at the numbers a
15760 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72 65  re aligned corre
15770 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ctly..*/.void sq
15780 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
15790 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
157a0 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
157b0 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66  dest, int jumpIf
157c0 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76  Null){.  Vdbe *v
157d0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
157e0 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a  ;.  int op = 0;.
157f0 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d    int regFree1 =
15800 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65   0;.  int regFre
15810 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31  e2 = 0;.  int r1
15820 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28  , r2;..  assert(
15830 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c   jumpIfNull==SQL
15840 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c  ITE_JUMPIFNULL |
15850 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  | jumpIfNull==0 
15860 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c  );.  if( v==0 ||
15870 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
15880 72 6e 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70 72  rn;.  op = pExpr
15890 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20  ->op;.  switch( 
158a0 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
158b0 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69  K_AND: {.      i
158c0 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56  nt d2 = sqlite3V
158d0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
158e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
158f0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
15900 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
15910 64 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51  d2,jumpIfNull^SQ
15920 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
15930 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
15940 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b  disableColCache+
15950 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  +;.      sqlite3
15960 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
15970 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
15980 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
15990 6c 6c 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  ll);.      pPars
159a0 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63  e->disableColCac
159b0 68 65 2d 2d 3b 0a 20 20 20 20 20 20 73 71 6c 69  he--;.      sqli
159c0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
159d0 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20  bel(v, d2);.    
159e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
159f0 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b     case TK_OR: {
15a00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
15a10 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
15a20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
15a30 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
15a40 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
15a50 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b  disableColCache+
15a60 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  +;.      sqlite3
15a70 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
15a80 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
15a90 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
15aa0 6c 6c 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  ll);.      pPars
15ab0 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63  e->disableColCac
15ac0 68 65 2d 2d 3b 0a 20 20 20 20 20 20 62 72 65 61  he--;.      brea
15ad0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
15ae0 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
15af0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
15b00 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
15b10 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
15b20 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
15b30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
15b40 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
15b50 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
15b60 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
15b70 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
15b80 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
15b90 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
15ba0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
15bb0 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b   TK_LT==OP_Lt );
15bc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
15bd0 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20  K_LE==OP_Le );. 
15be0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
15bf0 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20  GT==OP_Gt );.   
15c00 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45     assert( TK_GE
15c10 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20 20  ==OP_Ge );.     
15c20 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d   assert( TK_EQ==
15c30 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 61  OP_Eq );.      a
15c40 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50  ssert( TK_NE==OP
15c50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 63 6f 64  _Ne );.      cod
15c60 65 43 6f 6d 70 61 72 65 4f 70 65 72 61 6e 64 73  eCompareOperands
15c70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
15c80 70 4c 65 66 74 2c 20 26 72 31 2c 20 26 72 65 67  pLeft, &r1, &reg
15c90 46 72 65 65 31 2c 0a 20 20 20 20 20 20 20 20 20  Free1,.         
15ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15cb0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
15cc0 70 52 69 67 68 74 2c 20 26 72 32 2c 20 26 72 65  pRight, &r2, &re
15cd0 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63  gFree2);.      c
15ce0 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
15cf0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
15d00 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
15d10 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  op,.            
15d20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65        r1, r2, de
15d30 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
15d40 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
15d50 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
15d60 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
15d70 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
15d80 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
15d90 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c  ISNULL==OP_IsNul
15da0 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  l );.      asser
15db0 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f  t( TK_NOTNULL==O
15dc0 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20  P_NotNull );.   
15dd0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
15de0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
15df0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
15e00 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
15e10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15e20 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c  ddOp2(v, op, r1,
15e30 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72   dest);.      br
15e40 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
15e50 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
15e60 7b 0a 20 20 20 20 20 20 2f 2a 20 20 20 20 78 20  {.      /*    x 
15e70 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a  BETWEEN y AND z.
15e80 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
15e90 2a 20 49 73 20 65 71 75 69 76 61 6c 65 6e 74 20  * Is equivalent 
15ea0 74 6f 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  to .      **.   
15eb0 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e     **    x>=y AN
15ec0 44 20 78 3c 3d 7a 0a 20 20 20 20 20 20 2a 2a 0a  D x<=z.      **.
15ed0 20 20 20 20 20 20 2a 2a 20 43 6f 64 65 20 69 74        ** Code it
15ee0 20 61 73 20 73 75 63 68 2c 20 74 61 6b 69 6e 67   as such, taking
15ef0 20 63 61 72 65 20 74 6f 20 64 6f 20 74 68 65 20   care to do the 
15f00 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65 73  common subexpres
15f10 73 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 65 6c  sion.      ** el
15f20 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 78 2e  ementation of x.
15f30 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
15f40 45 78 70 72 20 65 78 70 72 41 6e 64 3b 0a 20 20  Expr exprAnd;.  
15f50 20 20 20 20 45 78 70 72 20 63 6f 6d 70 4c 65 66      Expr compLef
15f60 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 63 6f  t;.      Expr co
15f70 6d 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 45  mpRight;.      E
15f80 78 70 72 20 65 78 70 72 58 3b 0a 0a 20 20 20 20  xpr exprX;..    
15f90 20 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70 72    exprX = *pExpr
15fa0 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 65  ->pLeft;.      e
15fb0 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41  xprAnd.op = TK_A
15fc0 4e 44 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e  ND;.      exprAn
15fd0 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c  d.pLeft = &compL
15fe0 65 66 74 3b 0a 20 20 20 20 20 20 65 78 70 72 41  eft;.      exprA
15ff0 6e 64 2e 70 52 69 67 68 74 20 3d 20 26 63 6f 6d  nd.pRight = &com
16000 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 63 6f  pRight;.      co
16010 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47  mpLeft.op = TK_G
16020 45 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65 66  E;.      compLef
16030 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58  t.pLeft = &exprX
16040 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65 66 74  ;.      compLeft
16050 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d  .pRight = pExpr-
16060 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  >pList->a[0].pEx
16070 70 72 3b 0a 20 20 20 20 20 20 63 6f 6d 70 52 69  pr;.      compRi
16080 67 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a  ght.op = TK_LE;.
16090 20 20 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e        compRight.
160a0 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a  pLeft = &exprX;.
160b0 20 20 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e        compRight.
160c0 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
160d0 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
160e0 72 3b 0a 20 20 20 20 20 20 65 78 70 72 58 2e 69  r;.      exprX.i
160f0 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 45  Table = sqlite3E
16100 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
16110 73 65 2c 20 26 65 78 70 72 58 2c 20 26 72 65 67  se, &exprX, &reg
16120 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 65 78  Free1);.      ex
16130 70 72 58 2e 6f 70 20 3d 20 54 4b 5f 52 45 47 49  prX.op = TK_REGI
16140 53 54 45 52 3b 0a 20 20 20 20 20 20 73 71 6c 69  STER;.      sqli
16150 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
16160 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20  arse, &exprAnd, 
16170 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
16180 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
16190 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
161a0 74 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20  t: {.      r1 = 
161b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
161c0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
161d0 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  r, &regFree1);. 
161e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
161f0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 2c  AddOp3(v, OP_If,
16200 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49   r1, dest, jumpI
16210 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20  fNull!=0);.     
16220 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
16230 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
16240 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
16250 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73  , regFree1);.  s
16260 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
16270 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
16280 46 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a  Free2);  .}../*.
16290 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
162a0 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65   for a boolean e
162b0 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74  xpression such t
162c0 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  hat a jump is ma
162d0 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62  de.** to the lab
162e0 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65  el "dest" if the
162f0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
16300 61 6c 73 65 20 62 75 74 20 65 78 65 63 75 74 69  alse but executi
16310 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20  on.** continues 
16320 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66  straight thru if
16330 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
16340 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49  is true..**.** I
16350 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
16360 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
16370 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65  LL (neither true
16380 20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e   nor false) then
16390 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70  .** jump if jump
163a0 49 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54 45  IfNull is SQLITE
163b0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66  _JUMPIFNULL or f
163c0 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a  all through if j
163d0 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20  umpIfNull.** is 
163e0 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  0..*/.void sqlit
163f0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 50 61  e3ExprIfFalse(Pa
16400 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
16410 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65  r *pExpr, int de
16420 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  st, int jumpIfNu
16430 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ll){.  Vdbe *v =
16440 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
16450 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20    int op = 0;.  
16460 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
16470 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32  ;.  int regFree2
16480 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20   = 0;.  int r1, 
16490 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a  r2;..  assert( j
164a0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
164b0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20  E_JUMPIFNULL || 
164c0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
164d0 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70  .  if( v==0 || p
164e0 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
164f0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75  ;..  /* The valu
16500 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61  e of pExpr->op a
16510 6e 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65  nd op are relate
16520 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  d as follows:.  
16530 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45  **.  **       pE
16540 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20  xpr->op         
16550 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20     op.  **      
16560 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20   ---------      
16570 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20      ----------. 
16580 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e   **       TK_ISN
16590 55 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f  ULL          OP_
165a0 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20  NotNull.  **    
165b0 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20     TK_NOTNULL   
165c0 20 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a        OP_IsNull.
165d0 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45    **       TK_NE
165e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
165f0 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Eq.  **       T
16600 4b 5f 45 51 20 20 20 20 20 20 20 20 20 20 20 20  K_EQ            
16610 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20    OP_Ne.  **    
16620 20 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20     TK_GT        
16630 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a        OP_Le.  **
16640 20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20         TK_LE    
16650 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a            OP_Gt.
16660 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45    **       TK_GE
16670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
16680 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Lt.  **       T
16690 4b 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20 20  K_LT            
166a0 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a    OP_Ge.  **.  *
166b0 2a 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75  * For other valu
166c0 65 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c  es of pExpr->op,
166d0 20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64   op is undefined
166e0 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a   and unused..  *
166f0 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54  * The value of T
16700 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74  K_ and OP_ const
16710 61 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67 65  ants are arrange
16720 64 20 73 75 63 68 20 74 68 61 74 20 77 65 0a 20  d such that we. 
16730 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20   ** can compute 
16740 74 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76  the mapping abov
16750 65 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c  e using the foll
16760 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e  owing expression
16770 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73  ..  ** Assert()s
16780 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
16790 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20   computation is 
167a0 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20  correct..  */.  
167b0 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70  op = ((pExpr->op
167c0 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e  +(TK_ISNULL&1))^
167d0 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29  1)-(TK_ISNULL&1)
167e0 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63  ;..  /* Verify c
167f0 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74  orrect alignment
16800 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20   of TK_ and OP_ 
16810 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20  constants.  */. 
16820 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
16830 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c  op!=TK_ISNULL ||
16840 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20   op==OP_NotNull 
16850 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
16860 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55  pr->op!=TK_NOTNU
16870 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e  LL || op==OP_IsN
16880 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ull );.  assert(
16890 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e   pExpr->op!=TK_N
168a0 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29  E || op==OP_Eq )
168b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
168c0 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20  r->op!=TK_EQ || 
168d0 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61  op==OP_Ne );.  a
168e0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
168f0 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_LT || op==O
16900 50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Ge );.  assert
16910 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
16920 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20  LE || op==OP_Gt 
16930 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
16940 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c  pr->op!=TK_GT ||
16950 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20   op==OP_Le );.  
16960 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
16970 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_GE || op==
16980 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74  OP_Lt );..  swit
16990 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
169a0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
169b0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
169c0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
169d0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
169e0 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
169f0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 70 50 61 72  ull);.      pPar
16a00 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61  se->disableColCa
16a10 63 68 65 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  che++;.      sql
16a20 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
16a30 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
16a40 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
16a50 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
16a60 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43  pParse->disableC
16a70 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20 20 20 20 20  olCache--;.     
16a80 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
16a90 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a    case TK_OR: {.
16aa0 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73        int d2 = s
16ab0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
16ac0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71  bel(v);.      sq
16ad0 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
16ae0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
16af0 4c 65 66 74 2c 20 64 32 2c 20 6a 75 6d 70 49 66  Left, d2, jumpIf
16b00 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50  Null^SQLITE_JUMP
16b10 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 70  IFNULL);.      p
16b20 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f  Parse->disableCo
16b30 6c 43 61 63 68 65 2b 2b 3b 0a 20 20 20 20 20 20  lCache++;.      
16b40 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
16b50 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
16b60 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
16b70 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
16b80 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62     pParse->disab
16b90 6c 65 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20 20  leColCache--;.  
16ba0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
16bb0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
16bc0 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  2);.      break;
16bd0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
16be0 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_NOT: {.      
16bf0 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
16c00 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
16c10 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
16c20 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
16c30 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
16c40 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
16c50 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
16c60 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
16c70 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
16c80 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
16c90 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a    case TK_EQ: {.
16ca0 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
16cb0 65 4f 70 65 72 61 6e 64 73 28 70 50 61 72 73 65  eOperands(pParse
16cc0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
16cd0 26 72 31 2c 20 26 72 65 67 46 72 65 65 31 2c 0a  &r1, &regFree1,.
16ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d00 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c    pExpr->pRight,
16d10 20 26 72 32 2c 20 26 72 65 67 46 72 65 65 32 29   &r2, &regFree2)
16d20 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
16d30 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
16d40 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
16d50 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
16d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
16d70 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d  1, r2, dest, jum
16d80 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
16d90 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
16da0 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
16db0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
16dc0 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 72 31  NULL: {.      r1
16dd0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
16de0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
16df0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
16e00 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73  gFree1);.      s
16e10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16e20 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74  (v, op, r1, dest
16e30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
16e40 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
16e50 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20  K_BETWEEN: {.   
16e60 20 20 20 2f 2a 20 20 20 20 78 20 42 45 54 57 45     /*    x BETWE
16e70 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 20  EN y AND z.     
16e80 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 73 20   **.      ** Is 
16e90 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20  equivalent to . 
16ea0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
16eb0 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d      x>=y AND x<=
16ec0 7a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  z.      **.     
16ed0 20 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20 73   ** Code it as s
16ee0 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72 65  uch, taking care
16ef0 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f   to do the commo
16f00 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a  n subexpression.
16f10 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74        ** element
16f20 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 20 20 20 20  ation of x..    
16f30 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20    */.      Expr 
16f40 65 78 70 72 41 6e 64 3b 0a 20 20 20 20 20 20 45  exprAnd;.      E
16f50 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b 0a 20 20  xpr compLeft;.  
16f60 20 20 20 20 45 78 70 72 20 63 6f 6d 70 52 69 67      Expr compRig
16f70 68 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 65  ht;.      Expr e
16f80 78 70 72 58 3b 0a 0a 20 20 20 20 20 20 65 78 70  xprX;..      exp
16f90 72 58 20 3d 20 2a 70 45 78 70 72 2d 3e 70 4c 65  rX = *pExpr->pLe
16fa0 66 74 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e  ft;.      exprAn
16fb0 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20  d.op = TK_AND;. 
16fc0 20 20 20 20 20 65 78 70 72 41 6e 64 2e 70 4c 65       exprAnd.pLe
16fd0 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a  ft = &compLeft;.
16fe0 20 20 20 20 20 20 65 78 70 72 41 6e 64 2e 70 52        exprAnd.pR
16ff0 69 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67 68  ight = &compRigh
17000 74 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65 66  t;.      compLef
17010 74 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20  t.op = TK_GE;.  
17020 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65      compLeft.pLe
17030 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 20  ft = &exprX;.   
17040 20 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67     compLeft.pRig
17050 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  ht = pExpr->pLis
17060 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
17070 20 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f       compRight.o
17080 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 20 20 20  p = TK_LE;.     
17090 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66 74   compRight.pLeft
170a0 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 20 20 20   = &exprX;.     
170b0 20 63 6f 6d 70 52 69 67 68 74 2e 70 52 69 67 68   compRight.pRigh
170c0 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
170d0 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
170e0 20 20 20 20 65 78 70 72 58 2e 69 54 61 62 6c 65      exprX.iTable
170f0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
17100 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26  deTemp(pParse, &
17110 65 78 70 72 58 2c 20 26 72 65 67 46 72 65 65 31  exprX, &regFree1
17120 29 3b 0a 20 20 20 20 20 20 65 78 70 72 58 2e 6f  );.      exprX.o
17130 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b  p = TK_REGISTER;
17140 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
17150 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
17160 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74  , &exprAnd, dest
17170 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
17180 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17190 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
171a0 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
171b0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
171c0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26  pParse, pExpr, &
171d0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
171e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
171f0 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p3(v, OP_IfNot, 
17200 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  r1, dest, jumpIf
17210 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20  Null!=0);.      
17220 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
17230 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
17240 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
17250 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71   regFree1);.  sq
17260 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
17270 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
17280 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ree2);.}../*.** 
17290 44 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61 72  Do a deep compar
172a0 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70 72  ison of two expr
172b0 65 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20 52  ession trees.  R
172c0 65 74 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d  eturn TRUE (non-
172d0 7a 65 72 6f 29 0a 2a 2a 20 69 66 20 74 68 65 79  zero).** if they
172e0 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 20 61   are identical a
172f0 6e 64 20 72 65 74 75 72 6e 20 46 41 4c 53 45 20  nd return FALSE 
17300 69 66 20 74 68 65 79 20 64 69 66 66 65 72 20 69  if they differ i
17310 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a  n any way..**.**
17320 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 69 73 20   Sometimes this 
17330 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
17340 75 72 6e 20 46 41 4c 53 45 20 65 76 65 6e 20 69  urn FALSE even i
17350 66 20 74 68 65 20 74 77 6f 20 65 78 70 72 65 73  f the two expres
17360 73 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20  sions.** really 
17370 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20  are equivalent. 
17380 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 70 72   If we cannot pr
17390 6f 76 65 20 74 68 61 74 20 74 68 65 20 65 78 70  ove that the exp
173a0 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20  ressions are.** 
173b0 69 64 65 6e 74 69 63 61 6c 2c 20 77 65 20 72 65  identical, we re
173c0 74 75 72 6e 20 46 41 4c 53 45 20 6a 75 73 74 20  turn FALSE just 
173d0 74 6f 20 62 65 20 73 61 66 65 2e 20 20 53 6f 20  to be safe.  So 
173e0 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  if this routine.
173f0 2a 2a 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  ** returns false
17400 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f  , then you do no
17410 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f  t really know fo
17420 72 20 63 65 72 74 61 69 6e 20 69 66 20 74 68 65  r certain if the
17430 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69   two.** expressi
17440 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  ons are the same
17450 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20 67 65  .  But if you ge
17460 74 20 61 20 54 52 55 45 20 72 65 74 75 72 6e 2c  t a TRUE return,
17470 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e   then you.** can
17480 20 62 65 20 73 75 72 65 20 74 68 65 20 65 78 70   be sure the exp
17490 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65  ressions are the
174a0 20 73 61 6d 65 2e 20 20 49 6e 20 74 68 65 20 70   same.  In the p
174b0 6c 61 63 65 73 20 77 68 65 72 65 0a 2a 2a 20 74  laces where.** t
174c0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
174d0 73 65 64 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  sed, it does not
174e0 20 68 75 72 74 20 74 6f 20 67 65 74 20 61 6e 20   hurt to get an 
174f0 65 78 74 72 61 20 46 41 4c 53 45 20 2d 20 74 68  extra FALSE - th
17500 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74  at.** just might
17510 20 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20   result in some 
17520 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20  slightly slower 
17530 63 6f 64 65 2e 20 20 42 75 74 20 72 65 74 75 72  code.  But retur
17540 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72  ning.** an incor
17550 72 65 63 74 20 54 52 55 45 20 63 6f 75 6c 64 20  rect TRUE could 
17560 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e  lead to a malfun
17570 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
17580 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
17590 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72 20  (Expr *pA, Expr 
175a0 2a 70 42 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  *pB){.  int i;. 
175b0 20 69 66 28 20 70 41 3d 3d 30 7c 7c 70 42 3d 3d   if( pA==0||pB==
175c0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
175d0 70 42 3d 3d 70 41 3b 0a 20 20 7d 0a 20 20 69 66  pB==pA;.  }.  if
175e0 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70  ( pA->op!=pB->op
175f0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
17600 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20  f( (pA->flags & 
17610 45 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70  EP_Distinct)!=(p
17620 42 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69  B->flags & EP_Di
17630 73 74 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e  stinct) ) return
17640 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   0;.  if( !sqlit
17650 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41  e3ExprCompare(pA
17660 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65  ->pLeft, pB->pLe
17670 66 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ft) ) return 0;.
17680 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78    if( !sqlite3Ex
17690 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52  prCompare(pA->pR
176a0 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74  ight, pB->pRight
176b0 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
176c0 69 66 28 20 70 41 2d 3e 70 4c 69 73 74 20 29 7b  if( pA->pList ){
176d0 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 70 4c 69  .    if( pB->pLi
176e0 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
176f0 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 70 4c  ;.    if( pA->pL
17700 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e  ist->nExpr!=pB->
17710 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 20 72  pList->nExpr ) r
17720 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f 72  eturn 0;.    for
17730 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 70 4c 69 73  (i=0; i<pA->pLis
17740 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
17750 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74        if( !sqlit
17760 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41  e3ExprCompare(pA
17770 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  ->pList->a[i].pE
17780 78 70 72 2c 20 70 42 2d 3e 70 4c 69 73 74 2d 3e  xpr, pB->pList->
17790 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  a[i].pExpr) ){. 
177a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
177b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
177c0 20 7d 65 6c 73 65 20 69 66 28 20 70 42 2d 3e 70   }else if( pB->p
177d0 4c 69 73 74 20 29 7b 0a 20 20 20 20 72 65 74 75  List ){.    retu
177e0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
177f0 70 41 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 70  pA->pSelect || p
17800 42 2d 3e 70 53 65 6c 65 63 74 20 29 20 72 65 74  B->pSelect ) ret
17810 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d  urn 0;.  if( pA-
17820 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61  >iTable!=pB->iTa
17830 62 6c 65 20 7c 7c 20 70 41 2d 3e 69 43 6f 6c 75  ble || pA->iColu
17840 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20  mn!=pB->iColumn 
17850 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
17860 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  ( pA->op!=TK_COL
17870 55 4d 4e 20 26 26 20 70 41 2d 3e 74 6f 6b 65 6e  UMN && pA->token
17880 2e 7a 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42  .z ){.    if( pB
17890 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 20 72  ->token.z==0 ) r
178a0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28  eturn 0;.    if(
178b0 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 70 41   pB->token.n!=pA
178c0 2d 3e 74 6f 6b 65 6e 2e 6e 20 29 20 72 65 74 75  ->token.n ) retu
178d0 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71  rn 0;.    if( sq
178e0 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63  lite3StrNICmp((c
178f0 68 61 72 2a 29 70 41 2d 3e 74 6f 6b 65 6e 2e 7a  har*)pA->token.z
17900 2c 28 63 68 61 72 2a 29 70 42 2d 3e 74 6f 6b 65  ,(char*)pB->toke
17910 6e 2e 7a 2c 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 29  n.z,pB->token.n)
17920 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=0 ){.      ret
17930 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
17940 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
17950 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
17960 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
17970 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
17980 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20   array.  Return 
17990 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20  the index of.** 
179a0 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e  the new element.
179b0 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74    Return a negat
179c0 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61  ive number if ma
179d0 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  lloc fails..*/.s
179e0 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67  tatic int addAgg
179f0 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74  InfoColumn(sqlit
17a00 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20  e3 *db, AggInfo 
17a10 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69  *pInfo){.  int i
17a20 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20  ;.  pInfo->aCol 
17a30 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c  = sqlite3ArrayAl
17a40 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64  locate(.       d
17a50 62 2c 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d  b,.       pInfo-
17a60 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69  >aCol,.       si
17a70 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c  zeof(pInfo->aCol
17a80 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 33 2c 0a  [0]),.       3,.
17a90 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e         &pInfo->n
17aa0 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26  Column,.       &
17ab0 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 41 6c  pInfo->nColumnAl
17ac0 6c 6f 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20  loc,.       &i. 
17ad0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a   );.  return i;.
17ae0 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  }    ../*.** Add
17af0 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
17b00 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e  o the pAggInfo->
17b10 61 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20  aFunc[] array.  
17b20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
17b30 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65   of.** the new e
17b40 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  lement.  Return 
17b50 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
17b60 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  r if malloc fail
17b70 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
17b80 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28   addAggInfoFunc(
17b90 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67  sqlite3 *db, Agg
17ba0 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20  Info *pInfo){.  
17bb0 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e  int i;.  pInfo->
17bc0 61 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 41  aFunc = sqlite3A
17bd0 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20  rrayAllocate(.  
17be0 20 20 20 20 20 64 62 2c 20 0a 20 20 20 20 20 20       db, .      
17bf0 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20   pInfo->aFunc,. 
17c00 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e        sizeof(pIn
17c10 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20  fo->aFunc[0]),. 
17c20 20 20 20 20 20 20 33 2c 0a 20 20 20 20 20 20 20        3,.       
17c30 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20  &pInfo->nFunc,. 
17c40 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46        &pInfo->nF
17c50 75 6e 63 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20  uncAlloc,.      
17c60 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72   &i.  );.  retur
17c70 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a  n i;.}    ../*.*
17c80 2a 20 54 68 69 73 20 69 73 20 61 6e 20 78 46 75  * This is an xFu
17c90 6e 63 20 66 6f 72 20 77 61 6c 6b 45 78 70 72 54  nc for walkExprT
17ca0 72 65 65 28 29 20 75 73 65 64 20 74 6f 20 69 6d  ree() used to im
17cb0 70 6c 65 6d 65 6e 74 20 0a 2a 2a 20 73 71 6c 69  plement .** sqli
17cc0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
17cd0 67 72 65 67 61 74 65 73 28 29 2e 20 20 53 65 65  gregates().  See
17ce0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
17cf0 79 7a 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a  yzeAggregates.**
17d00 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
17d10 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a  information..**.
17d20 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
17d30 61 6e 61 6c 79 7a 65 73 20 74 68 65 20 61 67 67  analyzes the agg
17d40 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20  regate function 
17d50 61 74 20 70 45 78 70 72 2e 0a 2a 2f 0a 73 74 61  at pExpr..*/.sta
17d60 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41  tic int analyzeA
17d70 67 67 72 65 67 61 74 65 28 76 6f 69 64 20 2a 70  ggregate(void *p
17d80 41 72 67 2c 20 45 78 70 72 20 2a 70 45 78 70 72  Arg, Expr *pExpr
17d90 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61  ){.  int i;.  Na
17da0 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d  meContext *pNC =
17db0 20 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 29   (NameContext *)
17dc0 70 41 72 67 3b 0a 20 20 50 61 72 73 65 20 2a 70  pArg;.  Parse *p
17dd0 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61  Parse = pNC->pPa
17de0 72 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  rse;.  SrcList *
17df0 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e  pSrcList = pNC->
17e00 70 53 72 63 4c 69 73 74 3b 0a 20 20 41 67 67 49  pSrcList;.  AggI
17e10 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20  nfo *pAggInfo = 
17e20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 0a  pNC->pAggInfo;..
17e30 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
17e40 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
17e50 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20  TK_AGG_COLUMN:. 
17e60 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
17e70 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 43 68  N: {.      /* Ch
17e80 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
17e90 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f  e column is in o
17ea0 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73  ne of the tables
17eb0 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 20   in the FROM.   
17ec0 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20     ** clause of 
17ed0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75  the aggregate qu
17ee0 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ery */.      if(
17ef0 20 70 53 72 63 4c 69 73 74 20 29 7b 0a 20 20 20   pSrcList ){.   
17f00 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
17f10 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
17f20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20  = pSrcList->a;. 
17f30 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
17f40 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63  i<pSrcList->nSrc
17f50 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
17f60 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  .          struc
17f70 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
17f80 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Col;.          i
17f90 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  f( pExpr->iTable
17fa0 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ==pItem->iCursor
17fb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
17fc0 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
17fd0 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65  his point, it me
17fe0 61 6e 73 20 74 68 61 74 20 70 45 78 70 72 20 72  ans that pExpr r
17ff0 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
18000 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
18010 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 46  that is in the F
18020 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
18030 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  e aggregate quer
18040 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  y.  .           
18050 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20   **.            
18060 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79  ** Make an entry
18070 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20   for the column 
18080 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  in pAggInfo->aCo
18090 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20 20 20  l[] if there.   
180a0 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e           ** is n
180b0 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68 65 72  ot an entry ther
180c0 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 20  e already..     
180d0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
180e0 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
180f0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20           pCol = 
18100 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a  pAggInfo->aCol;.
18110 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
18120 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d  k=0; k<pAggInfo-
18130 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70  >nColumn; k++, p
18140 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
18150 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
18160 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69  iTable==pExpr->i
18170 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20  Table &&.       
18180 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
18190 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d  >iColumn==pExpr-
181a0 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
181b0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
181c0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
181d0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
181e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
181f0 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e   (k>=pAggInfo->n
18200 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20 20  Column).        
18210 20 20 20 20 20 26 26 20 28 6b 20 3d 20 61 64 64       && (k = add
18220 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50  AggInfoColumn(pP
18230 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e  arse->db, pAggIn
18240 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20 20 20  fo))>=0 .       
18250 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
18260 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 41        pCol = &pA
18270 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b  ggInfo->aCol[k];
18280 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
18290 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78 70  Col->pTab = pExp
182a0 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  r->pTab;.       
182b0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61         pCol->iTa
182c0 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61  ble = pExpr->iTa
182d0 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ble;.           
182e0 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e     pCol->iColumn
182f0 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
18300 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n;.             
18310 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b   pCol->iMem = ++
18320 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
18330 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
18340 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20  ->iSorterColumn 
18350 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
18360 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20      pCol->pExpr 
18370 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
18380 20 20 20 20 20 20 20 69 66 28 20 70 41 67 67 49         if( pAggI
18390 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b  nfo->pGroupBy ){
183a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
183b0 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20   int j, n;.     
183c0 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 4c             ExprL
183d0 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67 67 49  ist *pGB = pAggI
183e0 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  nfo->pGroupBy;. 
183f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
18400 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
18410 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47 42  tem *pTerm = pGB
18420 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ->a;.           
18430 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45       n = pGB->nE
18440 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
18450 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
18460 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  n; j++, pTerm++)
18470 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
18480 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
18490 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
184a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
184b0 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( pE->op==TK_CO
184c0 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61 62  LUMN && pE->iTab
184d0 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  le==pExpr->iTabl
184e0 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  e &&.           
184f0 20 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e 69             pE->i
18500 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69  Column==pExpr->i
18510 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
18520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
18530 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
18540 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  n = j;.         
18550 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
18560 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
18570 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
18580 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
18590 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
185a0 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
185b0 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20  iSorterColumn<0 
185c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
185d0 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
185e0 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66  Column = pAggInf
185f0 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  o->nSortingColum
18600 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  n++;.           
18610 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
18620 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f   }.            /
18630 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77 20 61  * There is now a
18640 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45 78 70  n entry for pExp
18650 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61  r in pAggInfo->a
18660 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20 20  Col[] (either.  
18670 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63            ** bec
18680 61 75 73 65 20 69 74 20 77 61 73 20 74 68 65 72  ause it was ther
18690 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65 63 61  e before or beca
186a0 75 73 65 20 77 65 20 6a 75 73 74 20 63 72 65 61  use we just crea
186b0 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20 20 20  ted it)..       
186c0 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20       ** Convert 
186d0 74 68 65 20 70 45 78 70 72 20 74 6f 20 62 65 20  the pExpr to be 
186e0 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  a TK_AGG_COLUMN 
186f0 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74 68 61  referring to tha
18700 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  t.            **
18710 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
18720 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20 20 20  ] entry..       
18730 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
18740 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49      pExpr->pAggI
18750 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a  nfo = pAggInfo;.
18760 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
18770 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43  r->op = TK_AGG_C
18780 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20  OLUMN;.         
18790 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d     pExpr->iAgg =
187a0 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   k;.            
187b0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
187c0 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45 78 70   } /* endif pExp
187d0 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d  r->iTable==pItem
187e0 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20  ->iCursor */.   
187f0 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f       } /* end lo
18800 6f 70 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74  op over pSrcList
18810 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
18820 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
18830 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  }.    case TK_AG
18840 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  G_FUNCTION: {.  
18850 20 20 20 20 2f 2a 20 54 68 65 20 70 4e 43 2d 3e      /* The pNC->
18860 6e 44 65 70 74 68 3d 3d 30 20 74 65 73 74 20 63  nDepth==0 test c
18870 61 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20  auses aggregate 
18880 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 73 75 62  functions in sub
18890 71 75 65 72 69 65 73 0a 20 20 20 20 20 20 2a 2a  queries.      **
188a0 20 74 6f 20 62 65 20 69 67 6e 6f 72 65 64 20 2a   to be ignored *
188b0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d  /.      if( pNC-
188c0 3e 6e 44 65 70 74 68 3d 3d 30 20 29 7b 0a 20 20  >nDepth==0 ){.  
188d0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
188e0 6f 20 73 65 65 20 69 66 20 70 45 78 70 72 20 69  o see if pExpr i
188f0 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66  s a duplicate of
18900 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65 67 61   another aggrega
18910 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  te .        ** f
18920 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20  unction that is 
18930 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70  already in the p
18940 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72  AggInfo structur
18950 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  e.        */.   
18960 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
18970 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20  nfo_func *pItem 
18980 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  = pAggInfo->aFun
18990 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  c;.        for(i
189a0 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
189b0 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65  nFunc; i++, pIte
189c0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
189d0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
189e0 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45  ompare(pItem->pE
189f0 78 70 72 2c 20 70 45 78 70 72 29 20 29 7b 0a 20  xpr, pExpr) ){. 
18a00 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
18a10 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
18a20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
18a30 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d  if( i>=pAggInfo-
18a40 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20  >nFunc ){.      
18a50 20 20 20 20 2f 2a 20 70 45 78 70 72 20 69 73 20      /* pExpr is 
18a60 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20  original.  Make 
18a70 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70  a new entry in p
18a80 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d  AggInfo->aFunc[]
18a90 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
18aa0 20 20 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d          u8 enc =
18ab0 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29   ENC(pParse->db)
18ac0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d 20  ;.          i = 
18ad0 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 70  addAggInfoFunc(p
18ae0 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49  Parse->db, pAggI
18af0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nfo);.          
18b00 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20  if( i>=0 ){.    
18b10 20 20 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20          pItem = 
18b20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  &pAggInfo->aFunc
18b30 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [i];.           
18b40 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20   pItem->pExpr = 
18b50 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
18b60 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d     pItem->iMem =
18b70 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
18b80 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
18b90 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69  em->pFunc = sqli
18ba0 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
18bb0 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20  pParse->db,.    
18bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
18bd0 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b  char*)pExpr->tok
18be0 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  en.z, pExpr->tok
18bf0 65 6e 2e 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  en.n,.          
18c00 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
18c10 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e 70  pList ? pExpr->p
18c20 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c  List->nExpr : 0,
18c30 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20   enc, 0);.      
18c40 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
18c50 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74  >flags & EP_Dist
18c60 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  inct ){.        
18c70 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69        pItem->iDi
18c80 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d  stinct = pParse-
18c90 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
18ca0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
18cb0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
18cc0 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b  >iDistinct = -1;
18cd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
18ce0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
18cf0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
18d00 4d 61 6b 65 20 70 45 78 70 72 20 70 6f 69 6e 74  Make pExpr point
18d10 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69   to the appropri
18d20 61 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  ate pAggInfo->aF
18d30 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20  unc[] entry.    
18d40 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
18d50 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 69 3b 0a  Expr->iAgg = i;.
18d60 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
18d70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e  AggInfo = pAggIn
18d80 66 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  fo;.        retu
18d90 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
18da0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
18db0 63 75 72 73 69 76 65 6c 79 20 77 61 6c 6b 20 73  cursively walk s
18dc0 75 62 71 75 65 72 69 65 73 20 6c 6f 6f 6b 69 6e  ubqueries lookin
18dd0 67 20 66 6f 72 20 54 4b 5f 43 4f 4c 55 4d 4e 20  g for TK_COLUMN 
18de0 6e 6f 64 65 73 20 74 68 61 74 20 6e 65 65 64 0a  nodes that need.
18df0 20 20 2a 2a 20 74 6f 20 62 65 20 63 68 61 6e 67    ** to be chang
18e00 65 64 20 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c  ed to TK_AGG_COL
18e10 55 4d 4e 2e 20 20 42 75 74 20 69 6e 63 72 65 6d  UMN.  But increm
18e20 65 6e 74 20 6e 44 65 70 74 68 20 73 6f 20 74 68  ent nDepth so th
18e30 61 74 0a 20 20 2a 2a 20 54 4b 5f 41 47 47 5f 46  at.  ** TK_AGG_F
18e40 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e  UNCTION nodes in
18e50 20 73 75 62 71 75 65 72 69 65 73 20 77 69 6c 6c   subqueries will
18e60 20 62 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20   be unchanged.. 
18e70 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d   */.  if( pExpr-
18e80 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
18e90 70 4e 43 2d 3e 6e 44 65 70 74 68 2b 2b 3b 0a 20  pNC->nDepth++;. 
18ea0 20 20 20 77 61 6c 6b 53 65 6c 65 63 74 45 78 70     walkSelectExp
18eb0 72 28 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  r(pExpr->pSelect
18ec0 2c 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  , analyzeAggrega
18ed0 74 65 2c 20 70 4e 43 29 3b 0a 20 20 20 20 70 4e  te, pNC);.    pN
18ee0 43 2d 3e 6e 44 65 70 74 68 2d 2d 3b 0a 20 20 7d  C->nDepth--;.  }
18ef0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
18f00 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68  /*.** Analyze th
18f10 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
18f20 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  on looking for a
18f30 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
18f40 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61  ns and.** for va
18f50 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65  riables that nee
18f60 64 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f  d to be added 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 2e 0a 2a 2a 20 4d 61  g[] array..** Ma
18f90 6b 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 6e  ke additional en
18fa0 74 72 69 65 73 20 74 6f 20 74 68 65 20 70 50 61  tries to the pPa
18fb0 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61  rse->aAgg[] arra
18fc0 79 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  y as necessary..
18fd0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
18fe0 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62  ne should only b
18ff0 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74  e called after t
19000 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61  he expression ha
19010 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a  s been.** analyz
19020 65 64 20 62 79 20 73 71 6c 69 74 65 33 45 78 70  ed by sqlite3Exp
19030 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29 2e  rResolveNames().
19040 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
19050 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
19060 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78  gates(NameContex
19070 74 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70 45  t *pNC, Expr *pE
19080 78 70 72 29 7b 0a 20 20 77 61 6c 6b 45 78 70 72  xpr){.  walkExpr
19090 54 72 65 65 28 70 45 78 70 72 2c 20 61 6e 61 6c  Tree(pExpr, anal
190a0 79 7a 65 41 67 67 72 65 67 61 74 65 2c 20 70 4e  yzeAggregate, pN
190b0 43 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c  C);.}../*.** Cal
190c0 6c 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  l sqlite3ExprAna
190d0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29  lyzeAggregates()
190e0 20 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65   for every expre
190f0 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65  ssion in an.** e
19100 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20  xpression list. 
19110 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
19120 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a  er of errors..**
19130 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
19140 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e  is found, the an
19150 61 6c 79 73 69 73 20 69 73 20 63 75 74 20 73 68  alysis is cut sh
19160 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ort..*/.void sql
19170 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
19180 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65  ggList(NameConte
19190 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73  xt *pNC, ExprLis
191a0 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74 72  t *pList){.  str
191b0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
191c0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
191d0 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  i;.  if( pList )
191e0 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d  {.    for(pItem=
191f0 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
19200 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
19210 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
19220 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
19230 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
19240 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78  (pNC, pItem->pEx
19250 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  pr);.    }.  }.}
19260 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
19270 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 20 74   or deallocate t
19280 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65 67  emporary use reg
19290 69 73 74 65 72 73 20 64 75 72 69 6e 67 20 63 6f  isters during co
192a0 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 0a 2a  de generation..*
192b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74  /.int sqlite3Get
192c0 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70  TempReg(Parse *p
192d0 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69 2c  Parse){.  int i,
192e0 20 72 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65   r;.  if( pParse
192f0 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b  ->nTempReg==0 ){
19300 0a 20 20 20 20 72 65 74 75 72 6e 20 2b 2b 70 50  .    return ++pP
19310 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a  arse->nMem;.  }.
19320 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
19330 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3b 20 69  rse->nTempReg; i
19340 2b 2b 29 7b 0a 20 20 20 20 72 20 3d 20 70 50 61  ++){.    r = pPa
19350 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 69 5d  rse->aTempReg[i]
19360 3b 0a 20 20 20 20 69 66 28 20 75 73 65 64 41 73  ;.    if( usedAs
19370 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72  ColumnCache(pPar
19380 73 65 2c 20 72 2c 20 72 29 20 29 20 63 6f 6e 74  se, r, r) ) cont
19390 69 6e 75 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  inue;.  }.  if( 
193a0 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  i>=pParse->nTemp
193b0 52 65 67 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Reg ){.    retur
193c0 6e 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  n ++pParse->nMem
193d0 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 69  ;.  }.  while( i
193e0 3c 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65  <pParse->nTempRe
193f0 67 2d 31 20 29 7b 0a 20 20 20 20 70 50 61 72 73  g-1 ){.    pPars
19400 65 2d 3e 61 54 65 6d 70 52 65 67 5b 69 5d 20 3d  e->aTempReg[i] =
19410 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65   pParse->aTempRe
19420 67 5b 69 2b 31 5d 3b 0a 20 20 7d 0a 20 20 70 50  g[i+1];.  }.  pP
19430 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2d 2d  arse->nTempReg--
19440 3b 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a  ;.  return r;.}.
19450 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65  void sqlite3Rele
19460 61 73 65 54 65 6d 70 52 65 67 28 50 61 72 73 65  aseTempReg(Parse
19470 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52   *pParse, int iR
19480 65 67 29 7b 0a 20 20 69 66 28 20 69 52 65 67 20  eg){.  if( iReg 
19490 26 26 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  && pParse->nTemp
194a0 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50  Reg<ArraySize(pP
194b0 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20  arse->aTempReg) 
194c0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
194d0 52 65 67 3e 30 20 29 3b 0a 20 20 20 20 70 50 61  Reg>0 );.    pPa
194e0 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50  rse->aTempReg[pP
194f0 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b  arse->nTempReg++
19500 5d 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a  ] = iReg;.  }.}.
19510 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
19520 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 20 61 20  or deallocate a 
19530 62 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f  block of nReg co
19540 6e 73 65 63 75 74 69 76 65 20 72 65 67 69 73 74  nsecutive regist
19550 65 72 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ers.*/.int sqlit
19560 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 50  e3GetTempRange(P
19570 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
19580 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69  t nReg){.  int i
19590 2c 20 6e 3b 0a 20 20 69 20 3d 20 70 50 61 72 73  , n;.  i = pPars
195a0 65 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20 20  e->iRangeReg;.  
195b0 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e  n = pParse->nRan
195c0 67 65 52 65 67 3b 0a 20 20 69 66 28 20 6e 52 65  geReg;.  if( nRe
195d0 67 3c 3d 6e 20 26 26 20 21 75 73 65 64 41 73 43  g<=n && !usedAsC
195e0 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73  olumnCache(pPars
195f0 65 2c 20 69 2c 20 69 2b 6e 2d 31 29 20 29 7b 0a  e, i, i+n-1) ){.
19600 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e      pParse->iRan
19610 67 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20  geReg += nReg;. 
19620 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67     pParse->nRang
19630 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20  eReg -= nReg;.  
19640 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20 70  }else{.    i = p
19650 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
19660 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
19670 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72  += nReg;.  }.  r
19680 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20  eturn i;.}.void 
19690 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
196a0 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70  mpRange(Parse *p
196b0 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c  Parse, int iReg,
196c0 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 66   int nReg){.  if
196d0 28 20 6e 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e  ( nReg>pParse->n
196e0 52 61 6e 67 65 52 65 67 20 29 7b 0a 20 20 20 20  RangeReg ){.    
196f0 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
19700 67 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50  g = nReg;.    pP
19710 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20  arse->iRangeReg 
19720 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a        = iReg;.  }.}.