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

Artifact a896d1be67b2abe9759369cb7f3a3b7a1c21fc3f:


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 37 30 20 32 30 30 38 2f 30 34 2f 32 39 20  .370 2008/04/29 
0220: 30 30 3a 31 35 3a 32 31 20 64 72 68 20 45 78 70  00:15:21 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 73 74 61 74 69 63 20  *pNew;.  static 
2130: 63 6f 6e 73 74 20 45 78 70 72 20 7a 65 72 6f 45  const Expr zeroE
2140: 78 70 72 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  xpr;.  pNew = sq
2150: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
2160: 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  (db, sizeof(Expr
2170: 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d  ));.  if( pNew==
2180: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 68 65 6e  0 ){.    /* When
2190: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2c 20 64   malloc fails, d
21a0: 65 6c 65 74 65 20 70 4c 65 66 74 20 61 6e 64 20  elete pLeft and 
21b0: 70 52 69 67 68 74 2e 20 45 78 70 72 65 73 73 69  pRight. Expressi
21c0: 6f 6e 73 20 70 61 73 73 65 64 20 74 6f 20 0a 20  ons passed to . 
21d0: 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74     ** this funct
21e0: 69 6f 6e 20 6d 75 73 74 20 61 6c 77 61 79 73 20  ion must always 
21f0: 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 77 69 74  be allocated wit
2200: 68 20 73 71 6c 69 74 65 33 45 78 70 72 28 29 20  h sqlite3Expr() 
2210: 66 6f 72 20 74 68 69 73 20 0a 20 20 20 20 2a 2a  for this .    **
2220: 20 72 65 61 73 6f 6e 2e 20 0a 20 20 20 20 2a 2f   reason. .    */
2230: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
2240: 44 65 6c 65 74 65 28 70 4c 65 66 74 29 3b 0a 20  Delete(pLeft);. 
2250: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
2260: 6c 65 74 65 28 70 52 69 67 68 74 29 3b 0a 20 20  lete(pRight);.  
2270: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
2280: 20 20 2a 70 4e 65 77 20 3d 20 7a 65 72 6f 45 78    *pNew = zeroEx
2290: 70 72 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d  pr;.  pNew->op =
22a0: 20 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65   op;.  pNew->pLe
22b0: 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 70 4e  ft = pLeft;.  pN
22c0: 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 70 52 69  ew->pRight = pRi
22d0: 67 68 74 3b 0a 20 20 70 4e 65 77 2d 3e 69 41 67  ght;.  pNew->iAg
22e0: 67 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 54  g = -1;.  if( pT
22f0: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65  oken ){.    asse
2300: 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e 3d  rt( pToken->dyn=
2310: 3d 30 20 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  =0 );.    pNew->
2320: 73 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b  span = pNew->tok
2330: 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20  en = *pToken;.  
2340: 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74 20  }else if( pLeft 
2350: 29 7b 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  ){.    if( pRigh
2360: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
2370: 65 33 45 78 70 72 53 70 61 6e 28 70 4e 65 77 2c  e3ExprSpan(pNew,
2380: 20 26 70 4c 65 66 74 2d 3e 73 70 61 6e 2c 20 26   &pLeft->span, &
2390: 70 52 69 67 68 74 2d 3e 73 70 61 6e 29 3b 0a 20  pRight->span);. 
23a0: 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d       if( pRight-
23b0: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
23c0: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20  ollate ){.      
23d0: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
23e0: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a   EP_ExpCollate;.
23f0: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 43          pNew->pC
2400: 6f 6c 6c 20 3d 20 70 52 69 67 68 74 2d 3e 70 43  oll = pRight->pC
2410: 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
2420: 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74   }.    if( pLeft
2430: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70  ->flags & EP_Exp
2440: 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20  Collate ){.     
2450: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
2460: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20  EP_ExpCollate;. 
2470: 20 20 20 20 20 70 4e 65 77 2d 3e 70 43 6f 6c 6c       pNew->pColl
2480: 20 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b   = pLeft->pColl;
2490: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71  .    }.  }..  sq
24a0: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
24b0: 68 74 28 70 4e 65 77 29 3b 0a 20 20 72 65 74 75  ht(pNew);.  retu
24c0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
24d0: 2a 20 57 6f 72 6b 73 20 6c 69 6b 65 20 73 71 6c  * Works like sql
24e0: 69 74 65 33 45 78 70 72 28 29 20 65 78 63 65 70  ite3Expr() excep
24f0: 74 20 74 68 61 74 20 69 74 20 74 61 6b 65 73 20  t that it takes 
2500: 61 6e 20 65 78 74 72 61 20 50 61 72 73 65 2a 0a  an extra Parse*.
2510: 2a 2a 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20  ** argument and 
2520: 6e 6f 74 69 66 69 65 73 20 74 68 65 20 61 73 73  notifies the ass
2530: 6f 63 69 61 74 65 64 20 63 6f 6e 6e 65 63 74 69  ociated connecti
2540: 6f 6e 20 6f 62 6a 65 63 74 20 69 66 20 6d 61 6c  on object if mal
2550: 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 45 78  loc fails..*/.Ex
2560: 70 72 20 2a 73 71 6c 69 74 65 33 50 45 78 70 72  pr *sqlite3PExpr
2570: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
2580: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
2590: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
25a0: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
25b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
25c0: 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65  xpression opcode
25d0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66   */.  Expr *pLef
25e0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
25f0: 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   Left operand */
2600: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
2610: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69             /* Ri
2620: 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  ght operand */. 
2630: 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54   const Token *pT
2640: 6f 6b 65 6e 20 20 20 20 20 2f 2a 20 41 72 67 75  oken     /* Argu
2650: 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b  ment token */.){
2660: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
2670: 33 45 78 70 72 28 70 50 61 72 73 65 2d 3e 64 62  3Expr(pParse->db
2680: 2c 20 6f 70 2c 20 70 4c 65 66 74 2c 20 70 52 69  , op, pLeft, pRi
2690: 67 68 74 2c 20 70 54 6f 6b 65 6e 29 3b 0a 7d 0a  ght, pToken);.}.
26a0: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64 6f 69 6e  ./*.** When doin
26b0: 67 20 61 20 6e 65 73 74 65 64 20 70 61 72 73 65  g a nested parse
26c0: 2c 20 79 6f 75 20 63 61 6e 20 69 6e 63 6c 75 64  , you can includ
26d0: 65 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 65 78  e terms in an ex
26e0: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 68 61 74  pression.** that
26f0: 20 6c 6f 6f 6b 20 6c 69 6b 65 20 74 68 69 73 3a   look like this:
2700: 20 20 20 23 31 20 23 32 20 2e 2e 2e 20 20 54 68     #1 #2 ...  Th
2710: 65 73 65 20 74 65 72 6d 73 20 72 65 66 65 72 20  ese terms refer 
2720: 74 6f 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20  to registers.** 
2730: 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d  in the virtual m
2740: 61 63 68 69 6e 65 2e 20 20 23 4e 20 69 73 20 74  achine.  #N is t
2750: 68 65 20 4e 2d 74 68 20 72 65 67 69 73 74 65 72  he N-th register
2760: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2770: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
2780: 79 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20  y the parser to 
2790: 64 65 61 6c 20 77 69 74 68 20 6f 6e 20 6f 66 20  deal with on of 
27a0: 74 68 6f 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20  those terms..** 
27b0: 49 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 67  It immediately g
27c0: 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f  enerates code to
27d0: 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65   store the value
27e0: 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20 6c 6f 63   in a memory loc
27f0: 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 72 65  ation..** The re
2800: 74 75 72 6e 73 20 61 6e 20 65 78 70 72 65 73 73  turns an express
2810: 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 63 6f  ion that will co
2820: 64 65 20 74 6f 20 65 78 74 72 61 63 74 20 74 68  de to extract th
2830: 65 20 76 61 6c 75 65 20 66 72 6f 6d 0a 2a 2a 20  e value from.** 
2840: 74 68 61 74 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  that memory loca
2850: 74 69 6f 6e 20 61 73 20 6e 65 65 64 65 64 2e 0a  tion as needed..
2860: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
2870: 52 65 67 69 73 74 65 72 45 78 70 72 28 50 61 72  RegisterExpr(Par
2880: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
2890: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 56 64  n *pToken){.  Vd
28a0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
28b0: 70 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70  pVdbe;.  Expr *p
28c0: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
28d0: 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  nested==0 ){.   
28e0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
28f0: 28 70 50 61 72 73 65 2c 20 22 6e 65 61 72 20 5c  (pParse, "near \
2900: 22 25 54 5c 22 3a 20 73 79 6e 74 61 78 20 65 72  "%T\": syntax er
2910: 72 6f 72 22 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20  ror", pToken);. 
2920: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
2930: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
2940: 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20 30 29  K_NULL, 0, 0, 0)
2950: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 76 3d 3d 30  ;.  }.  if( v==0
2960: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
2970: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
2980: 70 50 61 72 73 65 2c 20 54 4b 5f 52 45 47 49 53  pParse, TK_REGIS
2990: 54 45 52 2c 20 30 2c 20 30 2c 20 70 54 6f 6b 65  TER, 0, 0, pToke
29a0: 6e 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  n);.  if( p==0 )
29b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
29c0: 20 2f 2a 20 4d 61 6c 6c 6f 63 20 66 61 69 6c 65   /* Malloc faile
29d0: 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 2d 3e 69 54  d */.  }.  p->iT
29e0: 61 62 6c 65 20 3d 20 61 74 6f 69 28 28 63 68 61  able = atoi((cha
29f0: 72 2a 29 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d  r*)&pToken->z[1]
2a00: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  );.  return p;.}
2a10: 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f  ../*.** Join two
2a20: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73 69   expressions usi
2a30: 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74  ng an AND operat
2a40: 6f 72 2e 20 20 49 66 20 65 69 74 68 65 72 20 65  or.  If either e
2a50: 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20  xpression is.** 
2a60: 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74 20  NULL, then just 
2a70: 72 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65 72  return the other
2a80: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a   expression..*/.
2a90: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
2aa0: 72 41 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62  rAnd(sqlite3 *db
2ab0: 2c 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45  , Expr *pLeft, E
2ac0: 78 70 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20  xpr *pRight){.  
2ad0: 69 66 28 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a  if( pLeft==0 ){.
2ae0: 20 20 20 20 72 65 74 75 72 6e 20 70 52 69 67 68      return pRigh
2af0: 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  t;.  }else if( p
2b00: 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20  Right==0 ){.    
2b10: 72 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20  return pLeft;.  
2b20: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
2b30: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  n sqlite3Expr(db
2b40: 2c 20 54 4b 5f 41 4e 44 2c 20 70 4c 65 66 74 2c  , TK_AND, pLeft,
2b50: 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 7d   pRight, 0);.  }
2b60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
2b70: 65 20 45 78 70 72 2e 73 70 61 6e 20 66 69 65 6c  e Expr.span fiel
2b80: 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65  d of the given e
2b90: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 73 70 61  xpression to spa
2ba0: 6e 20 61 6c 6c 0a 2a 2a 20 74 65 78 74 20 62 65  n all.** text be
2bb0: 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20 67 69  tween the two gi
2bc0: 76 65 6e 20 74 6f 6b 65 6e 73 2e 0a 2a 2f 0a 76  ven tokens..*/.v
2bd0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53  oid sqlite3ExprS
2be0: 70 61 6e 28 45 78 70 72 20 2a 70 45 78 70 72 2c  pan(Expr *pExpr,
2bf0: 20 54 6f 6b 65 6e 20 2a 70 4c 65 66 74 2c 20 54   Token *pLeft, T
2c00: 6f 6b 65 6e 20 2a 70 52 69 67 68 74 29 7b 0a 20  oken *pRight){. 
2c10: 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74 21   assert( pRight!
2c20: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2c30: 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 69 66  pLeft!=0 );.  if
2c40: 28 20 70 45 78 70 72 20 26 26 20 70 52 69 67 68  ( pExpr && pRigh
2c50: 74 2d 3e 7a 20 26 26 20 70 4c 65 66 74 2d 3e 7a  t->z && pLeft->z
2c60: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2c70: 70 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30 20 7c 7c  pLeft->dyn==0 ||
2c80: 20 70 4c 65 66 74 2d 3e 7a 5b 70 4c 65 66 74 2d   pLeft->z[pLeft-
2c90: 3e 6e 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  >n]==0 );.    if
2ca0: 28 20 70 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30 20  ( pLeft->dyn==0 
2cb0: 26 26 20 70 52 69 67 68 74 2d 3e 64 79 6e 3d 3d  && pRight->dyn==
2cc0: 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72  0 ){.      pExpr
2cd0: 2d 3e 73 70 61 6e 2e 7a 20 3d 20 70 4c 65 66 74  ->span.z = pLeft
2ce0: 2d 3e 7a 3b 0a 20 20 20 20 20 20 70 45 78 70 72  ->z;.      pExpr
2cf0: 2d 3e 73 70 61 6e 2e 6e 20 3d 20 70 52 69 67 68  ->span.n = pRigh
2d00: 74 2d 3e 6e 20 2b 20 28 70 52 69 67 68 74 2d 3e  t->n + (pRight->
2d10: 7a 20 2d 20 70 4c 65 66 74 2d 3e 7a 29 3b 0a 20  z - pLeft->z);. 
2d20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2d30: 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 20 3d 20  pExpr->span.z = 
2d40: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
2d50: 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  /*.** Construct 
2d60: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
2d70: 20 6e 6f 64 65 20 66 6f 72 20 61 20 66 75 6e 63   node for a func
2d80: 74 69 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69 70  tion with multip
2d90: 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e  le.** arguments.
2da0: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
2db0: 33 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 50 61  3ExprFunction(Pa
2dc0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
2dd0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f  rList *pList, To
2de0: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
2df0: 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 61 73  Expr *pNew;.  as
2e00: 73 65 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b 0a  sert( pToken );.
2e10: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
2e20: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61  DbMallocZero(pPa
2e30: 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28  rse->db, sizeof(
2e40: 45 78 70 72 29 20 29 3b 0a 20 20 69 66 28 20 70  Expr) );.  if( p
2e50: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  New==0 ){.    sq
2e60: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
2e70: 65 74 65 28 70 4c 69 73 74 29 3b 20 2f 2a 20 41  ete(pList); /* A
2e80: 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d  void leaking mem
2e90: 6f 72 79 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20  ory when malloc 
2ea0: 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74  fails */.    ret
2eb0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65  urn 0;.  }.  pNe
2ec0: 77 2d 3e 6f 70 20 3d 20 54 4b 5f 46 55 4e 43 54  w->op = TK_FUNCT
2ed0: 49 4f 4e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  ION;.  pNew->pLi
2ee0: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73  st = pList;.  as
2ef0: 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79  sert( pToken->dy
2f00: 6e 3d 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e  n==0 );.  pNew->
2f10: 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b  token = *pToken;
2f20: 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20  .  pNew->span = 
2f30: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 3b 0a 0a 20 20  pNew->token;..  
2f40: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65  sqlite3ExprSetHe
2f50: 69 67 68 74 28 70 4e 65 77 29 3b 0a 20 20 72 65  ight(pNew);.  re
2f60: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
2f70: 0a 2a 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72  .** Assign a var
2f80: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20  iable number to 
2f90: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  an expression th
2fa0: 61 74 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c  at encodes a wil
2fb0: 64 63 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20  dcard.** in the 
2fc0: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61  original SQL sta
2fd0: 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20  tement.  .**.** 
2fe0: 57 69 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73  Wildcards consis
2ff0: 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65  ting of a single
3000: 20 22 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65   "?" are assigne
3010: 64 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65  d the next seque
3020: 6e 74 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c  ntial.** variabl
3030: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
3040: 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65  Wildcards of the
3050: 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65   form "?nnn" are
3060: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75   assigned the nu
3070: 6d 62 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20  mber "nnn".  We 
3080: 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e  make.** sure "nn
3090: 6e 22 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65  n" is not too be
30a0: 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69   to avoid a deni
30b0: 61 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61 74  al of service at
30c0: 74 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65  tack when.** the
30d0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63   SQL statement c
30e0: 6f 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74  omes from an ext
30f0: 65 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a  ernal source..**
3100: 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66  .** Wildcards of
3110: 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22   the form ":aaa"
3120: 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20 61   or "$aaa" are a
3130: 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d 65  ssigned the same
3140: 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68   number.** as th
3150: 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61  e previous insta
3160: 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  nce of the same 
3170: 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69 66  wildcard.  Or if
3180: 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
3190: 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f  st.** instance o
31a0: 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c 20  f the wildcard, 
31b0: 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 69  the next sequeni
31c0: 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  al variable numb
31d0: 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65  er is.** assigne
31e0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
31f0: 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72 4e  e3ExprAssignVarN
3200: 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50 61  umber(Parse *pPa
3210: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
3220: 29 7b 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ){.  Token *pTok
3230: 65 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  en;.  sqlite3 *d
3240: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
3250: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
3260: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 6f 6b  ) return;.  pTok
3270: 65 6e 20 3d 20 26 70 45 78 70 72 2d 3e 74 6f 6b  en = &pExpr->tok
3280: 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  en;.  assert( pT
3290: 6f 6b 65 6e 2d 3e 6e 3e 3d 31 20 29 3b 0a 20 20  oken->n>=1 );.  
32a0: 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e  assert( pToken->
32b0: 7a 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  z!=0 );.  assert
32c0: 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 21 3d  ( pToken->z[0]!=
32d0: 30 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65  0 );.  if( pToke
32e0: 6e 2d 3e 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f  n->n==1 ){.    /
32f0: 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68  * Wildcard of th
3300: 65 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73  e form "?".  Ass
3310: 69 67 6e 20 74 68 65 20 6e 65 78 74 20 76 61 72  ign the next var
3320: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  iable number */.
3330: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
3340: 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 56  e = ++pParse->nV
3350: 61 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ar;.  }else if( 
3360: 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 3f  pToken->z[0]=='?
3370: 27 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64  ' ){.    /* Wild
3380: 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d  card of the form
3390: 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72   "?nnn".  Conver
33a0: 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e  t "nnn" to an in
33b0: 74 65 67 65 72 20 61 6e 64 0a 20 20 20 20 2a 2a  teger and.    **
33c0: 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76   use it as the v
33d0: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a  ariable number *
33e0: 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  /.    int i;.   
33f0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
3400: 20 69 20 3d 20 61 74 6f 69 28 28 63 68 61 72 2a   i = atoi((char*
3410: 29 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d 29 3b  )&pToken->z[1]);
3420: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69  .    testcase( i
3430: 3d 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ==0 );.    testc
3440: 61 73 65 28 20 69 3d 3d 31 20 29 3b 0a 20 20 20  ase( i==1 );.   
3450: 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62   testcase( i==db
3460: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
3470: 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
3480: 55 4d 42 45 52 5d 2d 31 20 29 3b 0a 20 20 20 20  UMBER]-1 );.    
3490: 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d  testcase( i==db-
34a0: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
34b0: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
34c0: 4d 42 45 52 5d 20 29 3b 0a 20 20 20 20 69 66 28  MBER] );.    if(
34d0: 20 69 3c 31 20 7c 7c 20 69 3e 64 62 2d 3e 61 4c   i<1 || i>db->aL
34e0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
34f0: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
3500: 52 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  R] ){.      sqli
3510: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
3520: 73 65 2c 20 22 76 61 72 69 61 62 6c 65 20 6e 75  se, "variable nu
3530: 6d 62 65 72 20 6d 75 73 74 20 62 65 20 62 65 74  mber must be bet
3540: 77 65 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22  ween ?1 and ?%d"
3550: 2c 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ,.          db->
3560: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
3570: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
3580: 42 45 52 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  BER]);.    }.   
3590: 20 69 66 28 20 69 3e 70 50 61 72 73 65 2d 3e 6e   if( i>pParse->n
35a0: 56 61 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61  Var ){.      pPa
35b0: 72 73 65 2d 3e 6e 56 61 72 20 3d 20 69 3b 0a 20  rse->nVar = i;. 
35c0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
35d0: 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 73 20 6f    /* Wildcards o
35e0: 66 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61  f the form ":aaa
35f0: 22 20 6f 72 20 22 24 61 61 61 22 2e 20 20 52 65  " or "$aaa".  Re
3600: 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72  use the same var
3610: 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 6e 75 6d  iable.    ** num
3620: 62 65 72 20 61 73 20 74 68 65 20 70 72 69 6f 72  ber as the prior
3630: 20 61 70 70 65 61 72 61 6e 63 65 20 6f 66 20 74   appearance of t
3640: 68 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72  he same name, or
3650: 20 69 66 20 74 68 65 20 6e 61 6d 65 0a 20 20 20   if the name.   
3660: 20 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70   ** has never ap
3670: 70 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72  peared before, r
3680: 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61  euse the same va
3690: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20  riable number.  
36a0: 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20    */.    int i, 
36b0: 6e 3b 0a 20 20 20 20 6e 20 3d 20 70 54 6f 6b 65  n;.    n = pToke
36c0: 6e 2d 3e 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d  n->n;.    for(i=
36d0: 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 61  0; i<pParse->nVa
36e0: 72 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  rExpr; i++){.   
36f0: 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20     Expr *pE;.   
3700: 20 20 20 69 66 28 20 28 70 45 20 3d 20 70 50 61     if( (pE = pPa
3710: 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 69  rse->apVarExpr[i
3720: 5d 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ])!=0.          
3730: 26 26 20 70 45 2d 3e 74 6f 6b 65 6e 2e 6e 3d 3d  && pE->token.n==
3740: 6e 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 6d  n.          && m
3750: 65 6d 63 6d 70 28 70 45 2d 3e 74 6f 6b 65 6e 2e  emcmp(pE->token.
3760: 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 6e 29  z, pToken->z, n)
3770: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
3780: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
3790: 45 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  E->iTable;.     
37a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
37b0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
37c0: 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 56 61 72 45  i>=pParse->nVarE
37d0: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70 45 78  xpr ){.      pEx
37e0: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2b 2b 70  pr->iTable = ++p
37f0: 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 20  Parse->nVar;.   
3800: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
3810: 56 61 72 45 78 70 72 3e 3d 70 50 61 72 73 65 2d  VarExpr>=pParse-
3820: 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 2d 31  >nVarExprAlloc-1
3830: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72   ){.        pPar
3840: 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f  se->nVarExprAllo
3850: 63 20 2b 3d 20 70 50 61 72 73 65 2d 3e 6e 56 61  c += pParse->nVa
3860: 72 45 78 70 72 41 6c 6c 6f 63 20 2b 20 31 30 3b  rExprAlloc + 10;
3870: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
3880: 3e 61 70 56 61 72 45 78 70 72 20 3d 0a 20 20 20  >apVarExpr =.   
3890: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
38a0: 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  DbReallocOrFree(
38b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  .              d
38c0: 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
38d0: 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78   pParse->apVarEx
38e0: 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
38f0: 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78    pParse->nVarEx
3900: 70 72 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70  prAlloc*sizeof(p
3910: 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72  Parse->apVarExpr
3920: 5b 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20  [0]).           
3930: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
3940: 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
3950: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
3960: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
3970: 65 2d 3e 61 70 56 61 72 45 78 70 72 21 3d 30 20  e->apVarExpr!=0 
3980: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
3990: 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 70 50 61  e->apVarExpr[pPa
39a0: 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 2b 2b 5d  rse->nVarExpr++]
39b0: 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20   = pExpr;.      
39c0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 0a 20 20 69  }.    }.  } .  i
39d0: 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 45 72 72  f( !pParse->nErr
39e0: 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 56 61 72   && pParse->nVar
39f0: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
3a00: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
3a10: 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20  E_NUMBER] ){.   
3a20: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
3a30: 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
3a40: 6e 79 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73  ny SQL variables
3a50: 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ");.  }.}../*.**
3a60: 20 52 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c   Recursively del
3a70: 65 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ete an expressio
3a80: 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20  n tree..*/.void 
3a90: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
3aa0: 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  e(Expr *p){.  if
3ab0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
3ac0: 0a 20 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 64  .  if( p->span.d
3ad0: 79 6e 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  yn ) sqlite3_fre
3ae0: 65 28 28 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e  e((char*)p->span
3af0: 2e 7a 29 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f  .z);.  if( p->to
3b00: 6b 65 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74 65  ken.dyn ) sqlite
3b10: 33 5f 66 72 65 65 28 28 63 68 61 72 2a 29 70 2d  3_free((char*)p-
3b20: 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 73 71 6c  >token.z);.  sql
3b30: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
3b40: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 73 71 6c 69  ->pLeft);.  sqli
3b50: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d  te3ExprDelete(p-
3b60: 3e 70 52 69 67 68 74 29 3b 0a 20 20 73 71 6c 69  >pRight);.  sqli
3b70: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
3b80: 65 28 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 73  e(p->pList);.  s
3b90: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
3ba0: 74 65 28 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  te(p->pSelect);.
3bb0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
3bc0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
3bd0: 45 78 70 72 2e 74 6f 6b 65 6e 20 66 69 65 6c 64  Expr.token field
3be0: 20 6d 69 67 68 74 20 62 65 20 61 20 73 74 72 69   might be a stri
3bf0: 6e 67 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20  ng literal that 
3c00: 69 73 20 71 75 6f 74 65 64 2e 0a 2a 2a 20 49 66  is quoted..** If
3c10: 20 73 6f 2c 20 72 65 6d 6f 76 65 20 74 68 65 20   so, remove the 
3c20: 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b 73 2e  quotation marks.
3c30: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3c40: 44 65 71 75 6f 74 65 45 78 70 72 28 73 71 6c 69  DequoteExpr(sqli
3c50: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
3c60: 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  ){.  if( ExprHas
3c70: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45  AnyProperty(p, E
3c80: 50 5f 44 65 71 75 6f 74 65 64 29 20 29 7b 0a 20  P_Dequoted) ){. 
3c90: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
3ca0: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
3cb0: 28 70 2c 20 45 50 5f 44 65 71 75 6f 74 65 64 29  (p, EP_Dequoted)
3cc0: 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e  ;.  if( p->token
3cd0: 2e 64 79 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 73  .dyn==0 ){.    s
3ce0: 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28  qlite3TokenCopy(
3cf0: 64 62 2c 20 26 70 2d 3e 74 6f 6b 65 6e 2c 20 26  db, &p->token, &
3d00: 70 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20  p->token);.  }. 
3d10: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
3d20: 28 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e  (char*)p->token.
3d30: 7a 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  z);.}.../*.** Th
3d40: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75  e following grou
3d50: 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 6d 61  p of routines ma
3d60: 6b 65 20 64 65 65 70 20 63 6f 70 69 65 73 20 6f  ke deep copies o
3d70: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a  f expressions,.*
3d80: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * expression lis
3d90: 74 73 2c 20 49 44 20 6c 69 73 74 73 2c 20 61 6e  ts, ID lists, an
3da0: 64 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  d select stateme
3db0: 6e 74 73 2e 20 20 54 68 65 20 63 6f 70 69 65 73  nts.  The copies
3dc0: 20 63 61 6e 0a 2a 2a 20 62 65 20 64 65 6c 65 74   can.** be delet
3dd0: 65 64 20 28 62 79 20 62 65 69 6e 67 20 70 61 73  ed (by being pas
3de0: 73 65 64 20 74 6f 20 74 68 65 69 72 20 72 65 73  sed to their res
3df0: 70 65 63 74 69 76 65 20 2e 2e 2e 44 65 6c 65 74  pective ...Delet
3e00: 65 28 29 20 72 6f 75 74 69 6e 65 73 29 0a 2a 2a  e() routines).**
3e10: 20 77 69 74 68 6f 75 74 20 65 66 66 65 63 74 69   without effecti
3e20: 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 73  ng the originals
3e30: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72  ..**.** The expr
3e40: 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 49 44 2c  ession list, ID,
3e50: 20 61 6e 64 20 73 6f 75 72 63 65 20 6c 69 73 74   and source list
3e60: 73 20 72 65 74 75 72 6e 20 62 79 20 73 71 6c 69  s return by sqli
3e70: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 29  te3ExprListDup()
3e80: 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 49 64 4c 69  ,.** sqlite3IdLi
3e90: 73 74 44 75 70 28 29 2c 20 61 6e 64 20 73 71 6c  stDup(), and sql
3ea0: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 29  ite3SrcListDup()
3eb0: 20 63 61 6e 20 6e 6f 74 20 62 65 20 66 75 72 74   can not be furt
3ec0: 68 65 72 20 65 78 70 61 6e 64 65 64 20 0a 2a 2a  her expanded .**
3ed0: 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63   by subsequent c
3ee0: 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 2a 4c  alls to sqlite*L
3ef0: 69 73 74 41 70 70 65 6e 64 28 29 20 72 6f 75 74  istAppend() rout
3f00: 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20  ines..**.** Any 
3f10: 74 61 62 6c 65 73 20 74 68 61 74 20 74 68 65 20  tables that the 
3f20: 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20 70 6f  SrcList might po
3f30: 69 6e 74 20 74 6f 20 61 72 65 20 6e 6f 74 20 64  int to are not d
3f40: 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2f 0a 45 78  uplicated..*/.Ex
3f50: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 44  pr *sqlite3ExprD
3f60: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
3f70: 45 78 70 72 20 2a 70 29 7b 0a 20 20 45 78 70 72  Expr *p){.  Expr
3f80: 20 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d   *pNew;.  if( p=
3f90: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
3fa0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
3fb0: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
3fc0: 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
3fd0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
3fe0: 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 63 70 79 28  urn 0;.  memcpy(
3ff0: 70 4e 65 77 2c 20 70 2c 20 73 69 7a 65 6f 66 28  pNew, p, sizeof(
4000: 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66 28 20 70  *pNew));.  if( p
4010: 2d 3e 74 6f 6b 65 6e 2e 7a 21 3d 30 20 29 7b 0a  ->token.z!=0 ){.
4020: 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e      pNew->token.
4030: 7a 20 3d 20 28 75 38 2a 29 73 71 6c 69 74 65 33  z = (u8*)sqlite3
4040: 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63  DbStrNDup(db, (c
4050: 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c  har*)p->token.z,
4060: 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20   p->token.n);.  
4070: 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 64 79    pNew->token.dy
4080: 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  n = 1;.  }else{.
4090: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
40a0: 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 3b 0a  ->token.z==0 );.
40b0: 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e    }.  pNew->span
40c0: 2e 7a 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  .z = 0;.  pNew->
40d0: 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
40e0: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c  xprDup(db, p->pL
40f0: 65 66 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 52  eft);.  pNew->pR
4100: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
4110: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69  prDup(db, p->pRi
4120: 67 68 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c  ght);.  pNew->pL
4130: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
4140: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
4150: 70 4c 69 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e  pList);.  pNew->
4160: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
4170: 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
4180: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 72 65  ->pSelect);.  re
4190: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 76 6f 69  turn pNew;.}.voi
41a0: 64 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f  d sqlite3TokenCo
41b0: 70 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  py(sqlite3 *db, 
41c0: 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 54 6f 6b 65  Token *pTo, Toke
41d0: 6e 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28  n *pFrom){.  if(
41e0: 20 70 54 6f 2d 3e 64 79 6e 20 29 20 73 71 6c 69   pTo->dyn ) sqli
41f0: 74 65 33 5f 66 72 65 65 28 28 63 68 61 72 2a 29  te3_free((char*)
4200: 70 54 6f 2d 3e 7a 29 3b 0a 20 20 69 66 28 20 70  pTo->z);.  if( p
4210: 46 72 6f 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 70  From->z ){.    p
4220: 54 6f 2d 3e 6e 20 3d 20 70 46 72 6f 6d 2d 3e 6e  To->n = pFrom->n
4230: 3b 0a 20 20 20 20 70 54 6f 2d 3e 7a 20 3d 20 28  ;.    pTo->z = (
4240: 75 38 2a 29 73 71 6c 69 74 65 33 44 62 53 74 72  u8*)sqlite3DbStr
4250: 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29  NDup(db, (char*)
4260: 70 46 72 6f 6d 2d 3e 7a 2c 20 70 46 72 6f 6d 2d  pFrom->z, pFrom-
4270: 3e 6e 29 3b 0a 20 20 20 20 70 54 6f 2d 3e 64 79  >n);.    pTo->dy
4280: 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  n = 1;.  }else{.
4290: 20 20 20 20 70 54 6f 2d 3e 7a 20 3d 20 30 3b 0a      pTo->z = 0;.
42a0: 20 20 7d 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a    }.}.ExprList *
42b0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
42c0: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
42d0: 45 78 70 72 4c 69 73 74 20 2a 70 29 7b 0a 20 20  ExprList *p){.  
42e0: 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a  ExprList *pNew;.
42f0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
4300: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a  t_item *pItem, *
4310: 70 4f 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20  pOldItem;.  int 
4320: 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  i;.  if( p==0 ) 
4330: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
4340: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
4350: 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
4360: 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28  (*pNew) );.  if(
4370: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
4380: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 45 43  n 0;.  pNew->iEC
4390: 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 70 4e 65  ursor = 0;.  pNe
43a0: 77 2d 3e 6e 45 78 70 72 20 3d 20 70 4e 65 77 2d  w->nExpr = pNew-
43b0: 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 45 78  >nAlloc = p->nEx
43c0: 70 72 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20  pr;.  pNew->a = 
43d0: 70 49 74 65 6d 20 3d 20 73 71 6c 69 74 65 33 44  pItem = sqlite3D
43e0: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 20  bMallocRaw(db,  
43f0: 70 2d 3e 6e 45 78 70 72 2a 73 69 7a 65 6f 66 28  p->nExpr*sizeof(
4400: 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66  p->a[0]) );.  if
4410: 28 20 70 49 74 65 6d 3d 3d 30 20 29 7b 0a 20 20  ( pItem==0 ){.  
4420: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
4430: 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  New);.    return
4440: 20 30 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49   0;.  } .  pOldI
4450: 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f  tem = p->a;.  fo
4460: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70  r(i=0; i<p->nExp
4470: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c  r; i++, pItem++,
4480: 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20   pOldItem++){.  
4490: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
44a0: 2c 20 2a 70 4f 6c 64 45 78 70 72 3b 0a 20 20 20  , *pOldExpr;.   
44b0: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20   pItem->pExpr = 
44c0: 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74  pNewExpr = sqlit
44d0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f  e3ExprDup(db, pO
44e0: 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64 49 74 65  ldExpr = pOldIte
44f0: 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 69  m->pExpr);.    i
4500: 66 28 20 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61  f( pOldExpr->spa
4510: 6e 2e 7a 21 3d 30 20 26 26 20 70 4e 65 77 45 78  n.z!=0 && pNewEx
4520: 70 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  pr ){.      /* A
4530: 6c 77 61 79 73 20 6d 61 6b 65 20 61 20 63 6f 70  lways make a cop
4540: 79 20 6f 66 20 74 68 65 20 73 70 61 6e 20 66 6f  y of the span fo
4550: 72 20 74 6f 70 2d 6c 65 76 65 6c 20 65 78 70 72  r top-level expr
4560: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 0a 20  essions in the. 
4570: 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69       ** expressi
4580: 6f 6e 20 6c 69 73 74 2e 20 20 54 68 65 20 6c 6f  on list.  The lo
4590: 67 69 63 20 69 6e 20 53 45 4c 45 43 54 20 70 72  gic in SELECT pr
45a0: 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20 64 65  ocessing that de
45b0: 74 65 72 6d 69 6e 65 73 0a 20 20 20 20 20 20 2a  termines.      *
45c0: 2a 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63  * the names of c
45d0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
45e0: 73 75 6c 74 20 73 65 74 20 6e 65 65 64 73 20 74  sult set needs t
45f0: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
4600: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
4610: 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70  TokenCopy(db, &p
4620: 4e 65 77 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26  NewExpr->span, &
4630: 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e 29 3b  pOldExpr->span);
4640: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
4650: 74 28 20 70 4e 65 77 45 78 70 72 3d 3d 30 20 7c  t( pNewExpr==0 |
4660: 7c 20 70 4e 65 77 45 78 70 72 2d 3e 73 70 61 6e  | pNewExpr->span
4670: 2e 7a 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20  .z!=0 .         
4680: 20 20 20 7c 7c 20 70 4f 6c 64 45 78 70 72 2d 3e     || pOldExpr->
4690: 73 70 61 6e 2e 7a 3d 3d 30 0a 20 20 20 20 20 20  span.z==0.      
46a0: 20 20 20 20 20 20 7c 7c 20 64 62 2d 3e 6d 61 6c        || db->mal
46b0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
46c0: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20   pItem->zName = 
46d0: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
46e0: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e  db, pOldItem->zN
46f0: 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  ame);.    pItem-
4700: 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c  >sortOrder = pOl
4710: 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  dItem->sortOrder
4720: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 69 73 41  ;.    pItem->isA
4730: 67 67 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  gg = pOldItem->i
4740: 73 41 67 67 3b 0a 20 20 20 20 70 49 74 65 6d 2d  sAgg;.    pItem-
4750: 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  >done = 0;.  }. 
4760: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
4770: 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72  ./*.** If cursor
4780: 73 2c 20 74 72 69 67 67 65 72 73 2c 20 76 69 65  s, triggers, vie
4790: 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65  ws and subquerie
47a0: 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65  s are all omitte
47b0: 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75  d from.** the bu
47c0: 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f  ild, then none o
47d0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
47e0: 72 6f 75 74 69 6e 65 73 2c 20 65 78 63 65 70 74  routines, except
47f0: 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33   for .** sqlite3
4800: 53 65 6c 65 63 74 44 75 70 28 29 2c 20 63 61 6e  SelectDup(), can
4810: 20 62 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69   be called. sqli
4820: 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 20 69  te3SelectDup() i
4830: 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63  s sometimes.** c
4840: 61 6c 6c 65 64 20 77 69 74 68 20 61 20 4e 55 4c  alled with a NUL
4850: 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23  L argument..*/.#
4860: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
4870: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
4880: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
4890: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 5c  _OMIT_TRIGGER) \
48a0: 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  . || !defined(SQ
48b0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
48c0: 52 59 29 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c  RY).SrcList *sql
48d0: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 73  ite3SrcListDup(s
48e0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c  qlite3 *db, SrcL
48f0: 69 73 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69  ist *p){.  SrcLi
4900: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  st *pNew;.  int 
4910: 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  i;.  int nByte;.
4920: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
4930: 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d  urn 0;.  nByte =
4940: 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70   sizeof(*p) + (p
4950: 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f  ->nSrc>0 ? sizeo
4960: 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d  f(p->a[0]) * (p-
4970: 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20  >nSrc-1) : 0);. 
4980: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
4990: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 6e  bMallocRaw(db, n
49a0: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e  Byte );.  if( pN
49b0: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
49c0: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d  ;.  pNew->nSrc =
49d0: 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20   pNew->nAlloc = 
49e0: 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69  p->nSrc;.  for(i
49f0: 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69  =0; i<p->nSrc; i
4a00: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
4a10: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e  SrcList_item *pN
4a20: 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e  ewItem = &pNew->
4a30: 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74  a[i];.    struct
4a40: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
4a50: 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b  OldItem = &p->a[
4a60: 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  i];.    Table *p
4a70: 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  Tab;.    pNewIte
4a80: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73  m->zDatabase = s
4a90: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
4aa0: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61  b, pOldItem->zDa
4ab0: 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65  tabase);.    pNe
4ac0: 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  wItem->zName = s
4ad0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
4ae0: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  b, pOldItem->zNa
4af0: 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  me);.    pNewIte
4b00: 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69  m->zAlias = sqli
4b10: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
4b20: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  pOldItem->zAlias
4b30: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
4b40: 3e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 4f 6c 64  >jointype = pOld
4b50: 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a  Item->jointype;.
4b60: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43      pNewItem->iC
4b70: 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d  ursor = pOldItem
4b80: 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70  ->iCursor;.    p
4b90: 4e 65 77 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c  NewItem->isPopul
4ba0: 61 74 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  ated = pOldItem-
4bb0: 3e 69 73 50 6f 70 75 6c 61 74 65 64 3b 0a 20 20  >isPopulated;.  
4bc0: 20 20 70 54 61 62 20 3d 20 70 4e 65 77 49 74 65    pTab = pNewIte
4bd0: 6d 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49 74  m->pTab = pOldIt
4be0: 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66  em->pTab;.    if
4bf0: 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ( pTab ){.      
4c00: 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  pTab->nRef++;.  
4c10: 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d    }.    pNewItem
4c20: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
4c30: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
4c40: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65   pOldItem->pSele
4c50: 63 74 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ct);.    pNewIte
4c60: 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33  m->pOn = sqlite3
4c70: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  ExprDup(db, pOld
4c80: 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20  Item->pOn);.    
4c90: 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67  pNewItem->pUsing
4ca0: 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74   = sqlite3IdList
4cb0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
4cc0: 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 70  ->pUsing);.    p
4cd0: 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  NewItem->colUsed
4ce0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c   = pOldItem->col
4cf0: 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Used;.  }.  retu
4d00: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73  rn pNew;.}.IdLis
4d10: 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74  t *sqlite3IdList
4d20: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
4d30: 20 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49   IdList *p){.  I
4d40: 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69  dList *pNew;.  i
4d50: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30  nt i;.  if( p==0
4d60: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
4d70: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
4d80: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
4d90: 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20  eof(*pNew) );.  
4da0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
4db0: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
4dc0: 6e 49 64 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c  nId = pNew->nAll
4dd0: 6f 63 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70  oc = p->nId;.  p
4de0: 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33  New->a = sqlite3
4df0: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
4e00: 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d  p->nId*sizeof(p-
4e10: 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  >a[0]) );.  if( 
4e20: 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20  pNew->a==0 ){.  
4e30: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
4e40: 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  New);.    return
4e50: 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d   0;.  }.  for(i=
4e60: 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b  0; i<p->nId; i++
4e70: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64  ){.    struct Id
4e80: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49  List_item *pNewI
4e90: 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69  tem = &pNew->a[i
4ea0: 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64  ];.    struct Id
4eb0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49  List_item *pOldI
4ec0: 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a  tem = &p->a[i];.
4ed0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e      pNewItem->zN
4ee0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
4ef0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
4f00: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
4f10: 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20  pNewItem->idx = 
4f20: 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20  pOldItem->idx;. 
4f30: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
4f40: 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  ;.}.Select *sqli
4f50: 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c  te3SelectDup(sql
4f60: 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74  ite3 *db, Select
4f70: 20 2a 70 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a   *p){.  Select *
4f80: 70 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d 3d 30  pNew;.  if( p==0
4f90: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
4fa0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
4fb0: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
4fc0: 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
4fd0: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
4fe0: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 44  n 0;.  pNew->isD
4ff0: 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44  istinct = p->isD
5000: 69 73 74 69 6e 63 74 3b 0a 20 20 70 4e 65 77 2d  istinct;.  pNew-
5010: 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  >pEList = sqlite
5020: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
5030: 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70   p->pEList);.  p
5040: 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69  New->pSrc = sqli
5050: 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 64 62  te3SrcListDup(db
5060: 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 70 4e  , p->pSrc);.  pN
5070: 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c  ew->pWhere = sql
5080: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
5090: 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 70 4e  p->pWhere);.  pN
50a0: 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73  ew->pGroupBy = s
50b0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
50c0: 70 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42  p(db, p->pGroupB
50d0: 79 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76  y);.  pNew->pHav
50e0: 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ing = sqlite3Exp
50f0: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 48 61 76  rDup(db, p->pHav
5100: 69 6e 67 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f  ing);.  pNew->pO
5110: 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33  rderBy = sqlite3
5120: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
5130: 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
5140: 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70  pNew->op = p->op
5150: 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72  ;.  pNew->pPrior
5160: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
5170: 44 75 70 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f  Dup(db, p->pPrio
5180: 72 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d  r);.  pNew->pLim
5190: 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  it = sqlite3Expr
51a0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  Dup(db, p->pLimi
51b0: 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66  t);.  pNew->pOff
51c0: 73 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  set = sqlite3Exp
51d0: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66 66  rDup(db, p->pOff
51e0: 73 65 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c  set);.  pNew->iL
51f0: 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  imit = -1;.  pNe
5200: 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b  w->iOffset = -1;
5210: 0a 20 20 70 4e 65 77 2d 3e 69 73 52 65 73 6f 6c  .  pNew->isResol
5220: 76 65 64 20 3d 20 70 2d 3e 69 73 52 65 73 6f 6c  ved = p->isResol
5230: 76 65 64 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 41  ved;.  pNew->isA
5240: 67 67 20 3d 20 70 2d 3e 69 73 41 67 67 3b 0a 20  gg = p->isAgg;. 
5250: 20 70 4e 65 77 2d 3e 75 73 65 73 45 70 68 6d 20   pNew->usesEphm 
5260: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 64 69 73  = 0;.  pNew->dis
5270: 61 6c 6c 6f 77 4f 72 64 65 72 42 79 20 3d 20 30  allowOrderBy = 0
5280: 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74  ;.  pNew->pRight
5290: 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77  most = 0;.  pNew
52a0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
52b0: 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  ] = -1;.  pNew->
52c0: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
52d0: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64  = -1;.  pNew->ad
52e0: 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20  drOpenEphm[2] = 
52f0: 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  -1;.  return pNe
5300: 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63  w;.}.#else.Selec
5310: 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74  t *sqlite3Select
5320: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
5330: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 61   Select *p){.  a
5340: 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20  ssert( p==0 );. 
5350: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
5360: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  dif.../*.** Add 
5370: 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
5380: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20 65   the end of an e
5390: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20  xpression list. 
53a0: 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20   If pList is.** 
53b0: 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20  initially NULL, 
53c0: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65  then create a ne
53d0: 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  w expression lis
53e0: 74 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a  t..*/.ExprList *
53f0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
5400: 70 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a  ppend(.  Parse *
5410: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
5420: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
5430: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
5440: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20  t *pList,       
5450: 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63   /* List to whic
5460: 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67  h to append. Mig
5470: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
5480: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
5490: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
54a0: 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65  ssion to be appe
54b0: 6e 64 65 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  nded */.  Token 
54c0: 2a 70 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20  *pName          
54d0: 20 20 2f 2a 20 41 53 20 6b 65 79 77 6f 72 64 20    /* AS keyword 
54e0: 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69  for the expressi
54f0: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  on */.){.  sqlit
5500: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
5510: 3e 64 62 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  >db;.  if( pList
5520: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ==0 ){.    pList
5530: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
5540: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
5550: 66 28 45 78 70 72 4c 69 73 74 29 20 29 3b 0a 20  f(ExprList) );. 
5560: 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
5570: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f  ){.      goto no
5580: 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _mem;.    }.    
5590: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
55a0: 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 7d 0a  Alloc==0 );.  }.
55b0: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 41 6c    if( pList->nAl
55c0: 6c 6f 63 3c 3d 70 4c 69 73 74 2d 3e 6e 45 78 70  loc<=pList->nExp
55d0: 72 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  r ){.    struct 
55e0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
55f0: 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c  ;.    int n = pL
5600: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20  ist->nAlloc*2 + 
5610: 34 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74  4;.    a = sqlit
5620: 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
5630: 70 4c 69 73 74 2d 3e 61 2c 20 6e 2a 73 69 7a 65  pList->a, n*size
5640: 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29  of(pList->a[0]))
5650: 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29  ;.    if( a==0 )
5660: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f  {.      goto no_
5670: 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  mem;.    }.    p
5680: 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 20  List->a = a;.   
5690: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d   pList->nAlloc =
56a0: 20 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   n;.  }.  assert
56b0: 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 29 3b  ( pList->a!=0 );
56c0: 0a 20 20 69 66 28 20 70 45 78 70 72 20 7c 7c 20  .  if( pExpr || 
56d0: 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 74 72  pName ){.    str
56e0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
56f0: 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73  m *pItem = &pLis
5700: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70  t->a[pList->nExp
5710: 72 2b 2b 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74  r++];.    memset
5720: 28 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f  (pItem, 0, sizeo
5730: 66 28 2a 70 49 74 65 6d 29 29 3b 0a 20 20 20 20  f(*pItem));.    
5740: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
5750: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
5760: 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  ken(db, pName);.
5770: 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72      pItem->pExpr
5780: 20 3d 20 70 45 78 70 72 3b 0a 20 20 7d 0a 20 20   = pExpr;.  }.  
5790: 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e  return pList;..n
57a0: 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f 2a  o_mem:     .  /*
57b0: 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d   Avoid leaking m
57c0: 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20  emory if malloc 
57d0: 68 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20  has failed. */. 
57e0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
57f0: 74 65 28 70 45 78 70 72 29 3b 0a 20 20 73 71 6c  te(pExpr);.  sql
5800: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
5810: 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  te(pList);.  ret
5820: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
5830: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
5840: 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20 63 6f  n list pEList co
5850: 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e  ntains more than
5860: 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e 74 73   iLimit elements
5870: 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72  ,.** leave an er
5880: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
5890: 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  Parse..*/.void s
58a0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 68  qlite3ExprListCh
58b0: 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50 61 72  eckLength(.  Par
58c0: 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 45 78  se *pParse,.  Ex
58d0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 0a  prList *pEList,.
58e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
58f0: 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74 20 6d  bject.){.  int m
5900: 78 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  x = pParse->db->
5910: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
5920: 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 74  MIT_COLUMN];.  t
5930: 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74 20  estcase( pEList 
5940: 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
5950: 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74 63 61  ==mx );.  testca
5960: 73 65 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  se( pEList && pE
5970: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 2b  List->nExpr==mx+
5980: 31 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  1 );.  if( pELis
5990: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
59a0: 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73 71 6c  pr>mx ){.    sql
59b0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
59c0: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63  rse, "too many c
59d0: 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c 20 7a  olumns in %s", z
59e0: 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  Object);.  }.}..
59f0: 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ./* The followin
5a00: 67 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e  g three function
5a10: 73 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72 28  s, heightOfExpr(
5a20: 29 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c  ), heightOfExprL
5a30: 69 73 74 28 29 0a 2a 2a 20 61 6e 64 20 68 65 69  ist().** and hei
5a40: 67 68 74 4f 66 53 65 6c 65 63 74 28 29 2c 20 61  ghtOfSelect(), a
5a50: 72 65 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  re used to deter
5a60: 6d 69 6e 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  mine the maximum
5a70: 20 68 65 69 67 68 74 0a 2a 2a 20 6f 66 20 61 6e   height.** of an
5a80: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  y expression tre
5a90: 65 20 72 65 66 65 72 65 6e 63 65 64 20 62 79 20  e referenced by 
5aa0: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70 61  the structure pa
5ab0: 73 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 66  ssed as the.** f
5ac0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  irst argument..*
5ad0: 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d 61 78  *.** If this max
5ae0: 69 6d 75 6d 20 68 65 69 67 68 74 20 69 73 20 67  imum height is g
5af0: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
5b00: 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 70 6f  current value po
5b10: 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 70  inted.** to by p
5b20: 6e 48 65 69 67 68 74 2c 20 74 68 65 20 73 65 63  nHeight, the sec
5b30: 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 2c 20 74  ond parameter, t
5b40: 68 65 6e 20 73 65 74 20 2a 70 6e 48 65 69 67 68  hen set *pnHeigh
5b50: 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c  t to that.** val
5b60: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ue..*/.static vo
5b70: 69 64 20 68 65 69 67 68 74 4f 66 45 78 70 72 28  id heightOfExpr(
5b80: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 6e  Expr *p, int *pn
5b90: 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70  Height){.  if( p
5ba0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e   ){.    if( p->n
5bb0: 48 65 69 67 68 74 3e 2a 70 6e 48 65 69 67 68 74  Height>*pnHeight
5bc0: 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e 48 65 69   ){.      *pnHei
5bd0: 67 68 74 20 3d 20 70 2d 3e 6e 48 65 69 67 68 74  ght = p->nHeight
5be0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74  ;.    }.  }.}.st
5bf0: 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74  atic void height
5c00: 4f 66 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c  OfExprList(ExprL
5c10: 69 73 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48  ist *p, int *pnH
5c20: 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20  eight){.  if( p 
5c30: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
5c40: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
5c50: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
5c60: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28     heightOfExpr(
5c70: 70 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70  p->a[i].pExpr, p
5c80: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a  nHeight);.    }.
5c90: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
5ca0: 64 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74  d heightOfSelect
5cb0: 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20  (Select *p, int 
5cc0: 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66  *pnHeight){.  if
5cd0: 28 20 70 20 29 7b 0a 20 20 20 20 68 65 69 67 68  ( p ){.    heigh
5ce0: 74 4f 66 45 78 70 72 28 70 2d 3e 70 57 68 65 72  tOfExpr(p->pWher
5cf0: 65 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  e, pnHeight);.  
5d00: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
5d10: 2d 3e 70 48 61 76 69 6e 67 2c 20 70 6e 48 65 69  ->pHaving, pnHei
5d20: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
5d30: 4f 66 45 78 70 72 28 70 2d 3e 70 4c 69 6d 69 74  OfExpr(p->pLimit
5d40: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
5d50: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
5d60: 3e 70 4f 66 66 73 65 74 2c 20 70 6e 48 65 69 67  >pOffset, pnHeig
5d70: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
5d80: 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c  fExprList(p->pEL
5d90: 69 73 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  ist, pnHeight);.
5da0: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
5db0: 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79  List(p->pGroupBy
5dc0: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
5dd0: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
5de0: 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70  t(p->pOrderBy, p
5df0: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
5e00: 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e  ightOfSelect(p->
5e10: 70 50 72 69 6f 72 2c 20 70 6e 48 65 69 67 68 74  pPrior, pnHeight
5e20: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
5e30: 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65  Set the Expr.nHe
5e40: 69 67 68 74 20 76 61 72 69 61 62 6c 65 20 69 6e  ight variable in
5e50: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70   the structure p
5e60: 61 73 73 65 64 20 61 73 20 61 6e 20 0a 2a 2a 20  assed as an .** 
5e70: 61 72 67 75 6d 65 6e 74 2e 20 41 6e 20 65 78 70  argument. An exp
5e80: 72 65 73 73 69 6f 6e 20 77 69 74 68 20 6e 6f 20  ression with no 
5e90: 63 68 69 6c 64 72 65 6e 2c 20 45 78 70 72 2e 70  children, Expr.p
5ea0: 4c 69 73 74 20 6f 72 20 0a 2a 2a 20 45 78 70 72  List or .** Expr
5eb0: 2e 70 53 65 6c 65 63 74 20 6d 65 6d 62 65 72 20  .pSelect member 
5ec0: 68 61 73 20 61 20 68 65 69 67 68 74 20 6f 66 20  has a height of 
5ed0: 31 2e 20 41 6e 79 20 6f 74 68 65 72 20 65 78 70  1. Any other exp
5ee0: 72 65 73 73 69 6f 6e 0a 2a 2a 20 68 61 73 20 61  ression.** has a
5ef0: 20 68 65 69 67 68 74 20 65 71 75 61 6c 20 74 6f   height equal to
5f00: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69   the maximum hei
5f10: 67 68 74 20 6f 66 20 61 6e 79 20 6f 74 68 65 72  ght of any other
5f20: 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 64 20   .** referenced 
5f30: 45 78 70 72 20 70 6c 75 73 20 6f 6e 65 2e 0a 2a  Expr plus one..*
5f40: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
5f50: 70 72 53 65 74 48 65 69 67 68 74 28 45 78 70 72  prSetHeight(Expr
5f60: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69   *p){.  int nHei
5f70: 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68  ght = 0;.  heigh
5f80: 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65 66 74  tOfExpr(p->pLeft
5f90: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 68  , &nHeight);.  h
5fa0: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
5fb0: 52 69 67 68 74 2c 20 26 6e 48 65 69 67 68 74 29  Right, &nHeight)
5fc0: 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70 72  ;.  heightOfExpr
5fd0: 4c 69 73 74 28 70 2d 3e 70 4c 69 73 74 2c 20 26  List(p->pList, &
5fe0: 6e 48 65 69 67 68 74 29 3b 0a 20 20 68 65 69 67  nHeight);.  heig
5ff0: 68 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e 70 53  htOfSelect(p->pS
6000: 65 6c 65 63 74 2c 20 26 6e 48 65 69 67 68 74 29  elect, &nHeight)
6010: 3b 0a 20 20 70 2d 3e 6e 48 65 69 67 68 74 20 3d  ;.  p->nHeight =
6020: 20 6e 48 65 69 67 68 74 20 2b 20 31 3b 0a 7d 0a   nHeight + 1;.}.
6030: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
6040: 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74  e maximum height
6050: 20 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73 69   of any expressi
6060: 6f 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e 63  on tree referenc
6070: 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 65 6c  ed.** by the sel
6080: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61  ect statement pa
6090: 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
60a0: 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
60b0: 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69  te3SelectExprHei
60c0: 67 68 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  ght(Select *p){.
60d0: 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20    int nHeight = 
60e0: 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c  0;.  heightOfSel
60f0: 65 63 74 28 70 2c 20 26 6e 48 65 69 67 68 74 29  ect(p, &nHeight)
6100: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 48 65 69 67  ;.  return nHeig
6110: 68 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  ht;.}../*.** Del
6120: 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78  ete an entire ex
6130: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
6140: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
6150: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 45 78 70  prListDelete(Exp
6160: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
6170: 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
6180: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
6190: 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69  pItem;.  if( pLi
61a0: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
61b0: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
61c0: 3e 61 21 3d 30 20 7c 7c 20 28 70 4c 69 73 74 2d  >a!=0 || (pList-
61d0: 3e 6e 45 78 70 72 3d 3d 30 20 26 26 20 70 4c 69  >nExpr==0 && pLi
61e0: 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 29 20 29  st->nAlloc==0) )
61f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
6200: 74 2d 3e 6e 45 78 70 72 3c 3d 70 4c 69 73 74 2d  t->nExpr<=pList-
6210: 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 20 20 66 6f 72  >nAlloc );.  for
6220: 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
6230: 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e   i=0; i<pList->n
6240: 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
6250: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
6260: 45 78 70 72 44 65 6c 65 74 65 28 70 49 74 65 6d  ExprDelete(pItem
6270: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71  ->pExpr);.    sq
6280: 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 6d  lite3_free(pItem
6290: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ->zName);.  }.  
62a0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 69  sqlite3_free(pLi
62b0: 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65  st->a);.  sqlite
62c0: 33 5f 66 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d  3_free(pList);.}
62d0: 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  ../*.** Walk an 
62e0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
62f0: 20 20 43 61 6c 6c 20 78 46 75 6e 63 20 66 6f 72    Call xFunc for
6300: 20 65 61 63 68 20 6e 6f 64 65 20 76 69 73 69 74   each node visit
6310: 65 64 2e 20 20 78 46 75 6e 63 0a 2a 2a 20 69 73  ed.  xFunc.** is
6320: 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e   called on the n
6330: 6f 64 65 20 62 65 66 6f 72 65 20 78 46 75 6e 63  ode before xFunc
6340: 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68   is called on th
6350: 65 20 6e 6f 64 65 73 20 63 68 69 6c 64 72 65 6e  e nodes children
6360: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
6370: 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 78 46  rn value from xF
6380: 75 6e 63 20 64 65 74 65 72 6d 69 6e 65 73 20 77  unc determines w
6390: 68 65 74 68 65 72 20 74 68 65 20 74 72 65 65 20  hether the tree 
63a0: 77 61 6c 6b 20 63 6f 6e 74 69 6e 75 65 73 2e 0a  walk continues..
63b0: 2a 2a 20 30 20 6d 65 61 6e 73 20 63 6f 6e 74 69  ** 0 means conti
63c0: 6e 75 65 20 77 61 6c 6b 69 6e 67 20 74 68 65 20  nue walking the 
63d0: 74 72 65 65 2e 20 20 31 20 6d 65 61 6e 73 20 64  tree.  1 means d
63e0: 6f 20 6e 6f 74 20 77 61 6c 6b 20 63 68 69 6c 64  o not walk child
63f0: 72 65 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 63 75  ren.** of the cu
6400: 72 72 65 6e 74 20 6e 6f 64 65 20 62 75 74 20 63  rrent node but c
6410: 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 73 69 62  ontinue with sib
6420: 6c 69 6e 67 73 2e 20 20 32 20 6d 65 61 6e 73 20  lings.  2 means 
6430: 61 62 61 6e 64 6f 6e 0a 2a 2a 20 74 68 65 20 74  abandon.** the t
6440: 72 65 65 20 77 61 6c 6b 20 63 6f 6d 70 6c 65 74  ree walk complet
6450: 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ely..**.** The r
6460: 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d  eturn value from
6470: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
6480: 20 31 20 74 6f 20 61 62 61 6e 64 6f 6e 20 74 68   1 to abandon th
6490: 65 20 74 72 65 65 20 77 61 6c 6b 0a 2a 2a 20 61  e tree walk.** a
64a0: 6e 64 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75 65  nd 0 to continue
64b0: 2e 0a 2a 2a 0a 2a 2a 20 4e 4f 54 49 43 45 3a 20  ..**.** NOTICE: 
64c0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
64d0: 65 73 20 2a 6e 6f 74 2a 20 64 65 73 63 65 6e 64  es *not* descend
64e0: 20 69 6e 74 6f 20 73 75 62 71 75 65 72 69 65 73   into subqueries
64f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6500: 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 45 78 70  walkExprList(Exp
6510: 72 4c 69 73 74 20 2a 2c 20 69 6e 74 20 28 2a 29  rList *, int (*)
6520: 28 76 6f 69 64 20 2a 2c 20 45 78 70 72 2a 29 2c  (void *, Expr*),
6530: 20 76 6f 69 64 20 2a 29 3b 0a 73 74 61 74 69 63   void *);.static
6540: 20 69 6e 74 20 77 61 6c 6b 45 78 70 72 54 72 65   int walkExprTre
6550: 65 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  e(Expr *pExpr, i
6560: 6e 74 20 28 2a 78 46 75 6e 63 29 28 76 6f 69 64  nt (*xFunc)(void
6570: 2a 2c 45 78 70 72 2a 29 2c 20 76 6f 69 64 20 2a  *,Expr*), void *
6580: 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pArg){.  int rc;
6590: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
65a0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 63  ) return 0;.  rc
65b0: 20 3d 20 28 2a 78 46 75 6e 63 29 28 70 41 72 67   = (*xFunc)(pArg
65c0: 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  , pExpr);.  if( 
65d0: 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  rc==0 ){.    if(
65e0: 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70 45   walkExprTree(pE
65f0: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 78 46 75 6e  xpr->pLeft, xFun
6600: 63 2c 20 70 41 72 67 29 20 29 20 72 65 74 75 72  c, pArg) ) retur
6610: 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 77 61 6c  n 1;.    if( wal
6620: 6b 45 78 70 72 54 72 65 65 28 70 45 78 70 72 2d  kExprTree(pExpr-
6630: 3e 70 52 69 67 68 74 2c 20 78 46 75 6e 63 2c 20  >pRight, xFunc, 
6640: 70 41 72 67 29 20 29 20 72 65 74 75 72 6e 20 31  pArg) ) return 1
6650: 3b 0a 20 20 20 20 69 66 28 20 77 61 6c 6b 45 78  ;.    if( walkEx
6660: 70 72 4c 69 73 74 28 70 45 78 70 72 2d 3e 70 4c  prList(pExpr->pL
6670: 69 73 74 2c 20 78 46 75 6e 63 2c 20 70 41 72 67  ist, xFunc, pArg
6680: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
6690: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3e 31 3b  }.  return rc>1;
66a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 77  .}../*.** Call w
66b0: 61 6c 6b 45 78 70 72 54 72 65 65 28 29 20 66 6f  alkExprTree() fo
66c0: 72 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69  r every expressi
66d0: 6f 6e 20 69 6e 20 6c 69 73 74 20 70 2e 0a 2a 2f  on in list p..*/
66e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c 6b  .static int walk
66f0: 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73  ExprList(ExprLis
6700: 74 20 2a 70 2c 20 69 6e 74 20 28 2a 78 46 75 6e  t *p, int (*xFun
6710: 63 29 28 76 6f 69 64 20 2a 2c 20 45 78 70 72 2a  c)(void *, Expr*
6720: 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  ), void *pArg){.
6730: 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
6740: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
6750: 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 21 70  *pItem;.  if( !p
6760: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66   ) return 0;.  f
6770: 6f 72 28 69 3d 70 2d 3e 6e 45 78 70 72 2c 20 70  or(i=p->nExpr, p
6780: 49 74 65 6d 3d 70 2d 3e 61 3b 20 69 3e 30 3b 20  Item=p->a; i>0; 
6790: 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i--, pItem++){. 
67a0: 20 20 20 69 66 28 20 77 61 6c 6b 45 78 70 72 54     if( walkExprT
67b0: 72 65 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72  ree(pItem->pExpr
67c0: 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 20 29  , xFunc, pArg) )
67d0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
67e0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
67f0: 0a 2a 2a 20 43 61 6c 6c 20 77 61 6c 6b 45 78 70  .** Call walkExp
6800: 72 54 72 65 65 28 29 20 66 6f 72 20 65 76 65 72  rTree() for ever
6810: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  y expression in 
6820: 53 65 6c 65 63 74 20 70 2c 20 6e 6f 74 20 69 6e  Select p, not in
6830: 63 6c 75 64 69 6e 67 0a 2a 2a 20 65 78 70 72 65  cluding.** expre
6840: 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  ssions that are 
6850: 70 61 72 74 20 6f 66 20 73 75 62 2d 73 65 6c 65  part of sub-sele
6860: 63 74 73 20 69 6e 20 61 6e 79 20 46 52 4f 4d 20  cts in any FROM 
6870: 63 6c 61 75 73 65 20 6f 72 20 74 68 65 20 4c 49  clause or the LI
6880: 4d 49 54 0a 2a 2a 20 6f 72 20 4f 46 46 53 45 54  MIT.** or OFFSET
6890: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 2e 0a 2a   expressions...*
68a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c  /.static int wal
68b0: 6b 53 65 6c 65 63 74 45 78 70 72 28 53 65 6c 65  kSelectExpr(Sele
68c0: 63 74 20 2a 70 2c 20 69 6e 74 20 28 2a 78 46 75  ct *p, int (*xFu
68d0: 6e 63 29 28 76 6f 69 64 20 2a 2c 20 45 78 70 72  nc)(void *, Expr
68e0: 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  *), void *pArg){
68f0: 0a 20 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28  .  walkExprList(
6900: 70 2d 3e 70 45 4c 69 73 74 2c 20 78 46 75 6e 63  p->pEList, xFunc
6910: 2c 20 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b 45  , pArg);.  walkE
6920: 78 70 72 54 72 65 65 28 70 2d 3e 70 57 68 65 72  xprTree(p->pWher
6930: 65 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 3b  e, xFunc, pArg);
6940: 0a 20 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28  .  walkExprList(
6950: 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 78 46 75  p->pGroupBy, xFu
6960: 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 77 61 6c  nc, pArg);.  wal
6970: 6b 45 78 70 72 54 72 65 65 28 70 2d 3e 70 48 61  kExprTree(p->pHa
6980: 76 69 6e 67 2c 20 78 46 75 6e 63 2c 20 70 41 72  ving, xFunc, pAr
6990: 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72 4c 69  g);.  walkExprLi
69a0: 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  st(p->pOrderBy, 
69b0: 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20  xFunc, pArg);.  
69c0: 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
69d0: 0a 20 20 20 20 77 61 6c 6b 53 65 6c 65 63 74 45  .    walkSelectE
69e0: 78 70 72 28 70 2d 3e 70 50 72 69 6f 72 2c 20 78  xpr(p->pPrior, x
69f0: 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 7d  Func, pArg);.  }
6a00: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
6a10: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
6a20: 69 6e 65 20 69 73 20 64 65 73 69 67 6e 65 64 20  ine is designed 
6a30: 61 73 20 61 6e 20 78 46 75 6e 63 20 66 6f 72 20  as an xFunc for 
6a40: 77 61 6c 6b 45 78 70 72 54 72 65 65 28 29 2e 0a  walkExprTree()..
6a50: 2a 2a 0a 2a 2a 20 70 41 72 67 20 69 73 20 72 65  **.** pArg is re
6a60: 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74  ally a pointer t
6a70: 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 49  o an integer.  I
6a80: 66 20 77 65 20 63 61 6e 20 74 65 6c 6c 20 62 79  f we can tell by
6a90: 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 61 74 20 70   looking.** at p
6aa0: 45 78 70 72 20 74 68 61 74 20 74 68 65 20 65 78  Expr that the ex
6ab0: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f  pression that co
6ac0: 6e 74 61 69 6e 73 20 70 45 78 70 72 20 69 73 20  ntains pExpr is 
6ad0: 6e 6f 74 20 61 20 63 6f 6e 73 74 61 6e 74 0a 2a  not a constant.*
6ae0: 2a 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  * expression, th
6af0: 65 6e 20 73 65 74 20 2a 70 41 72 67 20 74 6f 20  en set *pArg to 
6b00: 30 20 61 6e 64 20 72 65 74 75 72 6e 20 32 20 74  0 and return 2 t
6b10: 6f 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 74 72  o abandon the tr
6b20: 65 65 20 77 61 6c 6b 2e 0a 2a 2a 20 49 66 20 70  ee walk..** If p
6b30: 45 78 70 72 20 64 6f 65 73 20 64 6f 65 73 20 6e  Expr does does n
6b40: 6f 74 20 64 69 73 71 75 61 6c 69 66 79 20 74 68  ot disqualify th
6b50: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f  e expression fro
6b60: 6d 20 62 65 69 6e 67 20 61 20 63 6f 6e 73 74 61  m being a consta
6b70: 6e 74 0a 2a 2a 20 74 68 65 6e 20 64 6f 20 6e 6f  nt.** then do no
6b80: 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 66 74  thing..**.** Aft
6b90: 65 72 20 77 61 6c 6b 69 6e 67 20 74 68 65 20 77  er walking the w
6ba0: 68 6f 6c 65 20 74 72 65 65 2c 20 69 66 20 6e 6f  hole tree, if no
6bb0: 20 6e 6f 64 65 73 20 61 72 65 20 66 6f 75 6e 64   nodes are found
6bc0: 20 74 68 61 74 20 64 69 73 71 75 61 6c 69 66 79   that disqualify
6bd0: 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73 69  .** the expressi
6be0: 6f 6e 20 61 73 20 63 6f 6e 73 74 61 6e 74 2c 20  on as constant, 
6bf0: 74 68 65 6e 20 77 65 20 61 73 73 75 6d 65 20 74  then we assume t
6c00: 68 65 20 77 68 6f 6c 65 20 65 78 70 72 65 73 73  he whole express
6c10: 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 74 61  ion.** is consta
6c20: 6e 74 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  nt.  See sqlite3
6c30: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 29  ExprIsConstant()
6c40: 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
6c50: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
6c60: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e  static int exprN
6c70: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 76 6f  odeIsConstant(vo
6c80: 69 64 20 2a 70 41 72 67 2c 20 45 78 70 72 20 2a  id *pArg, Expr *
6c90: 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 2a 70  pExpr){.  int *p
6ca0: 4e 20 3d 20 28 69 6e 74 2a 29 70 41 72 67 3b 0a  N = (int*)pArg;.
6cb0: 0a 20 20 2f 2a 20 49 66 20 2a 70 41 72 67 20 69  .  /* If *pArg i
6cc0: 73 20 33 20 74 68 65 6e 20 61 6e 79 20 74 65 72  s 3 then any ter
6cd0: 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  m of the express
6ce0: 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66  ion that comes f
6cf0: 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20  rom.  ** the ON 
6d00: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
6d10: 20 6f 66 20 61 20 6a 6f 69 6e 20 64 69 73 71 75   of a join disqu
6d20: 61 6c 69 66 69 65 73 20 74 68 65 20 65 78 70 72  alifies the expr
6d30: 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d  ession.  ** from
6d40: 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65   being considere
6d50: 64 20 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20  d constant. */. 
6d60: 20 69 66 28 20 28 2a 70 4e 29 3d 3d 33 20 26 26   if( (*pN)==3 &&
6d70: 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65   ExprHasAnyPrope
6d80: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
6d90: 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 2a  omJoin) ){.    *
6da0: 70 4e 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  pN = 0;.    retu
6db0: 72 6e 20 32 3b 0a 20 20 7d 0a 0a 20 20 73 77 69  rn 2;.  }..  swi
6dc0: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
6dd0: 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65  {.    /* Conside
6de0: 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62  r functions to b
6df0: 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c  e constant if al
6e00: 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74  l their argument
6e10: 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20  s are constant. 
6e20: 20 20 20 2a 2a 20 61 6e 64 20 2a 70 41 72 67 3d     ** and *pArg=
6e30: 3d 32 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  =2 */.    case T
6e40: 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  K_FUNCTION:.    
6e50: 20 20 69 66 28 20 28 2a 70 4e 29 3d 3d 32 20 29    if( (*pN)==2 )
6e60: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
6e70: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
6e80: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
6e90: 49 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ID:.    case TK_
6ea0: 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
6eb0: 20 54 4b 5f 44 4f 54 3a 0a 20 20 20 20 63 61 73   TK_DOT:.    cas
6ec0: 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  e TK_AGG_FUNCTIO
6ed0: 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  N:.    case TK_A
6ee0: 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 23 69 66 6e 64  GG_COLUMN:.#ifnd
6ef0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
6f00: 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
6f10: 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20   TK_SELECT:.    
6f20: 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a  case TK_EXISTS:.
6f30: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
6f40: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
6f50: 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 74 65  LECT );.      te
6f60: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
6f70: 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a  p==TK_EXISTS );.
6f80: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 74 65 73  #endif.      tes
6f90: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
6fa0: 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20 20 20 20  ==TK_ID );.     
6fb0: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
6fc0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
6fd0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
6fe0: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
6ff0: 5f 44 4f 54 20 29 3b 0a 20 20 20 20 20 20 74 65  _DOT );.      te
7000: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
7010: 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
7020: 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ON );.      test
7030: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
7040: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
7050: 3b 0a 20 20 20 20 20 20 2a 70 4e 20 3d 20 30 3b  ;.      *pN = 0;
7060: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b  .      return 2;
7070: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
7080: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
7090: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
70a0: 20 20 20 20 20 2a 70 4e 20 3d 20 30 3b 0a 20 20       *pN = 0;.  
70b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a        return 2;.
70c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61        }.    defa
70d0: 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72  ult:.      retur
70e0: 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  n 0;.  }.}../*.*
70f0: 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
7100: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
7110: 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72  rn 1 if the expr
7120: 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61  ession is consta
7130: 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20 69  nt.** and 0 if i
7140: 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61  t involves varia
7150: 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e  bles or function
7160: 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f   calls..**.** Fo
7170: 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
7180: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  f this function,
7190: 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64   a double-quoted
71a0: 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62   string (ex: "ab
71b0: 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64  c").** is consid
71c0: 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65 20  ered a variable 
71d0: 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f  but a single-quo
71e0: 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20  ted string (ex: 
71f0: 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63  'abc') is.** a c
7200: 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  onstant..*/.int 
7210: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
7220: 73 74 61 6e 74 28 45 78 70 72 20 2a 70 29 7b 0a  stant(Expr *p){.
7230: 20 20 69 6e 74 20 69 73 43 6f 6e 73 74 20 3d 20    int isConst = 
7240: 31 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65  1;.  walkExprTre
7250: 65 28 70 2c 20 65 78 70 72 4e 6f 64 65 49 73 43  e(p, exprNodeIsC
7260: 6f 6e 73 74 61 6e 74 2c 20 26 69 73 43 6f 6e 73  onstant, &isCons
7270: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 73 43  t);.  return isC
7280: 6f 6e 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  onst;.}../*.** W
7290: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
72a0: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
72b0: 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  1 if the express
72c0: 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
72d0: 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 20  ** that does no 
72e0: 6f 72 69 67 69 6e 61 74 65 20 66 72 6f 6d 20 74  originate from t
72f0: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
7300: 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e  lauses of a join
7310: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66  ..** Return 0 if
7320: 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72   it involves var
7330: 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69  iables or functi
7340: 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74 65 72 6d  on calls or term
7350: 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e 20  s from.** an ON 
7360: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  or USING clause.
7370: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
7380: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
7390: 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20  Join(Expr *p){. 
73a0: 20 69 6e 74 20 69 73 43 6f 6e 73 74 20 3d 20 33   int isConst = 3
73b0: 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65  ;.  walkExprTree
73c0: 28 70 2c 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  (p, exprNodeIsCo
73d0: 6e 73 74 61 6e 74 2c 20 26 69 73 43 6f 6e 73 74  nstant, &isConst
73e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 73 43 6f  );.  return isCo
73f0: 6e 73 74 21 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nst!=0;.}../*.**
7400: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
7410: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
7420: 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65  n 1 if the expre
7430: 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
7440: 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74 69  t.** or a functi
7450: 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e  on call with con
7460: 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e  stant arguments.
7470: 20 20 52 65 74 75 72 6e 20 61 6e 64 20 30 20 69    Return and 0 i
7480: 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 61  f there.** are a
7490: 6e 79 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a  ny variables..**
74a0: 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70  .** For the purp
74b0: 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e  oses of this fun
74c0: 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d  ction, a double-
74d0: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
74e0: 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20  x: "abc").** is 
74f0: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72  considered a var
7500: 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67  iable but a sing
7510: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
7520: 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a   (ex: 'abc') is.
7530: 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a  ** a constant..*
7540: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
7550: 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e  rIsConstantOrFun
7560: 63 74 69 6f 6e 28 45 78 70 72 20 2a 70 29 7b 0a  ction(Expr *p){.
7570: 20 20 69 6e 74 20 69 73 43 6f 6e 73 74 20 3d 20    int isConst = 
7580: 32 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65  2;.  walkExprTre
7590: 65 28 70 2c 20 65 78 70 72 4e 6f 64 65 49 73 43  e(p, exprNodeIsC
75a0: 6f 6e 73 74 61 6e 74 2c 20 26 69 73 43 6f 6e 73  onstant, &isCons
75b0: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 73 43  t);.  return isC
75c0: 6f 6e 73 74 21 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  onst!=0;.}../*.*
75d0: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
75e0: 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20 63 6f  ion p codes a co
75f0: 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20 74  nstant integer t
7600: 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f  hat is small eno
7610: 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e  ugh.** to fit in
7620: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
7630: 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64 20  r, return 1 and 
7640: 70 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  put the value of
7650: 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20   the integer.** 
7660: 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66 20  in *pValue.  If 
7670: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
7680: 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72  s not an integer
7690: 20 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f 6f   or if it is too
76a0: 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69   big.** to fit i
76b0: 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69  n a signed 32-bi
76c0: 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72  t integer, retur
76d0: 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a 70  n 0 and leave *p
76e0: 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64 2e  Value unchanged.
76f0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
7700: 78 70 72 49 73 49 6e 74 65 67 65 72 28 45 78 70  xprIsInteger(Exp
7710: 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75  r *p, int *pValu
7720: 65 29 7b 0a 20 20 73 77 69 74 63 68 28 20 70 2d  e){.  switch( p-
7730: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
7740: 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20  TK_INTEGER: {.  
7750: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
7760: 65 74 49 6e 74 33 32 28 28 63 68 61 72 2a 29 70  etInt32((char*)p
7770: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 56 61 6c 75  ->token.z, pValu
7780: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  e) ){.        re
7790: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
77a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
77b0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
77c0: 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 65  PLUS: {.      re
77d0: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
77e0: 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65  IsInteger(p->pLe
77f0: 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20  ft, pValue);.   
7800: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
7810: 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 69  MINUS: {.      i
7820: 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66 28 20  nt v;.      if( 
7830: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
7840: 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26  eger(p->pLeft, &
7850: 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  v) ){.        *p
7860: 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20  Value = -v;.    
7870: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
7880: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
7890: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
78a0: 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d  ault: break;.  }
78b0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
78c0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
78d0: 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 73  E if the given s
78e0: 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d 69  tring is a row-i
78f0: 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a  d column name..*
7900: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73 52  /.int sqlite3IsR
7910: 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72 20  owid(const char 
7920: 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  *z){.  if( sqlit
7930: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52  e3StrICmp(z, "_R
7940: 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65 74  OWID_")==0 ) ret
7950: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c  urn 1;.  if( sql
7960: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
7970: 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65 74  ROWID")==0 ) ret
7980: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c  urn 1;.  if( sql
7990: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
79a0: 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72  OID")==0 ) retur
79b0: 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  n 1;.  return 0;
79c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
79d0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f  the name of a co
79e0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d  lumn of the form
79f0: 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20 6f 72   X.Y.Z or Y.Z or
7a00: 20 6a 75 73 74 20 5a 2c 20 6c 6f 6f 6b 20 75 70   just Z, look up
7a10: 0a 2a 2a 20 74 68 61 74 20 6e 61 6d 65 20 69 6e  .** that name in
7a20: 20 74 68 65 20 73 65 74 20 6f 66 20 73 6f 75 72   the set of sour
7a30: 63 65 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72  ce tables in pSr
7a40: 63 4c 69 73 74 20 61 6e 64 20 6d 61 6b 65 20 74  cList and make t
7a50: 68 65 20 70 45 78 70 72 20 0a 2a 2a 20 65 78 70  he pExpr .** exp
7a60: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 72 65 66  ression node ref
7a70: 65 72 20 62 61 63 6b 20 74 6f 20 74 68 61 74 20  er back to that 
7a80: 73 6f 75 72 63 65 20 63 6f 6c 75 6d 6e 2e 20 20  source column.  
7a90: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
7aa0: 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64  anges.** are mad
7ab0: 65 20 74 6f 20 70 45 78 70 72 3a 0a 2a 2a 0a 2a  e to pExpr:.**.*
7ac0: 2a 20 20 20 20 70 45 78 70 72 2d 3e 69 44 62 20  *    pExpr->iDb 
7ad0: 20 20 20 20 20 20 20 20 20 20 53 65 74 20 74 68            Set th
7ae0: 65 20 69 6e 64 65 78 20 69 6e 20 64 62 2d 3e 61  e index in db->a
7af0: 44 62 5b 5d 20 6f 66 20 74 68 65 20 64 61 74 61  Db[] of the data
7b00: 62 61 73 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20  base holding.** 
7b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b20: 20 20 20 20 20 20 20 20 74 68 65 20 74 61 62 6c          the tabl
7b30: 65 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e  e..**    pExpr->
7b40: 69 54 61 62 6c 65 20 20 20 20 20 20 20 20 53 65  iTable        Se
7b50: 74 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72 20  t to the cursor 
7b60: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74  number for the t
7b70: 61 62 6c 65 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  able obtained.**
7b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b90: 20 20 20 20 20 20 20 20 20 66 72 6f 6d 20 70 53           from pS
7ba0: 72 63 4c 69 73 74 2e 0a 2a 2a 20 20 20 20 70 45  rcList..**    pE
7bb0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 20 20 20  xpr->iColumn    
7bc0: 20 20 20 53 65 74 20 74 6f 20 74 68 65 20 63 6f     Set to the co
7bd0: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74 68  lumn number with
7be0: 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  in the table..**
7bf0: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20      pExpr->op   
7c00: 20 20 20 20 20 20 20 20 20 53 65 74 20 74 6f 20           Set to 
7c10: 54 4b 5f 43 4f 4c 55 4d 4e 2e 0a 2a 2a 20 20 20  TK_COLUMN..**   
7c20: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 20 20   pExpr->pLeft   
7c30: 20 20 20 20 20 20 41 6e 79 20 65 78 70 72 65 73        Any expres
7c40: 73 69 6f 6e 20 74 68 69 73 20 70 6f 69 6e 74 73  sion this points
7c50: 20 74 6f 20 69 73 20 64 65 6c 65 74 65 64 0a 2a   to is deleted.*
7c60: 2a 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67  *    pExpr->pRig
7c70: 68 74 20 20 20 20 20 20 20 20 41 6e 79 20 65 78  ht        Any ex
7c80: 70 72 65 73 73 69 6f 6e 20 74 68 69 73 20 70 6f  pression this po
7c90: 69 6e 74 73 20 74 6f 20 69 73 20 64 65 6c 65 74  ints to is delet
7ca0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 44  ed..**.** The pD
7cb0: 62 54 6f 6b 65 6e 20 69 73 20 74 68 65 20 6e 61  bToken is the na
7cc0: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
7cd0: 73 65 20 28 74 68 65 20 22 58 22 29 2e 20 20 54  se (the "X").  T
7ce0: 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65  his value may be
7cf0: 0a 2a 2a 20 4e 55 4c 4c 20 6d 65 61 6e 69 6e 67  .** NULL meaning
7d00: 20 74 68 61 74 20 6e 61 6d 65 20 69 73 20 6f 66   that name is of
7d10: 20 74 68 65 20 66 6f 72 6d 20 59 2e 5a 20 6f 72   the form Y.Z or
7d20: 20 5a 2e 20 20 41 6e 79 20 61 76 61 69 6c 61 62   Z.  Any availab
7d30: 6c 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63  le database.** c
7d40: 61 6e 20 62 65 20 75 73 65 64 2e 20 20 54 68 65  an be used.  The
7d50: 20 70 54 61 62 6c 65 54 6f 6b 65 6e 20 69 73 20   pTableToken is 
7d60: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
7d70: 74 61 62 6c 65 20 28 74 68 65 20 22 59 22 29 2e  table (the "Y").
7d80: 20 20 54 68 69 73 0a 2a 2a 20 76 61 6c 75 65 20    This.** value 
7d90: 63 61 6e 20 62 65 20 4e 55 4c 4c 20 69 66 20 70  can be NULL if p
7da0: 44 62 54 6f 6b 65 6e 20 69 73 20 61 6c 73 6f 20  DbToken is also 
7db0: 4e 55 4c 4c 2e 20 20 49 66 20 70 54 61 62 6c 65  NULL.  If pTable
7dc0: 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20 69 74  Token is NULL it
7dd0: 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74  .** means that t
7de0: 68 65 20 66 6f 72 6d 20 6f 66 20 74 68 65 20 6e  he form of the n
7df0: 61 6d 65 20 69 73 20 5a 20 61 6e 64 20 74 68 61  ame is Z and tha
7e00: 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 61  t columns from a
7e10: 6e 79 20 74 61 62 6c 65 0a 2a 2a 20 63 61 6e 20  ny table.** can 
7e20: 62 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  be used..**.** I
7e30: 66 20 74 68 65 20 6e 61 6d 65 20 63 61 6e 6e 6f  f the name canno
7e40: 74 20 62 65 20 72 65 73 6f 6c 76 65 64 20 75 6e  t be resolved un
7e50: 61 6d 62 69 67 75 6f 75 73 6c 79 2c 20 6c 65 61  ambiguously, lea
7e60: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
7e70: 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65  age.** in pParse
7e80: 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d   and return non-
7e90: 7a 65 72 6f 2e 20 20 52 65 74 75 72 6e 20 7a 65  zero.  Return ze
7ea0: 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a  ro on success..*
7eb0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 6f  /.static int loo
7ec0: 6b 75 70 4e 61 6d 65 28 0a 20 20 50 61 72 73 65  kupName(.  Parse
7ed0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
7ee0: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
7ef0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
7f00: 6e 20 2a 70 44 62 54 6f 6b 65 6e 2c 20 20 20 20  n *pDbToken,    
7f10: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
7f20: 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
7f30: 69 6e 67 20 74 61 62 6c 65 2c 20 6f 72 20 4e 55  ing table, or NU
7f40: 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  LL */.  Token *p
7f50: 54 61 62 6c 65 54 6f 6b 65 6e 2c 20 20 2f 2a 20  TableToken,  /* 
7f60: 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 63 6f  Name of table co
7f70: 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 2c  ntaining column,
7f80: 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f   or NULL */.  To
7f90: 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e 54 6f 6b 65  ken *pColumnToke
7fa0: 6e 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  n, /* Name of th
7fb0: 65 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20 20 4e  e column. */.  N
7fc0: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
7fd0: 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20      /* The name 
7fe0: 63 6f 6e 74 65 78 74 20 75 73 65 64 20 74 6f 20  context used to 
7ff0: 72 65 73 6f 6c 76 65 20 74 68 65 20 6e 61 6d 65  resolve the name
8000: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
8010: 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  r          /* Ma
8020: 6b 65 20 74 68 69 73 20 45 58 50 52 20 6e 6f 64  ke this EXPR nod
8030: 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73  e point to the s
8040: 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e 20 2a  elected column *
8050: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 62  /.){.  char *zDb
8060: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
8070: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
8080: 61 73 65 2e 20 20 54 68 65 20 22 58 22 20 69 6e  ase.  The "X" in
8090: 20 58 2e 59 2e 5a 20 2a 2f 0a 20 20 63 68 61 72   X.Y.Z */.  char
80a0: 20 2a 7a 54 61 62 20 3d 20 30 3b 20 20 20 20 20   *zTab = 0;     
80b0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
80c0: 74 61 62 6c 65 2e 20 20 54 68 65 20 22 59 22 20  table.  The "Y" 
80d0: 69 6e 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20  in X.Y.Z or Y.Z 
80e0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 20  */.  char *zCol 
80f0: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d  = 0;      /* Nam
8100: 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e  e of the column.
8110: 20 20 54 68 65 20 22 5a 22 20 2a 2f 0a 20 20 69    The "Z" */.  i
8120: 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
8130: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
8140: 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  ters */.  int cn
8150: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  t = 0;         /
8160: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63  * Number of matc
8170: 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  hing column name
8180: 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 54 61  s */.  int cntTa
8190: 62 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e  b = 0;      /* N
81a0: 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e  umber of matchin
81b0: 67 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 2a 2f  g table names */
81c0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
81d0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a   pParse->db;  /*
81e0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   The database */
81f0: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
8200: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20  t_item *pItem;  
8210: 20 20 20 20 20 2f 2a 20 55 73 65 20 66 6f 72 20       /* Use for 
8220: 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 53 72  looping over pSr
8230: 63 4c 69 73 74 20 69 74 65 6d 73 20 2a 2f 0a 20  cList items */. 
8240: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
8250: 69 74 65 6d 20 2a 70 4d 61 74 63 68 20 3d 20 30  item *pMatch = 0
8260: 3b 20 20 2f 2a 20 54 68 65 20 6d 61 74 63 68 69  ;  /* The matchi
8270: 6e 67 20 70 53 72 63 4c 69 73 74 20 69 74 65 6d  ng pSrcList item
8280: 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   */.  NameContex
8290: 74 20 2a 70 54 6f 70 4e 43 20 3d 20 70 4e 43 3b  t *pTopNC = pNC;
82a0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
82b0: 20 6e 61 6d 65 63 6f 6e 74 65 78 74 20 69 6e 20   namecontext in 
82c0: 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 53 63  the list */.  Sc
82d0: 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20  hema *pSchema = 
82e0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
82f0: 2f 2a 20 53 63 68 65 6d 61 20 6f 66 20 74 68 65  /* Schema of the
8300: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 0a   expression */..
8310: 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 75 6d    assert( pColum
8320: 6e 54 6f 6b 65 6e 20 26 26 20 70 43 6f 6c 75 6d  nToken && pColum
8330: 6e 54 6f 6b 65 6e 2d 3e 7a 20 29 3b 20 2f 2a 20  nToken->z ); /* 
8340: 54 68 65 20 5a 20 69 6e 20 58 2e 59 2e 5a 20 63  The Z in X.Y.Z c
8350: 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  annot be NULL */
8360: 0a 20 20 7a 44 62 20 3d 20 73 71 6c 69 74 65 33  .  zDb = sqlite3
8370: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
8380: 2c 20 70 44 62 54 6f 6b 65 6e 29 3b 0a 20 20 7a  , pDbToken);.  z
8390: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  Tab = sqlite3Nam
83a0: 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
83b0: 54 61 62 6c 65 54 6f 6b 65 6e 29 3b 0a 20 20 7a  TableToken);.  z
83c0: 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  Col = sqlite3Nam
83d0: 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
83e0: 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 29 3b 0a 20 20  ColumnToken);.  
83f0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
8400: 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
8410: 20 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 3b   lookupname_end;
8420: 0a 20 20 7d 0a 0a 20 20 70 45 78 70 72 2d 3e 69  .  }..  pExpr->i
8430: 54 61 62 6c 65 20 3d 20 2d 31 3b 0a 20 20 77 68  Table = -1;.  wh
8440: 69 6c 65 28 20 70 4e 43 20 26 26 20 63 6e 74 3d  ile( pNC && cnt=
8450: 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69  =0 ){.    ExprLi
8460: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20  st *pEList;.    
8470: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73  SrcList *pSrcLis
8480: 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
8490: 74 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63  t;..    if( pSrc
84a0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 66 6f  List ){.      fo
84b0: 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 53 72  r(i=0, pItem=pSr
84c0: 63 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 53 72 63  cList->a; i<pSrc
84d0: 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
84e0: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
84f0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
8500: 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b          int iDb;
8510: 0a 20 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20  .        Column 
8520: 2a 70 43 6f 6c 3b 0a 20 20 0a 20 20 20 20 20 20  *pCol;.  .      
8530: 20 20 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e    pTab = pItem->
8540: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 61 73  pTab;.        as
8550: 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b  sert( pTab!=0 );
8560: 0a 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 73  .        iDb = s
8570: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
8580: 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  dex(db, pTab->pS
8590: 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20  chema);.        
85a0: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43  assert( pTab->nC
85b0: 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ol>0 );.        
85c0: 69 66 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20  if( zTab ){.    
85d0: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
85e0: 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20  >zAlias ){.     
85f0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61         char *zTa
8600: 62 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a  bName = pItem->z
8610: 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20  Alias;.         
8620: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
8630: 72 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65 2c 20  rICmp(zTabName, 
8640: 7a 54 61 62 29 21 3d 30 20 29 20 63 6f 6e 74 69  zTab)!=0 ) conti
8650: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
8660: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
8670: 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65    char *zTabName
8680: 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
8690: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
86a0: 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 73  zTabName==0 || s
86b0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54  qlite3StrICmp(zT
86c0: 61 62 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d 30  abName, zTab)!=0
86d0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
86e0: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 44 62           if( zDb
86f0: 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74  !=0 && sqlite3St
8700: 72 49 43 6d 70 28 64 62 2d 3e 61 44 62 5b 69 44  rICmp(db->aDb[iD
8710: 62 5d 2e 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d  b].zName, zDb)!=
8720: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
8730: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
8740: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8750: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
8760: 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d  .        if( 0==
8770: 28 63 6e 74 54 61 62 2b 2b 29 20 29 7b 0a 20 20  (cntTab++) ){.  
8780: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
8790: 54 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69  Table = pItem->i
87a0: 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20  Cursor;.        
87b0: 20 20 70 53 63 68 65 6d 61 20 3d 20 70 54 61 62    pSchema = pTab
87c0: 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20  ->pSchema;.     
87d0: 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70 49       pMatch = pI
87e0: 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  tem;.        }. 
87f0: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20         for(j=0, 
8800: 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b  pCol=pTab->aCol;
8810: 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
8820: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
8830: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
8840: 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e  e3StrICmp(pCol->
8850: 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20  zName, zCol)==0 
8860: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
8870: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
8880: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d   = pTab->aCol[j]
8890: 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  .zColl;.        
88a0: 20 20 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69      IdList *pUsi
88b0: 6e 67 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ng;.            
88c0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  cnt++;.         
88d0: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
88e0: 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f   = pItem->iCurso
88f0: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  r;.            p
8900: 4d 61 74 63 68 20 3d 20 70 49 74 65 6d 3b 0a 20  Match = pItem;. 
8910: 20 20 20 20 20 20 20 20 20 20 20 70 53 63 68 65             pSche
8920: 6d 61 20 3d 20 70 54 61 62 2d 3e 70 53 63 68 65  ma = pTab->pSche
8930: 6d 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ma;.            
8940: 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 74 68  /* Substitute th
8950: 65 20 72 6f 77 69 64 20 28 63 6f 6c 75 6d 6e 20  e rowid (column 
8960: 2d 31 29 20 66 6f 72 20 74 68 65 20 49 4e 54 45  -1) for the INTE
8970: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
8980: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  */.            p
8990: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
89a0: 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 3f  j==pTab->iPKey ?
89b0: 20 2d 31 20 3a 20 6a 3b 0a 20 20 20 20 20 20 20   -1 : j;.       
89c0: 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69       pExpr->affi
89d0: 6e 69 74 79 20 3d 20 70 54 61 62 2d 3e 61 43 6f  nity = pTab->aCo
89e0: 6c 5b 6a 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20  l[j].affinity;. 
89f0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
8a00: 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
8a10: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3d 3d 30  P_ExpCollate)==0
8a20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8a30: 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d    pExpr->pColl =
8a40: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
8a50: 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c  Seq(db, ENC(db),
8a60: 20 7a 43 6f 6c 6c 2c 2d 31 2c 20 30 29 3b 0a 20   zColl,-1, 0);. 
8a70: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
8a80: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 70           if( i<p
8a90: 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 20  SrcList->nSrc-1 
8aa0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
8ab0: 20 69 66 28 20 70 49 74 65 6d 5b 31 5d 2e 6a 6f   if( pItem[1].jo
8ac0: 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55  intype & JT_NATU
8ad0: 52 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  RAL ){.         
8ae0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69         /* If thi
8af0: 73 20 6d 61 74 63 68 20 6f 63 63 75 72 72 65 64  s match occurred
8b00: 20 69 6e 20 74 68 65 20 6c 65 66 74 20 74 61 62   in the left tab
8b10: 6c 65 20 6f 66 20 61 20 6e 61 74 75 72 61 6c 20  le of a natural 
8b20: 6a 6f 69 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  join,.          
8b30: 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 73 6b        ** then sk
8b40: 69 70 20 74 68 65 20 72 69 67 68 74 20 74 61 62  ip the right tab
8b50: 6c 65 20 74 6f 20 61 76 6f 69 64 20 61 20 64 75  le to avoid a du
8b60: 70 6c 69 63 61 74 65 20 6d 61 74 63 68 20 2a 2f  plicate match */
8b70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8b80: 20 70 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20   pItem++;.      
8b90: 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20            i++;. 
8ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c               }el
8bb0: 73 65 20 69 66 28 20 28 70 55 73 69 6e 67 20 3d  se if( (pUsing =
8bc0: 20 70 49 74 65 6d 5b 31 5d 2e 70 55 73 69 6e 67   pItem[1].pUsing
8bd0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
8be0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
8bf0: 69 73 20 6d 61 74 63 68 20 6f 63 63 75 72 73 20  is match occurs 
8c00: 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 74 68 61 74  on a column that
8c10: 20 69 73 20 69 6e 20 74 68 65 20 55 53 49 4e 47   is in the USING
8c20: 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20   clause.        
8c30: 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20          ** of a 
8c40: 6a 6f 69 6e 2c 20 73 6b 69 70 20 74 68 65 20 73  join, skip the s
8c50: 65 61 72 63 68 20 6f 66 20 74 68 65 20 72 69 67  earch of the rig
8c60: 68 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  ht table of the 
8c70: 6a 6f 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20  join.           
8c80: 20 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64       ** to avoid
8c90: 20 61 20 64 75 70 6c 69 63 61 74 65 20 6d 61 74   a duplicate mat
8ca0: 63 68 20 74 68 65 72 65 2e 20 2a 2f 0a 20 20 20  ch there. */.   
8cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
8cc0: 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   k;.            
8cd0: 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
8ce0: 55 73 69 6e 67 2d 3e 6e 49 64 3b 20 6b 2b 2b 29  Using->nId; k++)
8cf0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
8d00: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
8d10: 74 72 49 43 6d 70 28 70 55 73 69 6e 67 2d 3e 61  trICmp(pUsing->a
8d20: 5b 6b 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29  [k].zName, zCol)
8d30: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
8d40: 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
8d50: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
8d60: 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20          i++;.   
8d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
8d90: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8da0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
8db0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
8dc0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8dd0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8de0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8df0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
8e00: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
8e10: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a  TE_OMIT_TRIGGER.
8e20: 20 20 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76      /* If we hav
8e30: 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 72 65  e not already re
8e40: 73 6f 6c 76 65 64 20 74 68 65 20 6e 61 6d 65 2c  solved the name,
8e50: 20 74 68 65 6e 20 6d 61 79 62 65 20 0a 20 20 20   then maybe .   
8e60: 20 2a 2a 20 69 74 20 69 73 20 61 20 6e 65 77 2e   ** it is a new.
8e70: 2a 20 6f 72 20 6f 6c 64 2e 2a 20 74 72 69 67 67  * or old.* trigg
8e80: 65 72 20 61 72 67 75 6d 65 6e 74 20 72 65 66 65  er argument refe
8e90: 72 65 6e 63 65 0a 20 20 20 20 2a 2f 0a 20 20 20  rence.    */.   
8ea0: 20 69 66 28 20 7a 44 62 3d 3d 30 20 26 26 20 7a   if( zDb==0 && z
8eb0: 54 61 62 21 3d 30 20 26 26 20 63 6e 74 3d 3d 30  Tab!=0 && cnt==0
8ec0: 20 26 26 20 70 50 61 72 73 65 2d 3e 74 72 69 67   && pParse->trig
8ed0: 53 74 61 63 6b 21 3d 30 20 29 7b 0a 20 20 20 20  Stack!=0 ){.    
8ee0: 20 20 54 72 69 67 67 65 72 53 74 61 63 6b 20 2a    TriggerStack *
8ef0: 70 54 72 69 67 67 65 72 53 74 61 63 6b 20 3d 20  pTriggerStack = 
8f00: 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63  pParse->trigStac
8f10: 6b 3b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  k;.      Table *
8f20: 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  pTab = 0;.      
8f30: 75 33 32 20 2a 70 69 43 6f 6c 4d 61 73 6b 3b 0a  u32 *piColMask;.
8f40: 20 20 20 20 20 20 69 66 28 20 70 54 72 69 67 67        if( pTrigg
8f50: 65 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64 78 20  erStack->newIdx 
8f60: 21 3d 20 2d 31 20 26 26 20 73 71 6c 69 74 65 33  != -1 && sqlite3
8f70: 53 74 72 49 43 6d 70 28 22 6e 65 77 22 2c 20 7a  StrICmp("new", z
8f80: 54 61 62 29 20 3d 3d 20 30 20 29 7b 0a 20 20 20  Tab) == 0 ){.   
8f90: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
8fa0: 6c 65 20 3d 20 70 54 72 69 67 67 65 72 53 74 61  le = pTriggerSta
8fb0: 63 6b 2d 3e 6e 65 77 49 64 78 3b 0a 20 20 20 20  ck->newIdx;.    
8fc0: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69      assert( pTri
8fd0: 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 20  ggerStack->pTab 
8fe0: 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20  );.        pTab 
8ff0: 3d 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d  = pTriggerStack-
9000: 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 70  >pTab;.        p
9010: 69 43 6f 6c 4d 61 73 6b 20 3d 20 26 28 70 54 72  iColMask = &(pTr
9020: 69 67 67 65 72 53 74 61 63 6b 2d 3e 6e 65 77 43  iggerStack->newC
9030: 6f 6c 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 7d  olMask);.      }
9040: 65 6c 73 65 20 69 66 28 20 70 54 72 69 67 67 65  else if( pTrigge
9050: 72 53 74 61 63 6b 2d 3e 6f 6c 64 49 64 78 20 21  rStack->oldIdx !
9060: 3d 20 2d 31 20 26 26 20 73 71 6c 69 74 65 33 53  = -1 && sqlite3S
9070: 74 72 49 43 6d 70 28 22 6f 6c 64 22 2c 20 7a 54  trICmp("old", zT
9080: 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ab)==0 ){.      
9090: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
90a0: 3d 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d  = pTriggerStack-
90b0: 3e 6f 6c 64 49 64 78 3b 0a 20 20 20 20 20 20 20  >oldIdx;.       
90c0: 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65   assert( pTrigge
90d0: 72 53 74 61 63 6b 2d 3e 70 54 61 62 20 29 3b 0a  rStack->pTab );.
90e0: 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70          pTab = p
90f0: 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54  TriggerStack->pT
9100: 61 62 3b 0a 20 20 20 20 20 20 20 20 70 69 43 6f  ab;.        piCo
9110: 6c 4d 61 73 6b 20 3d 20 26 28 70 54 72 69 67 67  lMask = &(pTrigg
9120: 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 43 6f 6c 4d  erStack->oldColM
9130: 61 73 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  ask);.      }.. 
9140: 20 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b       if( pTab ){
9150: 20 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43   .        int iC
9160: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c 75  ol;.        Colu
9170: 6d 6e 20 2a 70 43 6f 6c 20 3d 20 70 54 61 62 2d  mn *pCol = pTab-
9180: 3e 61 43 6f 6c 3b 0a 0a 20 20 20 20 20 20 20 20  >aCol;..        
9190: 70 53 63 68 65 6d 61 20 3d 20 70 54 61 62 2d 3e  pSchema = pTab->
91a0: 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20 20  pSchema;.       
91b0: 20 63 6e 74 54 61 62 2b 2b 3b 0a 20 20 20 20 20   cntTab++;.     
91c0: 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69     for(iCol=0; i
91d0: 43 6f 6c 20 3c 20 70 54 61 62 2d 3e 6e 43 6f 6c  Col < pTab->nCol
91e0: 3b 20 69 43 6f 6c 2b 2b 2c 20 70 43 6f 6c 2b 2b  ; iCol++, pCol++
91f0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ) {.          if
9200: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
9210: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43  (pCol->zName, zC
9220: 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ol)==0 ){.      
9230: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
9240: 20 2a 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e   *zColl = pTab->
9250: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 43 6f 6c 6c  aCol[iCol].zColl
9260: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6e  ;.            cn
9270: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t++;.           
9280: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
9290: 3d 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50  = iCol==pTab->iP
92a0: 4b 65 79 20 3f 20 2d 31 20 3a 20 69 43 6f 6c 3b  Key ? -1 : iCol;
92b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
92c0: 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 70  pr->affinity = p
92d0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
92e0: 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20  affinity;.      
92f0: 20 20 20 20 20 20 69 66 28 20 28 70 45 78 70 72        if( (pExpr
9300: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70  ->flags & EP_Exp
9310: 43 6f 6c 6c 61 74 65 29 3d 3d 30 20 29 7b 0a 20  Collate)==0 ){. 
9320: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
9330: 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  pr->pColl = sqli
9340: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
9350: 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c  b, ENC(db), zCol
9360: 6c 2c 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  l,-1, 0);.      
9370: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9380: 20 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20      pExpr->pTab 
9390: 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  = pTab;.        
93a0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
93b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
93c0: 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d   testcase( iCol=
93d0: 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  =31 );.         
93e0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
93f0: 43 6f 6c 3d 3d 33 32 20 29 3b 0a 20 20 20 20 20  Col==32 );.     
9400: 20 20 20 20 20 20 20 20 20 2a 70 69 43 6f 6c 4d           *piColM
9410: 61 73 6b 20 7c 3d 20 28 28 75 33 32 29 31 3c 3c  ask |= ((u32)1<<
9420: 69 43 6f 6c 29 20 7c 20 28 69 43 6f 6c 3e 3d 33  iCol) | (iCol>=3
9430: 32 3f 30 78 66 66 66 66 66 66 66 66 3a 30 29 3b  2?0xffffffff:0);
9440: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
9450: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
9460: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
9470: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
9480: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
9490: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
94a0: 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 2a 2f  OMIT_TRIGGER) */
94b0: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
94c0: 50 65 72 68 61 70 73 20 74 68 65 20 6e 61 6d 65  Perhaps the name
94d0: 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20   is a reference 
94e0: 74 6f 20 74 68 65 20 52 4f 57 49 44 0a 20 20 20  to the ROWID.   
94f0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e 74 3d   */.    if( cnt=
9500: 3d 30 20 26 26 20 63 6e 74 54 61 62 3d 3d 31 20  =0 && cntTab==1 
9510: 26 26 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69  && sqlite3IsRowi
9520: 64 28 7a 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20  d(zCol) ){.     
9530: 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20   cnt = 1;.      
9540: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
9550: 20 2d 31 3b 0a 20 20 20 20 20 20 70 45 78 70 72   -1;.      pExpr
9560: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c  ->affinity = SQL
9570: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b  ITE_AFF_INTEGER;
9580: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
9590: 20 20 20 2a 2a 20 49 66 20 74 68 65 20 69 6e 70     ** If the inp
95a0: 75 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  ut is of the for
95b0: 6d 20 5a 20 28 6e 6f 74 20 59 2e 5a 20 6f 72 20  m Z (not Y.Z or 
95c0: 58 2e 59 2e 5a 29 20 74 68 65 6e 20 74 68 65 20  X.Y.Z) then the 
95d0: 6e 61 6d 65 20 5a 0a 20 20 20 20 2a 2a 20 6d 69  name Z.    ** mi
95e0: 67 68 74 20 72 65 66 65 72 20 74 6f 20 61 6e 20  ght refer to an 
95f0: 72 65 73 75 6c 74 2d 73 65 74 20 61 6c 69 61 73  result-set alias
9600: 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c  .  This happens,
9610: 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68   for example, wh
9620: 65 6e 0a 20 20 20 20 2a 2a 20 77 65 20 61 72 65  en.    ** we are
9630: 20 72 65 73 6f 6c 76 69 6e 67 20 6e 61 6d 65 73   resolving names
9640: 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
9650: 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ause of the foll
9660: 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 3a 0a 20  owing command:. 
9670: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
9680: 20 53 45 4c 45 43 54 20 61 2b 62 20 41 53 20 78   SELECT a+b AS x
9690: 20 46 52 4f 4d 20 74 61 62 6c 65 20 57 48 45 52   FROM table WHER
96a0: 45 20 78 3c 31 30 3b 0a 20 20 20 20 2a 2a 0a 20  E x<10;.    **. 
96b0: 20 20 20 2a 2a 20 49 6e 20 63 61 73 65 73 20 6c     ** In cases l
96c0: 69 6b 65 20 74 68 69 73 2c 20 72 65 70 6c 61 63  ike this, replac
96d0: 65 20 70 45 78 70 72 20 77 69 74 68 20 61 20 63  e pExpr with a c
96e0: 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70 72 65  opy of the expre
96f0: 73 73 69 6f 6e 20 74 68 61 74 0a 20 20 20 20 2a  ssion that.    *
9700: 2a 20 66 6f 72 6d 73 20 74 68 65 20 72 65 73 75  * forms the resu
9710: 6c 74 20 73 65 74 20 65 6e 74 72 79 20 28 22 61  lt set entry ("a
9720: 2b 62 22 20 69 6e 20 74 68 65 20 65 78 61 6d 70  +b" in the examp
9730: 6c 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20 69  le) and return i
9740: 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20  mmediately..    
9750: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
9760: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74   expression in t
9770: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 73 68  he result set sh
9780: 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
9790: 79 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 72 65  y been.    ** re
97a0: 73 6f 6c 76 65 64 20 62 79 20 74 68 65 20 74 69  solved by the ti
97b0: 6d 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  me the WHERE cla
97c0: 75 73 65 20 69 73 20 72 65 73 6f 6c 76 65 64 2e  use is resolved.
97d0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
97e0: 63 6e 74 3d 3d 30 20 26 26 20 28 70 45 4c 69 73  cnt==0 && (pELis
97f0: 74 20 3d 20 70 4e 43 2d 3e 70 45 4c 69 73 74 29  t = pNC->pEList)
9800: 21 3d 30 20 26 26 20 7a 54 61 62 3d 3d 30 20 29  !=0 && zTab==0 )
9810: 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  {.      for(j=0;
9820: 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   j<pEList->nExpr
9830: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
9840: 63 68 61 72 20 2a 7a 41 73 20 3d 20 70 45 4c 69  char *zAs = pELi
9850: 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[j].zName;.
9860: 20 20 20 20 20 20 20 20 69 66 28 20 7a 41 73 21          if( zAs!
9870: 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  =0 && sqlite3Str
9880: 49 43 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d  ICmp(zAs, zCol)=
9890: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
98a0: 45 78 70 72 20 2a 70 44 75 70 2c 20 2a 70 4f 72  Expr *pDup, *pOr
98b0: 69 67 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ig;.          as
98c0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65  sert( pExpr->pLe
98d0: 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  ft==0 && pExpr->
98e0: 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
98f0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
9900: 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29  Expr->pList==0 )
9910: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
9920: 72 74 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  rt( pExpr->pSele
9930: 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ct==0 );.       
9940: 20 20 20 70 4f 72 69 67 20 3d 20 70 45 4c 69 73     pOrig = pELis
9950: 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 3b 0a 20  t->a[j].pExpr;. 
9960: 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 4e           if( !pN
9970: 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 26 26 20 45  C->allowAgg && E
9980: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
9990: 4f 72 69 67 2c 20 45 50 5f 41 67 67 29 20 29 7b  Orig, EP_Agg) ){
99a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
99b0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
99c0: 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20  rse, "misuse of 
99d0: 61 6c 69 61 73 65 64 20 61 67 67 72 65 67 61 74  aliased aggregat
99e0: 65 20 25 73 22 2c 20 7a 41 73 29 3b 0a 20 20 20  e %s", zAs);.   
99f0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
9a00: 5f 66 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 20  _free(zCol);.   
9a10: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
9a20: 32 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  2;.          }. 
9a30: 20 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20           pDup = 
9a40: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
9a50: 62 2c 20 70 4f 72 69 67 29 3b 0a 20 20 20 20 20  b, pOrig);.     
9a60: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
9a70: 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f  flags & EP_ExpCo
9a80: 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20  llate ){.       
9a90: 20 20 20 20 20 70 44 75 70 2d 3e 70 43 6f 6c 6c       pDup->pColl
9aa0: 20 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b   = pExpr->pColl;
9ab0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 44 75  .            pDu
9ac0: 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45  p->flags |= EP_E
9ad0: 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20  xpCollate;.     
9ae0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
9af0: 20 69 66 28 20 70 45 78 70 72 2d 3e 73 70 61 6e   if( pExpr->span
9b00: 2e 64 79 6e 20 29 20 73 71 6c 69 74 65 33 5f 66  .dyn ) sqlite3_f
9b10: 72 65 65 28 28 63 68 61 72 2a 29 70 45 78 70 72  ree((char*)pExpr
9b20: 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20 20 20 20  ->span.z);.     
9b30: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
9b40: 74 6f 6b 65 6e 2e 64 79 6e 20 29 20 73 71 6c 69  token.dyn ) sqli
9b50: 74 65 33 5f 66 72 65 65 28 28 63 68 61 72 2a 29  te3_free((char*)
9b60: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b  pExpr->token.z);
9b70: 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
9b80: 79 28 70 45 78 70 72 2c 20 70 44 75 70 2c 20 73  y(pExpr, pDup, s
9b90: 69 7a 65 6f 66 28 2a 70 45 78 70 72 29 29 3b 0a  izeof(*pExpr));.
9ba0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
9bb0: 33 5f 66 72 65 65 28 70 44 75 70 29 3b 0a 20 20  3_free(pDup);.  
9bc0: 20 20 20 20 20 20 20 20 63 6e 74 20 3d 20 31 3b          cnt = 1;
9bd0: 0a 20 20 20 20 20 20 20 20 20 20 70 4d 61 74 63  .          pMatc
9be0: 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  h = 0;.         
9bf0: 20 61 73 73 65 72 74 28 20 7a 54 61 62 3d 3d 30   assert( zTab==0
9c00: 20 26 26 20 7a 44 62 3d 3d 30 20 29 3b 0a 20 20   && zDb==0 );.  
9c10: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6c 6f 6f          goto loo
9c20: 6b 75 70 6e 61 6d 65 5f 65 6e 64 5f 32 3b 0a 20  kupname_end_2;. 
9c30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
9c40: 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20   .    }..    /* 
9c50: 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e  Advance to the n
9c60: 65 78 74 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74  ext name context
9c70: 2e 20 20 54 68 65 20 6c 6f 6f 70 20 77 69 6c 6c  .  The loop will
9c80: 20 65 78 69 74 20 77 68 65 6e 20 65 69 74 68 65   exit when eithe
9c90: 72 0a 20 20 20 20 2a 2a 20 77 65 20 68 61 76 65  r.    ** we have
9ca0: 20 61 20 6d 61 74 63 68 20 28 63 6e 74 3e 30 29   a match (cnt>0)
9cb0: 20 6f 72 20 77 68 65 6e 20 77 65 20 72 75 6e 20   or when we run 
9cc0: 6f 75 74 20 6f 66 20 6e 61 6d 65 20 63 6f 6e 74  out of name cont
9cd0: 65 78 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  exts..    */.   
9ce0: 20 69 66 28 20 63 6e 74 3d 3d 30 20 29 7b 0a 20   if( cnt==0 ){. 
9cf0: 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e       pNC = pNC->
9d00: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
9d10: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 58  ..  /*.  ** If X
9d20: 20 61 6e 64 20 59 20 61 72 65 20 4e 55 4c 4c 20   and Y are NULL 
9d30: 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20  (in other words 
9d40: 69 66 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75  if only the colu
9d50: 6d 6e 20 6e 61 6d 65 20 5a 20 69 73 0a 20 20 2a  mn name Z is.  *
9d60: 2a 20 73 75 70 70 6c 69 65 64 29 20 61 6e 64 20  * supplied) and 
9d70: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 5a 20 69  the value of Z i
9d80: 73 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 64 6f  s enclosed in do
9d90: 75 62 6c 65 2d 71 75 6f 74 65 73 2c 20 74 68 65  uble-quotes, the
9da0: 6e 0a 20 20 2a 2a 20 5a 20 69 73 20 61 20 73 74  n.  ** Z is a st
9db0: 72 69 6e 67 20 6c 69 74 65 72 61 6c 20 69 66 20  ring literal if 
9dc0: 69 74 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68  it doesn't match
9dd0: 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   any column name
9de0: 73 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 2a 2a  s.  In that.  **
9df0: 20 63 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74   case, we need t
9e00: 6f 20 72 65 74 75 72 6e 20 72 69 67 68 74 20 61  o return right a
9e10: 77 61 79 20 61 6e 64 20 6e 6f 74 20 6d 61 6b 65  way and not make
9e20: 20 61 6e 79 20 63 68 61 6e 67 65 73 20 74 6f 0a   any changes to.
9e30: 20 20 2a 2a 20 70 45 78 70 72 2e 0a 20 20 2a 2a    ** pExpr..  **
9e40: 0a 20 20 2a 2a 20 42 65 63 61 75 73 65 20 6e 6f  .  ** Because no
9e50: 20 72 65 66 65 72 65 6e 63 65 20 77 61 73 20 6d   reference was m
9e60: 61 64 65 20 74 6f 20 6f 75 74 65 72 20 63 6f 6e  ade to outer con
9e70: 74 65 78 74 73 2c 20 74 68 65 20 70 4e 43 2d 3e  texts, the pNC->
9e80: 6e 52 65 66 0a 20 20 2a 2a 20 66 69 65 6c 64 73  nRef.  ** fields
9e90: 20 61 72 65 20 6e 6f 74 20 63 68 61 6e 67 65 64   are not changed
9ea0: 20 69 6e 20 61 6e 79 20 63 6f 6e 74 65 78 74 2e   in any context.
9eb0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74 3d  .  */.  if( cnt=
9ec0: 3d 30 20 26 26 20 7a 54 61 62 3d 3d 30 20 26 26  =0 && zTab==0 &&
9ed0: 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e 7a   pColumnToken->z
9ee0: 5b 30 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20  [0]=='"' ){.    
9ef0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
9f00: 6c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  l);.    return 0
9f10: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
9f20: 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68   cnt==0 means th
9f30: 65 72 65 20 77 61 73 20 6e 6f 74 20 6d 61 74 63  ere was not matc
9f40: 68 2e 20 20 63 6e 74 3e 31 20 6d 65 61 6e 73 20  h.  cnt>1 means 
9f50: 74 68 65 72 65 20 77 65 72 65 20 74 77 6f 20 6f  there were two o
9f60: 72 0a 20 20 2a 2a 20 6d 6f 72 65 20 6d 61 74 63  r.  ** more matc
9f70: 68 65 73 2e 20 20 45 69 74 68 65 72 20 77 61 79  hes.  Either way
9f80: 2c 20 77 65 20 68 61 76 65 20 61 6e 20 65 72 72  , we have an err
9f90: 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  or..  */.  if( c
9fa0: 6e 74 21 3d 31 20 29 7b 0a 20 20 20 20 63 6f 6e  nt!=1 ){.    con
9fb0: 73 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20  st char *zErr;. 
9fc0: 20 20 20 7a 45 72 72 20 3d 20 63 6e 74 3d 3d 30     zErr = cnt==0
9fd0: 20 3f 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75   ? "no such colu
9fe0: 6d 6e 22 20 3a 20 22 61 6d 62 69 67 75 6f 75 73  mn" : "ambiguous
9ff0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 22 3b 0a 20   column name";. 
a000: 20 20 20 69 66 28 20 7a 44 62 20 29 7b 0a 20 20     if( zDb ){.  
a010: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
a020: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 3a  Msg(pParse, "%s:
a030: 20 25 73 2e 25 73 2e 25 73 22 2c 20 7a 45 72 72   %s.%s.%s", zErr
a040: 2c 20 7a 44 62 2c 20 7a 54 61 62 2c 20 7a 43 6f  , zDb, zTab, zCo
a050: 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  l);.    }else if
a060: 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ( zTab ){.      
a070: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
a080: 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73 2e  pParse, "%s: %s.
a090: 25 73 22 2c 20 7a 45 72 72 2c 20 7a 54 61 62 2c  %s", zErr, zTab,
a0a0: 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 65 6c 73   zCol);.    }els
a0b0: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
a0c0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
a0d0: 20 22 25 73 3a 20 25 73 22 2c 20 7a 45 72 72 2c   "%s: %s", zErr,
a0e0: 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   zCol);.    }.  
a0f0: 20 20 70 54 6f 70 4e 43 2d 3e 6e 45 72 72 2b 2b    pTopNC->nErr++
a100: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
a110: 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 20 74   column from a t
a120: 61 62 6c 65 20 69 6e 20 70 53 72 63 4c 69 73 74  able in pSrcList
a130: 20 69 73 20 72 65 66 65 72 65 6e 63 65 64 2c 20   is referenced, 
a140: 74 68 65 6e 20 72 65 63 6f 72 64 0a 20 20 2a 2a  then record.  **
a150: 20 74 68 69 73 20 66 61 63 74 20 69 6e 20 74 68   this fact in th
a160: 65 20 70 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 63  e pSrcList.a[].c
a170: 6f 6c 55 73 65 64 20 62 69 74 6d 61 73 6b 2e 20  olUsed bitmask. 
a180: 20 43 6f 6c 75 6d 6e 20 30 20 63 61 75 73 65 73   Column 0 causes
a190: 0a 20 20 2a 2a 20 62 69 74 20 30 20 74 6f 20 62  .  ** bit 0 to b
a1a0: 65 20 73 65 74 2e 20 20 43 6f 6c 75 6d 6e 20 31  e set.  Column 1
a1b0: 20 73 65 74 73 20 62 69 74 20 31 2e 20 20 41 6e   sets bit 1.  An
a1c0: 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 66 20  d so forth.  If 
a1d0: 74 68 65 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20  the.  ** column 
a1e0: 6e 75 6d 62 65 72 20 69 73 20 67 72 65 61 74 65  number is greate
a1f0: 72 20 74 68 61 6e 20 74 68 65 20 6e 75 6d 62 65  r than the numbe
a200: 72 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68 65  r of bits in the
a210: 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 74 68   bitmask.  ** th
a220: 65 6e 20 73 65 74 20 74 68 65 20 68 69 67 68 2d  en set the high-
a230: 6f 72 64 65 72 20 62 69 74 20 6f 66 20 74 68 65  order bit of the
a240: 20 62 69 74 6d 61 73 6b 2e 0a 20 20 2a 2f 0a 20   bitmask..  */. 
a250: 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
a260: 75 6d 6e 3e 3d 30 20 26 26 20 70 4d 61 74 63 68  umn>=0 && pMatch
a270: 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  !=0 ){.    int n
a280: 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
a290: 6e 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  n;.    testcase(
a2a0: 20 6e 3d 3d 73 69 7a 65 6f 66 28 42 69 74 6d 61   n==sizeof(Bitma
a2b0: 73 6b 29 2a 38 2d 31 20 29 3b 0a 20 20 20 20 69  sk)*8-1 );.    i
a2c0: 66 28 20 6e 3e 3d 73 69 7a 65 6f 66 28 42 69 74  f( n>=sizeof(Bit
a2d0: 6d 61 73 6b 29 2a 38 20 29 7b 0a 20 20 20 20 20  mask)*8 ){.     
a2e0: 20 6e 20 3d 20 73 69 7a 65 6f 66 28 42 69 74 6d   n = sizeof(Bitm
a2f0: 61 73 6b 29 2a 38 2d 31 3b 0a 20 20 20 20 7d 0a  ask)*8-1;.    }.
a300: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 61 74      assert( pMat
a310: 63 68 2d 3e 69 43 75 72 73 6f 72 3d 3d 70 45 78  ch->iCursor==pEx
a320: 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20  pr->iTable );.  
a330: 20 20 70 4d 61 74 63 68 2d 3e 63 6f 6c 55 73 65    pMatch->colUse
a340: 64 20 7c 3d 20 28 28 42 69 74 6d 61 73 6b 29 31  d |= ((Bitmask)1
a350: 29 3c 3c 6e 3b 0a 20 20 7d 0a 0a 6c 6f 6f 6b 75  )<<n;.  }..looku
a360: 70 6e 61 6d 65 5f 65 6e 64 3a 0a 20 20 2f 2a 20  pname_end:.  /* 
a370: 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 72 65 74  Clean up and ret
a380: 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  urn.  */.  sqlit
a390: 65 33 5f 66 72 65 65 28 7a 44 62 29 3b 0a 20 20  e3_free(zDb);.  
a3a0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 61  sqlite3_free(zTa
a3b0: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  b);.  sqlite3Exp
a3c0: 72 44 65 6c 65 74 65 28 70 45 78 70 72 2d 3e 70  rDelete(pExpr->p
a3d0: 4c 65 66 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e  Left);.  pExpr->
a3e0: 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 73 71 6c  pLeft = 0;.  sql
a3f0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
a400: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
a410: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d   pExpr->pRight =
a420: 20 30 3b 0a 20 20 70 45 78 70 72 2d 3e 6f 70 20   0;.  pExpr->op 
a430: 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 6c 6f 6f  = TK_COLUMN;.loo
a440: 6b 75 70 6e 61 6d 65 5f 65 6e 64 5f 32 3a 0a 20  kupname_end_2:. 
a450: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
a460: 6f 6c 29 3b 0a 20 20 69 66 28 20 63 6e 74 3d 3d  ol);.  if( cnt==
a470: 31 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  1 ){.    assert(
a480: 20 70 4e 43 21 3d 30 20 29 3b 0a 20 20 20 20 73   pNC!=0 );.    s
a490: 71 6c 69 74 65 33 41 75 74 68 52 65 61 64 28 70  qlite3AuthRead(p
a4a0: 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 70 53  Parse, pExpr, pS
a4b0: 63 68 65 6d 61 2c 20 70 4e 43 2d 3e 70 53 72 63  chema, pNC->pSrc
a4c0: 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70  List);.    if( p
a4d0: 4d 61 74 63 68 20 26 26 20 21 70 4d 61 74 63 68  Match && !pMatch
a4e0: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
a4f0: 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d     pExpr->pTab =
a500: 20 70 4d 61 74 63 68 2d 3e 70 54 61 62 3b 0a 20   pMatch->pTab;. 
a510: 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 63 72     }.    /* Incr
a520: 65 6d 65 6e 74 20 74 68 65 20 6e 52 65 66 20 76  ement the nRef v
a530: 61 6c 75 65 20 6f 6e 20 61 6c 6c 20 6e 61 6d 65  alue on all name
a540: 20 63 6f 6e 74 65 78 74 73 20 66 72 6f 6d 20 54   contexts from T
a550: 6f 70 4e 43 20 75 70 20 74 6f 0a 20 20 20 20 2a  opNC up to.    *
a560: 2a 20 74 68 65 20 70 6f 69 6e 74 20 77 68 65 72  * the point wher
a570: 65 20 74 68 65 20 6e 61 6d 65 20 6d 61 74 63 68  e the name match
a580: 65 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 3b  ed. */.    for(;
a590: 3b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ;){.      assert
a5a0: 28 20 70 54 6f 70 4e 43 21 3d 30 20 29 3b 0a 20  ( pTopNC!=0 );. 
a5b0: 20 20 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 52 65       pTopNC->nRe
a5c0: 66 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  f++;.      if( p
a5d0: 54 6f 70 4e 43 3d 3d 70 4e 43 20 29 20 62 72 65  TopNC==pNC ) bre
a5e0: 61 6b 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e 43  ak;.      pTopNC
a5f0: 20 3d 20 70 54 6f 70 4e 43 2d 3e 70 4e 65 78 74   = pTopNC->pNext
a600: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
a610: 72 6e 20 30 3b 0a 20 20 7d 20 65 6c 73 65 20 7b  rn 0;.  } else {
a620: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
a630: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
a640: 20 72 6f 75 74 69 6e 65 20 69 73 20 64 65 73 69   routine is desi
a650: 67 6e 65 64 20 61 73 20 61 6e 20 78 46 75 6e 63  gned as an xFunc
a660: 20 66 6f 72 20 77 61 6c 6b 45 78 70 72 54 72 65   for walkExprTre
a670: 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 73 6f 6c  e()..**.** Resol
a680: 76 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65  ve symbolic name
a690: 73 20 69 6e 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e  s into TK_COLUMN
a6a0: 20 6f 70 65 72 61 74 6f 72 73 20 66 6f 72 20 74   operators for t
a6b0: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 6e 6f  he current.** no
a6c0: 64 65 20 69 6e 20 74 68 65 20 65 78 70 72 65 73  de in the expres
a6d0: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
a6e0: 72 6e 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75 65  rn 0 to continue
a6f0: 20 74 68 65 20 73 65 61 72 63 68 20 64 6f 77 6e   the search down
a700: 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 6f 72 20  .** the tree or 
a710: 32 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20 74  2 to abort the t
a720: 72 65 65 20 77 61 6c 6b 2e 0a 2a 2a 0a 2a 2a 20  ree walk..**.** 
a730: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73  This routine als
a740: 6f 20 64 6f 65 73 20 65 72 72 6f 72 20 63 68 65  o does error che
a750: 63 6b 69 6e 67 20 61 6e 64 20 6e 61 6d 65 20 72  cking and name r
a760: 65 73 6f 6c 75 74 69 6f 6e 20 66 6f 72 0a 2a 2a  esolution for.**
a770: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 2e   function names.
a780: 20 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20 66    The operator f
a790: 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  or aggregate fun
a7a0: 63 74 69 6f 6e 73 20 69 73 20 63 68 61 6e 67 65  ctions is change
a7b0: 64 0a 2a 2a 20 74 6f 20 54 4b 5f 41 47 47 5f 46  d.** to TK_AGG_F
a7c0: 55 4e 43 54 49 4f 4e 2e 0a 2a 2f 0a 73 74 61 74  UNCTION..*/.stat
a7d0: 69 63 20 69 6e 74 20 6e 61 6d 65 52 65 73 6f 6c  ic int nameResol
a7e0: 76 65 72 53 74 65 70 28 76 6f 69 64 20 2a 70 41  verStep(void *pA
a7f0: 72 67 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  rg, Expr *pExpr)
a800: 7b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  {.  NameContext 
a810: 2a 70 4e 43 20 3d 20 28 4e 61 6d 65 43 6f 6e 74  *pNC = (NameCont
a820: 65 78 74 2a 29 70 41 72 67 3b 0a 20 20 50 61 72  ext*)pArg;.  Par
a830: 73 65 20 2a 70 50 61 72 73 65 3b 0a 0a 20 20 69  se *pParse;..  i
a840: 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
a850: 74 75 72 6e 20 31 3b 0a 20 20 61 73 73 65 72 74  turn 1;.  assert
a860: 28 20 70 4e 43 21 3d 30 20 29 3b 0a 20 20 70 50  ( pNC!=0 );.  pP
a870: 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
a880: 73 65 3b 0a 0a 20 20 69 66 28 20 45 78 70 72 48  se;..  if( ExprH
a890: 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45  asAnyProperty(pE
a8a0: 78 70 72 2c 20 45 50 5f 52 65 73 6f 6c 76 65 64  xpr, EP_Resolved
a8b0: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
a8c0: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
a8d0: 70 45 78 70 72 2c 20 45 50 5f 52 65 73 6f 6c 76  pExpr, EP_Resolv
a8e0: 65 64 29 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45  ed);.#ifndef NDE
a8f0: 42 55 47 0a 20 20 69 66 28 20 70 4e 43 2d 3e 70  BUG.  if( pNC->p
a900: 53 72 63 4c 69 73 74 20 26 26 20 70 4e 43 2d 3e  SrcList && pNC->
a910: 70 53 72 63 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  pSrcList->nAlloc
a920: 3e 30 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73  >0 ){.    SrcLis
a930: 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e  t *pSrcList = pN
a940: 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20  C->pSrcList;.   
a950: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
a960: 69 3d 30 3b 20 69 3c 70 4e 43 2d 3e 70 53 72 63  i=0; i<pNC->pSrc
a970: 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
a980: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
a990: 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69  pSrcList->a[i].i
a9a0: 43 75 72 73 6f 72 3e 3d 30 20 26 26 20 70 53 72  Cursor>=0 && pSr
a9b0: 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72  cList->a[i].iCur
a9c0: 73 6f 72 3c 70 50 61 72 73 65 2d 3e 6e 54 61 62  sor<pParse->nTab
a9d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
a9e0: 64 69 66 0a 20 20 73 77 69 74 63 68 28 20 70 45  dif.  switch( pE
a9f0: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f  xpr->op ){.    /
aa00: 2a 20 44 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20  * Double-quoted 
aa10: 73 74 72 69 6e 67 73 20 28 65 78 3a 20 22 61 62  strings (ex: "ab
aa20: 63 22 29 20 61 72 65 20 75 73 65 64 20 61 73 20  c") are used as 
aa30: 69 64 65 6e 74 69 66 69 65 72 73 20 69 66 0a 20  identifiers if. 
aa40: 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20     ** possible. 
aa50: 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 79 20   Otherwise they 
aa60: 72 65 6d 61 69 6e 20 61 73 20 73 74 72 69 6e 67  remain as string
aa70: 73 2e 20 20 53 69 6e 67 6c 65 2d 71 75 6f 74 65  s.  Single-quote
aa80: 64 0a 20 20 20 20 2a 2a 20 73 74 72 69 6e 67 73  d.    ** strings
aa90: 20 28 65 78 3a 20 27 61 62 63 27 29 20 61 72 65   (ex: 'abc') are
aaa0: 20 61 6c 77 61 79 73 20 73 74 72 69 6e 67 20 6c   always string l
aab0: 69 74 65 72 61 6c 73 2e 0a 20 20 20 20 2a 2f 0a  iterals..    */.
aac0: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49      case TK_STRI
aad0: 4e 47 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  NG: {.      if( 
aae0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30  pExpr->token.z[0
aaf0: 5d 3d 3d 27 5c 27 27 20 29 20 62 72 65 61 6b 3b  ]=='\'' ) break;
ab00: 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74  .      /* Fall t
ab10: 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f  hru into the TK_
ab20: 49 44 20 63 61 73 65 20 69 66 20 74 68 69 73 20  ID case if this 
ab30: 69 73 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74  is a double-quot
ab40: 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20  ed string */.   
ab50: 20 7d 0a 20 20 20 20 2f 2a 20 41 20 6c 6f 6e 65   }.    /* A lone
ab60: 20 69 64 65 6e 74 69 66 69 65 72 20 69 73 20 74   identifier is t
ab70: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c  he name of a col
ab80: 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  umn..    */.    
ab90: 63 61 73 65 20 54 4b 5f 49 44 3a 20 7b 0a 20 20  case TK_ID: {.  
aba0: 20 20 20 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70      lookupName(p
abb0: 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 26 70 45  Parse, 0, 0, &pE
abc0: 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 70 4e 43 2c  xpr->token, pNC,
abd0: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 72   pExpr);.      r
abe0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
abf0: 20 0a 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65   .    /* A table
ac00: 20 6e 61 6d 65 20 61 6e 64 20 63 6f 6c 75 6d 6e   name and column
ac10: 20 6e 61 6d 65 3a 20 20 20 20 20 49 44 2e 49 44   name:     ID.ID
ac20: 0a 20 20 20 20 2a 2a 20 4f 72 20 61 20 64 61 74  .    ** Or a dat
ac30: 61 62 61 73 65 2c 20 74 61 62 6c 65 20 61 6e 64  abase, table and
ac40: 20 63 6f 6c 75 6d 6e 3a 20 20 49 44 2e 49 44 2e   column:  ID.ID.
ac50: 49 44 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  ID.    */.    ca
ac60: 73 65 20 54 4b 5f 44 4f 54 3a 20 7b 0a 20 20 20  se TK_DOT: {.   
ac70: 20 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75 6d     Token *pColum
ac80: 6e 3b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a  n;.      Token *
ac90: 70 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 54 6f  pTable;.      To
aca0: 6b 65 6e 20 2a 70 44 62 3b 0a 20 20 20 20 20 20  ken *pDb;.      
acb0: 45 78 70 72 20 2a 70 52 69 67 68 74 3b 0a 0a 20  Expr *pRight;.. 
acc0: 20 20 20 20 20 2f 2a 20 69 66 28 20 70 53 72 63       /* if( pSrc
acd0: 4c 69 73 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b  List==0 ) break;
ace0: 20 2a 2f 0a 20 20 20 20 20 20 70 52 69 67 68 74   */.      pRight
acf0: 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74   = pExpr->pRight
ad00: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 69 67  ;.      if( pRig
ad10: 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b  ht->op==TK_ID ){
ad20: 0a 20 20 20 20 20 20 20 20 70 44 62 20 3d 20 30  .        pDb = 0
ad30: 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 6c 65  ;.        pTable
ad40: 20 3d 20 26 70 45 78 70 72 2d 3e 70 4c 65 66 74   = &pExpr->pLeft
ad50: 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  ->token;.       
ad60: 20 70 43 6f 6c 75 6d 6e 20 3d 20 26 70 52 69 67   pColumn = &pRig
ad70: 68 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20  ht->token;.     
ad80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ad90: 61 73 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e  assert( pRight->
ada0: 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 3b 0a 20 20  op==TK_DOT );.  
adb0: 20 20 20 20 20 20 70 44 62 20 3d 20 26 70 45 78        pDb = &pEx
adc0: 70 72 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e  pr->pLeft->token
add0: 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 6c 65  ;.        pTable
ade0: 20 3d 20 26 70 52 69 67 68 74 2d 3e 70 4c 65 66   = &pRight->pLef
adf0: 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  t->token;.      
ae00: 20 20 70 43 6f 6c 75 6d 6e 20 3d 20 26 70 52 69    pColumn = &pRi
ae10: 67 68 74 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b  ght->pRight->tok
ae20: 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  en;.      }.    
ae30: 20 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70 50 61    lookupName(pPa
ae40: 72 73 65 2c 20 70 44 62 2c 20 70 54 61 62 6c 65  rse, pDb, pTable
ae50: 2c 20 70 43 6f 6c 75 6d 6e 2c 20 70 4e 43 2c 20  , pColumn, pNC, 
ae60: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 72 65  pExpr);.      re
ae70: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  turn 1;.    }.. 
ae80: 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 66 75     /* Resolve fu
ae90: 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 0a 20 20 20  nction names.   
aea0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
aeb0: 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20 20  CONST_FUNC:.    
aec0: 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  case TK_FUNCTION
aed0: 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69  : {.      ExprLi
aee0: 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70  st *pList = pExp
aef0: 72 2d 3e 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20  r->pList;    /* 
af00: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6c 69 73  The argument lis
af10: 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  t */.      int n
af20: 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74   = pList ? pList
af30: 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 20 20 2f 2a  ->nExpr : 0;  /*
af40: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
af50: 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ents */.      in
af60: 74 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d  t no_such_func =
af70: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75   0;       /* Tru
af80: 65 20 69 66 20 6e 6f 20 73 75 63 68 20 66 75 6e  e if no such fun
af90: 63 74 69 6f 6e 20 65 78 69 73 74 73 20 2a 2f 0a  ction exists */.
afa0: 20 20 20 20 20 20 69 6e 74 20 77 72 6f 6e 67 5f        int wrong_
afb0: 6e 75 6d 5f 61 72 67 73 20 3d 20 30 3b 20 20 20  num_args = 0;   
afc0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 72 6f    /* True if wro
afd0: 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  ng number of arg
afe0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  uments */.      
aff0: 69 6e 74 20 69 73 5f 61 67 67 20 3d 20 30 3b 20  int is_agg = 0; 
b000: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
b010: 72 75 65 20 69 66 20 69 73 20 61 6e 20 61 67 67  rue if is an agg
b020: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20  regate function 
b030: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  */.      int i;.
b040: 20 20 20 20 20 20 69 6e 74 20 61 75 74 68 3b 20        int auth; 
b050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b060: 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 61 74 69    /* Authorizati
b070: 6f 6e 20 74 6f 20 75 73 65 20 74 68 65 20 66 75  on to use the fu
b080: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  nction */.      
b090: 69 6e 74 20 6e 49 64 3b 20 20 20 20 20 20 20 20  int nId;        
b0a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
b0b0: 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74  umber of charact
b0c0: 65 72 73 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20  ers in function 
b0d0: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f  name */.      co
b0e0: 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 20 20  nst char *zId;  
b0f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
b100: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 2e 20   function name. 
b110: 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66  */.      FuncDef
b120: 20 2a 70 44 65 66 3b 20 20 20 20 20 20 20 20 20   *pDef;         
b130: 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
b140: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66 75  ion about the fu
b150: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  nction */.      
b160: 69 6e 74 20 65 6e 63 20 3d 20 45 4e 43 28 70 50  int enc = ENC(pP
b170: 61 72 73 65 2d 3e 64 62 29 3b 20 20 2f 2a 20 54  arse->db);  /* T
b180: 68 65 20 64 61 74 61 62 61 73 65 20 65 6e 63 6f  he database enco
b190: 64 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 20 20 7a  ding */..      z
b1a0: 49 64 20 3d 20 28 63 68 61 72 2a 29 70 45 78 70  Id = (char*)pExp
b1b0: 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20  r->token.z;.    
b1c0: 20 20 6e 49 64 20 3d 20 70 45 78 70 72 2d 3e 74    nId = pExpr->t
b1d0: 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 70 44  oken.n;.      pD
b1e0: 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ef = sqlite3Find
b1f0: 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d  Function(pParse-
b200: 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e  >db, zId, nId, n
b210: 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  , enc, 0);.     
b220: 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a   if( pDef==0 ){.
b230: 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73          pDef = s
b240: 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
b250: 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  on(pParse->db, z
b260: 49 64 2c 20 6e 49 64 2c 20 2d 31 2c 20 65 6e 63  Id, nId, -1, enc
b270: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
b280: 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ( pDef==0 ){.   
b290: 20 20 20 20 20 20 20 6e 6f 5f 73 75 63 68 5f 66         no_such_f
b2a0: 75 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  unc = 1;.       
b2b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b2c0: 20 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73    wrong_num_args
b2d0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
b2e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
b2f0: 20 20 20 20 20 69 73 5f 61 67 67 20 3d 20 70 44       is_agg = pD
b300: 65 66 2d 3e 78 46 75 6e 63 3d 3d 30 3b 0a 20 20  ef->xFunc==0;.  
b310: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
b320: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
b330: 49 5a 41 54 49 4f 4e 0a 20 20 20 20 20 20 69 66  IZATION.      if
b340: 28 20 70 44 65 66 20 29 7b 0a 20 20 20 20 20 20  ( pDef ){.      
b350: 20 20 61 75 74 68 20 3d 20 73 71 6c 69 74 65 33    auth = sqlite3
b360: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
b370: 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 54 49 4f  , SQLITE_FUNCTIO
b380: 4e 2c 20 30 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d  N, 0, pDef->zNam
b390: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  e, 0);.        i
b3a0: 66 28 20 61 75 74 68 21 3d 53 51 4c 49 54 45 5f  f( auth!=SQLITE_
b3b0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
b3c0: 69 66 28 20 61 75 74 68 3d 3d 53 51 4c 49 54 45  if( auth==SQLITE
b3d0: 5f 44 45 4e 59 20 29 7b 0a 20 20 20 20 20 20 20  _DENY ){.       
b3e0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
b3f0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
b400: 74 20 61 75 74 68 6f 72 69 7a 65 64 20 74 6f 20  t authorized to 
b410: 75 73 65 20 66 75 6e 63 74 69 6f 6e 3a 20 25 73  use function: %s
b420: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
b430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b440: 20 20 20 20 20 20 20 70 44 65 66 2d 3e 7a 4e 61         pDef->zNa
b450: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
b460: 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20   pNC->nErr++;.  
b470: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b480: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
b490: 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 20  TK_NULL;.       
b4a0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
b4b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
b4c0: 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
b4d0: 69 73 5f 61 67 67 20 26 26 20 21 70 4e 43 2d 3e  is_agg && !pNC->
b4e0: 61 6c 6c 6f 77 41 67 67 20 29 7b 0a 20 20 20 20  allowAgg ){.    
b4f0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
b500: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73  Msg(pParse, "mis
b510: 75 73 65 20 6f 66 20 61 67 67 72 65 67 61 74 65  use of aggregate
b520: 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29   function %.*s()
b530: 22 2c 20 6e 49 64 2c 7a 49 64 29 3b 0a 20 20 20  ", nId,zId);.   
b540: 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b       pNC->nErr++
b550: 3b 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67 67  ;.        is_agg
b560: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
b570: 65 20 69 66 28 20 6e 6f 5f 73 75 63 68 5f 66 75  e if( no_such_fu
b580: 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  nc ){.        sq
b590: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
b5a0: 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 66  arse, "no such f
b5b0: 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73 22 2c 20  unction: %.*s", 
b5c0: 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20  nId, zId);.     
b5d0: 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a     pNC->nErr++;.
b5e0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
b5f0: 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 29  wrong_num_args )
b600: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
b610: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
b620: 2c 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f  ,"wrong number o
b630: 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66  f arguments to f
b640: 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c  unction %.*s()",
b650: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 49  .             nI
b660: 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20  d, zId);.       
b670: 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20   pNC->nErr++;.  
b680: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
b690: 69 73 5f 61 67 67 20 29 7b 0a 20 20 20 20 20 20  is_agg ){.      
b6a0: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
b6b0: 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20  _AGG_FUNCTION;. 
b6c0: 20 20 20 20 20 20 20 70 4e 43 2d 3e 68 61 73 41         pNC->hasA
b6d0: 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  gg = 1;.      }.
b6e0: 20 20 20 20 20 20 69 66 28 20 69 73 5f 61 67 67        if( is_agg
b6f0: 20 29 20 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67   ) pNC->allowAgg
b700: 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 0;.      for(
b710: 69 3d 30 3b 20 70 4e 43 2d 3e 6e 45 72 72 3d 3d  i=0; pNC->nErr==
b720: 30 20 26 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  0 && i<n; i++){.
b730: 20 20 20 20 20 20 20 20 77 61 6c 6b 45 78 70 72          walkExpr
b740: 54 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  Tree(pList->a[i]
b750: 2e 70 45 78 70 72 2c 20 6e 61 6d 65 52 65 73 6f  .pExpr, nameReso
b760: 6c 76 65 72 53 74 65 70 2c 20 70 4e 43 29 3b 0a  lverStep, pNC);.
b770: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
b780: 28 20 69 73 5f 61 67 67 20 29 20 70 4e 43 2d 3e  ( is_agg ) pNC->
b790: 61 6c 6c 6f 77 41 67 67 20 3d 20 31 3b 0a 20 20  allowAgg = 1;.  
b7a0: 20 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 20      /* FIX ME:  
b7b0: 43 6f 6d 70 75 74 65 20 70 45 78 70 72 2d 3e 61  Compute pExpr->a
b7c0: 66 66 69 6e 69 74 79 20 62 61 73 65 64 20 6f 6e  ffinity based on
b7d0: 20 74 68 65 20 65 78 70 65 63 74 65 64 20 72 65   the expected re
b7e0: 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 74 79  turn.      ** ty
b7f0: 70 65 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69  pe of the functi
b800: 6f 6e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on .      */.   
b810: 20 20 20 72 65 74 75 72 6e 20 69 73 5f 61 67 67     return is_agg
b820: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
b830: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
b840: 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
b850: 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 63 61 73  _SELECT:.    cas
b860: 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 23 65 6e  e TK_EXISTS:.#en
b870: 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  dif.    case TK_
b880: 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  IN: {.      if( 
b890: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29  pExpr->pSelect )
b8a0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 52  {.        int nR
b8b0: 65 66 20 3d 20 70 4e 43 2d 3e 6e 52 65 66 3b 0a  ef = pNC->nRef;.
b8c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b8d0: 4d 49 54 5f 43 48 45 43 4b 0a 20 20 20 20 20 20  MIT_CHECK.      
b8e0: 20 20 69 66 28 20 70 4e 43 2d 3e 69 73 43 68 65    if( pNC->isChe
b8f0: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ck ){.          
b900: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
b910: 70 50 61 72 73 65 2c 22 73 75 62 71 75 65 72 69  pParse,"subqueri
b920: 65 73 20 70 72 6f 68 69 62 69 74 65 64 20 69 6e  es prohibited in
b930: 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
b940: 74 73 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ts");.        }.
b950: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 73  #endif.        s
b960: 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f  qlite3SelectReso
b970: 6c 76 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lve(pParse, pExp
b980: 72 2d 3e 70 53 65 6c 65 63 74 2c 20 70 4e 43 29  r->pSelect, pNC)
b990: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
b9a0: 28 20 70 4e 43 2d 3e 6e 52 65 66 3e 3d 6e 52 65  ( pNC->nRef>=nRe
b9b0: 66 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  f );.        if(
b9c0: 20 6e 52 65 66 21 3d 70 4e 43 2d 3e 6e 52 65 66   nRef!=pNC->nRef
b9d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78   ){.          Ex
b9e0: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
b9f0: 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63  xpr, EP_VarSelec
ba00: 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
ba10: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
ba20: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
ba30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45   SQLITE_OMIT_CHE
ba40: 43 4b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56  CK.    case TK_V
ba50: 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20  ARIABLE: {.     
ba60: 20 69 66 28 20 70 4e 43 2d 3e 69 73 43 68 65 63   if( pNC->isChec
ba70: 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  k ){.        sql
ba80: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
ba90: 72 73 65 2c 22 70 61 72 61 6d 65 74 65 72 73 20  rse,"parameters 
baa0: 70 72 6f 68 69 62 69 74 65 64 20 69 6e 20 43 48  prohibited in CH
bab0: 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 22  ECK constraints"
bac0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
bad0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
bae0: 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72  ndif.  }.  retur
baf0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
bb00: 69 73 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73  is routine walks
bb10: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
bb20: 72 65 65 20 61 6e 64 20 72 65 73 6f 6c 76 65 73  ree and resolves
bb30: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 0a 2a   references to.*
bb40: 2a 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 2e  * table columns.
bb50: 20 20 4e 6f 64 65 73 20 6f 66 20 74 68 65 20 66    Nodes of the f
bb60: 6f 72 6d 20 49 44 2e 49 44 20 6f 72 20 49 44 20  orm ID.ID or ID 
bb70: 72 65 73 6f 6c 76 65 20 69 6e 74 6f 20 61 6e 0a  resolve into an.
bb80: 2a 2a 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20  ** index to the 
bb90: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 74 61 62  table in the tab
bba0: 6c 65 20 6c 69 73 74 20 61 6e 64 20 61 20 63 6f  le list and a co
bbb0: 6c 75 6d 6e 20 6f 66 66 73 65 74 2e 20 20 54 68  lumn offset.  Th
bbc0: 65 20 0a 2a 2a 20 45 78 70 72 2e 6f 70 63 6f 64  e .** Expr.opcod
bbd0: 65 20 66 6f 72 20 73 75 63 68 20 6e 6f 64 65 73  e for such nodes
bbe0: 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54   is changed to T
bbf0: 4b 5f 43 4f 4c 55 4d 4e 2e 20 20 54 68 65 20 45  K_COLUMN.  The E
bc00: 78 70 72 2e 69 54 61 62 6c 65 0a 2a 2a 20 76 61  xpr.iTable.** va
bc10: 6c 75 65 20 69 73 20 63 68 61 6e 67 65 64 20 74  lue is changed t
bc20: 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
bc30: 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61  he referenced ta
bc40: 62 6c 65 20 69 6e 20 70 54 61 62 4c 69 73 74 0a  ble in pTabList.
bc50: 2a 2a 20 70 6c 75 73 20 74 68 65 20 22 62 61 73  ** plus the "bas
bc60: 65 22 20 76 61 6c 75 65 2e 20 20 54 68 65 20 62  e" value.  The b
bc70: 61 73 65 20 76 61 6c 75 65 20 77 69 6c 6c 20 75  ase value will u
bc80: 6c 74 69 6d 61 74 65 6c 79 20 62 65 63 6f 6d 65  ltimately become
bc90: 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 63 75 72   the.** VDBE cur
bca0: 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 61  sor number for a
bcb0: 20 63 75 72 73 6f 72 20 74 68 61 74 20 69 73 20   cursor that is 
bcc0: 70 6f 69 6e 74 69 6e 67 20 69 6e 74 6f 20 74 68  pointing into th
bcd0: 65 20 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20  e referenced.** 
bce0: 74 61 62 6c 65 2e 20 20 54 68 65 20 45 78 70 72  table.  The Expr
bcf0: 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69  .iColumn value i
bd00: 73 20 63 68 61 6e 67 65 64 20 74 6f 20 74 68 65  s changed to the
bd10: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f   index of the co
bd20: 6c 75 6d 6e 20 0a 2a 2a 20 6f 66 20 74 68 65 20  lumn .** of the 
bd30: 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65  referenced table
bd40: 2e 20 20 54 68 65 20 45 78 70 72 2e 69 43 6f 6c  .  The Expr.iCol
bd50: 75 6d 6e 20 76 61 6c 75 65 20 66 6f 72 20 74 68  umn value for th
bd60: 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20 52 4f 57  e special.** ROW
bd70: 49 44 20 63 6f 6c 75 6d 6e 20 69 73 20 2d 31 2e  ID column is -1.
bd80: 20 20 41 6e 79 20 49 4e 54 45 47 45 52 20 50 52    Any INTEGER PR
bd90: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e  IMARY KEY column
bda0: 20 69 73 20 74 72 69 65 64 20 61 73 20 61 6e 0a   is tried as an.
bdb0: 2a 2a 20 61 6c 69 61 73 20 66 6f 72 20 52 4f 57  ** alias for ROW
bdc0: 49 44 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72  ID..**.** Also r
bdd0: 65 73 6f 6c 76 65 20 66 75 6e 63 74 69 6f 6e 20  esolve function 
bde0: 6e 61 6d 65 73 20 61 6e 64 20 63 68 65 63 6b 20  names and check 
bdf0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 66 6f  the functions fo
be00: 72 20 70 72 6f 70 65 72 0a 2a 2a 20 75 73 61 67  r proper.** usag
be10: 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 61 6c  e.  Make sure al
be20: 6c 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73  l function names
be30: 20 61 72 65 20 72 65 63 6f 67 6e 69 7a 65 64 20   are recognized 
be40: 61 6e 64 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e  and all function
be50: 73 0a 2a 2a 20 68 61 76 65 20 74 68 65 20 63 6f  s.** have the co
be60: 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 20  rrect number of 
be70: 61 72 67 75 6d 65 6e 74 73 2e 20 20 4c 65 61 76  arguments.  Leav
be80: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
be90: 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65 2d  ge.** in pParse-
bea0: 3e 7a 45 72 72 4d 73 67 20 69 66 20 61 6e 79 74  >zErrMsg if anyt
beb0: 68 69 6e 67 20 69 73 20 61 6d 69 73 73 2e 20 20  hing is amiss.  
bec0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
bed0: 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a  r of errors..**.
bee0: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
bef0: 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61 67  sion contains ag
bf00: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
bf10: 73 20 74 68 65 6e 20 73 65 74 20 74 68 65 20 45  s then set the E
bf20: 50 5f 41 67 67 0a 2a 2a 20 70 72 6f 70 65 72 74  P_Agg.** propert
bf30: 79 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  y on the express
bf40: 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
bf50: 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  te3ExprResolveNa
bf60: 6d 65 73 28 20 0a 20 20 4e 61 6d 65 43 6f 6e 74  mes( .  NameCont
bf70: 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 20 20 20  ext *pNC,       
bf80: 2f 2a 20 4e 61 6d 65 73 70 61 63 65 20 74 6f 20  /* Namespace to 
bf90: 72 65 73 6f 6c 76 65 20 65 78 70 72 65 73 73 69  resolve expressi
bfa0: 6f 6e 73 20 69 6e 2e 20 2a 2f 0a 20 20 45 78 70  ons in. */.  Exp
bfb0: 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20  r *pExpr        
bfc0: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
bfd0: 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e 61  ession to be ana
bfe0: 6c 79 7a 65 64 2e 20 2a 2f 0a 29 7b 0a 20 20 69  lyzed. */.){.  i
bff0: 6e 74 20 73 61 76 65 64 48 61 73 41 67 67 3b 0a  nt savedHasAgg;.
c000: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
c010: 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 69 66 20  ) return 0;.#if 
c020: 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
c030: 44 45 50 54 48 3e 30 0a 20 20 7b 0a 20 20 20 20  DEPTH>0.  {.    
c040: 69 6e 74 20 6d 78 44 65 70 74 68 20 3d 20 70 4e  int mxDepth = pN
c050: 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61  C->pParse->db->a
c060: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
c070: 49 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a  IT_EXPR_DEPTH];.
c080: 20 20 20 20 69 66 28 20 28 70 45 78 70 72 2d 3e      if( (pExpr->
c090: 6e 48 65 69 67 68 74 2b 70 4e 43 2d 3e 70 50 61  nHeight+pNC->pPa
c0a0: 72 73 65 2d 3e 6e 48 65 69 67 68 74 29 3e 6d 78  rse->nHeight)>mx
c0b0: 44 65 70 74 68 20 29 7b 0a 20 20 20 20 20 20 73  Depth ){.      s
c0c0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
c0d0: 4e 43 2d 3e 70 50 61 72 73 65 2c 20 0a 20 20 20  NC->pParse, .   
c0e0: 20 20 20 20 20 20 22 45 78 70 72 65 73 73 69 6f        "Expressio
c0f0: 6e 20 74 72 65 65 20 69 73 20 74 6f 6f 20 6c 61  n tree is too la
c100: 72 67 65 20 28 6d 61 78 69 6d 75 6d 20 64 65 70  rge (maximum dep
c110: 74 68 20 25 64 29 22 2c 20 6d 78 44 65 70 74 68  th %d)", mxDepth
c120: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
c130: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
c140: 20 20 20 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d      pNC->pParse-
c150: 3e 6e 48 65 69 67 68 74 20 2b 3d 20 70 45 78 70  >nHeight += pExp
c160: 72 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 7d 0a  r->nHeight;.  }.
c170: 23 65 6e 64 69 66 0a 20 20 73 61 76 65 64 48 61  #endif.  savedHa
c180: 73 41 67 67 20 3d 20 70 4e 43 2d 3e 68 61 73 41  sAgg = pNC->hasA
c190: 67 67 3b 0a 20 20 70 4e 43 2d 3e 68 61 73 41 67  gg;.  pNC->hasAg
c1a0: 67 20 3d 20 30 3b 0a 20 20 77 61 6c 6b 45 78 70  g = 0;.  walkExp
c1b0: 72 54 72 65 65 28 70 45 78 70 72 2c 20 6e 61 6d  rTree(pExpr, nam
c1c0: 65 52 65 73 6f 6c 76 65 72 53 74 65 70 2c 20 70  eResolverStep, p
c1d0: 4e 43 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  NC);.#if SQLITE_
c1e0: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30  MAX_EXPR_DEPTH>0
c1f0: 0a 20 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e  .  pNC->pParse->
c200: 6e 48 65 69 67 68 74 20 2d 3d 20 70 45 78 70 72  nHeight -= pExpr
c210: 2d 3e 6e 48 65 69 67 68 74 3b 0a 23 65 6e 64 69  ->nHeight;.#endi
c220: 66 0a 20 20 69 66 28 20 70 4e 43 2d 3e 6e 45 72  f.  if( pNC->nEr
c230: 72 3e 30 20 29 7b 0a 20 20 20 20 45 78 70 72 53  r>0 ){.    ExprS
c240: 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  etProperty(pExpr
c250: 2c 20 45 50 5f 45 72 72 6f 72 29 3b 0a 20 20 7d  , EP_Error);.  }
c260: 0a 20 20 69 66 28 20 70 4e 43 2d 3e 68 61 73 41  .  if( pNC->hasA
c270: 67 67 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65  gg ){.    ExprSe
c280: 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  tProperty(pExpr,
c290: 20 45 50 5f 41 67 67 29 3b 0a 20 20 7d 65 6c 73   EP_Agg);.  }els
c2a0: 65 20 69 66 28 20 73 61 76 65 64 48 61 73 41 67  e if( savedHasAg
c2b0: 67 20 29 7b 0a 20 20 20 20 70 4e 43 2d 3e 68 61  g ){.    pNC->ha
c2c0: 73 41 67 67 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  sAgg = 1;.  }.  
c2d0: 72 65 74 75 72 6e 20 45 78 70 72 48 61 73 50 72  return ExprHasPr
c2e0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
c2f0: 5f 45 72 72 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  _Error);.}../*.*
c300: 2a 20 41 20 70 6f 69 6e 74 65 72 20 69 6e 73 74  * A pointer inst
c310: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72  ance of this str
c320: 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20 74  ucture is used t
c330: 6f 20 70 61 73 73 20 69 6e 66 6f 72 6d 61 74 69  o pass informati
c340: 6f 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20 77 61  on.** through wa
c350: 6c 6b 45 78 70 72 54 72 65 65 20 69 6e 74 6f 20  lkExprTree into 
c360: 63 6f 64 65 53 75 62 71 75 65 72 79 53 74 65 70  codeSubqueryStep
c370: 28 29 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ()..*/.typedef s
c380: 74 72 75 63 74 20 51 75 65 72 79 43 6f 64 65 72  truct QueryCoder
c390: 20 51 75 65 72 79 43 6f 64 65 72 3b 0a 73 74 72   QueryCoder;.str
c3a0: 75 63 74 20 51 75 65 72 79 43 6f 64 65 72 20 7b  uct QueryCoder {
c3b0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
c3c0: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ;       /* The p
c3d0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
c3e0: 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  /.  NameContext 
c3f0: 2a 70 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65  *pNC;    /* Name
c400: 73 70 61 63 65 20 6f 66 20 66 69 72 73 74 20 65  space of first e
c410: 6e 63 6c 6f 73 69 6e 67 20 71 75 65 72 79 20 2a  nclosing query *
c420: 2f 0a 7d 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  /.};..#ifdef SQL
c430: 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 73  ITE_TEST.  int s
c440: 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 69 6e  qlite3_enable_in
c450: 5f 6f 70 74 20 3d 20 31 3b 0a 23 65 6c 73 65 0a  _opt = 1;.#else.
c460: 20 20 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65    #define sqlite
c470: 33 5f 65 6e 61 62 6c 65 5f 69 6e 5f 6f 70 74 20  3_enable_in_opt 
c480: 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  1.#endif../*.** 
c490: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
c4a0: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 6f  he IN operator o
c4b0: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65  ptimization is e
c4c0: 6e 61 62 6c 65 64 20 61 6e 64 0a 2a 2a 20 74 68  nabled and.** th
c4d0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
c4e0: 6e 74 20 70 20 65 78 69 73 74 73 20 61 6e 64 20  nt p exists and 
c4f0: 69 73 20 6f 66 20 74 68 65 0a 2a 2a 20 73 69 6d  is of the.** sim
c500: 70 6c 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  ple form:.**.** 
c510: 20 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75      SELECT <colu
c520: 6d 6e 3e 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e  mn> FROM <table>
c530: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69  .**.** If this i
c540: 73 20 74 68 65 20 63 61 73 65 2c 20 69 74 20 6d  s the case, it m
c550: 61 79 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ay be possible t
c560: 6f 20 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e  o use an existin
c570: 67 20 74 61 62 6c 65 0a 2a 2a 20 6f 72 20 69 6e  g table.** or in
c580: 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66 20 67  dex instead of g
c590: 65 6e 65 72 61 74 69 6e 67 20 61 6e 20 65 70 68  enerating an eph
c5a0: 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f  eremal table..*/
c5b0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
c5c0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 73 74  OMIT_SUBQUERY.st
c5d0: 61 74 69 63 20 69 6e 74 20 69 73 43 61 6e 64 69  atic int isCandi
c5e0: 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 53 65 6c  dateForInOpt(Sel
c5f0: 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69  ect *p){.  SrcLi
c600: 73 74 20 2a 70 53 72 63 3b 0a 20 20 45 78 70 72  st *pSrc;.  Expr
c610: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
c620: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69  Table *pTab;.  i
c630: 66 28 20 21 73 71 6c 69 74 65 33 5f 65 6e 61 62  f( !sqlite3_enab
c640: 6c 65 5f 69 6e 5f 6f 70 74 20 29 20 72 65 74 75  le_in_opt ) retu
c650: 72 6e 20 30 3b 20 2f 2a 20 49 4e 20 6f 70 74 69  rn 0; /* IN opti
c660: 6d 69 7a 61 74 69 6f 6e 20 6d 75 73 74 20 62 65  mization must be
c670: 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66   enabled */.  if
c680: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
c690: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
c6a0: 20 20 20 20 20 2f 2a 20 72 69 67 68 74 2d 68 61       /* right-ha
c6b0: 6e 64 20 73 69 64 65 20 6f 66 20 49 4e 20 69 73  nd side of IN is
c6c0: 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28   SELECT */.  if(
c6d0: 20 70 2d 3e 70 50 72 69 6f 72 20 29 20 72 65 74   p->pPrior ) ret
c6e0: 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
c6f0: 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 6d      /* Not a com
c700: 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a  pound SELECT */.
c710: 20 20 69 66 28 20 70 2d 3e 69 73 44 69 73 74 69    if( p->isDisti
c720: 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  nct ) return 0; 
c730: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 44           /* No D
c740: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
c750: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 73 41 67  */.  if( p->isAg
c760: 67 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  g ) return 0;   
c770: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
c780: 6f 6e 74 61 69 6e 73 20 6e 6f 20 61 67 67 72 65  ontains no aggre
c790: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
c7a0: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75  /.  if( p->pGrou
c7b0: 70 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b 20  pBy ) return 0; 
c7c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
c7d0: 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c  s no GROUP BY cl
c7e0: 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ause */.  if( p-
c7f0: 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e  >pLimit ) return
c800: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
c810: 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54   /* Has no LIMIT
c820: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28   clause */.  if(
c830: 20 70 2d 3e 70 4f 66 66 73 65 74 20 29 20 72 65   p->pOffset ) re
c840: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d  turn 0;.  if( p-
c850: 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e  >pWhere ) return
c860: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
c870: 20 2f 2a 20 48 61 73 20 6e 6f 20 57 48 45 52 45   /* Has no WHERE
c880: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 70 53 72   clause */.  pSr
c890: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69  c = p->pSrc;.  i
c8a0: 66 28 20 70 53 72 63 3d 3d 30 20 29 20 72 65 74  f( pSrc==0 ) ret
c8b0: 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
c8c0: 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
c8d0: 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  e table in the F
c8e0: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
c8f0: 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d  if( pSrc->nSrc!=
c900: 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  1 ) return 0;.  
c910: 69 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70  if( pSrc->a[0].p
c920: 53 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20  Select ) return 
c930: 30 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63  0;     /* FROM c
c940: 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61 20 73  lause is not a s
c950: 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 70 54 61  ubquery */.  pTa
c960: 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70  b = pSrc->a[0].p
c970: 54 61 62 3b 0a 20 20 69 66 28 20 70 54 61 62 3d  Tab;.  if( pTab=
c980: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
c990: 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
c9a0: 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  ct ) return 0;  
c9b0: 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20          /* FROM 
c9c0: 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61 20  clause is not a 
c9d0: 76 69 65 77 20 2a 2f 0a 20 20 69 66 28 20 49 73  view */.  if( Is
c9e0: 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20  Virtual(pTab) ) 
c9f0: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
ca00: 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
ca10: 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61  not a virtual ta
ca20: 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20  ble */.  pEList 
ca30: 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69  = p->pEList;.  i
ca40: 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  f( pEList->nExpr
ca50: 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20  !=1 ) return 0; 
ca60: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63 6f 6c        /* One col
ca70: 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c  umn in the resul
ca80: 74 20 73 65 74 20 2a 2f 0a 20 20 69 66 28 20 70  t set */.  if( p
ca90: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
caa0: 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
cab0: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20   ) return 0; /* 
cac0: 52 65 73 75 6c 74 20 69 73 20 61 20 63 6f 6c 75  Result is a colu
cad0: 6d 6e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31  mn */.  return 1
cae0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
caf0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
cb00: 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  RY */../*.** Thi
cb10: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
cb20: 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d  ed by the implem
cb30: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
cb40: 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f  IN (...) operato
cb50: 72 2e 0a 2a 2a 20 49 74 27 73 20 6a 6f 62 20 69  r..** It's job i
cb60: 73 20 74 6f 20 66 69 6e 64 20 6f 72 20 63 72 65  s to find or cre
cb70: 61 74 65 20 61 20 62 2d 74 72 65 65 20 73 74 72  ate a b-tree str
cb80: 75 63 74 75 72 65 20 74 68 61 74 20 6d 61 79 20  ucture that may 
cb90: 62 65 20 75 73 65 64 0a 2a 2a 20 65 69 74 68 65  be used.** eithe
cba0: 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6d 65  r to test for me
cbb0: 6d 62 65 72 73 68 69 70 20 6f 66 20 74 68 65 20  mbership of the 
cbc0: 28 2e 2e 2e 29 20 73 65 74 20 6f 72 20 74 6f 20  (...) set or to 
cbd0: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 0a  iterate through.
cbe0: 2a 2a 20 69 74 73 20 6d 65 6d 62 65 72 73 2c 20  ** its members, 
cbf0: 73 6b 69 70 70 69 6e 67 20 64 75 70 6c 69 63 61  skipping duplica
cc00: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  tes..**.** The c
cc10: 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 6f 6e 20  ursor opened on 
cc20: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 28 64  the structure (d
cc30: 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c 20 64  atabase table, d
cc40: 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 0a 2a  atabase index .*
cc50: 2a 20 6f 72 20 65 70 68 65 72 6d 61 6c 20 74 61  * or ephermal ta
cc60: 62 6c 65 29 20 69 73 20 73 74 6f 72 65 64 20 69  ble) is stored i
cc70: 6e 20 70 58 2d 3e 69 54 61 62 6c 65 20 62 65 66  n pX->iTable bef
cc80: 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ore this functio
cc90: 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 20 54 68  n returns..** Th
cca0: 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
ccb0: 20 69 6e 64 69 63 61 74 65 73 20 74 68 65 20 73   indicates the s
ccc0: 74 72 75 63 74 75 72 65 20 74 79 70 65 2c 20 61  tructure type, a
ccd0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
cce0: 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49     IN_INDEX_ROWI
ccf0: 44 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77  D - The cursor w
cd00: 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64  as opened on a d
cd10: 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a  atabase table..*
cd20: 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  *   IN_INDEX_IND
cd30: 45 58 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20  EX - The cursor 
cd40: 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20  was opened on a 
cd50: 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 2e 0a  database index..
cd60: 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45 50  **   IN_INDEX_EP
cd70: 48 20 2d 20 20 20 54 68 65 20 63 75 72 73 6f 72  H -   The cursor
cd80: 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
cd90: 20 73 70 65 63 69 61 6c 6c 79 20 63 72 65 61 74   specially creat
cda0: 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  ed and.**       
cdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 70               pop
cdc0: 75 6c 61 74 65 64 20 65 70 68 65 72 65 6d 61 6c  ulated epheremal
cdd0: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e   table..**.** An
cde0: 20 65 78 69 73 74 69 6e 67 20 73 74 72 75 63 74   existing struct
cdf0: 75 72 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  ure may only be 
ce00: 75 73 65 64 20 69 66 20 74 68 65 20 53 45 4c 45  used if the SELE
ce10: 43 54 20 69 73 20 6f 66 20 74 68 65 20 73 69 6d  CT is of the sim
ce20: 70 6c 65 0a 2a 2a 20 66 6f 72 6d 3a 0a 2a 2a 0a  ple.** form:.**.
ce30: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c 63  **     SELECT <c
ce40: 6f 6c 75 6d 6e 3e 20 46 52 4f 4d 20 3c 74 61 62  olumn> FROM <tab
ce50: 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  le>.**.** If the
ce60: 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20 70 61   mustBeUnique pa
ce70: 72 61 6d 65 74 65 72 20 69 73 20 66 61 6c 73 65  rameter is false
ce80: 2c 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  , the structure 
ce90: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a  will be used .**
cea0: 20 66 6f 72 20 66 61 73 74 20 73 65 74 20 6d 65   for fast set me
ceb0: 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 2e 20  mbership tests. 
cec0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 20  In this case an 
ced0: 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20  epheremal table 
cee0: 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75 73 65 64  must .** be used
cef0: 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 3e   unless <column>
cf00: 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50   is an INTEGER P
cf10: 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 61 6e  RIMARY KEY or an
cf20: 20 69 6e 64 65 78 20 63 61 6e 20 0a 2a 2a 20 62   index can .** b
cf30: 65 20 66 6f 75 6e 64 20 77 69 74 68 20 3c 63 6f  e found with <co
cf40: 6c 75 6d 6e 3e 20 61 73 20 69 74 73 20 6c 65 66  lumn> as its lef
cf50: 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 2e 0a 2a  t-most column..*
cf60: 2a 0a 2a 2a 20 49 66 20 6d 75 73 74 42 65 55 6e  *.** If mustBeUn
cf70: 69 71 75 65 20 69 73 20 74 72 75 65 2c 20 74 68  ique is true, th
cf80: 65 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65  en the structure
cf90: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
cfa0: 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f   iterate.** thro
cfb0: 75 67 68 20 74 68 65 20 73 65 74 20 6d 65 6d 62  ugh the set memb
cfc0: 65 72 73 2c 20 73 6b 69 70 70 69 6e 67 20 61 6e  ers, skipping an
cfd0: 79 20 64 75 70 6c 69 63 61 74 65 73 2e 20 49 6e  y duplicates. In
cfe0: 20 74 68 69 73 20 63 61 73 65 20 61 6e 0a 2a 2a   this case an.**
cff0: 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65   epheremal table
d000: 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 75 6e   must be used un
d010: 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63 74 65  less the selecte
d020: 64 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 67 75  d <column> is gu
d030: 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62  aranteed.** to b
d040: 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74 68 65  e unique - eithe
d050: 72 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20  r because it is 
d060: 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  an INTEGER PRIMA
d070: 52 59 20 4b 45 59 20 6f 72 20 69 74 0a 2a 2a 20  RY KEY or it.** 
d080: 69 73 20 75 6e 69 71 75 65 20 62 79 20 76 69 72  is unique by vir
d090: 74 75 65 20 6f 66 20 61 20 63 6f 6e 73 74 72 61  tue of a constra
d0a0: 69 6e 74 20 6f 72 20 69 6d 70 6c 69 63 69 74 20  int or implicit 
d0b0: 69 6e 64 65 78 2e 0a 2a 2f 0a 23 69 66 6e 64 65  index..*/.#ifnde
d0c0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
d0d0: 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74  BQUERY.int sqlit
d0e0: 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 50 61  e3FindInIndex(Pa
d0f0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
d100: 72 20 2a 70 58 2c 20 69 6e 74 20 6d 75 73 74 42  r *pX, int mustB
d110: 65 55 6e 69 71 75 65 29 7b 0a 20 20 53 65 6c 65  eUnique){.  Sele
d120: 63 74 20 2a 70 3b 0a 20 20 69 6e 74 20 65 54 79  ct *p;.  int eTy
d130: 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54  pe = 0;.  int iT
d140: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
d150: 62 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66  b++;..  /* The f
d160: 6f 6c 6c 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20  ollwing if(...) 
d170: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72  expression is tr
d180: 75 65 20 69 66 20 74 68 65 20 53 45 4c 45 43 54  ue if the SELECT
d190: 20 69 73 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a   is of the .  **
d1a0: 20 73 69 6d 70 6c 65 20 66 6f 72 6d 3a 0a 20 20   simple form:.  
d1b0: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
d1c0: 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52 4f 4d  CT <column> FROM
d1d0: 20 3c 74 61 62 6c 65 3e 0a 20 20 2a 2a 0a 20 20   <table>.  **.  
d1e0: 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  ** If this is th
d1f0: 65 20 63 61 73 65 2c 20 69 74 20 6d 61 79 20 62  e case, it may b
d200: 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73  e possible to us
d210: 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61  e an existing ta
d220: 62 6c 65 0a 20 20 2a 2a 20 6f 72 20 69 6e 64 65  ble.  ** or inde
d230: 78 20 69 6e 73 74 65 61 64 20 6f 66 20 67 65 6e  x instead of gen
d240: 65 72 61 74 69 6e 67 20 61 6e 20 65 70 68 65 72  erating an epher
d250: 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  emal table..  */
d260: 0a 20 20 70 20 3d 20 70 58 2d 3e 70 53 65 6c 65  .  p = pX->pSele
d270: 63 74 3b 0a 20 20 69 66 28 20 69 73 43 61 6e 64  ct;.  if( isCand
d280: 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29  idateForInOpt(p)
d290: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20   ){.    sqlite3 
d2a0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
d2b0: 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  ;.    Index *pId
d2c0: 78 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  x;.    Expr *pEx
d2d0: 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  pr = p->pEList->
d2e0: 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[0].pExpr;.    
d2f0: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72  int iCol = pExpr
d300: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 56  ->iColumn;.    V
d310: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
d320: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
d330: 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75  ..    /* This fu
d340: 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63  nction is only c
d350: 61 6c 6c 65 64 20 66 72 6f 6d 20 74 77 6f 20 70  alled from two p
d360: 6c 61 63 65 73 2e 20 49 6e 20 62 6f 74 68 20 63  laces. In both c
d370: 61 73 65 73 20 74 68 65 20 76 64 62 65 0a 20 20  ases the vdbe.  
d380: 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79    ** has already
d390: 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2e   been allocated.
d3a0: 20 53 6f 20 61 73 73 75 6d 65 20 73 71 6c 69 74   So assume sqlit
d3b0: 65 33 47 65 74 56 64 62 65 28 29 20 69 73 20 61  e3GetVdbe() is a
d3c0: 6c 77 61 79 73 0a 20 20 20 20 2a 2a 20 73 75 63  lways.    ** suc
d3d0: 63 65 73 73 66 75 6c 20 68 65 72 65 2e 0a 20 20  cessful here..  
d3e0: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
d3f0: 76 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c  v);.    if( iCol
d400: 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  <0 ){.      int 
d410: 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
d420: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74  >nMem;.      int
d430: 20 69 41 64 64 72 3b 0a 20 20 20 20 20 20 54 61   iAddr;.      Ta
d440: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 2d 3e 70  ble *pTab = p->p
d450: 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a  Src->a[0].pTab;.
d460: 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20        int iDb = 
d470: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
d480: 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
d490: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 73  Schema);.      s
d4a0: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
d4b0: 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 0a 20 20  ree(v, iDb);..  
d4c0: 20 20 20 20 69 41 64 64 72 20 3d 20 73 71 6c 69      iAddr = sqli
d4d0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
d4e0: 20 4f 50 5f 49 66 2c 20 69 4d 65 6d 29 3b 0a 20   OP_If, iMem);. 
d4f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d500: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
d510: 65 67 65 72 2c 20 31 2c 20 69 4d 65 6d 29 3b 0a  eger, 1, iMem);.
d520: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
d530: 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
d540: 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c  iTab, iDb, pTab,
d550: 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20   OP_OpenRead);. 
d560: 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f       eType = IN_
d570: 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 0a 20 20  INDEX_ROWID;..  
d580: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
d590: 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64 72  umpHere(v, iAddr
d5a0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
d5b0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61      /* The colla
d5c0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73  tion sequence us
d5d0: 65 64 20 62 79 20 74 68 65 20 63 6f 6d 70 61 72  ed by the compar
d5e0: 69 73 6f 6e 2e 20 49 66 20 61 6e 20 69 6e 64 65  ison. If an inde
d5f0: 78 20 69 73 20 74 6f 20 0a 20 20 20 20 20 20 2a  x is to .      *
d600: 2a 20 62 65 20 75 73 65 64 20 69 6e 20 70 6c 61  * be used in pla
d610: 63 65 20 6f 66 20 61 20 74 65 6d 70 2d 74 61 62  ce of a temp-tab
d620: 6c 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20 6f  le, it must be o
d630: 72 64 65 72 65 64 20 61 63 63 6f 72 64 69 6e 67  rdered according
d640: 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 69  .      ** to thi
d650: 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  s collation sequ
d660: 65 6e 63 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ence..      */. 
d670: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52       CollSeq *pR
d680: 65 71 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61  eq = sqlite3Bina
d690: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
d6a0: 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65  (pParse, pX->pLe
d6b0: 66 74 2c 20 70 45 78 70 72 29 3b 0a 0a 20 20 20  ft, pExpr);..   
d6c0: 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74     /* Check that
d6d0: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 68   the affinity th
d6e0: 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  at will be used 
d6f0: 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 65 20 0a  to perform the .
d700: 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69        ** compari
d710: 73 6f 6e 20 69 73 20 74 68 65 20 73 61 6d 65 20  son is the same 
d720: 61 73 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  as the affinity 
d730: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 49  of the column. I
d740: 66 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73  f.      ** it is
d750: 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74 20   not, it is not 
d760: 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20  possible to use 
d770: 61 6e 79 20 69 6e 64 65 78 2e 0a 20 20 20 20 20  any index..     
d780: 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20   */.      Table 
d790: 2a 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d  *pTab = p->pSrc-
d7a0: 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 20 20  >a[0].pTab;.    
d7b0: 20 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f 6d    char aff = com
d7c0: 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28  parisonAffinity(
d7d0: 70 58 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 61  pX);.      int a
d7e0: 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 28 70 54  ffinity_ok = (pT
d7f0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 61  ab->aCol[iCol].a
d800: 66 66 69 6e 69 74 79 3d 3d 61 66 66 7c 7c 61 66  ffinity==aff||af
d810: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  f==SQLITE_AFF_NO
d820: 4e 45 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28  NE);..      for(
d830: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
d840: 78 3b 20 70 49 64 78 20 26 26 20 65 54 79 70 65  x; pIdx && eType
d850: 3d 3d 30 20 26 26 20 61 66 66 69 6e 69 74 79 5f  ==0 && affinity_
d860: 6f 6b 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  ok; pIdx=pIdx->p
d870: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69  Next){.        i
d880: 66 28 20 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75  f( (pIdx->aiColu
d890: 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 29 0a 20 20 20  mn[0]==iCol).   
d8a0: 20 20 20 20 20 20 26 26 20 28 70 52 65 71 3d 3d        && (pReq==
d8b0: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
d8c0: 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20  eq(db, ENC(db), 
d8d0: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 2c  pIdx->azColl[0],
d8e0: 20 2d 31 2c 20 30 29 29 0a 20 20 20 20 20 20 20   -1, 0)).       
d8f0: 20 20 26 26 20 28 21 6d 75 73 74 42 65 55 6e 69    && (!mustBeUni
d900: 71 75 65 20 7c 7c 20 28 70 49 64 78 2d 3e 6e 43  que || (pIdx->nC
d910: 6f 6c 75 6d 6e 3d 3d 31 20 26 26 20 70 49 64 78  olumn==1 && pIdx
d920: 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
d930: 6e 65 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  ne)).        ){.
d940: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44            int iD
d950: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  b;.          int
d960: 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65   iMem = ++pParse
d970: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->nMem;.        
d980: 20 20 69 6e 74 20 69 41 64 64 72 3b 0a 20 20 20    int iAddr;.   
d990: 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 4b 65         char *pKe
d9a0: 79 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20  y;.  .          
d9b0: 70 4b 65 79 20 3d 20 28 63 68 61 72 20 2a 29 73  pKey = (char *)s
d9c0: 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e  qlite3IndexKeyin
d9d0: 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29  fo(pParse, pIdx)
d9e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 44 62 20  ;.          iDb 
d9f0: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
da00: 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 64 78 2d  oIndex(db, pIdx-
da10: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
da20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
da30: 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62  UsesBtree(v, iDb
da40: 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69 41  );..          iA
da50: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
da60: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
da70: 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20  , iMem);.       
da80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
da90: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
daa0: 65 72 2c 20 31 2c 20 69 4d 65 6d 29 3b 0a 20 20  er, 1, iMem);.  
dab0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
dac0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
dad0: 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73  OP_SetNumColumns
dae0: 2c 20 30 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  , 0, pIdx->nColu
daf0: 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  mn);.          s
db00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
db10: 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c  (v, OP_OpenRead,
db20: 20 69 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e 75   iTab, pIdx->tnu
db30: 6d 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20  m, iDb,.        
db40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db50: 20 20 20 20 20 20 20 70 4b 65 79 2c 50 34 5f 4b         pKey,P4_K
db60: 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
db70: 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43  .          VdbeC
db80: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
db90: 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a   pIdx->zName));.
dba0: 20 20 20 20 20 20 20 20 20 20 65 54 79 70 65 20            eType 
dbb0: 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  = IN_INDEX_INDEX
dbc0: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ;..          sql
dbd0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
dbe0: 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20  (v, iAddr);.    
dbf0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
dc00: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65    }.  }..  if( e
dc10: 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Type==0 ){.    s
dc20: 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
dc30: 65 63 74 28 70 50 61 72 73 65 2c 20 70 58 29 3b  ect(pParse, pX);
dc40: 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f  .    eType = IN_
dc50: 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20 7d 65 6c  INDEX_EPH;.  }el
dc60: 73 65 7b 0a 20 20 20 20 70 58 2d 3e 69 54 61 62  se{.    pX->iTab
dc70: 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 7d 0a 20  le = iTab;.  }. 
dc80: 20 72 65 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d   return eType;.}
dc90: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
dca0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
dcb0: 20 73 63 61 6c 61 72 20 73 75 62 71 75 65 72 69   scalar subqueri
dcc0: 65 73 20 75 73 65 64 20 61 73 20 61 6e 20 65 78  es used as an ex
dcd0: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 6e 64 20  pression.** and 
dce0: 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 45  IN operators.  E
dcf0: 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  xamples:.**.**  
dd00: 20 20 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f     (SELECT a FRO
dd10: 4d 20 62 29 20 20 20 20 20 20 20 20 20 20 2d 2d  M b)          --
dd20: 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20   subquery.**    
dd30: 20 45 58 49 53 54 53 20 28 53 45 4c 45 43 54 20   EXISTS (SELECT 
dd40: 61 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d 20 45  a FROM b)   -- E
dd50: 58 49 53 54 53 20 73 75 62 71 75 65 72 79 0a 2a  XISTS subquery.*
dd60: 2a 20 20 20 20 20 78 20 49 4e 20 28 34 2c 35 2c  *     x IN (4,5,
dd70: 31 31 29 20 20 20 20 20 20 20 20 20 20 20 20 20  11)             
dd80: 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   -- IN operator 
dd90: 77 69 74 68 20 6c 69 73 74 20 6f 6e 20 72 69 67  with list on rig
dda0: 68 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a 2a 20  ht-hand side.** 
ddb0: 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54      x IN (SELECT
ddc0: 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20 2d   a FROM b)     -
ddd0: 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69  - IN operator wi
dde0: 74 68 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74  th subquery on t
ddf0: 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54  he right.**.** T
de00: 68 65 20 70 45 78 70 72 20 70 61 72 61 6d 65 74  he pExpr paramet
de10: 65 72 20 64 65 73 63 72 69 62 65 73 20 74 68 65  er describes the
de20: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
de30: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 49 4e   contains the IN
de40: 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 6f 72 20  .** operator or 
de50: 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 23 69 66  subquery..*/.#if
de60: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
de70: 5f 53 55 42 51 55 45 52 59 0a 76 6f 69 64 20 73  _SUBQUERY.void s
de80: 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
de90: 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ect(Parse *pPars
dea0: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
deb0: 0a 20 20 69 6e 74 20 74 65 73 74 41 64 64 72 20  .  int testAddr 
dec0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
ded0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
dee0: 65 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64 72  e-time test addr
def0: 65 73 73 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ess */.  Vdbe *v
df00: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
df10: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
df20: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
df30: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65  ..  /* This code
df40: 20 6d 75 73 74 20 62 65 20 72 75 6e 20 69 6e 20   must be run in 
df50: 69 74 73 20 65 6e 74 69 72 65 74 79 20 65 76 65  its entirety eve
df60: 72 79 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e  ry time it is en
df70: 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 69  countered.  ** i
df80: 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  f any of the fol
df90: 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 3a 0a  lowing is true:.
dfa0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20    **.  **    *  
dfb0: 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
dfc0: 69 64 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61  ide is a correla
dfd0: 74 65 64 20 73 75 62 71 75 65 72 79 0a 20 20 2a  ted subquery.  *
dfe0: 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67 68  *    *  The righ
dff0: 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61  t-hand side is a
e000: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
e010: 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72  t containing var
e020: 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a  iables.  **    *
e030: 20 20 57 65 20 61 72 65 20 69 6e 73 69 64 65 20    We are inside 
e040: 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20  a trigger.  **. 
e050: 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68   ** If all of th
e060: 65 20 61 62 6f 76 65 20 61 72 65 20 66 61 6c 73  e above are fals
e070: 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72  e, then we can r
e080: 75 6e 20 74 68 69 73 20 63 6f 64 65 20 6a 75 73  un this code jus
e090: 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65  t once.  ** save
e0a0: 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20 61 6e   the results, an
e0b0: 64 20 72 65 75 73 65 20 74 68 65 20 73 61 6d 65  d reuse the same
e0c0: 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65   result on subse
e0d0: 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e  quent invocation
e0e0: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 45  s..  */.  if( !E
e0f0: 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74  xprHasAnyPropert
e100: 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53  y(pExpr, EP_VarS
e110: 65 6c 65 63 74 29 20 26 26 20 21 70 50 61 72 73  elect) && !pPars
e120: 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 29 7b 0a  e->trigStack ){.
e130: 20 20 20 20 69 6e 74 20 6d 65 6d 20 3d 20 2b 2b      int mem = ++
e140: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
e150: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e160: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 6d 65  Op1(v, OP_If, me
e170: 6d 29 3b 0a 20 20 20 20 74 65 73 74 41 64 64 72  m);.    testAddr
e180: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
e190: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
e1a0: 65 72 2c 20 31 2c 20 6d 65 6d 29 3b 0a 20 20 20  er, 1, mem);.   
e1b0: 20 61 73 73 65 72 74 28 20 74 65 73 74 41 64 64   assert( testAdd
e1c0: 72 3e 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  r>0 || pParse->d
e1d0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
e1e0: 29 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68  );.  }..  switch
e1f0: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
e200: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
e210: 0a 20 20 20 20 20 20 63 68 61 72 20 61 66 66 69  .      char affi
e220: 6e 69 74 79 3b 0a 20 20 20 20 20 20 4b 65 79 49  nity;.      KeyI
e230: 6e 66 6f 20 6b 65 79 49 6e 66 6f 3b 0a 20 20 20  nfo keyInfo;.   
e240: 20 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20     int addr;    
e250: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
e260: 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  f OP_OpenEphemer
e270: 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a  al instruction *
e280: 2f 0a 0a 20 20 20 20 20 20 61 66 66 69 6e 69 74  /..      affinit
e290: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  y = sqlite3ExprA
e2a0: 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70  ffinity(pExpr->p
e2b0: 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Left);..      /*
e2c0: 20 57 68 65 74 68 65 72 20 74 68 69 73 20 69 73   Whether this is
e2d0: 20 61 6e 20 27 78 20 49 4e 28 53 45 4c 45 43 54   an 'x IN(SELECT
e2e0: 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78 20 49  ...)' or an 'x I
e2f0: 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a 20  N(<exprlist>)'. 
e300: 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69       ** expressi
e310: 6f 6e 20 69 74 20 69 73 20 68 61 6e 64 6c 65 64  on it is handled
e320: 20 74 68 65 20 73 61 6d 65 20 77 61 79 2e 20 41   the same way. A
e330: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69   virtual table i
e340: 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c  s .      ** fill
e350: 65 64 20 77 69 74 68 20 73 69 6e 67 6c 65 2d 66  ed with single-f
e360: 69 65 6c 64 20 69 6e 64 65 78 20 6b 65 79 73 20  ield index keys 
e370: 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65  representing the
e380: 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a   results.      *
e390: 2a 20 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43  * from the SELEC
e3a0: 54 20 6f 72 20 74 68 65 20 3c 65 78 70 72 6c 69  T or the <exprli
e3b0: 73 74 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  st>..      **.  
e3c0: 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 27 78      ** If the 'x
e3d0: 27 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  ' expression is 
e3e0: 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20  a column value, 
e3f0: 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e  or the SELECT...
e400: 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
e410: 65 6e 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f  ent returns a co
e420: 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e  lumn value, then
e430: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66   the affinity of
e440: 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63   that.      ** c
e450: 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 74 6f  olumn is used to
e460: 20 62 75 69 6c 64 20 74 68 65 20 69 6e 64 65 78   build the index
e470: 20 6b 65 79 73 2e 20 49 66 20 62 6f 74 68 20 27   keys. If both '
e480: 78 27 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20  x' and the.     
e490: 20 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74   ** SELECT... st
e4a0: 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75  atement are colu
e4b0: 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69  mns, then numeri
e4c0: 63 20 61 66 66 69 6e 69 74 79 20 69 73 20 75 73  c affinity is us
e4d0: 65 64 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 65  ed.      ** if e
e4e0: 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73  ither column has
e4f0: 20 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45   NUMERIC or INTE
e500: 47 45 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66  GER affinity. If
e510: 20 6e 65 69 74 68 65 72 0a 20 20 20 20 20 20 2a   neither.      *
e520: 2a 20 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45  * 'x' nor the SE
e530: 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e  LECT... statemen
e540: 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74  t are columns, t
e550: 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69  hen numeric affi
e560: 6e 69 74 79 0a 20 20 20 20 20 20 2a 2a 20 69 73  nity.      ** is
e570: 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a   used..      */.
e580: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
e590: 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ble = pParse->nT
e5a0: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72  ab++;.      addr
e5b0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
e5c0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
e5d0: 70 68 65 6d 65 72 61 6c 2c 20 70 45 78 70 72 2d  phemeral, pExpr-
e5e0: 3e 69 54 61 62 6c 65 2c 20 31 29 3b 0a 20 20 20  >iTable, 1);.   
e5f0: 20 20 20 6d 65 6d 73 65 74 28 26 6b 65 79 49 6e     memset(&keyIn
e600: 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6b 65  fo, 0, sizeof(ke
e610: 79 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 6b  yInfo));.      k
e620: 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d 20  eyInfo.nField = 
e630: 31 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 45  1;..      if( pE
e640: 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  xpr->pSelect ){.
e650: 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20          /* Case 
e660: 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28  1:     expr IN (
e670: 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20  SELECT ...).    
e680: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
e690: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
e6a0: 74 6f 20 77 72 69 74 65 20 74 68 65 20 72 65 73  to write the res
e6b0: 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ults of the sele
e6c0: 63 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70  ct into the temp
e6d0: 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a 2a  orary.        **
e6e0: 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65 64   table allocated
e6f0: 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f 76   and opened abov
e700: 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
e710: 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
e720: 20 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20 45   dest;.        E
e730: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
e740: 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ..        sqlite
e750: 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
e760: 26 64 65 73 74 2c 20 53 52 54 5f 53 65 74 2c 20  &dest, SRT_Set, 
e770: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a  pExpr->iTable);.
e780: 20 20 20 20 20 20 20 20 64 65 73 74 2e 61 66 66          dest.aff
e790: 69 6e 69 74 79 20 3d 20 28 69 6e 74 29 61 66 66  inity = (int)aff
e7a0: 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20 61  inity;.        a
e7b0: 73 73 65 72 74 28 20 28 70 45 78 70 72 2d 3e 69  ssert( (pExpr->i
e7c0: 54 61 62 6c 65 26 30 78 30 30 30 30 46 46 46 46  Table&0x0000FFFF
e7d0: 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  )==pExpr->iTable
e7e0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
e7f0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
e800: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 53 65  arse, pExpr->pSe
e810: 6c 65 63 74 2c 20 26 64 65 73 74 2c 20 30 2c 20  lect, &dest, 0, 
e820: 30 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20  0, 0, 0) ){.    
e830: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
e840: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e850: 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  pEList = pExpr->
e860: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
e870: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 4c  .        if( pEL
e880: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
e890: 45 78 70 72 3e 30 20 29 7b 20 0a 20 20 20 20 20  Expr>0 ){ .     
e8a0: 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f       keyInfo.aCo
e8b0: 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 42  ll[0] = sqlite3B
e8c0: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
e8d0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
e8e0: 72 2d 3e 70 4c 65 66 74 2c 0a 20 20 20 20 20 20  r->pLeft,.      
e8f0: 20 20 20 20 20 20 20 20 70 45 4c 69 73 74 2d 3e          pEList->
e900: 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[0].pExpr);.   
e910: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
e920: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c  se if( pExpr->pL
e930: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ist ){.        /
e940: 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20 65 78  * Case 2:     ex
e950: 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29  pr IN (exprlist)
e960: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
e970: 20 20 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20      ** For each 
e980: 65 78 70 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c  expression, buil
e990: 64 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 66  d an index key f
e9a0: 72 6f 6d 20 74 68 65 20 65 76 61 6c 75 61 74 69  rom the evaluati
e9b0: 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  on and.        *
e9c0: 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68  * store it in th
e9d0: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
e9e0: 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20  e. If <expr> is 
e9f0: 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75  a column, then u
ea00: 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  se.        ** th
ea10: 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e  at columns affin
ea20: 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64 69 6e  ity when buildin
ea30: 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66  g index keys. If
ea40: 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20   <expr> is not. 
ea50: 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75         ** a colu
ea60: 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69 63 20  mn, use numeric 
ea70: 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 20 20  affinity..      
ea80: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
ea90: 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72   i;.        Expr
eaa0: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
eab0: 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20  xpr->pList;.    
eac0: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
ead0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
eae0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 2c  .        int r1,
eaf0: 20 72 32 3b 0a 0a 20 20 20 20 20 20 20 20 69 66   r2;..        if
eb00: 28 20 21 61 66 66 69 6e 69 74 79 20 29 7b 0a 20  ( !affinity ){. 
eb10: 20 20 20 20 20 20 20 20 20 61 66 66 69 6e 69 74           affinit
eb20: 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  y = SQLITE_AFF_N
eb30: 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ONE;.        }. 
eb40: 20 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61         keyInfo.a
eb50: 43 6f 6c 6c 5b 30 5d 20 3d 20 70 45 78 70 72 2d  Coll[0] = pExpr-
eb60: 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 0a  >pLeft->pColl;..
eb70: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
eb80: 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70  through each exp
eb90: 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72  ression in <expr
eba0: 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20  list>. */.      
ebb0: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
ebc0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
ebd0: 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73  ;.        r2 = s
ebe0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
ebf0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
ec00: 20 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e    for(i=pList->n
ec10: 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73  Expr, pItem=pLis
ec20: 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  t->a; i>0; i--, 
ec30: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
ec40: 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20      Expr *pE2 = 
ec50: 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20  pItem->pExpr;.. 
ec60: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
ec70: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
ec80: 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74 68   not constant th
ec90: 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20  en we will need 
eca0: 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  to.          ** 
ecb0: 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 73 74  disable the test
ecc0: 20 74 68 61 74 20 77 61 73 20 67 65 6e 65 72 61   that was genera
ecd0: 74 65 64 20 61 62 6f 76 65 20 74 68 61 74 20 6d  ted above that m
ece0: 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20 20  akes sure.      
ecf0: 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65      ** this code
ed00: 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f   only executes o
ed10: 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f  nce.  Because fo
ed20: 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74  r a non-constant
ed30: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78  .          ** ex
ed40: 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64  pression we need
ed50: 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63   to rerun this c
ed60: 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20  ode each time.. 
ed70: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
ed80: 20 20 20 20 20 20 69 66 28 20 74 65 73 74 41 64        if( testAd
ed90: 64 72 20 26 26 20 21 73 71 6c 69 74 65 33 45 78  dr && !sqlite3Ex
eda0: 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32  prIsConstant(pE2
edb0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
edc0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
edd0: 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 74 65 73 74  geToNoop(v, test
ede0: 41 64 64 72 2d 31 2c 20 32 29 3b 0a 20 20 20 20  Addr-1, 2);.    
edf0: 20 20 20 20 20 20 20 20 74 65 73 74 41 64 64 72          testAddr
ee00: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
ee10: 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  }..          /* 
ee20: 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 78 70  Evaluate the exp
ee30: 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65  ression and inse
ee40: 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74  rt it into the t
ee50: 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  emp table */.   
ee60: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64         pParse->d
ee70: 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b  isableColCache++
ee80: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
ee90: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
eea0: 73 65 2c 20 70 45 32 2c 20 72 31 29 3b 0a 20 20  se, pE2, r1);.  
eeb0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
eec0: 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43  pParse->disableC
eed0: 6f 6c 43 61 63 68 65 3e 30 20 29 3b 0a 20 20 20  olCache>0 );.   
eee0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64         pParse->d
eef0: 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d 2d  isableColCache--
ef00: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
ef10: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
ef20: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
ef30: 72 31 2c 20 31 2c 20 72 32 2c 20 26 61 66 66 69  r1, 1, r2, &affi
ef40: 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20  nity, 1);.      
ef50: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
ef60: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
ef70: 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 31  ge(pParse, r1, 1
ef80: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
ef90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
efa0: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
efb0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72  pExpr->iTable, r
efc0: 32 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  2);.        }.  
efd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
efe0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
eff0: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  se, r1);.       
f000: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
f010: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
f020: 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
f030: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
f040: 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28  ngeP4(v, addr, (
f050: 76 6f 69 64 20 2a 29 26 6b 65 79 49 6e 66 6f 2c  void *)&keyInfo,
f060: 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
f070: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f080: 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  ..    case TK_EX
f090: 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54  ISTS:.    case T
f0a0: 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20  K_SELECT: {.    
f0b0: 20 20 2f 2a 20 54 68 69 73 20 68 61 73 20 74 6f    /* This has to
f0c0: 20 62 65 20 61 20 73 63 61 6c 61 72 20 53 45 4c   be a scalar SEL
f0d0: 45 43 54 2e 20 20 47 65 6e 65 72 61 74 65 20 63  ECT.  Generate c
f0e0: 6f 64 65 20 74 6f 20 70 75 74 20 74 68 65 0a 20  ode to put the. 
f0f0: 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66       ** value of
f100: 20 74 68 69 73 20 73 65 6c 65 63 74 20 69 6e 20   this select in 
f110: 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  a memory cell an
f120: 64 20 72 65 63 6f 72 64 20 74 68 65 20 6e 75 6d  d record the num
f130: 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ber.      ** of 
f140: 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  the memory cell 
f150: 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20  in iColumn..    
f160: 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69    */.      stati
f170: 63 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 6f 6e  c const Token on
f180: 65 20 3d 20 7b 20 28 75 38 2a 29 22 31 22 2c 20  e = { (u8*)"1", 
f190: 30 2c 20 31 20 7d 3b 0a 20 20 20 20 20 20 53 65  0, 1 };.      Se
f1a0: 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 20 20  lect *pSel;.    
f1b0: 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
f1c0: 74 3b 0a 0a 20 20 20 20 20 20 70 53 65 6c 20 3d  t;..      pSel =
f1d0: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 3b   pExpr->pSelect;
f1e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
f1f0: 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
f200: 73 74 2c 20 30 2c 20 2b 2b 70 50 61 72 73 65 2d  st, 0, ++pParse-
f210: 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 69 66  >nMem);.      if
f220: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
f230: 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20  SELECT ){.      
f240: 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53    dest.eDest = S
f250: 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  RT_Mem;.        
f260: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f270: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
f280: 20 64 65 73 74 2e 69 50 61 72 6d 29 3b 0a 20 20   dest.iParm);.  
f290: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
f2a0: 74 28 28 76 2c 20 22 49 6e 69 74 20 73 75 62 71  t((v, "Init subq
f2b0: 75 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a  uery result"));.
f2c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f2d0: 20 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20       dest.eDest 
f2e0: 3d 20 53 52 54 5f 45 78 69 73 74 73 3b 0a 20 20  = SRT_Exists;.  
f2f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f300: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
f310: 74 65 67 65 72 2c 20 30 2c 20 64 65 73 74 2e 69  teger, 0, dest.i
f320: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 56  Parm);.        V
f330: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
f340: 49 6e 69 74 20 45 58 49 53 54 53 20 72 65 73 75  Init EXISTS resu
f350: 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lt"));.      }. 
f360: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
f370: 44 65 6c 65 74 65 28 70 53 65 6c 2d 3e 70 4c 69  Delete(pSel->pLi
f380: 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 53 65 6c  mit);.      pSel
f390: 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74  ->pLimit = sqlit
f3a0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
f3b0: 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20 30  TK_INTEGER, 0, 0
f3c0: 2c 20 26 6f 6e 65 29 3b 0a 20 20 20 20 20 20 69  , &one);.      i
f3d0: 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
f3e0: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20 26  (pParse, pSel, &
f3f0: 64 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 30  dest, 0, 0, 0, 0
f400: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
f410: 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
f420: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
f430: 6e 20 3d 20 64 65 73 74 2e 69 50 61 72 6d 3b 0a  n = dest.iParm;.
f440: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f450: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 74 65   }.  }..  if( te
f460: 73 74 41 64 64 72 20 29 7b 0a 20 20 20 20 73 71  stAddr ){.    sq
f470: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
f480: 65 28 76 2c 20 74 65 73 74 41 64 64 72 2d 31 29  e(v, testAddr-1)
f490: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 3b  ;.  }..  return;
f4a0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
f4b0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
f4c0: 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 75 70 6c  Y */../*.** Dupl
f4d0: 69 63 61 74 65 20 61 6e 20 38 2d 62 79 74 65 20  icate an 8-byte 
f4e0: 76 61 6c 75 65 0a 2a 2f 0a 73 74 61 74 69 63 20  value.*/.static 
f4f0: 63 68 61 72 20 2a 64 75 70 38 62 79 74 65 73 28  char *dup8bytes(
f500: 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63  Vdbe *v, const c
f510: 68 61 72 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72  har *in){.  char
f520: 20 2a 6f 75 74 20 3d 20 73 71 6c 69 74 65 33 44   *out = sqlite3D
f530: 62 4d 61 6c 6c 6f 63 52 61 77 28 73 71 6c 69 74  bMallocRaw(sqlit
f540: 65 33 56 64 62 65 44 62 28 76 29 2c 20 38 29 3b  e3VdbeDb(v), 8);
f550: 0a 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20  .  if( out ){.  
f560: 20 20 6d 65 6d 63 70 79 28 6f 75 74 2c 20 69 6e    memcpy(out, in
f570: 2c 20 38 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 8);.  }.  retu
f580: 72 6e 20 6f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn out;.}../*.**
f590: 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73   Generate an ins
f5a0: 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69  truction that wi
f5b0: 6c 6c 20 70 75 74 20 74 68 65 20 66 6c 6f 61 74  ll put the float
f5c0: 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c  ing point.** val
f5d0: 75 65 20 64 65 73 63 72 69 62 65 64 20 62 79 20  ue described by 
f5e0: 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72  z[0..n-1] into r
f5f0: 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a  egister iMem..**
f600: 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72 69  .** The z[] stri
f610: 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79  ng will probably
f620: 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65 72   not be zero-ter
f630: 6d 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74 68  minated.  But th
f640: 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61  e .** z[n] chara
f650: 63 74 65 72 20 69 73 20 67 75 61 72 61 6e 74 65  cter is guarante
f660: 65 64 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69  ed to be somethi
f670: 6e 67 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ng that does not
f680: 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68   look.** like th
f690: 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f  e continuation o
f6a0: 66 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f  f the number..*/
f6b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
f6c0: 65 52 65 61 6c 28 56 64 62 65 20 2a 76 2c 20 63  eReal(Vdbe *v, c
f6d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
f6e0: 74 20 6e 2c 20 69 6e 74 20 6e 65 67 61 74 65 46  t n, int negateF
f6f0: 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a  lag, int iMem){.
f700: 20 20 61 73 73 65 72 74 28 20 7a 20 7c 7c 20 76    assert( z || v
f710: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 56 64  ==0 || sqlite3Vd
f720: 62 65 44 62 28 76 29 2d 3e 6d 61 6c 6c 6f 63 46  beDb(v)->mallocF
f730: 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 7a  ailed );.  if( z
f740: 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76   ){.    double v
f750: 61 6c 75 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  alue;.    char *
f760: 7a 56 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  zV;.    assert( 
f770: 21 69 73 64 69 67 69 74 28 7a 5b 6e 5d 29 20 29  !isdigit(z[n]) )
f780: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f  ;.    sqlite3Ato
f790: 46 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20  F(z, &value);.  
f7a0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 4e    if( sqlite3IsN
f7b0: 61 4e 28 76 61 6c 75 65 29 20 29 7b 0a 20 20 20  aN(value) ){.   
f7c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f7d0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
f7e0: 20 30 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 7d   0, iMem);.    }
f7f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
f800: 6e 65 67 61 74 65 46 6c 61 67 20 29 20 76 61 6c  negateFlag ) val
f810: 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20  ue = -value;.   
f820: 20 20 20 7a 56 20 3d 20 64 75 70 38 62 79 74 65     zV = dup8byte
f830: 73 28 76 2c 20 28 63 68 61 72 2a 29 26 76 61 6c  s(v, (char*)&val
f840: 75 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ue);.      sqlit
f850: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
f860: 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d  OP_Real, 0, iMem
f870: 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 52 45 41 4c  , 0, zV, P4_REAL
f880: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
f890: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
f8a0: 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  an instruction t
f8b0: 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65  hat will put the
f8c0: 20 69 6e 74 65 67 65 72 20 64 65 73 63 72 69 62   integer describ
f8d0: 65 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30  e by.** text z[0
f8e0: 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69  ..n-1] into regi
f8f0: 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a  ster iMem..**.**
f900: 20 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20   The z[] string 
f910: 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f  will probably no
f920: 74 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e  t be zero-termin
f930: 61 74 65 64 2e 20 20 42 75 74 20 74 68 65 20 0a  ated.  But the .
f940: 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65  ** z[n] characte
f950: 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  r is guaranteed 
f960: 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 20  to be something 
f970: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f  that does not lo
f980: 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63  ok.** like the c
f990: 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74  ontinuation of t
f9a0: 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74  he number..*/.st
f9b0: 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e  atic void codeIn
f9c0: 74 65 67 65 72 28 56 64 62 65 20 2a 76 2c 20 63  teger(Vdbe *v, c
f9d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
f9e0: 74 20 6e 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67  t n, int negFlag
f9f0: 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 61  , int iMem){.  a
fa00: 73 73 65 72 74 28 20 7a 20 7c 7c 20 76 3d 3d 30  ssert( z || v==0
fa10: 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65 44   || sqlite3VdbeD
fa20: 62 28 76 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  b(v)->mallocFail
fa30: 65 64 20 29 3b 0a 20 20 69 66 28 20 7a 20 29 7b  ed );.  if( z ){
fa40: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
fa50: 61 73 73 65 72 74 28 20 21 69 73 64 69 67 69 74  assert( !isdigit
fa60: 28 7a 5b 6e 5d 29 20 29 3b 0a 20 20 20 20 69 66  (z[n]) );.    if
fa70: 28 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33  ( sqlite3GetInt3
fa80: 32 28 7a 2c 20 26 69 29 20 29 7b 0a 20 20 20 20  2(z, &i) ){.    
fa90: 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 20    if( negFlag ) 
faa0: 69 20 3d 20 2d 69 3b 0a 20 20 20 20 20 20 73 71  i = -i;.      sq
fab0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
fac0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69  v, OP_Integer, i
fad0: 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 7d 65 6c  , iMem);.    }el
fae0: 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 46 69  se if( sqlite3Fi
faf0: 74 73 49 6e 36 34 42 69 74 73 28 7a 2c 20 6e 65  tsIn64Bits(z, ne
fb00: 67 46 6c 61 67 29 20 29 7b 0a 20 20 20 20 20 20  gFlag) ){.      
fb10: 69 36 34 20 76 61 6c 75 65 3b 0a 20 20 20 20 20  i64 value;.     
fb20: 20 63 68 61 72 20 2a 7a 56 3b 0a 20 20 20 20 20   char *zV;.     
fb30: 20 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 7a   sqlite3Atoi64(z
fb40: 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 20  , &value);.     
fb50: 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 20 76   if( negFlag ) v
fb60: 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20  alue = -value;. 
fb70: 20 20 20 20 20 7a 56 20 3d 20 64 75 70 38 62 79       zV = dup8by
fb80: 74 65 73 28 76 2c 20 28 63 68 61 72 2a 29 26 76  tes(v, (char*)&v
fb90: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  alue);.      sql
fba0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
fbb0: 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69  , OP_Int64, 0, i
fbc0: 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 49  Mem, 0, zV, P4_I
fbd0: 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65 6c 73 65  NT64);.    }else
fbe0: 7b 0a 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c  {.      codeReal
fbf0: 28 76 2c 20 7a 2c 20 6e 2c 20 6e 65 67 46 6c 61  (v, z, n, negFla
fc00: 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a  g, iMem);.    }.
fc10: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65    }.}.../*.** Ge
fc20: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
fc30: 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20 74 68   will extract th
fc40: 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c  e iColumn-th col
fc50: 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c  umn from.** tabl
fc60: 65 20 70 54 61 62 20 61 6e 64 20 73 74 6f 72 65  e pTab and store
fc70: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75   the column valu
fc80: 65 20 69 6e 20 61 20 72 65 67 69 73 74 65 72 2e  e in a register.
fc90: 20 20 41 6e 20 65 66 66 6f 72 74 0a 2a 2a 20 69    An effort.** i
fca0: 73 20 6d 61 64 65 20 74 6f 20 73 74 6f 72 65 20  s made to store 
fcb0: 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  the column value
fcc0: 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65   in register iRe
fcd0: 67 2c 20 62 75 74 20 74 68 69 73 20 69 73 0a 2a  g, but this is.*
fce0: 2a 20 6e 6f 74 20 67 75 61 72 61 6e 74 65 65 64  * not guaranteed
fcf0: 2e 20 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  .  The location 
fd00: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61  of the column va
fd10: 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  lue is returned.
fd20: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  .**.** There mus
fd30: 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63 75 72  t be an open cur
fd40: 73 6f 72 20 74 6f 20 70 54 61 62 20 69 6e 20 69  sor to pTab in i
fd50: 54 61 62 6c 65 20 77 68 65 6e 20 74 68 69 73 20  Table when this 
fd60: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
fd70: 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c 75 6d  lled.  If iColum
fd80: 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73  n<0 then code is
fd90: 20 67 65 6e 65 72 61 74 65 64 20 74 68 61 74 20   generated that 
fda0: 65 78 74 72 61 63 74 73 20 74 68 65 20 72 6f 77  extracts the row
fdb0: 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  id..**.** This r
fdc0: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 61 74 74  outine might att
fdd0: 65 6d 70 74 20 74 6f 20 72 65 75 73 65 20 74 68  empt to reuse th
fde0: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63  e value of the c
fdf0: 6f 6c 75 6d 6e 20 74 68 61 74 0a 2a 2a 20 68 61  olumn that.** ha
fe00: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6c  s already been l
fe10: 6f 61 64 65 64 20 69 6e 74 6f 20 61 20 72 65 67  oaded into a reg
fe20: 69 73 74 65 72 2e 20 20 54 68 65 20 76 61 6c 75  ister.  The valu
fe30: 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 0a 2a 2a  e will always.**
fe40: 20 62 65 20 75 73 65 64 20 69 66 20 69 74 20 68   be used if it h
fe50: 61 73 20 6e 6f 74 20 75 6e 64 65 72 67 6f 6e 65  as not undergone
fe60: 20 61 6e 79 20 61 66 66 69 6e 69 74 79 20 63 68   any affinity ch
fe70: 61 6e 67 65 73 2e 20 20 42 75 74 20 69 66 0a 2a  anges.  But if.*
fe80: 2a 20 61 6e 20 61 66 66 69 6e 69 74 79 20 63 68  * an affinity ch
fe90: 61 6e 67 65 20 68 61 73 20 6f 63 63 75 72 72 65  ange has occurre
fea0: 64 2c 20 74 68 65 6e 20 74 68 65 20 63 61 63 68  d, then the cach
feb0: 65 64 20 76 61 6c 75 65 20 77 69 6c 6c 20 6f 6e  ed value will on
fec0: 6c 79 20 62 65 0a 2a 2a 20 75 73 65 64 20 69 66  ly be.** used if
fed0: 20 61 6c 6c 6f 77 41 66 66 43 68 6e 67 20 69 73   allowAffChng is
fee0: 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   true..*/.int sq
fef0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
ff00: 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20  Column(.  Parse 
ff10: 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61  *pParse,   /* Pa
ff20: 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
ff30: 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
ff40: 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  t */.  Table *pT
ff50: 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72  ab,     /* Descr
ff60: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61  iption of the ta
ff70: 62 6c 65 20 77 65 20 61 72 65 20 72 65 61 64 69  ble we are readi
ff80: 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ng from */.  int
ff90: 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a   iColumn,     /*
ffa0: 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61   Index of the ta
ffb0: 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  ble column */.  
ffc0: 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
ffd0: 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70   /* The cursor p
ffe0: 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74  ointing to the t
fff0: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  able */.  int iR
10000 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 74  eg,        /* St
10010 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65 72 65  ore results here
10020 20 2a 2f 0a 20 20 69 6e 74 20 61 6c 6c 6f 77 41   */.  int allowA
10030 66 66 43 68 6e 67 20 2f 2a 20 54 72 75 65 20 69  ffChng /* True i
10040 66 20 70 72 69 6f 72 20 61 66 66 69 6e 69 74 79  f prior affinity
10050 20 63 68 61 6e 67 65 73 20 61 72 65 20 4f 4b 20   changes are OK 
10060 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
10070 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
10080 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
10090 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
100a0 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  ..  for(i=0, p=p
100b0 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
100c0 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c  ; i<pParse->nCol
100d0 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29  Cache; i++, p++)
100e0 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61  {.    if( p->iTa
100f0 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70  ble==iTable && p
10100 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75  ->iColumn==iColu
10110 6d 6e 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  mn.           &&
10120 20 28 21 70 2d 3e 61 66 66 43 68 61 6e 67 65 20   (!p->affChange 
10130 7c 7c 20 61 6c 6c 6f 77 41 66 66 43 68 6e 67 29  || allowAffChng)
10140 20 29 7b 0a 23 69 66 20 30 0a 20 20 20 20 20 20   ){.#if 0.      
10150 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10160 30 28 76 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20  0(v, OP_Noop);. 
10170 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
10180 28 28 76 2c 20 22 4f 50 54 3a 20 74 61 62 25 64  ((v, "OPT: tab%d
10190 2e 63 6f 6c 25 64 20 2d 3e 20 72 25 64 22 2c 20  .col%d -> r%d", 
101a0 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c  iTable, iColumn,
101b0 20 70 2d 3e 69 52 65 67 29 29 3b 0a 23 65 6e 64   p->iReg));.#end
101c0 69 66 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  if.      return 
101d0 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20  p->iReg;.    }. 
101e0 20 7d 20 20 0a 20 20 61 73 73 65 72 74 28 20 76   }  .  assert( v
101f0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 43 6f  !=0 );.  if( iCo
10200 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 69 6e  lumn<0 ){.    in
10210 74 20 6f 70 20 3d 20 28 70 54 61 62 20 26 26 20  t op = (pTab && 
10220 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 29  IsVirtual(pTab))
10230 20 3f 20 4f 50 5f 56 52 6f 77 69 64 20 3a 20 4f   ? OP_VRowid : O
10240 50 5f 52 6f 77 69 64 3b 0a 20 20 20 20 73 71 6c  P_Rowid;.    sql
10250 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
10260 2c 20 6f 70 2c 20 69 54 61 62 6c 65 2c 20 69 52  , op, iTable, iR
10270 65 67 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  eg);.  }else if(
10280 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
10290 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
102a0 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
102b0 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c  iTable, iColumn,
102c0 20 69 52 65 67 29 3b 0a 20 20 7d 65 6c 73 65 7b   iReg);.  }else{
102d0 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 49 73  .    int op = Is
102e0 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 3f 20  Virtual(pTab) ? 
102f0 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f  OP_VColumn : OP_
10300 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69  Column;.    sqli
10310 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
10320 20 6f 70 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f   op, iTable, iCo
10330 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 20  lumn, iReg);.   
10340 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65   sqlite3ColumnDe
10350 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69  fault(v, pTab, i
10360 43 6f 6c 75 6d 6e 29 3b 0a 23 69 66 6e 64 65 66  Column);.#ifndef
10370 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
10380 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
10390 69 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  if( pTab->aCol[i
103a0 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79  Column].affinity
103b0 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  ==SQLITE_AFF_REA
103c0 4c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L ){.      sqlit
103d0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
103e0 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 2c  OP_RealAffinity,
103f0 20 69 52 65 67 29 3b 0a 20 20 20 20 7d 0a 23 65   iReg);.    }.#e
10400 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66 28 20 70  ndif.  }.  if( p
10410 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f  Parse->disableCo
10420 6c 43 61 63 68 65 3d 3d 30 20 29 7b 0a 20 20 20  lCache==0 ){.   
10430 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 6f   i = pParse->iCo
10440 6c 43 61 63 68 65 3b 0a 20 20 20 20 70 20 3d 20  lCache;.    p = 
10450 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  &pParse->aColCac
10460 68 65 5b 69 5d 3b 0a 20 20 20 20 70 2d 3e 69 54  he[i];.    p->iT
10470 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20  able = iTable;. 
10480 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20     p->iColumn = 
10490 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 2d 3e  iColumn;.    p->
104a0 69 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 20  iReg = iReg;.   
104b0 20 70 2d 3e 61 66 66 43 68 61 6e 67 65 20 3d 20   p->affChange = 
104c0 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20  0;.    i++;.    
104d0 69 66 28 20 69 3e 3d 41 72 72 61 79 53 69 7a 65  if( i>=ArraySize
104e0 28 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  (pParse->aColCac
104f0 68 65 29 20 29 20 69 20 3d 20 30 3b 0a 20 20 20  he) ) i = 0;.   
10500 20 69 66 28 20 69 3e 70 50 61 72 73 65 2d 3e 6e   if( i>pParse->n
10510 43 6f 6c 43 61 63 68 65 20 29 20 70 50 61 72 73  ColCache ) pPars
10520 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 3d 20 69  e->nColCache = i
10530 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 43  ;.    pParse->iC
10540 6f 6c 43 61 63 68 65 20 3d 20 69 3b 0a 20 20 7d  olCache = i;.  }
10550 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a  .  return iReg;.
10560 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61  }../*.** Clear a
10570 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  ll column cache 
10580 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61 74  entries associat
10590 65 64 20 77 69 74 68 20 74 68 65 20 76 64 62 65  ed with the vdbe
105a0 0a 2a 2a 20 63 75 72 73 6f 72 20 77 69 74 68 20  .** cursor with 
105b0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 69 54  cursor number iT
105c0 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  able..*/.void sq
105d0 6c 69 74 65 33 45 78 70 72 43 6c 65 61 72 43 6f  lite3ExprClearCo
105e0 6c 75 6d 6e 43 61 63 68 65 28 50 61 72 73 65 20  lumnCache(Parse 
105f0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61  *pParse, int iTa
10600 62 6c 65 29 7b 0a 20 20 69 66 28 20 69 54 61 62  ble){.  if( iTab
10610 6c 65 3c 30 20 29 7b 0a 20 20 20 20 70 50 61 72  le<0 ){.    pPar
10620 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 3d 20  se->nColCache = 
10630 30 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69  0;.    pParse->i
10640 43 6f 6c 43 61 63 68 65 20 3d 20 30 3b 0a 20 20  ColCache = 0;.  
10650 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69  }else{.    int i
10660 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
10670 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63  <pParse->nColCac
10680 68 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  he; i++){.      
10690 69 66 28 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c  if( pParse->aCol
106a0 43 61 63 68 65 5b 69 5d 2e 69 54 61 62 6c 65 3d  Cache[i].iTable=
106b0 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  =iTable ){.     
106c0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d     testcase( i==
106d0 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
106e0 65 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70  e-1 );.        p
106f0 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
10700 5b 69 5d 20 3d 20 70 50 61 72 73 65 2d 3e 61 43  [i] = pParse->aC
10710 6f 6c 43 61 63 68 65 5b 2d 2d 70 50 61 72 73 65  olCache[--pParse
10720 2d 3e 6e 43 6f 6c 43 61 63 68 65 5d 3b 0a 20 20  ->nColCache];.  
10730 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69 43        pParse->iC
10740 6f 6c 43 61 63 68 65 20 3d 20 70 50 61 72 73 65  olCache = pParse
10750 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 0a 20 20 20  ->nColCache;.   
10760 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
10770 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74  ../*.** Record t
10780 68 65 20 66 61 63 74 20 74 68 61 74 20 61 6e 20  he fact that an 
10790 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65 20  affinity change 
107a0 68 61 73 20 6f 63 63 75 72 72 65 64 20 6f 6e 20  has occurred on 
107b0 69 43 6f 75 6e 74 0a 2a 2a 20 72 65 67 69 73 74  iCount.** regist
107c0 65 72 73 20 73 74 61 72 74 69 6e 67 20 77 69 74  ers starting wit
107d0 68 20 69 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69  h iStart..*/.voi
107e0 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
107f0 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
10800 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
10810 69 6e 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20  int iStart, int 
10820 69 43 6f 75 6e 74 29 7b 0a 20 20 69 6e 74 20 69  iCount){.  int i
10830 45 6e 64 20 3d 20 69 53 74 61 72 74 20 2b 20 69  End = iStart + i
10840 43 6f 75 6e 74 20 2d 20 31 3b 0a 20 20 69 6e 74  Count - 1;.  int
10850 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
10860 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63  <pParse->nColCac
10870 68 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  he; i++){.    in
10880 74 20 72 20 3d 20 70 50 61 72 73 65 2d 3e 61 43  t r = pParse->aC
10890 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65 67 3b  olCache[i].iReg;
108a0 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 53 74 61  .    if( r>=iSta
108b0 72 74 20 26 26 20 72 3c 3d 69 45 6e 64 20 29 7b  rt && r<=iEnd ){
108c0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61  .      pParse->a
108d0 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 61 66 66 43  ColCache[i].affC
108e0 68 61 6e 67 65 20 3d 20 31 3b 0a 20 20 20 20 7d  hange = 1;.    }
108f0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
10900 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d  nerate code to m
10910 6f 76 65 73 20 63 6f 6e 74 65 6e 74 20 66 72 6f  oves content fro
10920 6d 20 6f 6e 65 20 72 65 67 69 73 74 65 72 20 74  m one register t
10930 6f 20 61 6e 6f 74 68 65 72 2e 0a 2a 2a 20 4b 65  o another..** Ke
10940 65 70 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  ep the column ca
10950 63 68 65 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a  che up-to-date..
10960 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
10970 78 70 72 43 6f 64 65 4d 6f 76 65 28 50 61 72 73  xprCodeMove(Pars
10980 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
10990 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a  From, int iTo){.
109a0 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 69    int i;.  if( i
109b0 46 72 6f 6d 3d 3d 69 54 6f 20 29 20 72 65 74 75  From==iTo ) retu
109c0 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  rn;.  sqlite3Vdb
109d0 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e  eAddOp2(pParse->
109e0 70 56 64 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20  pVdbe, OP_Move, 
109f0 69 46 72 6f 6d 2c 20 69 54 6f 29 3b 0a 20 20 66  iFrom, iTo);.  f
10a00 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
10a10 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b  ->nColCache; i++
10a20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  ){.    if( pPars
10a30 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e  e->aColCache[i].
10a40 69 52 65 67 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20  iReg==iFrom ){. 
10a50 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 43 6f       pParse->aCo
10a60 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65 67 20 3d  lCache[i].iReg =
10a70 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   iTo;.    }.  }.
10a80 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
10a90 74 72 75 65 20 69 66 20 61 6e 79 20 72 65 67 69  true if any regi
10aa0 73 74 65 72 20 69 6e 20 74 68 65 20 72 61 6e 67  ster in the rang
10ab0 65 20 69 46 72 6f 6d 2e 2e 69 54 6f 20 28 69 6e  e iFrom..iTo (in
10ac0 63 6c 75 73 69 76 65 29 0a 2a 2a 20 69 73 20 75  clusive).** is u
10ad0 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  sed as part of t
10ae0 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e  he column cache.
10af0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
10b00 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65  sedAsColumnCache
10b10 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
10b20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69  int iFrom, int i
10b30 54 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  To){.  int i;.  
10b40 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
10b50 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b  e->nColCache; i+
10b60 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d 20  +){.    int r = 
10b70 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
10b80 65 5b 69 5d 2e 69 52 65 67 3b 0a 20 20 20 20 69  e[i].iReg;.    i
10b90 66 28 20 72 3e 3d 69 46 72 6f 6d 20 26 26 20 72  f( r>=iFrom && r
10ba0 3c 3d 69 54 6f 20 29 20 72 65 74 75 72 6e 20 31  <=iTo ) return 1
10bb0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
10bc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 72 65  ;.}../*.** There
10bd0 73 20 69 73 20 61 20 76 61 6c 75 65 20 69 6e 20  s is a value in 
10be0 72 65 67 69 73 74 65 72 20 69 43 75 72 72 65 6e  register iCurren
10bf0 74 2e 20 20 57 65 20 75 6c 74 69 6d 61 74 65 6c  t.  We ultimatel
10c00 79 20 77 61 6e 74 0a 2a 2a 20 74 68 65 20 76 61  y want.** the va
10c10 6c 75 65 20 74 6f 20 62 65 20 69 6e 20 72 65 67  lue to be in reg
10c20 69 73 74 65 72 20 69 54 61 72 67 65 74 2e 20 20  ister iTarget.  
10c30 49 74 20 6d 69 67 68 74 20 62 65 20 74 68 61 74  It might be that
10c40 0a 2a 2a 20 69 43 75 72 72 65 6e 74 20 61 6e 64  .** iCurrent and
10c50 20 69 54 61 72 67 65 74 20 61 72 65 20 74 68 65   iTarget are the
10c60 20 73 61 6d 65 20 72 65 67 69 73 74 65 72 2e 0a   same register..
10c70 2a 2a 0a 2a 2a 20 57 65 20 61 72 65 20 67 6f 69  **.** We are goi
10c80 6e 67 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  ng to modify the
10c90 20 76 61 6c 75 65 2c 20 73 6f 20 77 65 20 6e 65   value, so we ne
10ca0 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ed to make sure 
10cb0 69 74 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20 63  it.** is not a c
10cc0 61 63 68 65 64 20 72 65 67 69 73 74 65 72 2e 20  ached register. 
10cd0 20 49 66 20 69 43 75 72 72 65 6e 74 20 69 73 20   If iCurrent is 
10ce0 61 20 63 61 63 68 65 64 20 72 65 67 69 73 74 65  a cached registe
10cf0 72 2c 0a 2a 2a 20 74 68 65 6e 20 74 72 79 20 74  r,.** then try t
10d00 6f 20 6d 6f 76 65 20 74 68 65 20 76 61 6c 75 65  o move the value
10d10 20 6f 76 65 72 20 74 6f 20 69 54 61 72 67 65 74   over to iTarget
10d20 2e 20 20 49 66 20 69 54 61 72 67 65 74 20 69 73  .  If iTarget is
10d30 20 61 0a 2a 2a 20 63 61 63 68 65 64 20 72 65 67   a.** cached reg
10d40 69 73 74 65 72 2c 20 74 68 65 6e 20 63 6c 65 61  ister, then clea
10d50 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  r the correspond
10d60 69 6e 67 20 63 61 63 68 65 20 6c 69 6e 65 2e 0a  ing cache line..
10d70 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
10d80 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20 74   register that t
10d90 68 65 20 76 61 6c 75 65 20 65 6e 64 73 20 75 70  he value ends up
10da0 20 69 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69   in..*/.int sqli
10db0 74 65 33 45 78 70 72 57 72 69 74 61 62 6c 65 52  te3ExprWritableR
10dc0 65 67 69 73 74 65 72 28 50 61 72 73 65 20 2a 70  egister(Parse *p
10dd0 50 61 72 73 65 2c 20 69 6e 74 20 69 43 75 72 72  Parse, int iCurr
10de0 65 6e 74 2c 20 69 6e 74 20 69 54 61 72 67 65 74  ent, int iTarget
10df0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  ){.  int i;.  as
10e00 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56  sert( pParse->pV
10e10 64 62 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  dbe!=0 );.  if( 
10e20 21 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63  !usedAsColumnCac
10e30 68 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 72  he(pParse, iCurr
10e40 65 6e 74 2c 20 69 43 75 72 72 65 6e 74 29 20 29  ent, iCurrent) )
10e50 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 69 43 75  {.    return iCu
10e60 72 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 69 66 28  rrent;.  }.  if(
10e70 20 69 43 75 72 72 65 6e 74 21 3d 69 54 61 72 67   iCurrent!=iTarg
10e80 65 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  et ){.    sqlite
10e90 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72  3VdbeAddOp2(pPar
10ea0 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43  se->pVdbe, OP_SC
10eb0 6f 70 79 2c 20 69 43 75 72 72 65 6e 74 2c 20 69  opy, iCurrent, i
10ec0 54 61 72 67 65 74 29 3b 0a 20 20 7d 0a 20 20 66  Target);.  }.  f
10ed0 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
10ee0 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b  ->nColCache; i++
10ef0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  ){.    if( pPars
10f00 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e  e->aColCache[i].
10f10 69 52 65 67 3d 3d 69 54 61 72 67 65 74 20 29 7b  iReg==iTarget ){
10f20 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61  .      pParse->a
10f30 43 6f 6c 43 61 63 68 65 5b 69 5d 20 3d 20 70 50  ColCache[i] = pP
10f40 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b  arse->aColCache[
10f50 2d 2d 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61  --pParse->nColCa
10f60 63 68 65 5d 3b 0a 20 20 20 20 20 20 70 50 61 72  che];.      pPar
10f70 73 65 2d 3e 69 43 6f 6c 43 61 63 68 65 20 3d 20  se->iColCache = 
10f80 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
10f90 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  e;.    }.  }.  r
10fa0 65 74 75 72 6e 20 69 54 61 72 67 65 74 3b 0a 7d  eturn iTarget;.}
10fb0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ../*.** If the l
10fc0 61 73 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ast instruction 
10fd0 63 6f 64 65 64 20 69 73 20 61 6e 20 65 70 68 65  coded is an ephe
10fe0 6d 65 72 61 6c 20 63 6f 70 79 20 6f 66 20 61 6e  meral copy of an
10ff0 79 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 67 69  y of.** the regi
11000 73 74 65 72 73 20 69 6e 20 74 68 65 20 6e 52 65  sters in the nRe
11010 67 20 72 65 67 69 73 74 65 72 73 20 62 65 67 69  g registers begi
11020 6e 6e 69 6e 67 20 77 69 74 68 20 69 52 65 67 2c  nning with iReg,
11030 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 76 65 72 74   then.** convert
11040 20 74 68 65 20 6c 61 73 74 20 69 6e 73 74 72 75   the last instru
11050 63 74 69 6f 6e 20 66 72 6f 6d 20 4f 50 5f 53 43  ction from OP_SC
11060 6f 70 79 20 74 6f 20 4f 50 5f 43 6f 70 79 2e 0a  opy to OP_Copy..
11070 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
11080 78 70 72 48 61 72 64 43 6f 70 79 28 50 61 72 73  xprHardCopy(Pars
11090 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
110a0 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a  Reg, int nReg){.
110b0 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 56 64    int addr;.  Vd
110c0 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62  beOp *pOp;.  Vdb
110d0 65 20 2a 76 3b 0a 0a 20 20 76 20 3d 20 70 50 61  e *v;..  v = pPa
110e0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 64  rse->pVdbe;.  ad
110f0 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
11100 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
11110 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    pOp = sqlite3V
11120 64 62 65 47 65 74 4f 70 28 76 2c 20 61 64 64 72  dbeGetOp(v, addr
11130 2d 31 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  -1);.  assert( p
11140 4f 70 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  Op || pParse->db
11150 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
11160 3b 0a 20 20 69 66 28 20 70 4f 70 20 26 26 20 70  ;.  if( pOp && p
11170 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53  Op->opcode==OP_S
11180 43 6f 70 79 20 26 26 20 70 4f 70 2d 3e 70 31 3e  Copy && pOp->p1>
11190 3d 69 52 65 67 20 26 26 20 70 4f 70 2d 3e 70 31  =iReg && pOp->p1
111a0 3c 69 52 65 67 2b 6e 52 65 67 20 29 7b 0a 20 20  <iReg+nReg ){.  
111b0 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
111c0 4f 50 5f 43 6f 70 79 3b 0a 20 20 7d 0a 7d 0a 0a  OP_Copy;.  }.}..
111d0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
111e0 6f 64 65 20 69 6e 74 6f 20 74 68 65 20 63 75 72  ode into the cur
111f0 72 65 6e 74 20 56 64 62 65 20 74 6f 20 65 76 61  rent Vdbe to eva
11200 6c 75 61 74 65 20 74 68 65 20 67 69 76 65 6e 0a  luate the given.
11210 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  ** expression.  
11220 41 74 74 65 6d 70 74 20 74 6f 20 73 74 6f 72 65  Attempt to store
11230 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
11240 72 65 67 69 73 74 65 72 20 22 74 61 72 67 65 74  register "target
11250 22 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  "..** Return the
11260 20 72 65 67 69 73 74 65 72 20 77 68 65 72 65 20   register where 
11270 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72  results are stor
11280 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74  ed..**.** With t
11290 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65  his routine, the
112a0 72 65 20 69 73 20 6e 6f 20 67 75 61 72 61 6e 74  re is no guarant
112b0 65 65 64 20 74 68 61 74 20 72 65 73 75 6c 74 73  eed that results
112c0 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73 74 6f 72   will.** be stor
112d0 65 64 20 69 6e 20 74 61 72 67 65 74 2e 20 20 54  ed in target.  T
112e0 68 65 20 72 65 73 75 6c 74 20 6d 69 67 68 74 20  he result might 
112f0 62 65 20 73 74 6f 72 65 64 20 69 6e 20 73 6f 6d  be stored in som
11300 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65 67 69 73  e other.** regis
11310 74 65 72 20 69 66 20 69 74 20 69 73 20 63 6f 6e  ter if it is con
11320 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f 20 73 6f  venient to do so
11330 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  .  The calling f
11340 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20  unction.** must 
11350 63 68 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e  check the return
11360 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76 65 20 74   code and move t
11370 68 65 20 72 65 73 75 6c 74 73 20 74 6f 20 74 68  he results to th
11380 65 20 64 65 73 69 72 65 64 0a 2a 2a 20 72 65 67  e desired.** reg
11390 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ister..*/.int sq
113a0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
113b0 67 65 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  get(Parse *pPars
113c0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
113d0 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56  int target){.  V
113e0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
113f0 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54 68 65 20  >pVdbe;  /* The 
11400 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  VM under constru
11410 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f  ction */.  int o
11420 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
11430 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f       /* The opco
11440 64 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  de being coded *
11450 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20  /.  int inReg = 
11460 74 61 72 67 65 74 3b 20 20 20 20 20 20 20 2f 2a  target;       /*
11470 20 52 65 73 75 6c 74 73 20 73 74 6f 72 65 64 20   Results stored 
11480 69 6e 20 72 65 67 69 73 74 65 72 20 69 6e 52 65  in register inRe
11490 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72  g */.  int regFr
114a0 65 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ee1 = 0;        
114b0 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20   /* If non-zero 
114c0 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72  free this tempor
114d0 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  ary register */.
114e0 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d    int regFree2 =
114f0 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49   0;         /* I
11500 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20  f non-zero free 
11510 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72  this temporary r
11520 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74  egister */.  int
11530 20 72 31 2c 20 72 32 2c 20 72 33 2c 20 72 34 3b   r1, r2, r3, r4;
11540 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75         /* Variou
11550 73 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  s register numbe
11560 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  rs */..  assert(
11570 20 76 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d   v!=0 || pParse-
11580 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
11590 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  d );.  assert( t
115a0 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65  arget>0 && targe
115b0 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  t<=pParse->nMem 
115c0 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
115d0 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 69 66 28  return 0;..  if(
115e0 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20   pExpr==0 ){.   
115f0 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20   op = TK_NULL;. 
11600 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d   }else{.    op =
11610 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a   pExpr->op;.  }.
11620 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
11630 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
11640 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
11650 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
11660 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49  o = pExpr->pAggI
11670 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63  nfo;.      struc
11680 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
11690 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d  Col = &pAggInfo-
116a0 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67  >aCol[pExpr->iAg
116b0 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  g];.      if( !p
116c0 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
116d0 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ode ){.        a
116e0 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65  ssert( pCol->iMe
116f0 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  m>0 );.        i
11700 6e 52 65 67 20 3d 20 70 43 6f 6c 2d 3e 69 4d 65  nReg = pCol->iMe
11710 6d 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  m;.        break
11720 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
11730 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53  ( pAggInfo->useS
11740 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a 20 20 20  ortingIdx ){.   
11750 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11760 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
11770 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73  umn, pAggInfo->s
11780 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20 20 20 20  ortingIdx,.     
11790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117a0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
117b0 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74 61  SorterColumn, ta
117c0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 62  rget);.        b
117d0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
117e0 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65      /* Otherwise
117f0 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f  , fall thru into
11800 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63   the TK_COLUMN c
11810 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ase */.    }.   
11820 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
11830 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   {.      if( pEx
11840 70 72 2d 3e 69 54 61 62 6c 65 3c 30 20 29 7b 0a  pr->iTable<0 ){.
11850 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
11860 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65  only happens whe
11870 6e 20 63 6f 64 69 6e 67 20 63 68 65 63 6b 20 63  n coding check c
11880 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
11890 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
118a0 61 72 73 65 2d 3e 63 6b 42 61 73 65 3e 30 20 29  arse->ckBase>0 )
118b0 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20  ;.        inReg 
118c0 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
118d0 20 2b 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73   + pParse->ckBas
118e0 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
118f0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
11900 28 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  ( (pExpr->flags 
11910 26 20 45 50 5f 41 6e 79 41 66 66 29 21 3d 30 20  & EP_AnyAff)!=0 
11920 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  );.        inReg
11930 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
11940 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72  deGetColumn(pPar
11950 73 65 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c  se, pExpr->pTab,
11960 0a 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 20                  
11980 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
11990 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
119a0 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20   target,.       
119b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119c0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
119d0 3e 66 6c 61 67 73 20 26 20 45 50 5f 41 6e 79 41  >flags & EP_AnyA
119e0 66 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ff);.      }.   
119f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
11a00 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
11a10 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64  GER: {.      cod
11a20 65 49 6e 74 65 67 65 72 28 76 2c 20 28 63 68 61  eInteger(v, (cha
11a30 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  r*)pExpr->token.
11a40 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  z, pExpr->token.
11a50 6e 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  n, 0, target);. 
11a60 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11a70 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  }.    case TK_FL
11a80 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64  OAT: {.      cod
11a90 65 52 65 61 6c 28 76 2c 20 28 63 68 61 72 2a 29  eReal(v, (char*)
11aa0 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  pExpr->token.z, 
11ab0 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20  pExpr->token.n, 
11ac0 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
11ad0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
11ae0 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
11af0 47 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  G: {.      sqlit
11b00 65 33 44 65 71 75 6f 74 65 45 78 70 72 28 70 50  e3DequoteExpr(pP
11b10 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 29  arse->db, pExpr)
11b20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
11b30 64 62 65 41 64 64 4f 70 34 28 76 2c 4f 50 5f 53  dbeAddOp4(v,OP_S
11b40 74 72 69 6e 67 38 2c 20 30 2c 20 74 61 72 67 65  tring8, 0, targe
11b50 74 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  t, 0,.          
11b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
11b70 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65  har*)pExpr->toke
11b80 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  n.z, pExpr->toke
11b90 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  n.n);.      brea
11ba0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
11bb0 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20  e TK_NULL: {.   
11bc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11bd0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
11be0 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
11bf0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
11c00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11c10 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c  MIT_BLOB_LITERAL
11c20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
11c30 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  B: {.      int n
11c40 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
11c50 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63 68 61  ar *z;.      cha
11c60 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20 20 20  r *zBlob;.      
11c70 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 74  assert( pExpr->t
11c80 6f 6b 65 6e 2e 6e 3e 3d 33 20 29 3b 0a 20 20 20  oken.n>=3 );.   
11c90 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
11ca0 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d 3d 27 78  ->token.z[0]=='x
11cb0 27 20 7c 7c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  ' || pExpr->toke
11cc0 6e 2e 7a 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20  n.z[0]=='X' );. 
11cd0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
11ce0 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 31 5d 3d 3d  pr->token.z[1]==
11cf0 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 61 73  '\'' );.      as
11d00 73 65 72 74 28 20 70 45 78 70 72 2d 3e 74 6f 6b  sert( pExpr->tok
11d10 65 6e 2e 7a 5b 70 45 78 70 72 2d 3e 74 6f 6b 65  en.z[pExpr->toke
11d20 6e 2e 6e 2d 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a  n.n-1]=='\'' );.
11d30 20 20 20 20 20 20 6e 20 3d 20 70 45 78 70 72 2d        n = pExpr-
11d40 3e 74 6f 6b 65 6e 2e 6e 20 2d 20 33 3b 0a 20 20  >token.n - 3;.  
11d50 20 20 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 70      z = (char*)p
11d60 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 2b 20  Expr->token.z + 
11d70 32 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d  2;.      zBlob =
11d80 20 73 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f   sqlite3HexToBlo
11d90 62 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  b(sqlite3VdbeDb(
11da0 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  v), z, n);.     
11db0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11dc0 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e  p4(v, OP_Blob, n
11dd0 2f 32 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 7a  /2, target, 0, z
11de0 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43  Blob, P4_DYNAMIC
11df0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
11e00 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
11e10 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c   case TK_VARIABL
11e20 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
11e30 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11e40 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78  OP_Variable, pEx
11e50 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72 67  pr->iTable, targ
11e60 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  et);.      if( p
11e70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3e 31 20  Expr->token.n>1 
11e80 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
11e90 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
11ea0 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 45 78  , -1, (char*)pEx
11eb0 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
11ec0 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20  pr->token.n);.  
11ed0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
11ee0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
11ef0 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b  e TK_REGISTER: {
11f00 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70  .      inReg = p
11f10 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Expr->iTable;.  
11f20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11f30 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11f40 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61  OMIT_CAST.    ca
11f50 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20  se TK_CAST: {.  
11f60 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
11f70 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20  ns of the form: 
11f80 20 20 43 41 53 54 28 70 4c 65 66 74 20 41 53 20    CAST(pLeft AS 
11f90 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20  token) */.      
11fa0 69 6e 74 20 61 66 66 2c 20 74 6f 5f 6f 70 3b 0a  int aff, to_op;.
11fb0 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71        inReg = sq
11fc0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
11fd0 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
11fe0 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74  r->pLeft, target
11ff0 29 3b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 73  );.      aff = s
12000 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
12010 70 65 28 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  pe(&pExpr->token
12020 29 3b 0a 20 20 20 20 20 20 74 6f 5f 6f 70 20 3d  );.      to_op =
12030 20 61 66 66 20 2d 20 53 51 4c 49 54 45 5f 41 46   aff - SQLITE_AF
12040 46 5f 54 45 58 54 20 2b 20 4f 50 5f 54 6f 54 65  F_TEXT + OP_ToTe
12050 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  xt;.      assert
12060 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 54 65  ( to_op==OP_ToTe
12070 78 74 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51  xt    || aff!=SQ
12080 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 20 20  LITE_AFF_TEXT   
12090 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
120a0 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c  ( to_op==OP_ToBl
120b0 6f 62 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51  ob    || aff!=SQ
120c0 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 20 20  LITE_AFF_NONE   
120d0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
120e0 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75  ( to_op==OP_ToNu
120f0 6d 65 72 69 63 20 7c 7c 20 61 66 66 21 3d 53 51  meric || aff!=SQ
12100 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
12110 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
12120 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 49 6e  ( to_op==OP_ToIn
12130 74 20 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51  t     || aff!=SQ
12140 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
12150 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
12160 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 52 65  ( to_op==OP_ToRe
12170 61 6c 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51  al    || aff!=SQ
12180 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 20 20  LITE_AFF_REAL   
12190 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
121a0 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  se( to_op==OP_To
121b0 54 65 78 74 20 29 3b 0a 20 20 20 20 20 20 74 65  Text );.      te
121c0 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f  stcase( to_op==O
121d0 50 5f 54 6f 42 6c 6f 62 20 29 3b 0a 20 20 20 20  P_ToBlob );.    
121e0 20 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f    testcase( to_o
121f0 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65 72 69 63 20  p==OP_ToNumeric 
12200 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
12210 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 49  e( to_op==OP_ToI
12220 6e 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  nt );.      test
12230 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  case( to_op==OP_
12240 54 6f 52 65 61 6c 20 29 3b 0a 20 20 20 20 20 20  ToReal );.      
12250 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12260 31 28 76 2c 20 74 6f 5f 6f 70 2c 20 69 6e 52 65  1(v, to_op, inRe
12270 67 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  g);.      testca
12280 73 65 28 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e  se( usedAsColumn
12290 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 69 6e  Cache(pParse, in
122a0 52 65 67 2c 20 69 6e 52 65 67 29 20 29 3b 0a 20  Reg, inReg) );. 
122b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
122c0 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
122d0 6e 67 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65  nge(pParse, inRe
122e0 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65  g, 1);.      bre
122f0 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
12300 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
12310 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73 65  CAST */.    case
12320 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
12330 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
12340 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
12350 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
12360 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
12370 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
12380 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f  assert( TK_LT==O
12390 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Lt );.      as
123a0 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f  sert( TK_LE==OP_
123b0 4c 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Le );.      asse
123c0 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74  rt( TK_GT==OP_Gt
123d0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
123e0 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29  ( TK_GE==OP_Ge )
123f0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
12400 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a  TK_EQ==OP_Eq );.
12410 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
12420 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20  _NE==OP_Ne );.  
12430 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
12440 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20  ==TK_LT );.     
12450 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
12460 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65  K_LE );.      te
12470 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47  stcase( op==TK_G
12480 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
12490 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 45 20 29  ase( op==TK_GE )
124a0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
124b0 28 20 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20  ( op==TK_EQ );. 
124c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
124d0 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20  p==TK_NE );.    
124e0 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 4f 70 65    codeCompareOpe
124f0 72 61 6e 64 73 28 70 50 61 72 73 65 2c 20 70 45  rands(pParse, pE
12500 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 31 2c  xpr->pLeft, &r1,
12510 20 26 72 65 67 46 72 65 65 31 2c 0a 20 20 20 20   &regFree1,.    
12520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
12540 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 32  xpr->pRight, &r2
12550 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
12560 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
12570 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
12580 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  Left, pExpr->pRi
12590 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20  ght, op,.       
125a0 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72             r1, r
125b0 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49 54 45  2, inReg, SQLITE
125c0 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20  _STOREP2);.     
125d0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
125e0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
125f0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
12600 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e2==0 );.      b
12610 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
12620 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20  case TK_AND:.   
12630 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20   case TK_OR:.   
12640 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20   case TK_PLUS:. 
12650 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a     case TK_STAR:
12660 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e  .    case TK_MIN
12670 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  US:.    case TK_
12680 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  REM:.    case TK
12690 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73  _BITAND:.    cas
126a0 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20  e TK_BITOR:.    
126b0 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20  case TK_SLASH:. 
126c0 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46     case TK_LSHIF
126d0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  T:.    case TK_R
126e0 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65  SHIFT: .    case
126f0 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20   TK_CONCAT: {.  
12700 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 41      assert( TK_A
12710 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 0a 20 20  ND==OP_And );.  
12720 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4f      assert( TK_O
12730 52 3d 3d 4f 50 5f 4f 72 20 29 3b 0a 20 20 20 20  R==OP_Or );.    
12740 20 20 61 73 73 65 72 74 28 20 54 4b 5f 50 4c 55    assert( TK_PLU
12750 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 0a 20 20 20  S==OP_Add );.   
12760 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d 49     assert( TK_MI
12770 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74  NUS==OP_Subtract
12780 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
12790 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d  ( TK_REM==OP_Rem
127a0 61 69 6e 64 65 72 20 29 3b 0a 20 20 20 20 20 20  ainder );.      
127b0 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 41 4e  assert( TK_BITAN
127c0 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b 0a  D==OP_BitAnd );.
127d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
127e0 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72  _BITOR==OP_BitOr
127f0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
12800 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44  ( TK_SLASH==OP_D
12810 69 76 69 64 65 20 29 3b 0a 20 20 20 20 20 20 61  ivide );.      a
12820 73 73 65 72 74 28 20 54 4b 5f 4c 53 48 49 46 54  ssert( TK_LSHIFT
12830 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 29  ==OP_ShiftLeft )
12840 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
12850 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68  TK_RSHIFT==OP_Sh
12860 69 66 74 52 69 67 68 74 20 29 3b 0a 20 20 20 20  iftRight );.    
12870 20 20 61 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e    assert( TK_CON
12880 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29  CAT==OP_Concat )
12890 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
128a0 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a  ( op==TK_AND );.
128b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
128c0 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 20  op==TK_OR );.   
128d0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
128e0 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20  =TK_PLUS );.    
128f0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
12900 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20 20 20 20  TK_MINUS );.    
12910 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
12920 54 4b 5f 52 45 4d 20 29 3b 0a 20 20 20 20 20 20  TK_REM );.      
12930 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
12940 5f 42 49 54 41 4e 44 20 29 3b 0a 20 20 20 20 20  _BITAND );.     
12950 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
12960 4b 5f 42 49 54 4f 52 20 29 3b 0a 20 20 20 20 20  K_BITOR );.     
12970 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
12980 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20 20 20 20  K_SLASH );.     
12990 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
129a0 4b 5f 4c 53 48 49 46 54 20 29 3b 0a 20 20 20 20  K_LSHIFT );.    
129b0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
129c0 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a 20 20 20  TK_RSHIFT );.   
129d0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
129e0 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a 20 20  =TK_CONCAT );.  
129f0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
12a00 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
12a10 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
12a20 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
12a30 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
12a40 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
12a50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
12a60 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
12a70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
12a80 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20  beAddOp3(v, op, 
12a90 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b  r2, r1, target);
12aa0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
12ab0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
12ac0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
12ad0 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
12ae0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
12af0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d  }.    case TK_UM
12b00 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45 78  INUS: {.      Ex
12b10 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
12b20 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
12b30 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b  assert( pLeft );
12b40 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74  .      if( pLeft
12b50 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 7c  ->op==TK_FLOAT |
12b60 7c 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  | pLeft->op==TK_
12b70 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20  INTEGER ){.     
12b80 20 20 20 54 6f 6b 65 6e 20 2a 70 20 3d 20 26 70     Token *p = &p
12b90 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20  Left->token;.   
12ba0 20 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e       if( pLeft->
12bb0 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a  op==TK_FLOAT ){.
12bc0 20 20 20 20 20 20 20 20 20 20 63 6f 64 65 52 65            codeRe
12bd0 61 6c 28 76 2c 20 28 63 68 61 72 2a 29 70 2d 3e  al(v, (char*)p->
12be0 7a 2c 20 70 2d 3e 6e 2c 20 31 2c 20 74 61 72 67  z, p->n, 1, targ
12bf0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  et);.        }el
12c00 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  se{.          co
12c10 64 65 49 6e 74 65 67 65 72 28 76 2c 20 28 63 68  deInteger(v, (ch
12c20 61 72 2a 29 70 2d 3e 7a 2c 20 70 2d 3e 6e 2c 20  ar*)p->z, p->n, 
12c30 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
12c40 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
12c50 65 7b 0a 20 20 20 20 20 20 20 20 72 65 67 46 72  e{.        regFr
12c60 65 65 31 20 3d 20 72 31 20 3d 20 73 71 6c 69 74  ee1 = r1 = sqlit
12c70 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
12c80 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
12c90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12ca0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
12cb0 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 72  , r1);.        r
12cc0 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
12cd0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
12ce0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
12cf0 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
12d00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12d10 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74 72 61  Op3(v, OP_Subtra
12d20 63 74 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67  ct, r2, r1, targ
12d30 65 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  et);.        tes
12d40 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
12d50 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  =0 );.      }.  
12d60 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67      inReg = targ
12d70 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  et;.      break;
12d80 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
12d90 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63  TK_BITNOT:.    c
12da0 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
12db0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42      assert( TK_B
12dc0 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74  ITNOT==OP_BitNot
12dd0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
12de0 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74  ( TK_NOT==OP_Not
12df0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
12e00 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f  se( op==TK_BITNO
12e10 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
12e20 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20  ase( op==TK_NOT 
12e30 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d  );.      inReg =
12e40 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
12e50 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
12e60 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72  Expr->pLeft, tar
12e70 67 65 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  get);.      test
12e80 63 61 73 65 28 20 69 6e 52 65 67 3d 3d 74 61 72  case( inReg==tar
12e90 67 65 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73  get );.      tes
12ea0 74 63 61 73 65 28 20 75 73 65 64 41 73 43 6f 6c  tcase( usedAsCol
12eb0 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c  umnCache(pParse,
12ec0 20 69 6e 52 65 67 2c 20 69 6e 52 65 67 29 20 29   inReg, inReg) )
12ed0 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20  ;.      inReg = 
12ee0 73 71 6c 69 74 65 33 45 78 70 72 57 72 69 74 61  sqlite3ExprWrita
12ef0 62 6c 65 52 65 67 69 73 74 65 72 28 70 50 61 72  bleRegister(pPar
12f00 73 65 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65  se, inReg, targe
12f10 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
12f20 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 6f  3VdbeAddOp1(v, o
12f30 70 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20  p, inReg);.     
12f40 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
12f50 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
12f60 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
12f70 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69  TNULL: {.      i
12f80 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61  nt addr;.      a
12f90 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c  ssert( TK_ISNULL
12fa0 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20  ==OP_IsNull );. 
12fb0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
12fc0 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e  NOTNULL==OP_NotN
12fd0 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ull );.      tes
12fe0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
12ff0 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65  NULL );.      te
13000 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
13010 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  OTNULL );.      
13020 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13030 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
13040 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   1, target);.   
13050 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
13060 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
13070 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
13080 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
13090 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
130a0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
130b0 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
130c0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 6f  3VdbeAddOp1(v, o
130d0 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  p, r1);.      sq
130e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
130f0 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61  v, OP_AddImm, ta
13100 72 67 65 74 2c 20 2d 31 29 3b 0a 20 20 20 20 20  rget, -1);.     
13110 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
13120 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
13130 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13140 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  }.    case TK_AG
13150 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  G_FUNCTION: {.  
13160 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e      AggInfo *pIn
13170 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67  fo = pExpr->pAgg
13180 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  Info;.      if( 
13190 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  pInfo==0 ){.    
131a0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
131b0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73  Msg(pParse, "mis
131c0 75 73 65 20 6f 66 20 61 67 67 72 65 67 61 74 65  use of aggregate
131d0 3a 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20  : %T",.         
131e0 20 20 20 26 70 45 78 70 72 2d 3e 73 70 61 6e 29     &pExpr->span)
131f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
13200 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70         inReg = p
13210 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70  Info->aFunc[pExp
13220 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20  r->iAgg].iMem;. 
13230 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
13240 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
13250 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43  se TK_CONST_FUNC
13260 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  :.    case TK_FU
13270 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
13280 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
13290 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a  = pExpr->pList;.
132a0 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20        int nExpr 
132b0 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d  = pList ? pList-
132c0 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20  >nExpr : 0;.    
132d0 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b    FuncDef *pDef;
132e0 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 0a  .      int nId;.
132f0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
13300 20 2a 7a 49 64 3b 0a 20 20 20 20 20 20 69 6e 74   *zId;.      int
13310 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 0a   constMask = 0;.
13320 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
13330 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
13340 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20   pParse->db;.   
13350 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28     u8 enc = ENC(
13360 64 62 29 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  db);.      CollS
13370 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 0a  eq *pColl = 0;..
13380 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
13390 6f 70 3d 3d 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e  op==TK_CONST_FUN
133a0 43 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  C );.      testc
133b0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 46 55 4e 43  ase( op==TK_FUNC
133c0 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 7a 49  TION );.      zI
133d0 64 20 3d 20 28 63 68 61 72 2a 29 70 45 78 70 72  d = (char*)pExpr
133e0 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20  ->token.z;.     
133f0 20 6e 49 64 20 3d 20 70 45 78 70 72 2d 3e 74 6f   nId = pExpr->to
13400 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 70 44 65  ken.n;.      pDe
13410 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  f = sqlite3FindF
13420 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e  unction(pParse->
13430 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 45  db, zId, nId, nE
13440 78 70 72 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20  xpr, enc, 0);.  
13450 20 20 20 20 61 73 73 65 72 74 28 20 70 44 65 66      assert( pDef
13460 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
13470 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20   pList ){.      
13480 20 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d    nExpr = pList-
13490 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >nExpr;.        
134a0 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
134b0 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
134c0 20 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20   nExpr);.       
134d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
134e0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
134f0 20 70 4c 69 73 74 2c 20 72 31 2c 20 31 29 3b 0a   pList, r1, 1);.
13500 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13510 20 20 20 20 20 6e 45 78 70 72 20 3d 20 72 31 20       nExpr = r1 
13520 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  = 0;.      }.#if
13530 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13540 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
13550 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20      /* Possibly 
13560 6f 76 65 72 6c 6f 61 64 20 74 68 65 20 66 75 6e  overload the fun
13570 63 74 69 6f 6e 20 69 66 20 74 68 65 20 66 69 72  ction if the fir
13580 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 20  st argument is. 
13590 20 20 20 20 20 2a 2a 20 61 20 76 69 72 74 75 61       ** a virtua
135a0 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a  l table column..
135b0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
135c0 2a 20 46 6f 72 20 69 6e 66 69 78 20 66 75 6e 63  * For infix func
135d0 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f  tions (LIKE, GLO
135e0 42 2c 20 52 45 47 45 58 50 2c 20 61 6e 64 20 4d  B, REGEXP, and M
135f0 41 54 43 48 29 20 75 73 65 20 74 68 65 0a 20 20  ATCH) use the.  
13600 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72      ** second ar
13610 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20  gument, not the 
13620 66 69 72 73 74 2c 20 61 73 20 74 68 65 20 61 72  first, as the ar
13630 67 75 6d 65 6e 74 20 74 6f 20 74 65 73 74 20 74  gument to test t
13640 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69  o.      ** see i
13650 66 20 69 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e  f it is a column
13660 20 69 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61   in a virtual ta
13670 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20 64 6f  ble.  This is do
13680 6e 65 20 62 65 63 61 75 73 65 0a 20 20 20 20 20  ne because.     
13690 20 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f 70 65   ** the left ope
136a0 72 61 6e 64 20 6f 66 20 69 6e 66 69 78 20 66 75  rand of infix fu
136b0 6e 63 74 69 6f 6e 73 20 28 74 68 65 20 6f 70 65  nctions (the ope
136c0 72 61 6e 64 20 77 65 20 77 61 6e 74 20 74 6f 0a  rand we want to.
136d0 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c        ** control
136e0 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e   overloading) en
136f0 64 73 20 75 70 20 61 73 20 74 68 65 20 73 65 63  ds up as the sec
13700 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
13710 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e  the.      ** fun
13720 63 74 69 6f 6e 2e 20 20 54 68 65 20 65 78 70 72  ction.  The expr
13730 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42  ession "A glob B
13740 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  " is equivalent 
13750 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c  to .      ** "gl
13760 6f 62 28 42 2c 41 29 2e 20 20 57 65 20 77 61 6e  ob(B,A).  We wan
13770 74 20 74 6f 20 75 73 65 20 74 68 65 20 41 20 69  t to use the A i
13780 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 74 6f 20  n "A glob B" to 
13790 74 65 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f  test.      ** fo
137a0 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c  r function overl
137b0 6f 61 64 69 6e 67 2e 20 20 42 75 74 20 77 65 20  oading.  But we 
137c0 75 73 65 20 74 68 65 20 42 20 74 65 72 6d 20 69  use the B term i
137d0 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20  n "glob(B,A)".. 
137e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
137f0 28 20 6e 45 78 70 72 3e 3d 32 20 26 26 20 28 70  ( nExpr>=2 && (p
13800 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
13810 5f 49 6e 66 69 78 46 75 6e 63 29 20 29 7b 0a 20  _InfixFunc) ){. 
13820 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71         pDef = sq
13830 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61  lite3VtabOverloa
13840 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44  dFunction(db, pD
13850 65 66 2c 20 6e 45 78 70 72 2c 20 70 4c 69 73 74  ef, nExpr, pList
13860 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[1].pExpr);. 
13870 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
13880 45 78 70 72 3e 30 20 29 7b 0a 20 20 20 20 20 20  Expr>0 ){.      
13890 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
138a0 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63  VtabOverloadFunc
138b0 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e  tion(db, pDef, n
138c0 45 78 70 72 2c 20 70 4c 69 73 74 2d 3e 61 5b 30  Expr, pList->a[0
138d0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
138e0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66  }.#endif.      f
138f0 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 20  or(i=0; i<nExpr 
13900 26 26 20 69 3c 33 32 3b 20 69 2b 2b 29 7b 0a 20  && i<32; i++){. 
13910 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
13920 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
13930 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  (pList->a[i].pEx
13940 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pr) ){.         
13950 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 28 31   constMask |= (1
13960 3c 3c 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  <<i);.        }.
13970 20 20 20 20 20 20 20 20 69 66 28 20 70 44 65 66          if( pDef
13980 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 26 26  ->needCollSeq &&
13990 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
139a0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
139b0 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
139c0 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61  pParse, pList->a
139d0 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
139e0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
139f0 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 6e 65      if( pDef->ne
13a00 65 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20  edCollSeq ){.   
13a10 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
13a20 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65  ) pColl = pParse
13a30 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
13a40 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
13a50 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
13a60 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c  P_CollSeq, 0, 0,
13a70 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c   0, (char *)pCol
13a80 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
13a90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
13aa0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
13ab0 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20  v, OP_Function, 
13ac0 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74  constMask, r1, t
13ad0 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20  arget,.         
13ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
13af0 63 68 61 72 2a 29 70 44 65 66 2c 20 50 34 5f 46  char*)pDef, P4_F
13b00 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 73  UNCDEF);.      s
13b10 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
13b20 50 35 28 76 2c 20 6e 45 78 70 72 29 3b 0a 20 20  P5(v, nExpr);.  
13b30 20 20 20 20 69 66 28 20 6e 45 78 70 72 20 29 7b      if( nExpr ){
13b40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
13b50 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
13b60 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 45 78  (pParse, r1, nEx
13b70 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
13b80 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
13b90 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
13ba0 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 45  e(pParse, r1, nE
13bb0 78 70 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61  xpr);.      brea
13bc0 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
13bd0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
13be0 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
13bf0 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61  K_EXISTS:.    ca
13c00 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a  se TK_SELECT: {.
13c10 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
13c20 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b  op==TK_EXISTS );
13c30 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
13c40 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29   op==TK_SELECT )
13c50 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
13c60 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b  r->iColumn==0 ){
13c70 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
13c80 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
13c90 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
13ca0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65      }.      inRe
13cb0 67 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  g = pExpr->iColu
13cc0 6d 6e 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  mn;.      break;
13cd0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
13ce0 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
13cf0 6e 74 20 6a 31 2c 20 6a 32 2c 20 6a 33 2c 20 6a  nt j1, j2, j3, j
13d00 34 2c 20 6a 35 3b 0a 20 20 20 20 20 20 63 68 61  4, j5;.      cha
13d10 72 20 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20  r affinity;.    
13d20 20 20 69 6e 74 20 65 54 79 70 65 3b 0a 0a 20 20    int eType;..  
13d30 20 20 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69      eType = sqli
13d40 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70  te3FindInIndex(p
13d50 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30 29  Parse, pExpr, 0)
13d60 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 67 75  ;..      /* Figu
13d70 72 65 20 6f 75 74 20 74 68 65 20 61 66 66 69 6e  re out the affin
13d80 69 74 79 20 74 6f 20 75 73 65 20 74 6f 20 63 72  ity to use to cr
13d90 65 61 74 65 20 61 20 6b 65 79 20 66 72 6f 6d 20  eate a key from 
13da0 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20  the results.    
13db0 20 20 2a 2a 20 6f 66 20 74 68 65 20 65 78 70 72    ** of the expr
13dc0 65 73 73 69 6f 6e 2e 20 61 66 66 69 6e 69 74 79  ession. affinity
13dd0 53 74 72 20 73 74 6f 72 65 73 20 61 20 73 74 61  Str stores a sta
13de0 74 69 63 20 73 74 72 69 6e 67 20 73 75 69 74 61  tic string suita
13df0 62 6c 65 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a  ble for.      **
13e00 20 50 34 20 6f 66 20 4f 50 5f 4d 61 6b 65 52 65   P4 of OP_MakeRe
13e10 63 6f 72 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  cord..      */. 
13e20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20       affinity = 
13e30 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69  comparisonAffini
13e40 74 79 28 70 45 78 70 72 29 3b 0a 0a 20 20 20 20  ty(pExpr);..    
13e50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13e60 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
13e70 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 0a  r, 1, target);..
13e80 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
13e90 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c  e <expr> from "<
13ea0 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e  expr> IN (...)".
13eb0 20 54 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   The temporary t
13ec0 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 70 45  able.      ** pE
13ed0 78 70 72 2d 3e 69 54 61 62 6c 65 20 63 6f 6e 74  xpr->iTable cont
13ee0 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 73 20  ains the values 
13ef0 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65  that make up the
13f00 20 28 2e 2e 2e 29 20 73 65 74 2e 0a 20 20 20 20   (...) set..    
13f10 20 20 2a 2f 0a 20 20 20 20 20 20 72 31 20 3d 20    */.      r1 = 
13f20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
13f30 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
13f40 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
13f50 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ee1);.      test
13f60 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
13f70 30 20 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d 20  0 );.      j1 = 
13f80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13f90 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c  1(v, OP_NotNull,
13fa0 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
13fb0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13fc0 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72   OP_Null, 0, tar
13fd0 67 65 74 29 3b 0a 20 20 20 20 20 20 6a 32 20 20  get);.      j2  
13fe0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
13ff0 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b  Op0(v, OP_Goto);
14000 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
14010 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31  beJumpHere(v, j1
14020 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  );.      if( eTy
14030 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  pe==IN_INDEX_ROW
14040 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 33  ID ){.        j3
14050 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
14060 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp1(v, OP_MustB
14070 65 49 6e 74 2c 20 72 31 29 3b 0a 20 20 20 20 20  eInt, r1);.     
14080 20 20 20 6a 34 20 3d 20 73 71 6c 69 74 65 33 56     j4 = sqlite3V
14090 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
140a0 4e 6f 74 45 78 69 73 74 73 2c 20 70 45 78 70 72  NotExists, pExpr
140b0 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 20 72 31 29  ->iTable, 0, r1)
140c0 3b 0a 20 20 20 20 20 20 20 20 6a 35 20 3d 20 73  ;.        j5 = s
140d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
140e0 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20  (v, OP_Goto);.  
140f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14100 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 33 29  eJumpHere(v, j3)
14110 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
14120 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
14130 20 6a 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73   j4);.      }els
14140 65 7b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20  e{.        r2 = 
14150 72 65 67 46 72 65 65 32 20 3d 20 73 71 6c 69 74  regFree2 = sqlit
14160 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
14170 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
14180 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
14190 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
141a0 2c 20 72 31 2c 20 31 2c 20 72 32 2c 20 26 61 66  , r1, 1, r2, &af
141b0 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20  finity, 1);.    
141c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
141d0 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
141e0 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 31  ge(pParse, r1, 1
141f0 29 3b 0a 20 20 20 20 20 20 20 20 6a 35 20 3d 20  );.        j5 = 
14200 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14210 33 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70  3(v, OP_Found, p
14220 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c  Expr->iTable, 0,
14230 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   r2);.      }.  
14240 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14250 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
14260 6d 6d 2c 20 74 61 72 67 65 74 2c 20 2d 31 29 3b  mm, target, -1);
14270 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
14280 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 32  beJumpHere(v, j2
14290 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
142a0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
142b0 6a 35 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  j5);.      break
142c0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
142d0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20     /*.    **    
142e0 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20  x BETWEEN y AND 
142f0 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  z.    **.    ** 
14300 54 68 69 73 20 69 73 20 65 71 75 69 76 61 6c 65  This is equivale
14310 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20  nt to.    **.   
14320 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20   **    x>=y AND 
14330 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  x<=z.    **.    
14340 2a 2a 20 58 20 69 73 20 73 74 6f 72 65 64 20 69  ** X is stored i
14350 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a  n pExpr->pLeft..
14360 20 20 20 20 2a 2a 20 59 20 69 73 20 73 74 6f 72      ** Y is stor
14370 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69  ed in pExpr->pLi
14380 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a  st->a[0].pExpr..
14390 20 20 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72      ** Z is stor
143a0 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69  ed in pExpr->pLi
143b0 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a  st->a[1].pExpr..
143c0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
143d0 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20  TK_BETWEEN: {.  
143e0 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
143f0 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
14400 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
14410 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 49 74  rList_item *pLIt
14420 65 6d 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  em = pExpr->pLis
14430 74 2d 3e 61 3b 0a 20 20 20 20 20 20 45 78 70 72  t->a;.      Expr
14440 20 2a 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65   *pRight = pLIte
14450 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20 20 20 20  m->pExpr;..     
14460 20 63 6f 64 65 43 6f 6d 70 61 72 65 4f 70 65 72   codeCompareOper
14470 61 6e 64 73 28 70 50 61 72 73 65 2c 20 70 4c 65  ands(pParse, pLe
14480 66 74 2c 20 26 72 31 2c 20 26 72 65 67 46 72 65  ft, &r1, &regFre
14490 65 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e1,.            
144a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144b0 20 20 20 20 20 20 70 52 69 67 68 74 2c 20 26 72        pRight, &r
144c0 32 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  2, &regFree2);. 
144d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
144e0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
144f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
14500 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
14510 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33 47     r3 = sqlite3G
14520 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
14530 29 3b 0a 20 20 20 20 20 20 72 34 20 3d 20 73 71  );.      r4 = sq
14540 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
14550 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 63  pParse);.      c
14560 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
14570 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
14580 2c 20 4f 50 5f 47 65 2c 0a 20 20 20 20 20 20 20  , OP_Ge,.       
14590 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72             r1, r
145a0 32 2c 20 72 33 2c 20 53 51 4c 49 54 45 5f 53 54  2, r3, SQLITE_ST
145b0 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20 70 4c  OREP2);.      pL
145c0 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 52  Item++;.      pR
145d0 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70  ight = pLItem->p
145e0 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
145f0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
14600 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
14610 65 32 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e2);.      r2 = 
14620 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
14630 65 6d 70 28 70 50 61 72 73 65 2c 20 70 52 69 67  emp(pParse, pRig
14640 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
14650 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14660 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
14670 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
14680 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
14690 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 72  pRight, OP_Le, r
146a0 31 2c 20 72 32 2c 20 72 34 2c 20 53 51 4c 49 54  1, r2, r4, SQLIT
146b0 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20  E_STOREP2);.    
146c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
146d0 4f 70 33 28 76 2c 20 4f 50 5f 41 6e 64 2c 20 72  Op3(v, OP_And, r
146e0 33 2c 20 72 34 2c 20 74 61 72 67 65 74 29 3b 0a  3, r4, target);.
146f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
14700 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
14710 73 65 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 73  se, r3);.      s
14720 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
14730 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 34 29  pReg(pParse, r4)
14740 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
14750 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
14760 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20  _UPLUS: {.      
14770 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
14780 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
14790 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
147a0 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  ft, target);.   
147b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
147c0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 46  .    /*.    ** F
147d0 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20 20 20  orm A:.    **   
147e0 43 41 53 45 20 78 20 57 48 45 4e 20 65 31 20 54  CASE x WHEN e1 T
147f0 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54  HEN r1 WHEN e2 T
14800 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20  HEN r2 ... WHEN 
14810 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20  eN THEN rN ELSE 
14820 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20  y END.    **.   
14830 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20 20 20   ** Form B:.    
14840 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 65  **   CASE WHEN e
14850 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65  1 THEN r1 WHEN e
14860 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48  2 THEN r2 ... WH
14870 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c  EN eN THEN rN EL
14880 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a  SE y END.    **.
14890 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20 69 73      ** Form A is
148a0 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66 6f 72   can be transfor
148b0 6d 65 64 20 69 6e 74 6f 20 74 68 65 20 65 71 75  med into the equ
148c0 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42 20 61  ivalent form B a
148d0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a  s follows:.    *
148e0 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 78 3d  *   CASE WHEN x=
148f0 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20  e1 THEN r1 WHEN 
14900 78 3d 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e  x=e2 THEN r2 ...
14910 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 57  .    **        W
14920 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20 72 4e  HEN x=eN THEN rN
14930 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20   ELSE y END.    
14940 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69 66 20  **.    ** X (if 
14950 69 74 20 65 78 69 73 74 73 29 20 69 73 20 69 6e  it exists) is in
14960 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20   pExpr->pLeft.. 
14970 20 20 20 2a 2a 20 59 20 69 73 20 69 6e 20 70 45     ** Y is in pE
14980 78 70 72 2d 3e 70 52 69 67 68 74 2e 20 20 54 68  xpr->pRight.  Th
14990 65 20 59 20 69 73 20 61 6c 73 6f 20 6f 70 74 69  e Y is also opti
149a0 6f 6e 61 6c 2e 20 20 49 66 20 74 68 65 72 65 20  onal.  If there 
149b0 69 73 20 6e 6f 0a 20 20 20 20 2a 2a 20 45 4c 53  is no.    ** ELS
149c0 45 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 20  E clause and no 
149d0 6f 74 68 65 72 20 74 65 72 6d 20 6d 61 74 63 68  other term match
149e0 65 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  es, then the res
149f0 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ult of the.    *
14a00 2a 20 65 78 70 72 73 73 69 6f 6e 20 69 73 20 4e  * exprssion is N
14a10 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69 20 69  ULL..    ** Ei i
14a20 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73  s in pExpr->pLis
14a30 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20 52 69  t->a[i*2] and Ri
14a40 20 69 73 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   is pExpr->pList
14a50 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20 20  ->a[i*2+1]..    
14a60 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65  **.    ** The re
14a70 73 75 6c 74 20 6f 66 20 74 68 65 20 65 78 70 72  sult of the expr
14a80 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20 52 69  ession is the Ri
14a90 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 6d   for the first m
14aa0 61 74 63 68 69 6e 67 20 45 69 2c 0a 20 20 20 20  atching Ei,.    
14ab0 2a 2a 20 6f 72 20 69 66 20 74 68 65 72 65 20 69  ** or if there i
14ac0 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 45 69  s no matching Ei
14ad0 2c 20 74 68 65 20 45 4c 53 45 20 74 65 72 6d 20  , the ELSE term 
14ae0 59 2c 20 6f 72 20 69 66 20 74 68 65 72 65 20 69  Y, or if there i
14af0 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c 53 45  s.    ** no ELSE
14b00 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20   term, NULL..   
14b10 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
14b20 43 41 53 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e  CASE: {.      in
14b30 74 20 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20  t endLabel;     
14b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b50 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f  /* GOTO label fo
14b60 72 20 65 6e 64 20 6f 66 20 43 41 53 45 20 73 74  r end of CASE st
14b70 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  mt */.      int 
14b80 6e 65 78 74 43 61 73 65 3b 20 20 20 20 20 20 20  nextCase;       
14b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14ba0 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20   GOTO label for 
14bb0 6e 65 78 74 20 57 48 45 4e 20 63 6c 61 75 73 65  next WHEN clause
14bc0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 45   */.      int nE
14bd0 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  xpr;            
14be0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32              /* 2
14bf0 78 20 6e 75 6d 62 65 72 20 6f 66 20 57 48 45 4e  x number of WHEN
14c00 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20   terms */.      
14c10 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
14c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c30 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
14c40 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c  r */.      ExprL
14c50 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20  ist *pEList;    
14c60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14c70 4c 69 73 74 20 6f 66 20 57 48 45 4e 20 74 65 72  List of WHEN ter
14c80 6d 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75  ms */.      stru
14c90 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
14ca0 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a   *aListelem;  /*
14cb0 20 41 72 72 61 79 20 6f 66 20 57 48 45 4e 20 74   Array of WHEN t
14cc0 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45 78  erms */.      Ex
14cd0 70 72 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20  pr opCompare;   
14ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14cf0 2f 2a 20 54 68 65 20 58 3d 3d 45 69 20 65 78 70  /* The X==Ei exp
14d00 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ression */.     
14d10 20 45 78 70 72 20 63 61 63 68 65 58 3b 20 20 20   Expr cacheX;   
14d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d30 20 20 20 2f 2a 20 43 61 63 68 65 64 20 65 78 70     /* Cached exp
14d40 72 65 73 73 69 6f 6e 20 58 20 2a 2f 0a 20 20 20  ression X */.   
14d50 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20     Expr *pX;    
14d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d70 20 20 20 20 20 2f 2a 20 54 68 65 20 58 20 65 78       /* The X ex
14d80 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
14d90 20 20 45 78 70 72 20 2a 70 54 65 73 74 3b 20 20    Expr *pTest;  
14da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14db0 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28 66 6f      /* X==Ei (fo
14dc0 72 6d 20 41 29 20 6f 72 20 6a 75 73 74 20 45 69  rm A) or just Ei
14dd0 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 0a 20 20   (form B) */..  
14de0 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70 72      assert(pExpr
14df0 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  ->pList);.      
14e00 61 73 73 65 72 74 28 28 70 45 78 70 72 2d 3e 70  assert((pExpr->p
14e10 4c 69 73 74 2d 3e 6e 45 78 70 72 20 25 20 32 29  List->nExpr % 2)
14e20 20 3d 3d 20 30 29 3b 0a 20 20 20 20 20 20 61 73   == 0);.      as
14e30 73 65 72 74 28 70 45 78 70 72 2d 3e 70 4c 69 73  sert(pExpr->pLis
14e40 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20  t->nExpr > 0);. 
14e50 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45       pEList = pE
14e60 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20  xpr->pList;.    
14e70 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45    aListelem = pE
14e80 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e  List->a;.      n
14e90 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  Expr = pEList->n
14ea0 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c  Expr;.      endL
14eb0 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  abel = sqlite3Vd
14ec0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
14ed0 20 20 20 20 20 20 69 66 28 20 28 70 58 20 3d 20        if( (pX = 
14ee0 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30  pExpr->pLeft)!=0
14ef0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 63 68   ){.        cach
14f00 65 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20  eX = *pX;.      
14f10 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e    testcase( pX->
14f20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op==TK_COLUMN ||
14f30 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49   pX->op==TK_REGI
14f40 53 54 45 52 20 29 3b 0a 20 20 20 20 20 20 20 20  STER );.        
14f50 63 61 63 68 65 58 2e 69 54 61 62 6c 65 20 3d 20  cacheX.iTable = 
14f60 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
14f70 65 6d 70 28 70 50 61 72 73 65 2c 20 70 58 2c 20  emp(pParse, pX, 
14f80 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
14f90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
14fa0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
14fb0 20 20 20 20 20 63 61 63 68 65 58 2e 6f 70 20 3d       cacheX.op =
14fc0 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20   TK_REGISTER;.  
14fd0 20 20 20 20 20 20 63 61 63 68 65 58 2e 69 43 6f        cacheX.iCo
14fe0 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  lumn = 0;.      
14ff0 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d    opCompare.op =
15000 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20 20   TK_EQ;.        
15010 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20  opCompare.pLeft 
15020 3d 20 26 63 61 63 68 65 58 3b 0a 20 20 20 20 20  = &cacheX;.     
15030 20 20 20 70 54 65 73 74 20 3d 20 26 6f 70 43 6f     pTest = &opCo
15040 6d 70 61 72 65 3b 0a 20 20 20 20 20 20 7d 0a 20  mpare;.      }. 
15050 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73       pParse->dis
15060 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a  ableColCache++;.
15070 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
15080 3c 6e 45 78 70 72 3b 20 69 3d 69 2b 32 29 7b 0a  <nExpr; i=i+2){.
15090 20 20 20 20 20 20 20 20 69 66 28 20 70 58 20 29          if( pX )
150a0 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 70 43 6f  {.          opCo
150b0 6d 70 61 72 65 2e 70 52 69 67 68 74 20 3d 20 61  mpare.pRight = a
150c0 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70  Listelem[i].pExp
150d0 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  r;.        }else
150e0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 73  {.          pTes
150f0 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d  t = aListelem[i]
15100 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
15110 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74 43 61  }.        nextCa
15120 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  se = sqlite3Vdbe
15130 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
15140 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15150 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pTest->op==TK_CO
15160 4c 55 4d 4e 20 7c 7c 20 70 54 65 73 74 2d 3e 6f  LUMN || pTest->o
15170 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
15180 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
15190 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
151a0 72 73 65 2c 20 70 54 65 73 74 2c 20 6e 65 78 74  rse, pTest, next
151b0 43 61 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  Case, SQLITE_JUM
151c0 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
151d0 20 20 74 65 73 74 63 61 73 65 28 20 61 4c 69 73    testcase( aLis
151e0 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72  telem[i+1].pExpr
151f0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
15200 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
15210 61 73 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69  ase( aListelem[i
15220 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  +1].pExpr->op==T
15230 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20  K_REGISTER );.  
15240 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
15250 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61 4c  rCode(pParse, aL
15260 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78  istelem[i+1].pEx
15270 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
15280 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15290 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
152a0 6f 2c 20 30 2c 20 65 6e 64 4c 61 62 65 6c 29 3b  o, 0, endLabel);
152b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
152c0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
152d0 28 76 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a 20  (v, nextCase);. 
152e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
152f0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29   pExpr->pRight )
15300 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
15310 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
15320 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
15330 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
15340 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
15350 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15360 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
15370 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d  target);.      }
15380 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15390 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
153a0 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20  , endLabel);.   
153b0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
153c0 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63  e->disableColCac
153d0 68 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 70 50  he>0 );.      pP
153e0 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c  arse->disableCol
153f0 43 61 63 68 65 2d 2d 3b 0a 20 20 20 20 20 20 62  Cache--;.      b
15400 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
15410 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15420 54 52 49 47 47 45 52 0a 20 20 20 20 63 61 73 65  TRIGGER.    case
15430 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20   TK_RAISE: {.   
15440 20 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e     if( !pParse->
15450 74 72 69 67 53 74 61 63 6b 20 29 7b 0a 20 20 20  trigStack ){.   
15460 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
15470 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
15480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15490 20 20 20 20 22 52 41 49 53 45 28 29 20 6d 61 79      "RAISE() may
154a0 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69   only be used wi
154b0 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70  thin a trigger-p
154c0 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20  rogram");.      
154d0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
154e0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
154f0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 4f 45  xpr->iColumn!=OE
15500 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20  _Ignore ){.     
15510 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
15520 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 4f 45 5f 52  r->iColumn==OE_R
15530 6f 6c 6c 62 61 63 6b 20 7c 7c 0a 20 20 20 20 20  ollback ||.     
15540 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
15550 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45  r->iColumn == OE
15560 5f 41 62 6f 72 74 20 7c 7c 0a 20 20 20 20 20 20  _Abort ||.      
15570 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
15580 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f  ->iColumn == OE_
15590 46 61 69 6c 20 29 3b 0a 20 20 20 20 20 20 20 20  Fail );.        
155a0 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 45   sqlite3DequoteE
155b0 78 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  xpr(pParse->db, 
155c0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
155d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
155e0 70 34 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53  p4(v, OP_Halt, S
155f0 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
15600 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
15610 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
15620 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
15630 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  ar*)pExpr->token
15640 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  .z, pExpr->token
15650 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73  .n);.      } els
15660 65 20 7b 0a 20 20 20 20 20 20 20 20 20 61 73 73  e {.         ass
15670 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ert( pExpr->iCol
15680 75 6d 6e 20 3d 3d 20 4f 45 5f 49 67 6e 6f 72 65  umn == OE_Ignore
15690 20 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71 6c   );.         sql
156a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
156b0 2c 20 4f 50 5f 43 6f 6e 74 65 78 74 50 6f 70 2c  , OP_ContextPop,
156c0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
156d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
156e0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
156f0 2c 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74  , pParse->trigSt
15700 61 63 6b 2d 3e 69 67 6e 6f 72 65 4a 75 6d 70 29  ack->ignoreJump)
15710 3b 0a 20 20 20 20 20 20 20 20 20 56 64 62 65 43  ;.         VdbeC
15720 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 61 69 73  omment((v, "rais
15730 65 28 49 47 4e 4f 52 45 29 22 29 29 3b 0a 20 20  e(IGNORE)"));.  
15740 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
15750 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
15760 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
15770 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
15780 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20  se, regFree1);. 
15790 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
157a0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
157b0 65 67 46 72 65 65 32 29 3b 0a 20 20 72 65 74 75  egFree2);.  retu
157c0 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a  rn inReg;.}../*.
157d0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
157e0 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20   to evaluate an 
157f0 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73  expression and s
15800 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
15810 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73  .** into a regis
15820 74 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ter.  Return the
15830 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
15840 20 77 68 65 72 65 20 74 68 65 20 72 65 73 75 6c   where the resul
15850 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64  ts.** are stored
15860 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ..**.** If the r
15870 65 67 69 73 74 65 72 20 69 73 20 61 20 74 65 6d  egister is a tem
15880 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
15890 74 68 61 74 20 63 61 6e 20 62 65 20 64 65 61 6c  that can be deal
158a0 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68 65 6e  located,.** then
158b0 20 77 72 69 74 65 20 69 74 73 20 6e 75 6d 62 65   write its numbe
158c0 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20 20 49  r into *pReg.  I
158d0 66 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 67  f the result reg
158e0 69 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20  ister is not.** 
158f0 61 20 74 65 6d 70 6f 72 61 72 79 2c 20 74 68 65  a temporary, the
15900 6e 20 73 65 74 20 2a 70 52 65 67 20 74 6f 20 7a  n set *pReg to z
15910 65 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ero..*/.int sqli
15920 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
15930 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
15940 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
15950 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74 20 72 31  *pReg){.  int r1
15960 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
15970 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
15980 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33  int r2 = sqlite3
15990 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
159a0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31  Parse, pExpr, r1
159b0 29 3b 0a 20 20 69 66 28 20 72 32 3d 3d 72 31 20  );.  if( r2==r1 
159c0 29 7b 0a 20 20 20 20 2a 70 52 65 67 20 3d 20 72  ){.    *pReg = r
159d0 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
159e0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
159f0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
15a00 29 3b 0a 20 20 20 20 2a 70 52 65 67 20 3d 20 30  );.    *pReg = 0
15a10 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
15a20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  2;.}../*.** Gene
15a30 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
15a40 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70  ill evaluate exp
15a50 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e  ression pExpr an
15a60 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72  d store the.** r
15a70 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74  esults in regist
15a80 65 72 20 74 61 72 67 65 74 2e 20 20 54 68 65 20  er target.  The 
15a90 72 65 73 75 6c 74 73 20 61 72 65 20 67 75 61 72  results are guar
15aa0 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61 72  anteed to appear
15ab0 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20  .** in register 
15ac0 74 61 72 67 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73  target..*/.int s
15ad0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 50  qlite3ExprCode(P
15ae0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
15af0 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
15b00 61 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e  arget){.  int in
15b10 52 65 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Reg;..  assert( 
15b20 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67  target>0 && targ
15b30 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  et<=pParse->nMem
15b40 20 29 3b 0a 20 20 69 6e 52 65 67 20 3d 20 73 71   );.  inReg = sq
15b50 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
15b60 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
15b70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 61 73  r, target);.  as
15b80 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56  sert( pParse->pV
15b90 64 62 65 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  dbe || pParse->d
15ba0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
15bb0 29 3b 0a 20 20 69 66 28 20 69 6e 52 65 67 21 3d  );.  if( inReg!=
15bc0 74 61 72 67 65 74 20 26 26 20 70 50 61 72 73 65  target && pParse
15bd0 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 73  ->pVdbe ){.    s
15be0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15bf0 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
15c00 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c  OP_SCopy, inReg,
15c10 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 0a 20 20   target);.  }.  
15c20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 7d  return target;.}
15c30 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
15c40 20 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75   code that evalu
15c50 74 65 73 20 74 68 65 20 67 69 76 65 6e 20 65 78  tes the given ex
15c60 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 75 74  pression and put
15c70 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  s the result.** 
15c80 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
15c90 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d  et..**.** Also m
15ca0 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
15cb0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 73  e expression res
15cc0 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65  ults into anothe
15cd0 72 20 22 63 61 63 68 65 22 20 72 65 67 69 73 74  r "cache" regist
15ce0 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79  er.** and modify
15cf0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
15d00 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  so that the next
15d10 20 74 69 6d 65 20 69 74 20 69 73 20 65 76 61 6c   time it is eval
15d20 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65  uated,.** the re
15d30 73 75 6c 74 20 69 73 20 61 20 63 6f 70 79 20 6f  sult is a copy o
15d40 66 20 74 68 65 20 63 61 63 68 65 20 72 65 67 69  f the cache regi
15d50 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ster..**.** This
15d60 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
15d70 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 73   for expressions
15d80 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20 6d   that are used m
15d90 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65  ultiple .** time
15da0 73 2e 20 20 54 68 65 79 20 61 72 65 20 65 76 61  s.  They are eva
15db0 6c 75 61 74 65 64 20 6f 6e 63 65 20 61 6e 64 20  luated once and 
15dc0 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
15dd0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  he expression.**
15de0 20 61 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a   are reused..*/.
15df0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
15e00 6f 64 65 41 6e 64 43 61 63 68 65 28 50 61 72 73  odeAndCache(Pars
15e10 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
15e20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
15e30 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  et){.  Vdbe *v =
15e40 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
15e50 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a 20 20 69    int inReg;.  i
15e60 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
15e70 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
15e80 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
15e90 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e   assert( target>
15ea0 30 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72  0 );.  if( pExpr
15eb0 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45  ->op!=TK_REGISTE
15ec0 52 20 29 7b 20 20 0a 20 20 20 20 69 6e 74 20 69  R ){  .    int i
15ed0 4d 65 6d 3b 0a 20 20 20 20 69 4d 65 6d 20 3d 20  Mem;.    iMem = 
15ee0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
15ef0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15f00 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp2(v, OP_Copy
15f10 2c 20 69 6e 52 65 67 2c 20 69 4d 65 6d 29 3b 0a  , inReg, iMem);.
15f20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
15f30 65 20 3d 20 69 4d 65 6d 3b 0a 20 20 20 20 70 45  e = iMem;.    pE
15f40 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70  xpr->iColumn = p
15f50 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 70 45  Expr->op;.    pE
15f60 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47  xpr->op = TK_REG
15f70 49 53 54 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ISTER;.  }.  ret
15f80 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a  urn inReg;.}../*
15f90 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
15fa0 69 66 20 70 45 78 70 72 20 69 73 20 61 6e 20 63  if pExpr is an c
15fb0 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69  onstant expressi
15fc0 6f 6e 20 74 68 61 74 20 69 73 20 61 70 70 72 6f  on that is appro
15fd0 70 72 69 61 74 65 0a 2a 2a 20 66 6f 72 20 66 61  priate.** for fa
15fe0 63 74 6f 72 69 6e 67 20 6f 75 74 20 6f 66 20 61  ctoring out of a
15ff0 20 6c 6f 6f 70 2e 20 20 41 70 70 72 6f 70 72 69   loop.  Appropri
16000 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ate expressions 
16010 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  are:.**.**    * 
16020 20 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   Any expression 
16030 74 68 61 74 20 65 76 61 6c 75 61 74 65 73 20 74  that evaluates t
16040 6f 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 70  o two or more op
16050 63 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  codes..**.**    
16060 2a 20 20 41 6e 79 20 4f 50 5f 49 6e 74 65 67 65  *  Any OP_Intege
16070 72 2c 20 4f 50 5f 52 65 61 6c 2c 20 4f 50 5f 53  r, OP_Real, OP_S
16080 74 72 69 6e 67 2c 20 4f 50 5f 42 6c 6f 62 2c 20  tring, OP_Blob, 
16090 4f 50 5f 4e 75 6c 6c 2c 20 0a 2a 2a 20 20 20 20  OP_Null, .**    
160a0 20 20 20 6f 72 20 4f 50 5f 56 61 72 69 61 62 6c     or OP_Variabl
160b0 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
160c0 6e 65 65 64 20 74 6f 20 62 65 20 70 6c 61 63 65  need to be place
160d0 64 20 69 6e 20 61 20 0a 2a 2a 20 20 20 20 20 20  d in a .**      
160e0 20 73 70 65 63 69 66 69 63 20 72 65 67 69 73 74   specific regist
160f0 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  er..**.** There 
16100 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 66  is no point in f
16110 61 63 74 6f 72 69 6e 67 20 6f 75 74 20 73 69 6e  actoring out sin
16120 67 6c 65 2d 69 6e 73 74 72 75 63 74 69 6f 6e 20  gle-instruction 
16130 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 65 78 70 72  constant.** expr
16140 65 73 73 69 6f 6e 73 20 74 68 61 74 20 6e 65 65  essions that nee
16150 64 20 74 6f 20 62 65 20 70 6c 61 63 65 64 20 69  d to be placed i
16160 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 72  n a particular r
16170 65 67 69 73 74 65 72 2e 20 20 0a 2a 2a 20 57 65  egister.  .** We
16180 20 63 6f 75 6c 64 20 66 61 63 74 6f 72 20 74 68   could factor th
16190 65 6d 20 6f 75 74 2c 20 62 75 74 20 74 68 65 6e  em out, but then
161a0 20 77 65 20 77 6f 75 6c 64 20 65 6e 64 20 75 70   we would end up
161b0 20 61 64 64 69 6e 67 20 61 6e 0a 2a 2a 20 4f 50   adding an.** OP
161c0 5f 53 43 6f 70 79 20 69 6e 73 74 72 75 63 74 69  _SCopy instructi
161d0 6f 6e 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 76  on to move the v
161e0 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 63 6f  alue into the co
161f0 72 72 65 63 74 20 72 65 67 69 73 74 65 72 0a 2a  rrect register.*
16200 2a 20 6c 61 74 65 72 2e 20 20 57 65 20 6d 69 67  * later.  We mig
16210 68 74 20 61 73 20 77 65 6c 6c 20 6a 75 73 74 20  ht as well just 
16220 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  use the original
16230 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64   instruction and
16240 0a 2a 2a 20 61 76 6f 69 64 20 74 68 65 20 4f 50  .** avoid the OP
16250 5f 53 43 6f 70 79 2e 0a 2a 2f 0a 73 74 61 74 69  _SCopy..*/.stati
16260 63 20 69 6e 74 20 69 73 41 70 70 72 6f 70 72 69  c int isAppropri
16270 61 74 65 46 6f 72 46 61 63 74 6f 72 69 6e 67 28  ateForFactoring(
16280 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
16290 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f  !sqlite3ExprIsCo
162a0 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 29  nstantNotJoin(p)
162b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
162c0 3b 20 20 2f 2a 20 4f 6e 6c 79 20 63 6f 6e 73 74  ;  /* Only const
162d0 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ant expressions 
162e0 61 72 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  are appropriate 
162f0 66 6f 72 20 66 61 63 74 6f 72 69 6e 67 20 2a 2f  for factoring */
16300 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 66  .  }.  if( (p->f
16310 6c 61 67 73 20 26 20 45 50 5f 46 69 78 65 64 44  lags & EP_FixedD
16320 65 73 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  est)==0 ){.    r
16330 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 41 6e 79  eturn 1;  /* Any
16340 20 63 6f 6e 73 74 61 6e 74 20 77 69 74 68 6f 75   constant withou
16350 74 20 61 20 66 69 78 65 64 20 64 65 73 74 69 6e  t a fixed destin
16360 61 74 69 6f 6e 20 69 73 20 61 70 70 72 6f 70 72  ation is appropr
16370 69 61 74 65 20 2a 2f 0a 20 20 7d 0a 20 20 77 68  iate */.  }.  wh
16380 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  ile( p->op==TK_U
16390 50 4c 55 53 20 29 20 70 20 3d 20 70 2d 3e 70 4c  PLUS ) p = p->pL
163a0 65 66 74 3b 0a 20 20 73 77 69 74 63 68 28 20 70  eft;.  switch( p
163b0 2d 3e 6f 70 20 29 7b 0a 23 69 66 6e 64 65 66 20  ->op ){.#ifndef 
163c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42  SQLITE_OMIT_BLOB
163d0 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73  _LITERAL.    cas
163e0 65 20 54 4b 5f 42 4c 4f 42 3a 0a 23 65 6e 64 69  e TK_BLOB:.#endi
163f0 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41  f.    case TK_VA
16400 52 49 41 42 4c 45 3a 0a 20 20 20 20 63 61 73 65  RIABLE:.    case
16410 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20   TK_INTEGER:.   
16420 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a   case TK_FLOAT:.
16430 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c      case TK_NULL
16440 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  :.    case TK_ST
16450 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 74 65  RING: {.      te
16460 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
16470 4b 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 20 20  K_BLOB );.      
16480 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
16490 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 3b 0a  =TK_VARIABLE );.
164a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
164b0 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45  p->op==TK_INTEGE
164c0 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  R );.      testc
164d0 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46  ase( p->op==TK_F
164e0 4c 4f 41 54 20 29 3b 0a 20 20 20 20 20 20 74 65  LOAT );.      te
164f0 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
16500 4b 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  K_NULL );.      
16510 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
16520 3d 54 4b 5f 53 54 52 49 4e 47 20 29 3b 0a 20 20  =TK_STRING );.  
16530 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 2d 69 6e      /* Single-in
16540 73 74 72 75 63 74 69 6f 6e 20 63 6f 6e 73 74 61  struction consta
16550 6e 74 73 20 77 69 74 68 20 61 20 66 69 78 65 64  nts with a fixed
16560 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 61 72 65   destination are
16570 0a 20 20 20 20 20 20 2a 2a 20 62 65 74 74 65 72  .      ** better
16580 20 64 6f 6e 65 20 69 6e 2d 6c 69 6e 65 2e 20 20   done in-line.  
16590 49 66 20 77 65 20 66 61 63 74 6f 72 20 74 68 65  If we factor the
165a0 6d 2c 20 74 68 65 79 20 77 69 6c 6c 20 6a 75 73  m, they will jus
165b0 74 20 65 6e 64 0a 20 20 20 20 20 20 2a 2a 20 75  t end.      ** u
165c0 70 20 67 65 6e 65 72 61 74 69 6e 67 20 61 6e 20  p generating an 
165d0 4f 50 5f 53 43 6f 70 79 20 74 6f 20 6d 6f 76 65  OP_SCopy to move
165e0 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 74 68   the value to th
165f0 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 20 20  e destination.  
16600 20 20 20 20 2a 2a 20 72 65 67 69 73 74 65 72 2e      ** register.
16610 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
16620 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   0;.    }.    ca
16630 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a  se TK_UMINUS: {.
16640 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4c         if( p->pL
16650 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41  eft->op==TK_FLOA
16660 54 20 7c 7c 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f  T || p->pLeft->o
16670 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b  p==TK_INTEGER ){
16680 0a 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  .         return
16690 20 30 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20   0;.       }.   
166a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
166b0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
166c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
166d0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
166e0 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70  1;.}../*.** If p
166f0 45 78 70 72 20 69 73 20 61 20 63 6f 6e 73 74 61  Expr is a consta
16700 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  nt expression th
16710 61 74 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  at is appropriat
16720 65 20 66 6f 72 0a 2a 2a 20 66 61 63 74 6f 72 69  e for.** factori
16730 6e 67 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70  ng out of a loop
16740 2c 20 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20  , then evaluate 
16750 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  the expression.*
16760 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65  * into a registe
16770 72 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 68  r and convert th
16780 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 74  e expression int
16790 6f 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52 0a  o a TK_REGISTER.
167a0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  ** expression..*
167b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 76 61  /.static int eva
167c0 6c 43 6f 6e 73 74 45 78 70 72 28 76 6f 69 64 20  lConstExpr(void 
167d0 2a 70 41 72 67 2c 20 45 78 70 72 20 2a 70 45 78  *pArg, Expr *pEx
167e0 70 72 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  pr){.  Parse *pP
167f0 61 72 73 65 20 3d 20 28 50 61 72 73 65 2a 29 70  arse = (Parse*)p
16800 41 72 67 3b 0a 20 20 73 77 69 74 63 68 28 20 70  Arg;.  switch( p
16810 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
16820 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52  case TK_REGISTER
16830 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
16840 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   1;.    }.    ca
16850 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a  se TK_FUNCTION:.
16860 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
16870 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61  FUNCTION:.    ca
16880 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43  se TK_CONST_FUNC
16890 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  : {.      /* The
168a0 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 20   arguments to a 
168b0 66 75 6e 63 74 69 6f 6e 20 68 61 76 65 20 61 20  function have a 
168c0 66 69 78 65 64 20 64 65 73 74 69 6e 61 74 69 6f  fixed destinatio
168d0 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 4d 61 72 6b  n..      ** Mark
168e0 20 74 68 65 6d 20 74 68 69 73 20 77 61 79 20 74   them this way t
168f0 6f 20 61 76 6f 69 64 20 67 65 6e 65 72 61 74 65  o avoid generate
16900 64 20 75 6e 6e 65 65 64 65 64 20 4f 50 5f 53 43  d unneeded OP_SC
16910 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20 69 6e 73  opy.      ** ins
16920 74 72 75 63 74 69 6f 6e 73 2e 20 0a 20 20 20 20  tructions. .    
16930 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c    */.      ExprL
16940 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
16950 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20  pr->pList;.     
16960 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
16970 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 70 4c        int i = pL
16980 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
16990 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
169a0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
169b0 3d 20 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20  = pList->a;.    
169c0 20 20 20 20 66 6f 72 28 3b 20 69 3e 30 3b 20 69      for(; i>0; i
169d0 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
169e0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
169f0 6d 2d 3e 70 45 78 70 72 20 29 20 70 49 74 65 6d  m->pExpr ) pItem
16a00 2d 3e 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 7c  ->pExpr->flags |
16a10 3d 20 45 50 5f 46 69 78 65 64 44 65 73 74 3b 0a  = EP_FixedDest;.
16a20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16a30 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
16a40 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69     }.  }.  if( i
16a50 73 41 70 70 72 6f 70 72 69 61 74 65 46 6f 72 46  sAppropriateForF
16a60 61 63 74 6f 72 69 6e 67 28 70 45 78 70 72 29 20  actoring(pExpr) 
16a70 29 7b 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20  ){.    int r1 = 
16a80 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
16a90 20 20 20 20 69 6e 74 20 72 32 3b 0a 20 20 20 20      int r2;.    
16aa0 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
16ab0 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
16ac0 65 2c 20 70 45 78 70 72 2c 20 72 31 29 3b 0a 20  e, pExpr, r1);. 
16ad0 20 20 20 69 66 28 20 72 31 21 3d 72 32 20 29 20     if( r1!=r2 ) 
16ae0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
16af0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
16b00 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 43  );.    pExpr->iC
16b10 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 6f  olumn = pExpr->o
16b20 70 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  p;.    pExpr->op
16b30 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a   = TK_REGISTER;.
16b40 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
16b50 65 20 3d 20 72 32 3b 0a 20 20 20 20 72 65 74 75  e = r2;.    retu
16b60 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
16b70 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  rn 0;.}../*.** P
16b80 72 65 65 76 61 6c 75 61 74 65 20 63 6f 6e 73 74  reevaluate const
16b90 61 6e 74 20 73 75 62 65 78 70 72 65 73 73 69 6f  ant subexpressio
16ba0 6e 73 20 77 69 74 68 69 6e 20 70 45 78 70 72 20  ns within pExpr 
16bb0 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a  and store the.**
16bc0 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69   results in regi
16bd0 73 74 65 72 73 2e 20 20 4d 6f 64 69 66 79 20 70  sters.  Modify p
16be0 45 78 70 72 20 73 6f 20 74 68 61 74 20 74 68 65  Expr so that the
16bf0 20 63 6f 6e 73 74 61 6e 74 20 73 75 62 65 78 70   constant subexp
16c00 72 65 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 54  resions.** are T
16c10 4b 5f 52 45 47 49 53 54 45 52 20 6f 70 63 6f 64  K_REGISTER opcod
16c20 65 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f  es that refer to
16c30 20 74 68 65 20 70 72 65 63 6f 6d 70 75 74 65 64   the precomputed
16c40 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 76 6f 69 64   values..*/.void
16c50 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
16c60 43 6f 6e 73 74 61 6e 74 73 28 50 61 72 73 65 20  Constants(Parse 
16c70 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
16c80 45 78 70 72 29 7b 0a 20 20 20 77 61 6c 6b 45 78  Expr){.   walkEx
16c90 70 72 54 72 65 65 28 70 45 78 70 72 2c 20 65 76  prTree(pExpr, ev
16ca0 61 6c 43 6f 6e 73 74 45 78 70 72 2c 20 70 50 61  alConstExpr, pPa
16cb0 72 73 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rse);.}.../*.** 
16cc0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
16cd0 61 74 20 70 75 73 68 65 73 20 74 68 65 20 76 61  at pushes the va
16ce0 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65  lue of every ele
16cf0 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65  ment of the give
16d00 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
16d10 6c 69 73 74 20 69 6e 74 6f 20 61 20 73 65 71 75  list into a sequ
16d20 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72  ence of register
16d30 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 74  s beginning at t
16d40 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  arget..**.** Ret
16d50 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
16d60 66 20 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75  f elements evalu
16d70 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ated..*/.int sql
16d80 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
16d90 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
16da0 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61  Parse,     /* Pa
16db0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
16dc0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
16dd0 73 74 2c 20 20 20 2f 2a 20 54 68 65 20 65 78 70  st,   /* The exp
16de0 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20  ression list to 
16df0 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  be coded */.  in
16e00 74 20 74 61 72 67 65 74 2c 20 20 20 20 20 20 20  t target,       
16e10 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69   /* Where to wri
16e20 74 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  te results */.  
16e30 69 6e 74 20 64 6f 48 61 72 64 43 6f 70 79 20 20  int doHardCopy  
16e40 20 20 20 2f 2a 20 43 61 6c 6c 20 73 71 6c 69 74     /* Call sqlit
16e50 65 33 45 78 70 72 48 61 72 64 43 6f 70 79 20 6f  e3ExprHardCopy o
16e60 6e 20 65 61 63 68 20 65 6c 65 6d 65 6e 74 20 69  n each element i
16e70 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 73  f true */.){.  s
16e80 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
16e90 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e  tem *pItem;.  in
16ea0 74 20 69 2c 20 6e 3b 0a 20 20 61 73 73 65 72 74  t i, n;.  assert
16eb0 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50  ( pList!=0 || pP
16ec0 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
16ed0 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
16ee0 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
16ef0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
16f00 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30  assert( target>0
16f10 20 29 3b 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d   );.  n = pList-
16f20 3e 6e 45 78 70 72 3b 0a 20 20 66 6f 72 28 70 49  >nExpr;.  for(pI
16f30 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d  tem=pList->a, i=
16f40 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74  0; i<n; i++, pIt
16f50 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  em++){.    sqlit
16f60 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
16f70 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c  e, pItem->pExpr,
16f80 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20   target+i);.    
16f90 69 66 28 20 64 6f 48 61 72 64 43 6f 70 79 20 29  if( doHardCopy )
16fa0 20 73 71 6c 69 74 65 33 45 78 70 72 48 61 72 64   sqlite3ExprHard
16fb0 43 6f 70 79 28 70 50 61 72 73 65 2c 20 74 61 72  Copy(pParse, tar
16fc0 67 65 74 2c 20 6e 29 3b 0a 20 20 7d 0a 20 20 72  get, n);.  }.  r
16fd0 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
16fe0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
16ff0 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78  for a boolean ex
17000 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68  pression such th
17010 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  at a jump is mad
17020 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65  e.** to the labe
17030 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20  l "dest" if the 
17040 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72  expression is tr
17050 75 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e  ue but execution
17060 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74  .** continues st
17070 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74  raight thru if t
17080 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
17090 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   false..**.** If
170a0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
170b0 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c  evaluates to NUL
170c0 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20  L (neither true 
170d0 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68 65 6e  nor false), then
170e0 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d  .** take the jum
170f0 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49 66 4e  p if the jumpIfN
17100 75 6c 6c 20 66 6c 61 67 20 69 73 20 53 51 4c 49  ull flag is SQLI
17110 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a  TE_JUMPIFNULL..*
17120 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64  *.** This code d
17130 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61  epends on the fa
17140 63 74 20 74 68 61 74 20 63 65 72 74 61 69 6e 20  ct that certain 
17150 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78  token values (ex
17160 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20  : TK_EQ).** are 
17170 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f  the same as opco
17180 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f  de values (ex: O
17190 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65  P_Eq) that imple
171a0 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70  ment the corresp
171b0 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74  onding.** operat
171c0 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f  ion.  Special co
171d0 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63  mments in vdbe.c
171e0 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64   and the mkopcod
171f0 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e  eh.awk script in
17200 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f  .** the make pro
17210 63 65 73 73 20 63 61 75 73 65 20 74 68 65 73 65  cess cause these
17220 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e   values to align
17230 2e 20 20 41 73 73 65 72 74 28 29 73 20 69 6e 20  .  Assert()s in 
17240 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f  the code.** belo
17250 77 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  w verify that th
17260 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c  e numbers are al
17270 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e  igned correctly.
17280 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
17290 45 78 70 72 49 66 54 72 75 65 28 50 61 72 73 65  ExprIfTrue(Parse
172a0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
172b0 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c  pExpr, int dest,
172c0 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
172d0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
172e0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
172f0 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74  nt op = 0;.  int
17300 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20   regFree1 = 0;. 
17310 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20   int regFree2 = 
17320 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b  0;.  int r1, r2;
17330 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70  ..  assert( jump
17340 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a  IfNull==SQLITE_J
17350 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d  UMPIFNULL || jum
17360 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
17370 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70  if( v==0 || pExp
17380 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
17390 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
173a0 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
173b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
173c0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32  : {.      int d2
173d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
173e0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
173f0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
17400 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
17410 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61     testcase( pPa
17420 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43  rse->disableColC
17430 61 63 68 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ache==0 );.     
17440 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
17450 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
17460 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 6a 75 6d  r->pLeft, d2,jum
17470 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a  pIfNull^SQLITE_J
17480 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
17490 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c    pParse->disabl
174a0 65 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20 20 20  eColCache++;.   
174b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
174c0 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
174d0 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
174e0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
174f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
17500 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43  rse->disableColC
17510 61 63 68 65 3e 30 20 29 3b 0a 20 20 20 20 20 20  ache>0 );.      
17520 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43  pParse->disableC
17530 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20 20 20 20 20  olCache--;.     
17540 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
17550 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b  lveLabel(v, d2);
17560 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
17570 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
17580 4f 52 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  OR: {.      test
17590 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
175a0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
175b0 74 63 61 73 65 28 20 70 50 61 72 73 65 2d 3e 64  tcase( pParse->d
175c0 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 3d 3d  isableColCache==
175d0 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
175e0 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
175f0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
17600 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
17610 75 6c 6c 29 3b 0a 20 20 20 20 20 20 70 50 61 72  ull);.      pPar
17620 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61  se->disableColCa
17630 63 68 65 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  che++;.      sql
17640 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
17650 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
17660 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
17670 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61  IfNull);.      a
17680 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
17690 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 3e 30  isableColCache>0
176a0 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65   );.      pParse
176b0 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68  ->disableColCach
176c0 65 2d 2d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  e--;.      break
176d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
176e0 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_NOT: {.     
176f0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
17700 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
17710 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
17720 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
17730 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
17740 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
17750 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
17760 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
17770 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
17780 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
17790 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
177a0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
177b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
177c0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
177d0 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b   TK_LT==OP_Lt );
177e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
177f0 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20  K_LE==OP_Le );. 
17800 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
17810 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20  GT==OP_Gt );.   
17820 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45     assert( TK_GE
17830 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20 20  ==OP_Ge );.     
17840 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d   assert( TK_EQ==
17850 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 61  OP_Eq );.      a
17860 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50  ssert( TK_NE==OP
17870 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _Ne );.      tes
17880 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54  tcase( op==TK_LT
17890 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
178a0 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b  se( op==TK_LE );
178b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
178c0 20 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20   op==TK_GT );.  
178d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
178e0 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20  ==TK_GE );.     
178f0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
17900 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 74 65  K_EQ );.      te
17910 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
17920 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  E );.      testc
17930 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
17940 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  =0 );.      code
17950 43 6f 6d 70 61 72 65 4f 70 65 72 61 6e 64 73 28  CompareOperands(
17960 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
17970 4c 65 66 74 2c 20 26 72 31 2c 20 26 72 65 67 46  Left, &r1, &regF
17980 72 65 65 31 2c 0a 20 20 20 20 20 20 20 20 20 20  ree1,.          
17990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179a0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
179b0 52 69 67 68 74 2c 20 26 72 32 2c 20 26 72 65 67  Right, &r2, &reg
179c0 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f  Free2);.      co
179d0 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
179e0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
179f0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
17a00 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
17a10 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73       r1, r2, des
17a20 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
17a30 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17a40 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
17a50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
17a60 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
17a70 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
17a80 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
17a90 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
17aa0 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
17ab0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e    assert( TK_ISN
17ac0 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29  ULL==OP_IsNull )
17ad0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
17ae0 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e  TK_NOTNULL==OP_N
17af0 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20  otNull );.      
17b00 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
17b10 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  _ISNULL );.     
17b20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
17b30 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20  K_NOTNULL );.   
17b40 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
17b50 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
17b60 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
17b70 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
17b80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17b90 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c  ddOp2(v, op, r1,
17ba0 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65   dest);.      te
17bb0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
17bc0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
17bd0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
17be0 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
17bf0 0a 20 20 20 20 20 20 2f 2a 20 20 20 20 78 20 42  .      /*    x B
17c00 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20  ETWEEN y AND z. 
17c10 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
17c20 20 49 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   Is equivalent t
17c30 6f 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  o .      **.    
17c40 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44    **    x>=y AND
17c50 20 78 3c 3d 7a 0a 20 20 20 20 20 20 2a 2a 0a 20   x<=z.      **. 
17c60 20 20 20 20 20 2a 2a 20 43 6f 64 65 20 69 74 20       ** Code it 
17c70 61 73 20 73 75 63 68 2c 20 74 61 6b 69 6e 67 20  as such, taking 
17c80 63 61 72 65 20 74 6f 20 64 6f 20 74 68 65 20 63  care to do the c
17c90 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65 73 73  ommon subexpress
17ca0 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65  ion.      ** ele
17cb0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 78 2e 0a  mentation of x..
17cc0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45        */.      E
17cd0 78 70 72 20 65 78 70 72 41 6e 64 3b 0a 20 20 20  xpr exprAnd;.   
17ce0 20 20 20 45 78 70 72 20 63 6f 6d 70 4c 65 66 74     Expr compLeft
17cf0 3b 0a 20 20 20 20 20 20 45 78 70 72 20 63 6f 6d  ;.      Expr com
17d00 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 45 78  pRight;.      Ex
17d10 70 72 20 65 78 70 72 58 3b 0a 0a 20 20 20 20 20  pr exprX;..     
17d20 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70 72 2d   exprX = *pExpr-
17d30 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 65 78  >pLeft;.      ex
17d40 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e  prAnd.op = TK_AN
17d50 44 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e 64  D;.      exprAnd
17d60 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65  .pLeft = &compLe
17d70 66 74 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e  ft;.      exprAn
17d80 64 2e 70 52 69 67 68 74 20 3d 20 26 63 6f 6d 70  d.pRight = &comp
17d90 52 69 67 68 74 3b 0a 20 20 20 20 20 20 63 6f 6d  Right;.      com
17da0 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45  pLeft.op = TK_GE
17db0 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65 66 74  ;.      compLeft
17dc0 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b  .pLeft = &exprX;
17dd0 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e  .      compLeft.
17de0 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
17df0 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
17e00 72 3b 0a 20 20 20 20 20 20 63 6f 6d 70 52 69 67  r;.      compRig
17e10 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20  ht.op = TK_LE;. 
17e20 20 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e 70       compRight.p
17e30 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20  Left = &exprX;. 
17e40 20 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e 70       compRight.p
17e50 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70  Right = pExpr->p
17e60 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
17e70 3b 0a 20 20 20 20 20 20 65 78 70 72 58 2e 69 54  ;.      exprX.iT
17e80 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 45 78  able = sqlite3Ex
17e90 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
17ea0 65 2c 20 26 65 78 70 72 58 2c 20 26 72 65 67 46  e, &exprX, &regF
17eb0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73  ree1);.      tes
17ec0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
17ed0 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72  =0 );.      expr
17ee0 58 2e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54  X.op = TK_REGIST
17ef0 45 52 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  ER;.      testca
17f00 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
17f10 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
17f20 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
17f30 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64  rse, &exprAnd, d
17f40 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
17f50 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
17f60 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
17f70 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  : {.      r1 = s
17f80 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
17f90 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
17fa0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
17fb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17fc0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp3(v, OP_If, 
17fd0 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  r1, dest, jumpIf
17fe0 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20  Null!=0);.      
17ff0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
18000 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
18010 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
18020 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
18030 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
18040 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
18050 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
18060 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71   regFree1);.  sq
18070 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
18080 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
18090 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a  ree2);  .}../*.*
180a0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
180b0 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78  for a boolean ex
180c0 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68  pression such th
180d0 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  at a jump is mad
180e0 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65  e.** to the labe
180f0 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20  l "dest" if the 
18100 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61  expression is fa
18110 6c 73 65 20 62 75 74 20 65 78 65 63 75 74 69 6f  lse but executio
18120 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73  n.** continues s
18130 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20  traight thru if 
18140 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
18150 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s true..**.** If
18160 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
18170 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c  evaluates to NUL
18180 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20  L (neither true 
18190 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a  nor false) then.
181a0 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49  ** jump if jumpI
181b0 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f  fNull is SQLITE_
181c0 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61  JUMPIFNULL or fa
181d0 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75  ll through if ju
181e0 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30  mpIfNull.** is 0
181f0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
18200 33 45 78 70 72 49 66 46 61 6c 73 65 28 50 61 72  3ExprIfFalse(Par
18210 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
18220 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73   *pExpr, int des
18230 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  t, int jumpIfNul
18240 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  l){.  Vdbe *v = 
18250 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
18260 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69   int op = 0;.  i
18270 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
18280 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20  .  int regFree2 
18290 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72  = 0;.  int r1, r
182a0 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75  2;..  assert( ju
182b0 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
182c0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a  _JUMPIFNULL || j
182d0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
182e0 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45    if( v==0 || pE
182f0 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
18300 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65  ..  /* The value
18310 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e   of pExpr->op an
18320 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65 64  d op are related
18330 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a   as follows:.  *
18340 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45 78  *.  **       pEx
18350 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20  pr->op          
18360 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20 20    op.  **       
18370 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20  ---------       
18380 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20     ----------.  
18390 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e 55  **       TK_ISNU
183a0 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e  LL          OP_N
183b0 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  otNull.  **     
183c0 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20    TK_NOTNULL    
183d0 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20       OP_IsNull. 
183e0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45 20   **       TK_NE 
183f0 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
18400 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Eq.  **       TK
18410 5f 45 51 20 20 20 20 20 20 20 20 20 20 20 20 20  _EQ             
18420 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20   OP_Ne.  **     
18430 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20 20    TK_GT         
18440 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20       OP_Le.  ** 
18450 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20 20        TK_LE     
18460 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a 20           OP_Gt. 
18470 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45 20   **       TK_GE 
18480 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
18490 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Lt.  **       TK
184a0 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20  _LT             
184b0 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a   OP_Ge.  **.  **
184c0 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75 65   For other value
184d0 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20  s of pExpr->op, 
184e0 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  op is undefined 
184f0 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a  and unused..  **
18500 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54 4b   The value of TK
18510 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61  _ and OP_ consta
18520 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67 65 64  nts are arranged
18530 20 73 75 63 68 20 74 68 61 74 20 77 65 0a 20 20   such that we.  
18540 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  ** can compute t
18550 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76 65  he mapping above
18560 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f   using the follo
18570 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 2e  wing expression.
18580 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73 20  .  ** Assert()s 
18590 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
185a0 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 63  computation is c
185b0 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f  orrect..  */.  o
185c0 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b  p = ((pExpr->op+
185d0 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31  (TK_ISNULL&1))^1
185e0 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b  )-(TK_ISNULL&1);
185f0 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63 6f  ..  /* Verify co
18600 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20  rrect alignment 
18610 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63  of TK_ and OP_ c
18620 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20  onstants.  */.  
18630 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
18640 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20  p!=TK_ISNULL || 
18650 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  op==OP_NotNull )
18660 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
18670 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c  r->op!=TK_NOTNUL
18680 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75  L || op==OP_IsNu
18690 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
186a0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45  pExpr->op!=TK_NE
186b0 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b   || op==OP_Eq );
186c0 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
186d0 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f  ->op!=TK_EQ || o
186e0 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73  p==OP_Ne );.  as
186f0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
18700 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_LT || op==OP
18710 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Ge );.  assert(
18720 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c   pExpr->op!=TK_L
18730 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29  E || op==OP_Gt )
18740 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
18750 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20  r->op!=TK_GT || 
18760 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61  op==OP_Le );.  a
18770 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
18780 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_GE || op==O
18790 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74 63  P_Lt );..  switc
187a0 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
187b0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
187c0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
187d0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
187e0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
187f0 73 65 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61  se( pParse->disa
18800 62 6c 65 43 6f 6c 43 61 63 68 65 3d 3d 30 20 29  bleColCache==0 )
18810 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
18820 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
18830 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
18840 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
18850 6c 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  l);.      pParse
18860 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68  ->disableColCach
18870 65 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e++;.      sqlit
18880 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
18890 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
188a0 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
188b0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73  fNull);.      as
188c0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 69  sert( pParse->di
188d0 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 3e 30 20  sableColCache>0 
188e0 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
188f0 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65  >disableColCache
18900 2d 2d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  --;.      break;
18910 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
18920 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69  TK_OR: {.      i
18930 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56  nt d2 = sqlite3V
18940 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
18950 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
18960 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
18970 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
18980 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c  ( pParse->disabl
18990 65 43 6f 6c 43 61 63 68 65 3d 3d 30 20 29 3b 0a  eColCache==0 );.
189a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
189b0 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
189c0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32  pExpr->pLeft, d2
189d0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c  , jumpIfNull^SQL
189e0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
189f0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  .      pParse->d
18a00 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b  isableColCache++
18a10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
18a20 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
18a30 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
18a40 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
18a50 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ll);.      asser
18a60 74 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62  t( pParse->disab
18a70 6c 65 43 6f 6c 43 61 63 68 65 3e 30 20 29 3b 0a  leColCache>0 );.
18a80 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69        pParse->di
18a90 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d 2d 3b  sableColCache--;
18aa0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
18ab0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
18ac0 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65  , d2);.      bre
18ad0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
18ae0 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
18af0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
18b00 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
18b10 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
18b20 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
18b30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
18b40 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
18b50 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
18b60 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
18b70 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
18b80 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
18b90 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
18ba0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
18bb0 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a  e( op==TK_LT );.
18bc0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
18bd0 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20  op==TK_LE );.   
18be0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
18bf0 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20  =TK_GT );.      
18c00 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
18c10 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _GE );.      tes
18c20 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51  tcase( op==TK_EQ
18c30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
18c40 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b  se( op==TK_NE );
18c50 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
18c60 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
18c70 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
18c80 61 72 65 4f 70 65 72 61 6e 64 73 28 70 50 61 72  areOperands(pPar
18c90 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
18ca0 2c 20 26 72 31 2c 20 26 72 65 67 46 72 65 65 31  , &r1, &regFree1
18cb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
18cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cd0 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
18ce0 74 2c 20 26 72 32 2c 20 26 72 65 67 46 72 65 65  t, &r2, &regFree
18cf0 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  2);.      codeCo
18d00 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
18d10 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
18d20 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20  r->pRight, op,. 
18d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d40 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a   r1, r2, dest, j
18d50 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
18d60 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
18d70 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
18d80 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
18d90 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
18da0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
18db0 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
18dc0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
18dd0 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 74 65  NULL: {.      te
18de0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
18df0 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74  SNULL );.      t
18e00 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
18e10 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  NOTNULL );.     
18e20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
18e30 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
18e40 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
18e50 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
18e60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18e70 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64  Op2(v, op, r1, d
18e80 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  est);.      test
18e90 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
18ea0 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
18eb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
18ec0 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
18ed0 20 20 20 20 20 2f 2a 20 20 20 20 78 20 42 45 54       /*    x BET
18ee0 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20  WEEN y AND z.   
18ef0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
18f00 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
18f10 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
18f20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78  **    x>=y AND x
18f30 3c 3d 7a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  <=z.      **.   
18f40 20 20 20 2a 2a 20 43 6f 64 65 20 69 74 20 61 73     ** Code it as
18f50 20 73 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61   such, taking ca
18f60 72 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d  re to do the com
18f70 6d 6f 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f  mon subexpressio
18f80 6e 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65  n.      ** eleme
18f90 6e 74 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 20 20  ntation of x..  
18fa0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70      */.      Exp
18fb0 72 20 65 78 70 72 41 6e 64 3b 0a 20 20 20 20 20  r exprAnd;.     
18fc0 20 45 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b 0a   Expr compLeft;.
18fd0 20 20 20 20 20 20 45 78 70 72 20 63 6f 6d 70 52        Expr compR
18fe0 69 67 68 74 3b 0a 20 20 20 20 20 20 45 78 70 72  ight;.      Expr
18ff0 20 65 78 70 72 58 3b 0a 0a 20 20 20 20 20 20 65   exprX;..      e
19000 78 70 72 58 20 3d 20 2a 70 45 78 70 72 2d 3e 70  xprX = *pExpr->p
19010 4c 65 66 74 3b 0a 20 20 20 20 20 20 65 78 70 72  Left;.      expr
19020 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b  And.op = TK_AND;
19030 0a 20 20 20 20 20 20 65 78 70 72 41 6e 64 2e 70  .      exprAnd.p
19040 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74  Left = &compLeft
19050 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e 64 2e  ;.      exprAnd.
19060 70 52 69 67 68 74 20 3d 20 26 63 6f 6d 70 52 69  pRight = &compRi
19070 67 68 74 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c  ght;.      compL
19080 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a  eft.op = TK_GE;.
19090 20 20 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 70        compLeft.p
190a0 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20  Left = &exprX;. 
190b0 20 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52       compLeft.pR
190c0 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  ight = pExpr->pL
190d0 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
190e0 0a 20 20 20 20 20 20 63 6f 6d 70 52 69 67 68 74  .      compRight
190f0 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 20  .op = TK_LE;.   
19100 20 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65     compRight.pLe
19110 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 20  ft = &exprX;.   
19120 20 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52 69     compRight.pRi
19130 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  ght = pExpr->pLi
19140 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a  st->a[1].pExpr;.
19150 20 20 20 20 20 20 65 78 70 72 58 2e 69 54 61 62        exprX.iTab
19160 6c 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  le = sqlite3Expr
19170 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
19180 20 26 65 78 70 72 58 2c 20 26 72 65 67 46 72 65   &exprX, &regFre
19190 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e1);.      testc
191a0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
191b0 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 58 2e   );.      exprX.
191c0 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52  op = TK_REGISTER
191d0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
191e0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
191f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19200 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
19210 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65  se, &exprAnd, de
19220 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
19230 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
19240 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
19250 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71   {.      r1 = sq
19260 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
19270 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  p(pParse, pExpr,
19280 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
19290 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
192a0 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp3(v, OP_IfNot
192b0 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r1, dest, jump
192c0 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20  IfNull!=0);.    
192d0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
192e0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
192f0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
19300 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
19310 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
19320 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
19330 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
19340 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20  e, regFree1);.  
19350 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
19360 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
19370 67 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  gFree2);.}../*.*
19380 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d 70  * Do a deep comp
19390 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78  arison of two ex
193a0 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e 20  pression trees. 
193b0 20 52 65 74 75 72 6e 20 54 52 55 45 20 28 6e 6f   Return TRUE (no
193c0 6e 2d 7a 65 72 6f 29 0a 2a 2a 20 69 66 20 74 68  n-zero).** if th
193d0 65 79 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c  ey are identical
193e0 20 61 6e 64 20 72 65 74 75 72 6e 20 46 41 4c 53   and return FALS
193f0 45 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72  E if they differ
19400 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a   in any way..**.
19410 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 69  ** Sometimes thi
19420 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
19430 65 74 75 72 6e 20 46 41 4c 53 45 20 65 76 65 6e  eturn FALSE even
19440 20 69 66 20 74 68 65 20 74 77 6f 20 65 78 70 72   if the two expr
19450 65 73 73 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c  essions.** reall
19460 79 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74  y are equivalent
19470 2e 20 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20  .  If we cannot 
19480 70 72 6f 76 65 20 74 68 61 74 20 74 68 65 20 65  prove that the e
19490 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a  xpressions are.*
194a0 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 77 65 20  * identical, we 
194b0 72 65 74 75 72 6e 20 46 41 4c 53 45 20 6a 75 73  return FALSE jus
194c0 74 20 74 6f 20 62 65 20 73 61 66 65 2e 20 20 53  t to be safe.  S
194d0 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  o if this routin
194e0 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 66 61 6c  e.** returns fal
194f0 73 65 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20  se, then you do 
19500 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20  not really know 
19510 66 6f 72 20 63 65 72 74 61 69 6e 20 69 66 20 74  for certain if t
19520 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73  he two.** expres
19530 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61  sions are the sa
19540 6d 65 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20  me.  But if you 
19550 67 65 74 20 61 20 54 52 55 45 20 72 65 74 75 72  get a TRUE retur
19560 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63  n, then you.** c
19570 61 6e 20 62 65 20 73 75 72 65 20 74 68 65 20 65  an be sure the e
19580 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74  xpressions are t
19590 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74 68 65  he same.  In the
195a0 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a 2a 2a   places where.**
195b0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
195c0 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73 20 6e   used, it does n
195d0 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74 20 61  ot hurt to get a
195e0 6e 20 65 78 74 72 61 20 46 41 4c 53 45 20 2d 20  n extra FALSE - 
195f0 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67  that.** just mig
19600 68 74 20 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d  ht result in som
19610 65 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65  e slightly slowe
19620 72 20 63 6f 64 65 2e 20 20 42 75 74 20 72 65 74  r code.  But ret
19630 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63  urning.** an inc
19640 6f 72 72 65 63 74 20 54 52 55 45 20 63 6f 75 6c  orrect TRUE coul
19650 64 20 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66  d lead to a malf
19660 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  unction..*/.int 
19670 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
19680 72 65 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70  re(Expr *pA, Exp
19690 72 20 2a 70 42 29 7b 0a 20 20 69 6e 74 20 69 3b  r *pB){.  int i;
196a0 0a 20 20 69 66 28 20 70 41 3d 3d 30 7c 7c 70 42  .  if( pA==0||pB
196b0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
196c0 6e 20 70 42 3d 3d 70 41 3b 0a 20 20 7d 0a 20 20  n pB==pA;.  }.  
196d0 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e  if( pA->op!=pB->
196e0 6f 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  op ) return 0;. 
196f0 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20   if( (pA->flags 
19700 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 21 3d  & EP_Distinct)!=
19710 28 70 42 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  (pB->flags & EP_
19720 44 69 73 74 69 6e 63 74 29 20 29 20 72 65 74 75  Distinct) ) retu
19730 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c  rn 0;.  if( !sql
19740 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
19750 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70  pA->pLeft, pB->p
19760 4c 65 66 74 29 20 29 20 72 65 74 75 72 6e 20 30  Left) ) return 0
19770 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
19780 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e  ExprCompare(pA->
19790 70 52 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67  pRight, pB->pRig
197a0 68 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ht) ) return 0;.
197b0 20 20 69 66 28 20 70 41 2d 3e 70 4c 69 73 74 20    if( pA->pList 
197c0 29 7b 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 70  ){.    if( pB->p
197d0 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
197e0 20 30 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e   0;.    if( pA->
197f0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 42  pList->nExpr!=pB
19800 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  ->pList->nExpr )
19810 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 66   return 0;.    f
19820 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 70 4c  or(i=0; i<pA->pL
19830 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
19840 7b 0a 20 20 20 20 20 20 69 66 28 20 21 73 71 6c  {.      if( !sql
19850 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
19860 70 41 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  pA->pList->a[i].
19870 70 45 78 70 72 2c 20 70 42 2d 3e 70 4c 69 73 74  pExpr, pB->pList
19880 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b  ->a[i].pExpr) ){
19890 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
198a0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
198b0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 2d  .  }else if( pB-
198c0 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 72 65  >pList ){.    re
198d0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
198e0 28 20 70 41 2d 3e 70 53 65 6c 65 63 74 20 7c 7c  ( pA->pSelect ||
198f0 20 70 42 2d 3e 70 53 65 6c 65 63 74 20 29 20 72   pB->pSelect ) r
19900 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
19910 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69  A->iTable!=pB->i
19920 54 61 62 6c 65 20 7c 7c 20 70 41 2d 3e 69 43 6f  Table || pA->iCo
19930 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d  lumn!=pB->iColum
19940 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  n ) return 0;.  
19950 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43  if( pA->op!=TK_C
19960 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 74 6f 6b  OLUMN && pA->tok
19970 65 6e 2e 7a 20 29 7b 0a 20 20 20 20 69 66 28 20  en.z ){.    if( 
19980 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29  pB->token.z==0 )
19990 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69   return 0;.    i
199a0 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d  f( pB->token.n!=
199b0 70 41 2d 3e 74 6f 6b 65 6e 2e 6e 20 29 20 72 65  pA->token.n ) re
199c0 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20  turn 0;.    if( 
199d0 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
199e0 28 63 68 61 72 2a 29 70 41 2d 3e 74 6f 6b 65 6e  (char*)pA->token
199f0 2e 7a 2c 28 63 68 61 72 2a 29 70 42 2d 3e 74 6f  .z,(char*)pB->to
19a00 6b 65 6e 2e 7a 2c 70 42 2d 3e 74 6f 6b 65 6e 2e  ken.z,pB->token.
19a10 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  n)!=0 ){.      r
19a20 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
19a30 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
19a40 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  .../*.** Add a n
19a50 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
19a60 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  e pAggInfo->aCol
19a70 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72  [] array.  Retur
19a80 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a  n the index of.*
19a90 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e  * the new elemen
19aa0 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67  t.  Return a neg
19ab0 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20  ative number if 
19ac0 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f  malloc fails..*/
19ad0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41  .static int addA
19ae0 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c  ggInfoColumn(sql
19af0 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66  ite3 *db, AggInf
19b00 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74  o *pInfo){.  int
19b10 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f   i;.  pInfo->aCo
19b20 6c 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79  l = sqlite3Array
19b30 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20  Allocate(.      
19b40 20 64 62 2c 0a 20 20 20 20 20 20 20 70 49 6e 66   db,.       pInf
19b50 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20  o->aCol,.       
19b60 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43  sizeof(pInfo->aC
19b70 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 33  ol[0]),.       3
19b80 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d  ,.       &pInfo-
19b90 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  >nColumn,.      
19ba0 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e   &pInfo->nColumn
19bb0 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 20 26 69  Alloc,.       &i
19bc0 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  .  );.  return i
19bd0 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41  ;.}    ../*.** A
19be0 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
19bf0 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f   to the pAggInfo
19c00 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e  ->aFunc[] array.
19c10 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64    Return the ind
19c20 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ex of.** the new
19c30 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72   element.  Retur
19c40 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  n a negative num
19c50 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61  ber if malloc fa
19c60 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
19c70 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e  nt addAggInfoFun
19c80 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41  c(sqlite3 *db, A
19c90 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a  ggInfo *pInfo){.
19ca0 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f    int i;.  pInfo
19cb0 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69 74 65  ->aFunc = sqlite
19cc0 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a  3ArrayAllocate(.
19cd0 20 20 20 20 20 20 20 64 62 2c 20 0a 20 20 20 20         db, .    
19ce0 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c     pInfo->aFunc,
19cf0 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70  .       sizeof(p
19d00 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c  Info->aFunc[0]),
19d10 0a 20 20 20 20 20 20 20 33 2c 0a 20 20 20 20 20  .       3,.     
19d20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c    &pInfo->nFunc,
19d30 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e  .       &pInfo->
19d40 6e 46 75 6e 63 41 6c 6c 6f 63 2c 0a 20 20 20 20  nFuncAlloc,.    
19d50 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74     &i.  );.  ret
19d60 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a  urn i;.}    ../*
19d70 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 78  .** This is an x
19d80 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b 45 78 70  Func for walkExp
19d90 72 54 72 65 65 28 29 20 75 73 65 64 20 74 6f 20  rTree() used to 
19da0 69 6d 70 6c 65 6d 65 6e 74 20 0a 2a 2a 20 73 71  implement .** sq
19db0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
19dc0 41 67 67 72 65 67 61 74 65 73 28 29 2e 20 20 53  Aggregates().  S
19dd0 65 65 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  ee sqlite3ExprAn
19de0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 0a  alyzeAggregates.
19df0 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ** for additiona
19e00 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
19e10 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
19e20 65 20 61 6e 61 6c 79 7a 65 73 20 74 68 65 20 61  e analyzes the a
19e30 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
19e40 6e 20 61 74 20 70 45 78 70 72 2e 0a 2a 2f 0a 73  n at pExpr..*/.s
19e50 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a  tatic int analyz
19e60 65 41 67 67 72 65 67 61 74 65 28 76 6f 69 64 20  eAggregate(void 
19e70 2a 70 41 72 67 2c 20 45 78 70 72 20 2a 70 45 78  *pArg, Expr *pEx
19e80 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  pr){.  int i;.  
19e90 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
19ea0 20 3d 20 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20   = (NameContext 
19eb0 2a 29 70 41 72 67 3b 0a 20 20 50 61 72 73 65 20  *)pArg;.  Parse 
19ec0 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  *pParse = pNC->p
19ed0 50 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73 74  Parse;.  SrcList
19ee0 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43   *pSrcList = pNC
19ef0 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 41 67  ->pSrcList;.  Ag
19f00 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20  gInfo *pAggInfo 
19f10 3d 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b  = pNC->pAggInfo;
19f20 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
19f30 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
19f40 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
19f50 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
19f60 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  UMN: {.      /* 
19f70 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
19f80 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e  the column is in
19f90 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c   one of the tabl
19fa0 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20  es in the FROM. 
19fb0 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f       ** clause o
19fc0 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
19fd0 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69  query */.      i
19fe0 66 28 20 70 53 72 63 4c 69 73 74 20 29 7b 0a 20  f( pSrcList ){. 
19ff0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72         struct Sr
1a000 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
1a010 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b  m = pSrcList->a;
1a020 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
1a030 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53  ; i<pSrcList->nS
1a040 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
1a050 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  ){.          str
1a060 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
1a070 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20  *pCol;.         
1a080 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62   if( pExpr->iTab
1a090 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73  le==pItem->iCurs
1a0a0 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  or ){.          
1a0b0 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
1a0c0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20   this point, it 
1a0d0 6d 65 61 6e 73 20 74 68 61 74 20 70 45 78 70 72  means that pExpr
1a0e0 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
1a0f0 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  le.            *
1a100 2a 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65  * that is in the
1a110 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1a120 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75  the aggregate qu
1a130 65 72 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20  ery.  .         
1a140 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
1a150 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74    ** Make an ent
1a160 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ry for the colum
1a170 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61  n in pAggInfo->a
1a180 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20  Col[] if there. 
1a190 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73             ** is
1a1a0 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68   not an entry th
1a1b0 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20  ere already..   
1a1c0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
1a1d0 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20          int k;. 
1a1e0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20             pCol 
1a1f0 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  = pAggInfo->aCol
1a200 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
1a210 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66  r(k=0; k<pAggInf
1a220 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c  o->nColumn; k++,
1a230 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   pCol++){.      
1a240 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
1a250 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d  ->iTable==pExpr-
1a260 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20  >iTable &&.     
1a270 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
1a280 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70  l->iColumn==pExp
1a290 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  r->iColumn ){.  
1a2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
1a2b0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
1a2c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1a2d0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
1a2e0 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d  f( (k>=pAggInfo-
1a2f0 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20  >nColumn).      
1a300 20 20 20 20 20 20 20 26 26 20 28 6b 20 3d 20 61         && (k = a
1a310 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28  ddAggInfoColumn(
1a320 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67  pParse->db, pAgg
1a330 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20  Info))>=0 .     
1a340 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
1a350 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26          pCol = &
1a360 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b  pAggInfo->aCol[k
1a370 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
1a380 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45   pCol->pTab = pE
1a390 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  xpr->pTab;.     
1a3a0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
1a3b0 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69  Table = pExpr->i
1a3c0 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
1a3d0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75       pCol->iColu
1a3e0 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  mn = pExpr->iCol
1a3f0 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  umn;.           
1a400 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20     pCol->iMem = 
1a410 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1a420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
1a430 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
1a440 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  n = -1;.        
1a450 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70        pCol->pExp
1a460 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  r = pExpr;.     
1a470 20 20 20 20 20 20 20 20 20 69 66 28 20 70 41 67           if( pAg
1a480 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20  gInfo->pGroupBy 
1a490 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1a4a0 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20     int j, n;.   
1a4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
1a4c0 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67  rList *pGB = pAg
1a4d0 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b  gInfo->pGroupBy;
1a4e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a4f0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
1a500 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70  _item *pTerm = p
1a510 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20  GB->a;.         
1a520 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e         n = pGB->
1a530 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  nExpr;.         
1a540 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
1a550 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b  j<n; j++, pTerm+
1a560 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
1a570 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
1a580 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
1a590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5a0 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
1a5b0 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54  COLUMN && pE->iT
1a5c0 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61  able==pExpr->iTa
1a5d0 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20  ble &&.         
1a5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 2d               pE-
1a5f0 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d  >iColumn==pExpr-
1a600 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
1a610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a620 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
1a630 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  umn = j;.       
1a640 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
1a650 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
1a660 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1a670 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a680 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a690 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
1a6a0 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c  ->iSorterColumn<
1a6b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1a6c0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
1a6d0 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49  erColumn = pAggI
1a6e0 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c  nfo->nSortingCol
1a6f0 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  umn++;.         
1a700 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1a710 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1a720 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77   /* There is now
1a730 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45   an entry for pE
1a740 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  xpr in pAggInfo-
1a750 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a  >aCol[] (either.
1a760 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62              ** b
1a770 65 63 61 75 73 65 20 69 74 20 77 61 73 20 74 68  ecause it was th
1a780 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65  ere before or be
1a790 63 61 75 73 65 20 77 65 20 6a 75 73 74 20 63 72  cause we just cr
1a7a0 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20  eated it)..     
1a7b0 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72         ** Conver
1a7c0 74 20 74 68 65 20 70 45 78 70 72 20 74 6f 20 62  t the pExpr to b
1a7d0 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  e a TK_AGG_COLUM
1a7e0 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74  N referring to t
1a7f0 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  hat.            
1a800 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  ** pAggInfo->aCo
1a810 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20  l[] entry..     
1a820 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1a830 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67        pExpr->pAg
1a840 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f  gInfo = pAggInfo
1a850 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
1a860 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47  xpr->op = TK_AGG
1a870 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20  _COLUMN;.       
1a880 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67       pExpr->iAgg
1a890 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20   = k;.          
1a8a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1a8b0 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45     } /* endif pE
1a8c0 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74  xpr->iTable==pIt
1a8d0 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20  em->iCursor */. 
1a8e0 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20         } /* end 
1a8f0 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63 4c 69  loop over pSrcLi
1a900 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  st */.      }.  
1a910 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1a920 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1a930 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a  AGG_FUNCTION: {.
1a940 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 4e 43        /* The pNC
1a950 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 74 65 73 74  ->nDepth==0 test
1a960 20 63 61 75 73 65 73 20 61 67 67 72 65 67 61 74   causes aggregat
1a970 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 73  e functions in s
1a980 75 62 71 75 65 72 69 65 73 0a 20 20 20 20 20 20  ubqueries.      
1a990 2a 2a 20 74 6f 20 62 65 20 69 67 6e 6f 72 65 64  ** to be ignored
1a9a0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4e   */.      if( pN
1a9b0 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 29 7b 0a  C->nDepth==0 ){.
1a9c0 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
1a9d0 20 74 6f 20 73 65 65 20 69 66 20 70 45 78 70 72   to see if pExpr
1a9e0 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20   is a duplicate 
1a9f0 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65  of another aggre
1aa00 67 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  gate .        **
1aa10 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69   function that i
1aa20 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
1aa30 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74   pAggInfo struct
1aa40 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ure.        */. 
1aa50 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
1aa60 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65  gInfo_func *pIte
1aa70 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  m = pAggInfo->aF
1aa80 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  unc;.        for
1aa90 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f  (i=0; i<pAggInfo
1aaa0 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49  ->nFunc; i++, pI
1aab0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
1aac0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
1aad0 72 43 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e  rCompare(pItem->
1aae0 70 45 78 70 72 2c 20 70 45 78 70 72 29 20 29 7b  pExpr, pExpr) ){
1aaf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
1ab00 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
1ab10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ab20 20 20 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66    if( i>=pAggInf
1ab30 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20  o->nFunc ){.    
1ab40 20 20 20 20 20 20 2f 2a 20 70 45 78 70 72 20 69        /* pExpr i
1ab50 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b  s original.  Mak
1ab60 65 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  e a new entry in
1ab70 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
1ab80 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  [].          */.
1ab90 20 20 20 20 20 20 20 20 20 20 75 38 20 65 6e 63            u8 enc
1aba0 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64   = ENC(pParse->d
1abb0 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20  b);.          i 
1abc0 3d 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63  = addAggInfoFunc
1abd0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67  (pParse->db, pAg
1abe0 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  gInfo);.        
1abf0 20 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20    if( i>=0 ){.  
1ac00 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 20            pItem 
1ac10 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  = &pAggInfo->aFu
1ac20 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  nc[i];.         
1ac30 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20     pItem->pExpr 
1ac40 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
1ac50 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d       pItem->iMem
1ac60 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1ac70 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  m;.            p
1ac80 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71  Item->pFunc = sq
1ac90 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
1aca0 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20  n(pParse->db,.  
1acb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1acc0 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74   (char*)pExpr->t
1acd0 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74  oken.z, pExpr->t
1ace0 6f 6b 65 6e 2e 6e 2c 0a 20 20 20 20 20 20 20 20  oken.n,.        
1acf0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1ad00 2d 3e 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d  ->pList ? pExpr-
1ad10 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20  >pList->nExpr : 
1ad20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20  0, enc, 0);.    
1ad30 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
1ad40 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69  r->flags & EP_Di
1ad50 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20  stinct ){.      
1ad60 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
1ad70 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73  Distinct = pPars
1ad80 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
1ad90 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1ada0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
1adb0 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d  m->iDistinct = -
1adc0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
1add0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1ade0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
1adf0 2a 20 4d 61 6b 65 20 70 45 78 70 72 20 70 6f 69  * Make pExpr poi
1ae00 6e 74 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70  nt to the approp
1ae10 72 69 61 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e  riate pAggInfo->
1ae20 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20  aFunc[] entry.  
1ae30 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1ae40 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 69   pExpr->iAgg = i
1ae50 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
1ae60 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67  >pAggInfo = pAgg
1ae70 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 72 65  Info;.        re
1ae80 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
1ae90 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1aea0 52 65 63 75 72 73 69 76 65 6c 79 20 77 61 6c 6b  Recursively walk
1aeb0 20 73 75 62 71 75 65 72 69 65 73 20 6c 6f 6f 6b   subqueries look
1aec0 69 6e 67 20 66 6f 72 20 54 4b 5f 43 4f 4c 55 4d  ing for TK_COLUM
1aed0 4e 20 6e 6f 64 65 73 20 74 68 61 74 20 6e 65 65  N nodes that nee
1aee0 64 0a 20 20 2a 2a 20 74 6f 20 62 65 20 63 68 61  d.  ** to be cha
1aef0 6e 67 65 64 20 74 6f 20 54 4b 5f 41 47 47 5f 43  nged to TK_AGG_C
1af00 4f 4c 55 4d 4e 2e 20 20 42 75 74 20 69 6e 63 72  OLUMN.  But incr
1af10 65 6d 65 6e 74 20 6e 44 65 70 74 68 20 73 6f 20  ement nDepth so 
1af20 74 68 61 74 0a 20 20 2a 2a 20 54 4b 5f 41 47 47  that.  ** TK_AGG
1af30 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20  _FUNCTION nodes 
1af40 69 6e 20 73 75 62 71 75 65 72 69 65 73 20 77 69  in subqueries wi
1af50 6c 6c 20 62 65 20 75 6e 63 68 61 6e 67 65 64 2e  ll be unchanged.
1af60 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  .  */.  if( pExp
1af70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  r->pSelect ){.  
1af80 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2b 2b 3b    pNC->nDepth++;
1af90 0a 20 20 20 20 77 61 6c 6b 53 65 6c 65 63 74 45  .    walkSelectE
1afa0 78 70 72 28 70 45 78 70 72 2d 3e 70 53 65 6c 65  xpr(pExpr->pSele
1afb0 63 74 2c 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  ct, analyzeAggre
1afc0 67 61 74 65 2c 20 70 4e 43 29 3b 0a 20 20 20 20  gate, pNC);.    
1afd0 70 4e 43 2d 3e 6e 44 65 70 74 68 2d 2d 3b 0a 20  pNC->nDepth--;. 
1afe0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1aff0 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  ../*.** Analyze 
1b000 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
1b010 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  sion looking for
1b020 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
1b030 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
1b040 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e  variables that n
1b050 65 65 64 20 74 6f 20 62 65 20 61 64 64 65 64 20  eed to be added 
1b060 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61  to the pParse->a
1b070 41 67 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 20  Agg[] array..** 
1b080 4d 61 6b 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  Make additional 
1b090 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65 20 70  entries to the p
1b0a0 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72  Parse->aAgg[] ar
1b0b0 72 61 79 20 61 73 20 6e 65 63 65 73 73 61 72 79  ray as necessary
1b0c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1b0d0 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  tine should only
1b0e0 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72   be called after
1b0f0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1b100 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c  has been.** anal
1b110 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 45  yzed by sqlite3E
1b120 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28  xprResolveNames(
1b130 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
1b140 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
1b150 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74  regates(NameCont
1b160 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a  ext *pNC, Expr *
1b170 70 45 78 70 72 29 7b 0a 20 20 77 61 6c 6b 45 78  pExpr){.  walkEx
1b180 70 72 54 72 65 65 28 70 45 78 70 72 2c 20 61 6e  prTree(pExpr, an
1b190 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 2c 20  alyzeAggregate, 
1b1a0 70 4e 43 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  pNC);.}../*.** C
1b1b0 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72 41  all sqlite3ExprA
1b1c0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
1b1d0 28 29 20 66 6f 72 20 65 76 65 72 79 20 65 78 70  () for every exp
1b1e0 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a  ression in an.**
1b1f0 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
1b200 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
1b210 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a  mber of errors..
1b220 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
1b230 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 20  r is found, the 
1b240 61 6e 61 6c 79 73 69 73 20 69 73 20 63 75 74 20  analysis is cut 
1b250 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  short..*/.void s
1b260 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
1b270 65 41 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e  eAggList(NameCon
1b280 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c  text *pNC, ExprL
1b290 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73  ist *pList){.  s
1b2a0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
1b2b0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e  tem *pItem;.  in
1b2c0 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
1b2d0 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65   ){.    for(pIte
1b2e0 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b  m=pList->a, i=0;
1b2f0 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
1b300 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
1b310 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1b320 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
1b330 65 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70  es(pNC, pItem->p
1b340 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Expr);.    }.  }
1b350 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
1b360 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65  te or deallocate
1b370 20 74 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72   temporary use r
1b380 65 67 69 73 74 65 72 73 20 64 75 72 69 6e 67 20  egisters during 
1b390 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e  code generation.
1b3a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47  .*/.int sqlite3G
1b3b0 65 74 54 65 6d 70 52 65 67 28 50 61 72 73 65 20  etTempReg(Parse 
1b3c0 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20  *pParse){.  int 
1b3d0 69 2c 20 72 3b 0a 20 20 69 66 28 20 70 50 61 72  i, r;.  if( pPar
1b3e0 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d 30 20  se->nTempReg==0 
1b3f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2b 2b  ){.    return ++
1b400 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1b410 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
1b420 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3b  Parse->nTempReg;
1b430 20 69 2b 2b 29 7b 0a 20 20 20 20 72 20 3d 20 70   i++){.    r = p
1b440 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
1b450 69 5d 3b 0a 20 20 20 20 69 66 28 20 75 73 65 64  i];.    if( used
1b460 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50  AsColumnCache(pP
1b470 61 72 73 65 2c 20 72 2c 20 72 29 20 29 20 63 6f  arse, r, r) ) co
1b480 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 20 20 69 66  ntinue;.  }.  if
1b490 28 20 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 54 65  ( i>=pParse->nTe
1b4a0 6d 70 52 65 67 20 29 7b 0a 20 20 20 20 72 65 74  mpReg ){.    ret
1b4b0 75 72 6e 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  urn ++pParse->nM
1b4c0 65 6d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  em;.  }.  while(
1b4d0 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70   i<pParse->nTemp
1b4e0 52 65 67 2d 31 20 29 7b 0a 20 20 20 20 70 50 61  Reg-1 ){.    pPa
1b4f0 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 69 5d  rse->aTempReg[i]
1b500 20 3d 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70   = pParse->aTemp
1b510 52 65 67 5b 69 2b 31 5d 3b 0a 20 20 7d 0a 20 20  Reg[i+1];.  }.  
1b520 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
1b530 2d 2d 3b 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a  --;.  return r;.
1b540 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  }.void sqlite3Re
1b550 6c 65 61 73 65 54 65 6d 70 52 65 67 28 50 61 72  leaseTempReg(Par
1b560 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
1b570 69 52 65 67 29 7b 0a 20 20 69 66 28 20 69 52 65  iReg){.  if( iRe
1b580 67 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54 65  g && pParse->nTe
1b590 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28  mpReg<ArraySize(
1b5a0 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
1b5b0 29 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  ) ){.    pParse-
1b5c0 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65  >aTempReg[pParse
1b5d0 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20  ->nTempReg++] = 
1b5e0 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  iReg;.  }.}../*.
1b5f0 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72 20 64  ** Allocate or d
1b600 65 61 6c 6c 6f 63 61 74 65 20 61 20 62 6c 6f 63  eallocate a bloc
1b610 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e 73 65 63  k of nReg consec
1b620 75 74 69 76 65 20 72 65 67 69 73 74 65 72 73 0a  utive registers.
1b630 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65  */.int sqlite3Ge
1b640 74 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65  tTempRange(Parse
1b650 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 52   *pParse, int nR
1b660 65 67 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b  eg){.  int i, n;
1b670 0a 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 69  .  i = pParse->i
1b680 52 61 6e 67 65 52 65 67 3b 0a 20 20 6e 20 3d 20  RangeReg;.  n = 
1b690 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
1b6a0 67 3b 0a 20 20 69 66 28 20 6e 52 65 67 3c 3d 6e  g;.  if( nReg<=n
1b6b0 20 26 26 20 21 75 73 65 64 41 73 43 6f 6c 75 6d   && !usedAsColum
1b6c0 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 69  nCache(pParse, i
1b6d0 2c 20 69 2b 6e 2d 31 29 20 29 7b 0a 20 20 20 20  , i+n-1) ){.    
1b6e0 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
1b6f0 67 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70  g += nReg;.    p
1b700 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
1b710 20 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73   -= nReg;.  }els
1b720 65 7b 0a 20 20 20 20 69 20 3d 20 70 50 61 72 73  e{.    i = pPars
1b730 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70  e->nMem+1;.    p
1b740 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
1b750 52 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Reg;.  }.  retur
1b760 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  n i;.}.void sqli
1b770 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
1b780 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  nge(Parse *pPars
1b790 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74  e, int iReg, int
1b7a0 20 6e 52 65 67 29 7b 0a 20 20 69 66 28 20 6e 52   nReg){.  if( nR
1b7b0 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67  eg>pParse->nRang
1b7c0 65 52 65 67 20 29 7b 0a 20 20 20 20 70 50 61 72  eReg ){.    pPar
1b7d0 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20  se->nRangeReg = 
1b7e0 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65  nReg;.    pParse
1b7f0 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d 20 69 52  ->iRangeReg = iR
1b800 65 67 3b 0a 20 20 7d 0a 7d 0a                    eg;.  }.}.