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

Artifact 52fbb644cf5e9b70329e95c67552e74c3cba81b7:


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 32 20 32 30 30 38 2f 30 35 2f 32 38 20  .372 2008/05/28 
0220: 31 33 3a 34 39 3a 33 36 20 64 72 68 20 45 78 70  13:49:36 drh Exp
0230: 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22   $.*/.#include "
0240: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e  sqliteInt.h".#in
0250: 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a  clude <ctype.h>.
0260: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0270: 65 20 27 61 66 66 69 6e 69 74 79 27 20 6f 66 20  e 'affinity' of 
0280: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
0290: 45 78 70 72 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a  Expr if any..**.
02a0: 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61  ** If pExpr is a
02b0: 20 63 6f 6c 75 6d 6e 2c 20 61 20 72 65 66 65 72   column, a refer
02c0: 65 6e 63 65 20 74 6f 20 61 20 63 6f 6c 75 6d 6e  ence to a column
02d0: 20 76 69 61 20 61 6e 20 27 41 53 27 20 61 6c 69   via an 'AS' ali
02e0: 61 73 2c 0a 2a 2a 20 6f 72 20 61 20 73 75 62 2d  as,.** or a sub-
02f0: 73 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f  select with a co
0300: 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 65 74 75  lumn as the retu
0310: 72 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  rn value, then t
0320: 68 65 20 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20  he .** affinity 
0330: 6f 66 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69  of that column i
0340: 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
0350: 72 77 69 73 65 2c 20 30 78 30 30 20 69 73 20 72  rwise, 0x00 is r
0360: 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 69 6e 64 69  eturned,.** indi
0370: 63 61 74 69 6e 67 20 6e 6f 20 61 66 66 69 6e 69  cating no affini
0380: 74 79 20 66 6f 72 20 74 68 65 20 65 78 70 72 65  ty for the expre
0390: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65  ssion..**.** i.e
03a0: 2e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  . the WHERE clau
03b0: 73 65 20 65 78 70 72 65 73 73 73 69 6f 6e 73 20  se expresssions 
03c0: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
03d0: 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6c 6c 0a   statements all.
03e0: 2a 2a 20 68 61 76 65 20 61 6e 20 61 66 66 69 6e  ** have an affin
03f0: 69 74 79 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54  ity:.**.** CREAT
0400: 45 20 54 41 42 4c 45 20 74 31 28 61 29 3b 0a 2a  E TABLE t1(a);.*
0410: 2a 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  * SELECT * FROM 
0420: 74 31 20 57 48 45 52 45 20 61 3b 0a 2a 2a 20 53  t1 WHERE a;.** S
0430: 45 4c 45 43 54 20 61 20 41 53 20 62 20 46 52 4f  ELECT a AS b FRO
0440: 4d 20 74 31 20 57 48 45 52 45 20 62 3b 0a 2a 2a  M t1 WHERE b;.**
0450: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0460: 31 20 57 48 45 52 45 20 28 73 65 6c 65 63 74 20  1 WHERE (select 
0470: 61 20 66 72 6f 6d 20 74 31 29 3b 0a 2a 2f 0a 63  a from t1);.*/.c
0480: 68 61 72 20 73 71 6c 69 74 65 33 45 78 70 72 41  har sqlite3ExprA
0490: 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45  ffinity(Expr *pE
04a0: 78 70 72 29 7b 0a 20 20 69 6e 74 20 6f 70 20 3d  xpr){.  int op =
04b0: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
04c0: 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
04d0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  ){.    return sq
04e0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
04f0: 79 28 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  y(pExpr->pSelect
0500: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
0510: 45 78 70 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  Expr);.  }.#ifnd
0520: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
0530: 41 53 54 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  AST.  if( op==TK
0540: 5f 43 41 53 54 20 29 7b 0a 20 20 20 20 72 65 74  _CAST ){.    ret
0550: 75 72 6e 20 73 71 6c 69 74 65 33 41 66 66 69 6e  urn sqlite3Affin
0560: 69 74 79 54 79 70 65 28 26 70 45 78 70 72 2d 3e  ityType(&pExpr->
0570: 74 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64  token);.  }.#end
0580: 69 66 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70  if.  return pExp
0590: 72 2d 3e 61 66 66 69 6e 69 74 79 3b 0a 7d 0a 0a  r->affinity;.}..
05a0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f  /*.** Set the co
05b0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
05c0: 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20   for expression 
05d0: 70 45 78 70 72 20 74 6f 20 62 65 20 74 68 65 20  pExpr to be the 
05e0: 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71  collating.** seq
05f0: 75 65 6e 63 65 20 6e 61 6d 65 64 20 62 79 20 70  uence named by p
0600: 54 6f 6b 65 6e 2e 20 20 20 52 65 74 75 72 6e 20  Token.   Return 
0610: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
0620: 20 72 65 76 69 73 65 64 20 65 78 70 72 65 73 73   revised express
0630: 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c  ion..** The coll
0640: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  ating sequence i
0650: 73 20 6d 61 72 6b 65 64 20 61 73 20 22 65 78 70  s marked as "exp
0660: 6c 69 63 69 74 22 20 75 73 69 6e 67 20 74 68 65  licit" using the
0670: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 0a 2a   EP_ExpCollate.*
0680: 2a 20 66 6c 61 67 2e 20 20 41 6e 20 65 78 70 6c  * flag.  An expl
0690: 69 63 69 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73  icit collating s
06a0: 65 71 75 65 6e 63 65 20 77 69 6c 6c 20 6f 76 65  equence will ove
06b0: 72 72 69 64 65 20 69 6d 70 6c 69 63 69 74 0a 2a  rride implicit.*
06c0: 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * collating sequ
06d0: 65 6e 63 65 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a  ences..*/.Expr *
06e0: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 43 6f  sqlite3ExprSetCo
06f0: 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ll(Parse *pParse
0700: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 54  , Expr *pExpr, T
0710: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
0720: 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 30 3b  char *zColl = 0;
0730: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
0740: 65 71 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20  equoted name of 
0750: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
0760: 63 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20  ce */.  CollSeq 
0770: 2a 70 43 6f 6c 6c 3b 0a 20 20 7a 43 6f 6c 6c 20  *pColl;.  zColl 
0780: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
0790: 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64  mToken(pParse->d
07a0: 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b, pName);.  if(
07b0: 20 70 45 78 70 72 20 26 26 20 7a 43 6f 6c 6c 20   pExpr && zColl 
07c0: 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  ){.    pColl = s
07d0: 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
07e0: 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  Seq(pParse, zCol
07f0: 6c 2c 20 2d 31 29 3b 0a 20 20 20 20 69 66 28 20  l, -1);.    if( 
0800: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  pColl ){.      p
0810: 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43  Expr->pColl = pC
0820: 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 45 78 70 72  oll;.      pExpr
0830: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78  ->flags |= EP_Ex
0840: 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 7d 0a  pCollate;.    }.
0850: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
0860: 65 65 28 7a 43 6f 6c 6c 29 3b 0a 20 20 72 65 74  ee(zColl);.  ret
0870: 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a  urn pExpr;.}../*
0880: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
0890: 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e  efault collation
08a0: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
08b0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
08c0: 70 72 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65 20  pr. If.** there 
08d0: 69 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f  is no default co
08e0: 6c 6c 61 74 69 6f 6e 20 74 79 70 65 2c 20 72 65  llation type, re
08f0: 74 75 72 6e 20 30 2e 0a 2a 2f 0a 43 6f 6c 6c 53  turn 0..*/.CollS
0900: 65 71 20 2a 73 71 6c 69 74 65 33 45 78 70 72 43  eq *sqlite3ExprC
0910: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
0920: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
0930: 72 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  r){.  CollSeq *p
0940: 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20  Coll = 0;.  if( 
0950: 70 45 78 70 72 20 29 7b 0a 20 20 20 20 69 6e 74  pExpr ){.    int
0960: 20 6f 70 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d   op;.    pColl =
0970: 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a 20   pExpr->pColl;. 
0980: 20 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f     op = pExpr->o
0990: 70 3b 0a 20 20 20 20 69 66 28 20 28 6f 70 3d 3d  p;.    if( (op==
09a0: 54 4b 5f 43 41 53 54 20 7c 7c 20 6f 70 3d 3d 54  TK_CAST || op==T
09b0: 4b 5f 55 50 4c 55 53 29 20 26 26 20 21 70 43 6f  K_UPLUS) && !pCo
09c0: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ll ){.      retu
09d0: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  rn sqlite3ExprCo
09e0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
09f0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
0a00: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c   }.  }.  if( sql
0a10: 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71  ite3CheckCollSeq
0a20: 28 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20  (pParse, pColl) 
0a30: 29 7b 20 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20  ){ .    pColl = 
0a40: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
0a50: 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pColl;.}../*.** 
0a60: 70 45 78 70 72 20 69 73 20 61 6e 20 6f 70 65 72  pExpr is an oper
0a70: 61 6e 64 20 6f 66 20 61 20 63 6f 6d 70 61 72 69  and of a compari
0a80: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 61  son operator.  a
0a90: 66 66 32 20 69 73 20 74 68 65 0a 2a 2a 20 74 79  ff2 is the.** ty
0aa0: 70 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74  pe affinity of t
0ab0: 68 65 20 6f 74 68 65 72 20 6f 70 65 72 61 6e 64  he other operand
0ac0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
0ad0: 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 74  returns the.** t
0ae0: 79 70 65 20 61 66 66 69 6e 69 74 79 20 74 68 61  ype affinity tha
0af0: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
0b00: 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 61 72 69   for the compari
0b10: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f  son operator..*/
0b20: 0a 63 68 61 72 20 73 71 6c 69 74 65 33 43 6f 6d  .char sqlite3Com
0b30: 70 61 72 65 41 66 66 69 6e 69 74 79 28 45 78 70  pareAffinity(Exp
0b40: 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20 61  r *pExpr, char a
0b50: 66 66 32 29 7b 0a 20 20 63 68 61 72 20 61 66 66  ff2){.  char aff
0b60: 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  1 = sqlite3ExprA
0b70: 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a  ffinity(pExpr);.
0b80: 20 20 69 66 28 20 61 66 66 31 20 26 26 20 61 66    if( aff1 && af
0b90: 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20 42 6f 74  f2 ){.    /* Bot
0ba0: 68 20 73 69 64 65 73 20 6f 66 20 74 68 65 20 63  h sides of the c
0bb0: 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65 20 63 6f  omparison are co
0bc0: 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e 65 20 68 61  lumns. If one ha
0bd0: 73 20 6e 75 6d 65 72 69 63 0a 20 20 20 20 2a 2a  s numeric.    **
0be0: 20 61 66 66 69 6e 69 74 79 2c 20 75 73 65 20 74   affinity, use t
0bf0: 68 61 74 2e 20 4f 74 68 65 72 77 69 73 65 20 75  hat. Otherwise u
0c00: 73 65 20 6e 6f 20 61 66 66 69 6e 69 74 79 2e 0a  se no affinity..
0c10: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
0c20: 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41  qlite3IsNumericA
0c30: 66 66 69 6e 69 74 79 28 61 66 66 31 29 20 7c 7c  ffinity(aff1) ||
0c40: 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69   sqlite3IsNumeri
0c50: 63 41 66 66 69 6e 69 74 79 28 61 66 66 32 29 20  cAffinity(aff2) 
0c60: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
0c70: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
0c80: 49 43 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  IC;.    }else{. 
0c90: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
0ca0: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
0cb0: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21   }.  }else if( !
0cc0: 61 66 66 31 20 26 26 20 21 61 66 66 32 20 29 7b  aff1 && !aff2 ){
0cd0: 0a 20 20 20 20 2f 2a 20 4e 65 69 74 68 65 72 20  .    /* Neither 
0ce0: 73 69 64 65 20 6f 66 20 74 68 65 20 63 6f 6d 70  side of the comp
0cf0: 61 72 69 73 6f 6e 20 69 73 20 61 20 63 6f 6c 75  arison is a colu
0d00: 6d 6e 2e 20 20 43 6f 6d 70 61 72 65 20 74 68 65  mn.  Compare the
0d10: 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 73 20  .    ** results 
0d20: 64 69 72 65 63 74 6c 79 2e 0a 20 20 20 20 2a 2f  directly..    */
0d30: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
0d40: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d  TE_AFF_NONE;.  }
0d50: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65  else{.    /* One
0d60: 20 73 69 64 65 20 69 73 20 61 20 63 6f 6c 75 6d   side is a colum
0d70: 6e 2c 20 74 68 65 20 6f 74 68 65 72 20 69 73 20  n, the other is 
0d80: 6e 6f 74 2e 20 55 73 65 20 74 68 65 20 63 6f 6c  not. Use the col
0d90: 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 2e 20 2a  umns affinity. *
0da0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 66  /.    assert( af
0db0: 66 31 3d 3d 30 20 7c 7c 20 61 66 66 32 3d 3d 30  f1==0 || aff2==0
0dc0: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   );.    return (
0dd0: 61 66 66 31 20 2b 20 61 66 66 32 29 3b 0a 20 20  aff1 + aff2);.  
0de0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72  }.}../*.** pExpr
0df0: 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e   is a comparison
0e00: 20 6f 70 65 72 61 74 6f 72 2e 20 20 52 65 74 75   operator.  Retu
0e10: 72 6e 20 74 68 65 20 74 79 70 65 20 61 66 66 69  rn the type affi
0e20: 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64  nity that should
0e30: 0a 2a 2a 20 62 65 20 61 70 70 6c 69 65 64 20 74  .** be applied t
0e40: 6f 20 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20  o both operands 
0e50: 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20 74  prior to doing t
0e60: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a  he comparison..*
0e70: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 63 6f  /.static char co
0e80: 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79  mparisonAffinity
0e90: 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20  (Expr *pExpr){. 
0ea0: 20 63 68 61 72 20 61 66 66 3b 0a 20 20 61 73 73   char aff;.  ass
0eb0: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
0ec0: 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_EQ || pExpr->
0ed0: 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 70 45 78  op==TK_IN || pEx
0ee0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c  pr->op==TK_LT ||
0ef0: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
0f00: 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20 70  ->op==TK_GT || p
0f10: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20  Expr->op==TK_GE 
0f20: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
0f30: 5f 4c 45 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  _LE ||.         
0f40: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e   pExpr->op==TK_N
0f50: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
0f60: 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20  Expr->pLeft );. 
0f70: 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 45 78   aff = sqlite3Ex
0f80: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
0f90: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  ->pLeft);.  if( 
0fa0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b  pExpr->pRight ){
0fb0: 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74  .    aff = sqlit
0fc0: 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
0fd0: 79 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  y(pExpr->pRight,
0fe0: 20 61 66 66 29 3b 0a 20 20 7d 0a 20 20 65 6c 73   aff);.  }.  els
0ff0: 65 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65  e if( pExpr->pSe
1000: 6c 65 63 74 20 29 7b 0a 20 20 20 20 61 66 66 20  lect ){.    aff 
1010: 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
1020: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
1030: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
1040: 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61 66 66  >a[0].pExpr, aff
1050: 29 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66  );.  }.  else if
1060: 28 20 21 61 66 66 20 29 7b 0a 20 20 20 20 61 66  ( !aff ){.    af
1070: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  f = SQLITE_AFF_N
1080: 4f 4e 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ONE;.  }.  retur
1090: 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aff;.}../*.** 
10a0: 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61  pExpr is a compa
10b0: 72 69 73 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e  rison expression
10c0: 2c 20 65 67 2e 20 27 3d 27 2c 20 27 3c 27 2c 20  , eg. '=', '<', 
10d0: 49 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a 2a 20  IN(...) etc..** 
10e0: 69 64 78 5f 61 66 66 69 6e 69 74 79 20 69 73 20  idx_affinity is 
10f0: 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20  the affinity of 
1100: 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d  an indexed colum
1110: 6e 2e 20 52 65 74 75 72 6e 20 74 72 75 65 0a 2a  n. Return true.*
1120: 2a 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 77  * if the index w
1130: 69 74 68 20 61 66 66 69 6e 69 74 79 20 69 64 78  ith affinity idx
1140: 5f 61 66 66 69 6e 69 74 79 20 6d 61 79 20 62 65  _affinity may be
1150: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
1160: 6e 74 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61 72  nt.** the compar
1170: 69 73 6f 6e 20 69 6e 20 70 45 78 70 72 2e 0a 2a  ison in pExpr..*
1180: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64  /.int sqlite3Ind
1190: 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 45 78 70  exAffinityOk(Exp
11a0: 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20 69  r *pExpr, char i
11b0: 64 78 5f 61 66 66 69 6e 69 74 79 29 7b 0a 20 20  dx_affinity){.  
11c0: 63 68 61 72 20 61 66 66 20 3d 20 63 6f 6d 70 61  char aff = compa
11d0: 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45  risonAffinity(pE
11e0: 78 70 72 29 3b 0a 20 20 73 77 69 74 63 68 28 20  xpr);.  switch( 
11f0: 61 66 66 20 29 7b 0a 20 20 20 20 63 61 73 65 20  aff ){.    case 
1200: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3a  SQLITE_AFF_NONE:
1210: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
1220: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1230: 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20 20  _AFF_TEXT:.     
1240: 20 72 65 74 75 72 6e 20 69 64 78 5f 61 66 66 69   return idx_affi
1250: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
1260: 5f 54 45 58 54 3b 0a 20 20 20 20 64 65 66 61 75  _TEXT;.    defau
1270: 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  lt:.      return
1280: 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69   sqlite3IsNumeri
1290: 63 41 66 66 69 6e 69 74 79 28 69 64 78 5f 61 66  cAffinity(idx_af
12a0: 66 69 6e 69 74 79 29 3b 0a 20 20 7d 0a 7d 0a 0a  finity);.  }.}..
12b0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
12c0: 20 50 35 20 76 61 6c 75 65 20 74 68 61 74 20 73   P5 value that s
12d0: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f  hould be used fo
12e0: 72 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70 61  r a binary compa
12f0: 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64 65 20  rison.** opcode 
1300: 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20 65 74  (OP_Eq, OP_Ge et
1310: 63 2e 29 20 75 73 65 64 20 74 6f 20 63 6f 6d 70  c.) used to comp
1320: 61 72 65 20 70 45 78 70 72 31 20 61 6e 64 20 70  are pExpr1 and p
1330: 45 78 70 72 32 2e 0a 2a 2f 0a 73 74 61 74 69 63  Expr2..*/.static
1340: 20 75 38 20 62 69 6e 61 72 79 43 6f 6d 70 61 72   u8 binaryCompar
1350: 65 50 35 28 45 78 70 72 20 2a 70 45 78 70 72 31  eP5(Expr *pExpr1
1360: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 32 2c 20  , Expr *pExpr2, 
1370: 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b  int jumpIfNull){
1380: 0a 20 20 75 38 20 61 66 66 20 3d 20 28 63 68 61  .  u8 aff = (cha
1390: 72 29 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  r)sqlite3ExprAff
13a0: 69 6e 69 74 79 28 70 45 78 70 72 32 29 3b 0a 20  inity(pExpr2);. 
13b0: 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f   aff = sqlite3Co
13c0: 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45  mpareAffinity(pE
13d0: 78 70 72 31 2c 20 61 66 66 29 20 7c 20 6a 75 6d  xpr1, aff) | jum
13e0: 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74 75 72  pIfNull;.  retur
13f0: 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aff;.}../*.** 
1400: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
1410: 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   to the collatio
1420: 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61 74 20  n sequence that 
1430: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 62  should be used b
1440: 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20 63 6f  y.** a binary co
1450: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
1460: 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c 65 66  r comparing pLef
1470: 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2a  t and pRight..**
1480: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66 74 20  .** If the left 
1490: 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 20  hand expression 
14a0: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  has a collating 
14b0: 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c 20 74  sequence type, t
14c0: 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75 73 65  hen it is.** use
14d0: 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  d. Otherwise the
14e0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
14f0: 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69 67 68  nce for the righ
1500: 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f  t hand expressio
1510: 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 6f 72  n.** is used, or
1520: 20 74 68 65 20 64 65 66 61 75 6c 74 20 28 42 49   the default (BI
1530: 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68 65 72  NARY) if neither
1540: 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
1550: 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 74  a collating.** t
1560: 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  ype..**.** Argum
1570: 65 6e 74 20 70 52 69 67 68 74 20 28 62 75 74 20  ent pRight (but 
1580: 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61 79 20 62  not pLeft) may b
1590: 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72  e a null pointer
15a0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a  . In this case,.
15b0: 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 63 6f 6e  ** it is not con
15c0: 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f 6c 6c  sidered..*/.Coll
15d0: 53 65 71 20 2a 73 71 6c 69 74 65 33 42 69 6e 61  Seq *sqlite3Bina
15e0: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
15f0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1600: 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c 65 66  e, .  Expr *pLef
1610: 74 2c 20 0a 20 20 45 78 70 72 20 2a 70 52 69 67  t, .  Expr *pRig
1620: 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  ht.){.  CollSeq 
1630: 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72 74  *pColl;.  assert
1640: 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 69 66 28  ( pLeft );.  if(
1650: 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20   pLeft->flags & 
1660: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b  EP_ExpCollate ){
1670: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65  .    assert( pLe
1680: 66 74 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20 20  ft->pColl );.   
1690: 20 70 43 6f 6c 6c 20 3d 20 70 4c 65 66 74 2d 3e   pColl = pLeft->
16a0: 70 43 6f 6c 6c 3b 0a 20 20 7d 65 6c 73 65 20 69  pColl;.  }else i
16b0: 66 28 20 70 52 69 67 68 74 20 26 26 20 70 52 69  f( pRight && pRi
16c0: 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ght->flags & EP_
16d0: 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  ExpCollate ){.  
16e0: 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74    assert( pRight
16f0: 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 70  ->pColl );.    p
1700: 43 6f 6c 6c 20 3d 20 70 52 69 67 68 74 2d 3e 70  Coll = pRight->p
1710: 43 6f 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Coll;.  }else{. 
1720: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
1730: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
1740: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
1750: 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
1760: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
1770: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
1780: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
1790: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
17a0: 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f  turn pColl;.}../
17b0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68  *.** Generate th
17c0: 65 20 6f 70 65 72 61 6e 64 73 20 66 6f 72 20 61  e operands for a
17d0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
17e0: 61 74 69 6f 6e 2e 20 20 42 65 66 6f 72 65 0a 2a  ation.  Before.*
17f0: 2a 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65  * generating the
1800: 20 63 6f 64 65 20 66 6f 72 20 65 61 63 68 20 6f   code for each o
1810: 70 65 72 61 6e 64 2c 20 73 65 74 20 74 68 65 20  perand, set the 
1820: 45 50 5f 41 6e 79 41 66 66 0a 2a 2a 20 66 6c 61  EP_AnyAff.** fla
1830: 67 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  g on the express
1840: 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 74 20 77  ion so that it w
1850: 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f 20 75  ill be able to u
1860: 73 65 64 20 61 0a 2a 2a 20 63 61 63 68 65 64 20  sed a.** cached 
1870: 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 74 68 61  column value tha
1880: 74 20 68 61 73 20 70 72 65 76 69 6f 75 73 6c 79  t has previously
1890: 20 75 6e 64 65 72 67 6f 6e 65 20 61 6e 0a 2a 2a   undergone an.**
18a0: 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65   affinity change
18b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
18c0: 20 63 6f 64 65 43 6f 6d 70 61 72 65 4f 70 65 72   codeCompareOper
18d0: 61 6e 64 73 28 0a 20 20 50 61 72 73 65 20 2a 70  ands(.  Parse *p
18e0: 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
18f0: 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
1900: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
1910: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66   */.  Expr *pLef
1920: 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c  t,      /* The l
1930: 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  eft operand */. 
1940: 20 69 6e 74 20 2a 70 52 65 67 4c 65 66 74 2c 20   int *pRegLeft, 
1950: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 77     /* Register w
1960: 68 65 72 65 20 6c 65 66 74 20 6f 70 65 72 61 6e  here left operan
1970: 64 20 69 73 20 73 74 6f 72 65 64 20 2a 2f 0a 20  d is stored */. 
1980: 20 69 6e 74 20 2a 70 46 72 65 65 4c 65 66 74 2c   int *pFreeLeft,
1990: 20 20 20 2f 2a 20 46 72 65 65 20 74 68 69 73 20     /* Free this 
19a0: 72 65 67 69 73 74 65 72 20 77 68 65 6e 20 64 6f  register when do
19b0: 6e 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52  ne */.  Expr *pR
19c0: 69 67 68 74 2c 20 20 20 20 20 2f 2a 20 54 68 65  ight,     /* The
19d0: 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a   right operand *
19e0: 2f 0a 20 20 69 6e 74 20 2a 70 52 65 67 52 69 67  /.  int *pRegRig
19f0: 68 74 2c 20 20 20 2f 2a 20 52 65 67 69 73 74 65  ht,   /* Registe
1a00: 72 20 77 68 65 72 65 20 72 69 67 68 74 20 6f 70  r where right op
1a10: 65 72 61 6e 64 20 69 73 20 73 74 6f 72 65 64 20  erand is stored 
1a20: 2a 2f 0a 20 20 69 6e 74 20 2a 70 46 72 65 65 52  */.  int *pFreeR
1a30: 69 67 68 74 20 20 20 2f 2a 20 57 72 69 74 65 20  ight   /* Write 
1a40: 74 65 6d 70 20 72 65 67 69 73 74 65 72 20 66 6f  temp register fo
1a50: 72 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  r right operand 
1a60: 74 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 77 68  there */.){.  wh
1a70: 69 6c 65 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d  ile( pLeft->op==
1a80: 54 4b 5f 55 50 4c 55 53 20 29 20 70 4c 65 66 74  TK_UPLUS ) pLeft
1a90: 20 3d 20 70 4c 65 66 74 2d 3e 70 4c 65 66 74 3b   = pLeft->pLeft;
1aa0: 0a 20 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20  .  pLeft->flags 
1ab0: 7c 3d 20 45 50 5f 41 6e 79 41 66 66 3b 0a 20 20  |= EP_AnyAff;.  
1ac0: 2a 70 52 65 67 4c 65 66 74 20 3d 20 73 71 6c 69  *pRegLeft = sqli
1ad0: 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1ae0: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
1af0: 46 72 65 65 4c 65 66 74 29 3b 0a 20 20 77 68 69  FreeLeft);.  whi
1b00: 6c 65 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d  le( pRight->op==
1b10: 54 4b 5f 55 50 4c 55 53 20 29 20 70 52 69 67 68  TK_UPLUS ) pRigh
1b20: 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 4c 65 66  t = pRight->pLef
1b30: 74 3b 0a 20 20 70 52 69 67 68 74 2d 3e 66 6c 61  t;.  pRight->fla
1b40: 67 73 20 7c 3d 20 45 50 5f 41 6e 79 41 66 66 3b  gs |= EP_AnyAff;
1b50: 0a 20 20 2a 70 52 65 67 52 69 67 68 74 20 3d 20  .  *pRegRight = 
1b60: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1b70: 65 6d 70 28 70 50 61 72 73 65 2c 20 70 52 69 67  emp(pParse, pRig
1b80: 68 74 2c 20 70 46 72 65 65 52 69 67 68 74 29 3b  ht, pFreeRight);
1b90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1ba0: 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f  te code for a co
1bb0: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
1bc0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
1bd0: 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 0a 20 20   codeCompare(.  
1be0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1bf0: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
1c00: 20 28 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72   (and code gener
1c10: 61 74 69 6e 67 29 20 63 6f 6e 74 65 78 74 20 2a  ating) context *
1c20: 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c  /.  Expr *pLeft,
1c30: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66        /* The lef
1c40: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45  t operand */.  E
1c50: 78 70 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20  xpr *pRight,    
1c60: 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20 6f 70   /* The right op
1c70: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  erand */.  int o
1c80: 70 63 6f 64 65 2c 20 20 20 20 20 20 20 2f 2a 20  pcode,       /* 
1c90: 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  The comparison o
1ca0: 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69  pcode */.  int i
1cb0: 6e 31 2c 20 69 6e 74 20 69 6e 32 2c 20 2f 2a 20  n1, int in2, /* 
1cc0: 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
1cd0: 20 6f 70 65 72 61 6e 64 73 20 2a 2f 0a 20 20 69   operands */.  i
1ce0: 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20 20 20  nt dest,        
1cf0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
1d00: 20 74 72 75 65 2e 20 20 2a 2f 0a 20 20 69 6e 74   true.  */.  int
1d10: 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f   jumpIfNull    /
1d20: 2a 20 49 66 20 74 72 75 65 2c 20 6a 75 6d 70 20  * If true, jump 
1d30: 69 66 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e  if either operan
1d40: 64 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  d is NULL */.){.
1d50: 20 20 69 6e 74 20 70 35 3b 0a 20 20 69 6e 74 20    int p5;.  int 
1d60: 61 64 64 72 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  addr;.  CollSeq 
1d70: 2a 70 34 3b 0a 0a 20 20 70 34 20 3d 20 73 71 6c  *p4;..  p4 = sql
1d80: 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
1d90: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
1da0: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b   pLeft, pRight);
1db0: 0a 20 20 70 35 20 3d 20 62 69 6e 61 72 79 43 6f  .  p5 = binaryCo
1dc0: 6d 70 61 72 65 50 35 28 70 4c 65 66 74 2c 20 70  mpareP5(pLeft, p
1dd0: 52 69 67 68 74 2c 20 6a 75 6d 70 49 66 4e 75 6c  Right, jumpIfNul
1de0: 6c 29 3b 0a 20 20 61 64 64 72 20 3d 20 73 71 6c  l);.  addr = sql
1df0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 70  ite3VdbeAddOp4(p
1e00: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 6f 70  Parse->pVdbe, op
1e10: 63 6f 64 65 2c 20 69 6e 32 2c 20 64 65 73 74 2c  code, in2, dest,
1e20: 20 69 6e 31 2c 0a 20 20 20 20 20 20 20 20 20 20   in1,.          
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e40: 20 28 76 6f 69 64 2a 29 70 34 2c 20 50 34 5f 43   (void*)p4, P4_C
1e50: 4f 4c 4c 53 45 51 29 3b 0a 20 20 73 71 6c 69 74  OLLSEQ);.  sqlit
1e60: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 70  e3VdbeChangeP5(p
1e70: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 35  Parse->pVdbe, p5
1e80: 29 3b 0a 20 20 69 66 28 20 70 35 20 26 20 53 51  );.  if( p5 & SQ
1e90: 4c 49 54 45 5f 41 46 46 5f 4d 41 53 4b 20 29 7b  LITE_AFF_MASK ){
1ea0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1eb0: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
1ec0: 6e 67 65 28 70 50 61 72 73 65 2c 20 69 6e 31 2c  nge(pParse, in1,
1ed0: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
1ee0: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
1ef0: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
1f00: 69 6e 32 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72  in2, 1);.  }.  r
1f10: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
1f20: 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61  *.** Construct a
1f30: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
1f40: 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e 20  node and return 
1f50: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e  a pointer to it.
1f60: 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20    Memory.** for 
1f70: 74 68 69 73 20 6e 6f 64 65 20 69 73 20 6f 62 74  this node is obt
1f80: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
1f90: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 20 20 54 68  e3_malloc().  Th
1fa0: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
1fb0: 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73  on.** is respons
1fc0: 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20  ible for making 
1fd0: 73 75 72 65 20 74 68 65 20 6e 6f 64 65 20 65 76  sure the node ev
1fe0: 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20 66 72  entually gets fr
1ff0: 65 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  eed..*/.Expr *sq
2000: 6c 69 74 65 33 45 78 70 72 28 0a 20 20 73 71 6c  lite3Expr(.  sql
2010: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
2020: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66       /* Handle f
2030: 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  or sqlite3DbMall
2040: 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65  ocZero() (may be
2050: 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20   null) */.  int 
2060: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
2070: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
2080: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78  n opcode */.  Ex
2090: 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20  pr *pLeft,      
20a0: 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70        /* Left op
20b0: 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20  erand */.  Expr 
20c0: 2a 70 52 69 67 68 74 2c 20 20 20 20 20 20 20 20  *pRight,        
20d0: 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65 72     /* Right oper
20e0: 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54  and */.  const T
20f0: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 20 20 20  oken *pToken    
2100: 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 6b   /* Argument tok
2110: 65 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20  en */.){.  Expr 
2120: 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20  *pNew;.  pNew = 
2130: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
2140: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 45  ero(db, sizeof(E
2150: 78 70 72 29 29 3b 0a 20 20 69 66 28 20 70 4e 65  xpr));.  if( pNe
2160: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57  w==0 ){.    /* W
2170: 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73  hen malloc fails
2180: 2c 20 64 65 6c 65 74 65 20 70 4c 65 66 74 20 61  , delete pLeft a
2190: 6e 64 20 70 52 69 67 68 74 2e 20 45 78 70 72 65  nd pRight. Expre
21a0: 73 73 69 6f 6e 73 20 70 61 73 73 65 64 20 74 6f  ssions passed to
21b0: 20 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 66 75   .    ** this fu
21c0: 6e 63 74 69 6f 6e 20 6d 75 73 74 20 61 6c 77 61  nction must alwa
21d0: 79 73 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20  ys be allocated 
21e0: 77 69 74 68 20 73 71 6c 69 74 65 33 45 78 70 72  with sqlite3Expr
21f0: 28 29 20 66 6f 72 20 74 68 69 73 20 0a 20 20 20  () for this .   
2200: 20 2a 2a 20 72 65 61 73 6f 6e 2e 20 0a 20 20 20   ** reason. .   
2210: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
2220: 78 70 72 44 65 6c 65 74 65 28 70 4c 65 66 74 29  xprDelete(pLeft)
2230: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2240: 72 44 65 6c 65 74 65 28 70 52 69 67 68 74 29 3b  rDelete(pRight);
2250: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2260: 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20   }.  pNew->op = 
2270: 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65 66  op;.  pNew->pLef
2280: 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 70 4e 65  t = pLeft;.  pNe
2290: 77 2d 3e 70 52 69 67 68 74 20 3d 20 70 52 69 67  w->pRight = pRig
22a0: 68 74 3b 0a 20 20 70 4e 65 77 2d 3e 69 41 67 67  ht;.  pNew->iAgg
22b0: 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 54 6f   = -1;.  if( pTo
22c0: 6b 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ken ){.    asser
22d0: 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e 3d 3d  t( pToken->dyn==
22e0: 30 20 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 73  0 );.    pNew->s
22f0: 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b 65  pan = pNew->toke
2300: 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 7d  n = *pToken;.  }
2310: 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74 20 29  else if( pLeft )
2320: 7b 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  {.    if( pRight
2330: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2340: 33 45 78 70 72 53 70 61 6e 28 70 4e 65 77 2c 20  3ExprSpan(pNew, 
2350: 26 70 4c 65 66 74 2d 3e 73 70 61 6e 2c 20 26 70  &pLeft->span, &p
2360: 52 69 67 68 74 2d 3e 73 70 61 6e 29 3b 0a 20 20  Right->span);.  
2370: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
2380: 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f  flags & EP_ExpCo
2390: 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20  llate ){.       
23a0: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
23b0: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20  EP_ExpCollate;. 
23c0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 43 6f         pNew->pCo
23d0: 6c 6c 20 3d 20 70 52 69 67 68 74 2d 3e 70 43 6f  ll = pRight->pCo
23e0: 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
23f0: 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d  }.    if( pLeft-
2400: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
2410: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20  ollate ){.      
2420: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  pNew->flags |= E
2430: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20  P_ExpCollate;.  
2440: 20 20 20 20 70 4e 65 77 2d 3e 70 43 6f 6c 6c 20      pNew->pColl 
2450: 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a  = pLeft->pColl;.
2460: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c      }.  }..  sql
2470: 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68  ite3ExprSetHeigh
2480: 74 28 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72  t(pNew);.  retur
2490: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
24a0: 20 57 6f 72 6b 73 20 6c 69 6b 65 20 73 71 6c 69   Works like sqli
24b0: 74 65 33 45 78 70 72 28 29 20 65 78 63 65 70 74  te3Expr() except
24c0: 20 74 68 61 74 20 69 74 20 74 61 6b 65 73 20 61   that it takes a
24d0: 6e 20 65 78 74 72 61 20 50 61 72 73 65 2a 0a 2a  n extra Parse*.*
24e0: 2a 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 6e  * argument and n
24f0: 6f 74 69 66 69 65 73 20 74 68 65 20 61 73 73 6f  otifies the asso
2500: 63 69 61 74 65 64 20 63 6f 6e 6e 65 63 74 69 6f  ciated connectio
2510: 6e 20 6f 62 6a 65 63 74 20 69 66 20 6d 61 6c 6c  n object if mall
2520: 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 45 78 70  oc fails..*/.Exp
2530: 72 20 2a 73 71 6c 69 74 65 33 50 45 78 70 72 28  r *sqlite3PExpr(
2540: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2550: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
2560: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
2570: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
2580: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
2590: 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20  pression opcode 
25a0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74  */.  Expr *pLeft
25b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
25c0: 4c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  Left operand */.
25d0: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20    Expr *pRight, 
25e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67            /* Rig
25f0: 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  ht operand */.  
2600: 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f  const Token *pTo
2610: 6b 65 6e 20 20 20 20 20 2f 2a 20 41 72 67 75 6d  ken     /* Argum
2620: 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a  ent token */.){.
2630: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2640: 45 78 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c  Expr(pParse->db,
2650: 20 6f 70 2c 20 70 4c 65 66 74 2c 20 70 52 69 67   op, pLeft, pRig
2660: 68 74 2c 20 70 54 6f 6b 65 6e 29 3b 0a 7d 0a 0a  ht, pToken);.}..
2670: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64 6f 69 6e 67  /*.** When doing
2680: 20 61 20 6e 65 73 74 65 64 20 70 61 72 73 65 2c   a nested parse,
2690: 20 79 6f 75 20 63 61 6e 20 69 6e 63 6c 75 64 65   you can include
26a0: 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 65 78 70   terms in an exp
26b0: 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 68 61 74 20  ression.** that 
26c0: 6c 6f 6f 6b 20 6c 69 6b 65 20 74 68 69 73 3a 20  look like this: 
26d0: 20 20 23 31 20 23 32 20 2e 2e 2e 20 20 54 68 65    #1 #2 ...  The
26e0: 73 65 20 74 65 72 6d 73 20 72 65 66 65 72 20 74  se terms refer t
26f0: 6f 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 69  o registers.** i
2700: 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  n the virtual ma
2710: 63 68 69 6e 65 2e 20 20 23 4e 20 69 73 20 74 68  chine.  #N is th
2720: 65 20 4e 2d 74 68 20 72 65 67 69 73 74 65 72 2e  e N-th register.
2730: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2740: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
2750: 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 64   the parser to d
2760: 65 61 6c 20 77 69 74 68 20 6f 6e 20 6f 66 20 74  eal with on of t
2770: 68 6f 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 49  hose terms..** I
2780: 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 67 65  t immediately ge
2790: 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20  nerates code to 
27a0: 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20  store the value 
27b0: 69 6e 20 61 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  in a memory loca
27c0: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 72 65 74  tion..** The ret
27d0: 75 72 6e 73 20 61 6e 20 65 78 70 72 65 73 73 69  urns an expressi
27e0: 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 63 6f 64  on that will cod
27f0: 65 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65  e to extract the
2800: 20 76 61 6c 75 65 20 66 72 6f 6d 0a 2a 2a 20 74   value from.** t
2810: 68 61 74 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  hat memory locat
2820: 69 6f 6e 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a  ion as needed..*
2830: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 52  /.Expr *sqlite3R
2840: 65 67 69 73 74 65 72 45 78 70 72 28 50 61 72 73  egisterExpr(Pars
2850: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
2860: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 56 64 62   *pToken){.  Vdb
2870: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
2880: 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70 3b  Vdbe;.  Expr *p;
2890: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
28a0: 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ested==0 ){.    
28b0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
28c0: 70 50 61 72 73 65 2c 20 22 6e 65 61 72 20 5c 22  pParse, "near \"
28d0: 25 54 5c 22 3a 20 73 79 6e 74 61 78 20 65 72 72  %T\": syntax err
28e0: 6f 72 22 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20  or", pToken);.  
28f0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2900: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
2910: 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20 30 29 3b  _NULL, 0, 0, 0);
2920: 0a 20 20 7d 0a 20 20 69 66 28 20 76 3d 3d 30 20  .  }.  if( v==0 
2930: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 20  ) return 0;.  p 
2940: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
2950: 50 61 72 73 65 2c 20 54 4b 5f 52 45 47 49 53 54  Parse, TK_REGIST
2960: 45 52 2c 20 30 2c 20 30 2c 20 70 54 6f 6b 65 6e  ER, 0, 0, pToken
2970: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  );.  if( p==0 ){
2980: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
2990: 2f 2a 20 4d 61 6c 6c 6f 63 20 66 61 69 6c 65 64  /* Malloc failed
29a0: 20 2a 2f 0a 20 20 7d 0a 20 20 70 2d 3e 69 54 61   */.  }.  p->iTa
29b0: 62 6c 65 20 3d 20 61 74 6f 69 28 28 63 68 61 72  ble = atoi((char
29c0: 2a 29 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d 29  *)&pToken->z[1])
29d0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  ;.  return p;.}.
29e0: 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f 20  ./*.** Join two 
29f0: 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73 69 6e  expressions usin
2a00: 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  g an AND operato
2a10: 72 2e 20 20 49 66 20 65 69 74 68 65 72 20 65 78  r.  If either ex
2a20: 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 4e  pression is.** N
2a30: 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74 20 72  ULL, then just r
2a40: 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65 72 20  eturn the other 
2a50: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 45  expression..*/.E
2a60: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
2a70: 41 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  And(sqlite3 *db,
2a80: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78   Expr *pLeft, Ex
2a90: 70 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69  pr *pRight){.  i
2aa0: 66 28 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20  f( pLeft==0 ){. 
2ab0: 20 20 20 72 65 74 75 72 6e 20 70 52 69 67 68 74     return pRight
2ac0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52  ;.  }else if( pR
2ad0: 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ight==0 ){.    r
2ae0: 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d  eturn pLeft;.  }
2af0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
2b00: 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
2b10: 20 54 4b 5f 41 4e 44 2c 20 70 4c 65 66 74 2c 20   TK_AND, pLeft, 
2b20: 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 7d 0a  pRight, 0);.  }.
2b30: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
2b40: 20 45 78 70 72 2e 73 70 61 6e 20 66 69 65 6c 64   Expr.span field
2b50: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   of the given ex
2b60: 70 72 65 73 73 69 6f 6e 20 74 6f 20 73 70 61 6e  pression to span
2b70: 20 61 6c 6c 0a 2a 2a 20 74 65 78 74 20 62 65 74   all.** text bet
2b80: 77 65 65 6e 20 74 68 65 20 74 77 6f 20 67 69 76  ween the two giv
2b90: 65 6e 20 74 6f 6b 65 6e 73 2e 0a 2a 2f 0a 76 6f  en tokens..*/.vo
2ba0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53 70  id sqlite3ExprSp
2bb0: 61 6e 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20  an(Expr *pExpr, 
2bc0: 54 6f 6b 65 6e 20 2a 70 4c 65 66 74 2c 20 54 6f  Token *pLeft, To
2bd0: 6b 65 6e 20 2a 70 52 69 67 68 74 29 7b 0a 20 20  ken *pRight){.  
2be0: 61 73 73 65 72 74 28 20 70 52 69 67 68 74 21 3d  assert( pRight!=
2bf0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
2c00: 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 69 66 28  Left!=0 );.  if(
2c10: 20 70 45 78 70 72 20 26 26 20 70 52 69 67 68 74   pExpr && pRight
2c20: 2d 3e 7a 20 26 26 20 70 4c 65 66 74 2d 3e 7a 20  ->z && pLeft->z 
2c30: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2c40: 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30 20 7c 7c 20  Left->dyn==0 || 
2c50: 70 4c 65 66 74 2d 3e 7a 5b 70 4c 65 66 74 2d 3e  pLeft->z[pLeft->
2c60: 6e 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  n]==0 );.    if(
2c70: 20 70 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30 20 26   pLeft->dyn==0 &
2c80: 26 20 70 52 69 67 68 74 2d 3e 64 79 6e 3d 3d 30  & pRight->dyn==0
2c90: 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   ){.      pExpr-
2ca0: 3e 73 70 61 6e 2e 7a 20 3d 20 70 4c 65 66 74 2d  >span.z = pLeft-
2cb0: 3e 7a 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  >z;.      pExpr-
2cc0: 3e 73 70 61 6e 2e 6e 20 3d 20 70 52 69 67 68 74  >span.n = pRight
2cd0: 2d 3e 6e 20 2b 20 28 70 52 69 67 68 74 2d 3e 7a  ->n + (pRight->z
2ce0: 20 2d 20 70 4c 65 66 74 2d 3e 7a 29 3b 0a 20 20   - pLeft->z);.  
2cf0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
2d00: 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 20 3d 20 30  Expr->span.z = 0
2d10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
2d20: 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61  *.** Construct a
2d30: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
2d40: 6e 6f 64 65 20 66 6f 72 20 61 20 66 75 6e 63 74  node for a funct
2d50: 69 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69 70 6c  ion with multipl
2d60: 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a  e.** arguments..
2d70: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
2d80: 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 50 61 72  ExprFunction(Par
2d90: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
2da0: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b  List *pList, Tok
2db0: 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45  en *pToken){.  E
2dc0: 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 61 73 73  xpr *pNew;.  ass
2dd0: 65 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b 0a 20  ert( pToken );. 
2de0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
2df0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72  bMallocZero(pPar
2e00: 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 45  se->db, sizeof(E
2e10: 78 70 72 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  xpr) );.  if( pN
2e20: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ew==0 ){.    sql
2e30: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
2e40: 74 65 28 70 4c 69 73 74 29 3b 20 2f 2a 20 41 76  te(pList); /* Av
2e50: 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f  oid leaking memo
2e60: 72 79 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20 66  ry when malloc f
2e70: 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74 75  ails */.    retu
2e80: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77  rn 0;.  }.  pNew
2e90: 2d 3e 6f 70 20 3d 20 54 4b 5f 46 55 4e 43 54 49  ->op = TK_FUNCTI
2ea0: 4f 4e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 73  ON;.  pNew->pLis
2eb0: 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73 73  t = pList;.  ass
2ec0: 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e  ert( pToken->dyn
2ed0: 3d 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 74  ==0 );.  pNew->t
2ee0: 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a  oken = *pToken;.
2ef0: 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20 70    pNew->span = p
2f00: 4e 65 77 2d 3e 74 6f 6b 65 6e 3b 0a 0a 20 20 73  New->token;..  s
2f10: 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69  qlite3ExprSetHei
2f20: 67 68 74 28 70 4e 65 77 29 3b 0a 20 20 72 65 74  ght(pNew);.  ret
2f30: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
2f40: 2a 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72 69  ** Assign a vari
2f50: 61 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20 61  able number to a
2f60: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  n expression tha
2f70: 74 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c 64  t encodes a wild
2f80: 63 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f  card.** in the o
2f90: 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74  riginal SQL stat
2fa0: 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57  ement.  .**.** W
2fb0: 69 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73 74  ildcards consist
2fc0: 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ing of a single 
2fd0: 22 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65 64  "?" are assigned
2fe0: 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e   the next sequen
2ff0: 74 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65  tial.** variable
3000: 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57   number..**.** W
3010: 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20  ildcards of the 
3020: 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20  form "?nnn" are 
3030: 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75 6d  assigned the num
3040: 62 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d  ber "nnn".  We m
3050: 61 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e  ake.** sure "nnn
3060: 22 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65 20  " is not too be 
3070: 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69 61  to avoid a denia
3080: 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61 74 74  l of service att
3090: 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ack when.** the 
30a0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63 6f  SQL statement co
30b0: 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74 65  mes from an exte
30c0: 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a  rnal source..**.
30d0: 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20  ** Wildcards of 
30e0: 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 20  the form ":aaa" 
30f0: 6f 72 20 22 24 61 61 61 22 20 61 72 65 20 61 73  or "$aaa" are as
3100: 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d 65 20  signed the same 
3110: 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68 65  number.** as the
3120: 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61 6e   previous instan
3130: 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 77  ce of the same w
3140: 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69 66 20  ildcard.  Or if 
3150: 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
3160: 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66  t.** instance of
3170: 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c 20 74   the wildcard, t
3180: 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 69 61  he next sequenia
3190: 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  l variable numbe
31a0: 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65 64  r is.** assigned
31b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
31c0: 33 45 78 70 72 41 73 73 69 67 6e 56 61 72 4e 75  3ExprAssignVarNu
31d0: 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50 61 72  mber(Parse *pPar
31e0: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
31f0: 7b 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  {.  Token *pToke
3200: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  n;.  sqlite3 *db
3210: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
3220: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
3230: 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 6f 6b 65   return;.  pToke
3240: 6e 20 3d 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65  n = &pExpr->toke
3250: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f  n;.  assert( pTo
3260: 6b 65 6e 2d 3e 6e 3e 3d 31 20 29 3b 0a 20 20 61  ken->n>=1 );.  a
3270: 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a  ssert( pToken->z
3280: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
3290: 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 21 3d 30   pToken->z[0]!=0
32a0: 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e   );.  if( pToken
32b0: 2d 3e 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a  ->n==1 ){.    /*
32c0: 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65   Wildcard of the
32d0: 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73 69   form "?".  Assi
32e0: 67 6e 20 74 68 65 20 6e 65 78 74 20 76 61 72 69  gn the next vari
32f0: 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  able number */. 
3300: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
3310: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61   = ++pParse->nVa
3320: 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  r;.  }else if( p
3330: 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 3f 27  Token->z[0]=='?'
3340: 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63   ){.    /* Wildc
3350: 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ard of the form 
3360: 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74  "?nnn".  Convert
3370: 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74   "nnn" to an int
3380: 65 67 65 72 20 61 6e 64 0a 20 20 20 20 2a 2a 20  eger and.    ** 
3390: 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76 61  use it as the va
33a0: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f  riable number */
33b0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
33c0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
33d0: 69 20 3d 20 61 74 6f 69 28 28 63 68 61 72 2a 29  i = atoi((char*)
33e0: 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d 29 3b 0a  &pToken->z[1]);.
33f0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d      testcase( i=
3400: 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  =0 );.    testca
3410: 73 65 28 20 69 3d 3d 31 20 29 3b 0a 20 20 20 20  se( i==1 );.    
3420: 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d  testcase( i==db-
3430: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
3440: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
3450: 4d 42 45 52 5d 2d 31 20 29 3b 0a 20 20 20 20 74  MBER]-1 );.    t
3460: 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e  estcase( i==db->
3470: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
3480: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
3490: 42 45 52 5d 20 29 3b 0a 20 20 20 20 69 66 28 20  BER] );.    if( 
34a0: 69 3c 31 20 7c 7c 20 69 3e 64 62 2d 3e 61 4c 69  i<1 || i>db->aLi
34b0: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
34c0: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
34d0: 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ] ){.      sqlit
34e0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
34f0: 65 2c 20 22 76 61 72 69 61 62 6c 65 20 6e 75 6d  e, "variable num
3500: 62 65 72 20 6d 75 73 74 20 62 65 20 62 65 74 77  ber must be betw
3510: 65 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c  een ?1 and ?%d",
3520: 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61  .          db->a
3530: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
3540: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
3550: 45 52 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ER]);.    }.    
3560: 69 66 28 20 69 3e 70 50 61 72 73 65 2d 3e 6e 56  if( i>pParse->nV
3570: 61 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  ar ){.      pPar
3580: 73 65 2d 3e 6e 56 61 72 20 3d 20 69 3b 0a 20 20  se->nVar = i;.  
3590: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
35a0: 20 2f 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66   /* Wildcards of
35b0: 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22   the form ":aaa"
35c0: 20 6f 72 20 22 24 61 61 61 22 2e 20 20 52 65 75   or "$aaa".  Reu
35d0: 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72 69  se the same vari
35e0: 61 62 6c 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62  able.    ** numb
35f0: 65 72 20 61 73 20 74 68 65 20 70 72 69 6f 72 20  er as the prior 
3600: 61 70 70 65 61 72 61 6e 63 65 20 6f 66 20 74 68  appearance of th
3610: 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20  e same name, or 
3620: 69 66 20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20  if the name.    
3630: 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70 70  ** has never app
3640: 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72 65  eared before, re
3650: 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72  use the same var
3660: 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20  iable number.   
3670: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e   */.    int i, n
3680: 3b 0a 20 20 20 20 6e 20 3d 20 70 54 6f 6b 65 6e  ;.    n = pToken
3690: 2d 3e 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ->n;.    for(i=0
36a0: 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 61 72  ; i<pParse->nVar
36b0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
36c0: 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20    Expr *pE;.    
36d0: 20 20 69 66 28 20 28 70 45 20 3d 20 70 50 61 72    if( (pE = pPar
36e0: 73 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 69 5d  se->apVarExpr[i]
36f0: 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26  )!=0.          &
3700: 26 20 70 45 2d 3e 74 6f 6b 65 6e 2e 6e 3d 3d 6e  & pE->token.n==n
3710: 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 6d 65  .          && me
3720: 6d 63 6d 70 28 70 45 2d 3e 74 6f 6b 65 6e 2e 7a  mcmp(pE->token.z
3730: 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 6e 29 3d  , pToken->z, n)=
3740: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45  =0 ){.        pE
3750: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45  xpr->iTable = pE
3760: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
3770: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
3780: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
3790: 3e 3d 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78  >=pParse->nVarEx
37a0: 70 72 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70  pr ){.      pExp
37b0: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2b 2b 70 50  r->iTable = ++pP
37c0: 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 20 20  arse->nVar;.    
37d0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 56    if( pParse->nV
37e0: 61 72 45 78 70 72 3e 3d 70 50 61 72 73 65 2d 3e  arExpr>=pParse->
37f0: 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 2d 31 20  nVarExprAlloc-1 
3800: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  ){.        pPars
3810: 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63  e->nVarExprAlloc
3820: 20 2b 3d 20 70 50 61 72 73 65 2d 3e 6e 56 61 72   += pParse->nVar
3830: 45 78 70 72 41 6c 6c 6f 63 20 2b 20 31 30 3b 0a  ExprAlloc + 10;.
3840: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
3850: 61 70 56 61 72 45 78 70 72 20 3d 0a 20 20 20 20  apVarExpr =.    
3860: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
3870: 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 0a  bReallocOrFree(.
3880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 62                db
3890: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
38a0: 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70  pParse->apVarExp
38b0: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
38c0: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70   pParse->nVarExp
38d0: 72 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 50  rAlloc*sizeof(pP
38e0: 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 5b  arse->apVarExpr[
38f0: 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  0]).            
3900: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
3910: 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
3920: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
3930: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
3940: 2d 3e 61 70 56 61 72 45 78 70 72 21 3d 30 20 29  ->apVarExpr!=0 )
3950: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
3960: 2d 3e 61 70 56 61 72 45 78 70 72 5b 70 50 61 72  ->apVarExpr[pPar
3970: 73 65 2d 3e 6e 56 61 72 45 78 70 72 2b 2b 5d 20  se->nVarExpr++] 
3980: 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 7d  = pExpr;.      }
3990: 0a 20 20 20 20 7d 0a 20 20 7d 20 0a 20 20 69 66  .    }.  } .  if
39a0: 28 20 21 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  ( !pParse->nErr 
39b0: 26 26 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e  && pParse->nVar>
39c0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
39d0: 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
39e0: 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20  _NUMBER] ){.    
39f0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
3a00: 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
3a10: 79 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73 22  y SQL variables"
3a20: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
3a30: 52 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65  Recursively dele
3a40: 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  te an expression
3a50: 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   tree..*/.void s
3a60: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
3a70: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28  (Expr *p){.  if(
3a80: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
3a90: 20 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 64 79    if( p->span.dy
3aa0: 6e 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  n ) sqlite3_free
3ab0: 28 28 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e 2e  ((char*)p->span.
3ac0: 7a 29 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b  z);.  if( p->tok
3ad0: 65 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74 65 33  en.dyn ) sqlite3
3ae0: 5f 66 72 65 65 28 28 63 68 61 72 2a 29 70 2d 3e  _free((char*)p->
3af0: 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 73 71 6c 69  token.z);.  sqli
3b00: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d  te3ExprDelete(p-
3b10: 3e 70 4c 65 66 74 29 3b 0a 20 20 73 71 6c 69 74  >pLeft);.  sqlit
3b20: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e  e3ExprDelete(p->
3b30: 70 52 69 67 68 74 29 3b 0a 20 20 73 71 6c 69 74  pRight);.  sqlit
3b40: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
3b50: 28 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 73 71  (p->pList);.  sq
3b60: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
3b70: 65 28 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  e(p->pSelect);. 
3b80: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
3b90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 45  ;.}../*.** The E
3ba0: 78 70 72 2e 74 6f 6b 65 6e 20 66 69 65 6c 64 20  xpr.token field 
3bb0: 6d 69 67 68 74 20 62 65 20 61 20 73 74 72 69 6e  might be a strin
3bc0: 67 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 69  g literal that i
3bd0: 73 20 71 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20  s quoted..** If 
3be0: 73 6f 2c 20 72 65 6d 6f 76 65 20 74 68 65 20 71  so, remove the q
3bf0: 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b 73 2e 0a  uotation marks..
3c00: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
3c10: 65 71 75 6f 74 65 45 78 70 72 28 73 71 6c 69 74  equoteExpr(sqlit
3c20: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29  e3 *db, Expr *p)
3c30: 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 41  {.  if( ExprHasA
3c40: 6e 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  nyProperty(p, EP
3c50: 5f 44 65 71 75 6f 74 65 64 29 20 29 7b 0a 20 20  _Dequoted) ){.  
3c60: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
3c70: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
3c80: 70 2c 20 45 50 5f 44 65 71 75 6f 74 65 64 29 3b  p, EP_Dequoted);
3c90: 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e  .  if( p->token.
3ca0: 64 79 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  dyn==0 ){.    sq
3cb0: 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 64  lite3TokenCopy(d
3cc0: 62 2c 20 26 70 2d 3e 74 6f 6b 65 6e 2c 20 26 70  b, &p->token, &p
3cd0: 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20  ->token);.  }.  
3ce0: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 28  sqlite3Dequote((
3cf0: 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a  char*)p->token.z
3d00: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  );.}.../*.** The
3d10: 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70   following group
3d20: 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b   of routines mak
3d30: 65 20 64 65 65 70 20 63 6f 70 69 65 73 20 6f 66  e deep copies of
3d40: 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a   expressions,.**
3d50: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
3d60: 73 2c 20 49 44 20 6c 69 73 74 73 2c 20 61 6e 64  s, ID lists, and
3d70: 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
3d80: 74 73 2e 20 20 54 68 65 20 63 6f 70 69 65 73 20  ts.  The copies 
3d90: 63 61 6e 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65  can.** be delete
3da0: 64 20 28 62 79 20 62 65 69 6e 67 20 70 61 73 73  d (by being pass
3db0: 65 64 20 74 6f 20 74 68 65 69 72 20 72 65 73 70  ed to their resp
3dc0: 65 63 74 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65  ective ...Delete
3dd0: 28 29 20 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20  () routines).** 
3de0: 77 69 74 68 6f 75 74 20 65 66 66 65 63 74 69 6e  without effectin
3df0: 67 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e  g the originals.
3e00: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65  .**.** The expre
3e10: 73 73 69 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20  ssion list, ID, 
3e20: 61 6e 64 20 73 6f 75 72 63 65 20 6c 69 73 74 73  and source lists
3e30: 20 72 65 74 75 72 6e 20 62 79 20 73 71 6c 69 74   return by sqlit
3e40: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 29 2c  e3ExprListDup(),
3e50: 0a 2a 2a 20 73 71 6c 69 74 65 33 49 64 4c 69 73  .** sqlite3IdLis
3e60: 74 44 75 70 28 29 2c 20 61 6e 64 20 73 71 6c 69  tDup(), and sqli
3e70: 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 29 20  te3SrcListDup() 
3e80: 63 61 6e 20 6e 6f 74 20 62 65 20 66 75 72 74 68  can not be furth
3e90: 65 72 20 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20  er expanded .** 
3ea0: 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  by subsequent ca
3eb0: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69  lls to sqlite*Li
3ec0: 73 74 41 70 70 65 6e 64 28 29 20 72 6f 75 74 69  stAppend() routi
3ed0: 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74  nes..**.** Any t
3ee0: 61 62 6c 65 73 20 74 68 61 74 20 74 68 65 20 53  ables that the S
3ef0: 72 63 4c 69 73 74 20 6d 69 67 68 74 20 70 6f 69  rcList might poi
3f00: 6e 74 20 74 6f 20 61 72 65 20 6e 6f 74 20 64 75  nt to are not du
3f10: 70 6c 69 63 61 74 65 64 2e 0a 2a 2f 0a 45 78 70  plicated..*/.Exp
3f20: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 44 75  r *sqlite3ExprDu
3f30: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  p(sqlite3 *db, E
3f40: 78 70 72 20 2a 70 29 7b 0a 20 20 45 78 70 72 20  xpr *p){.  Expr 
3f50: 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d 3d  *pNew;.  if( p==
3f60: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
3f70: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
3f80: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
3f90: 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66  zeof(*p) );.  if
3fa0: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
3fb0: 72 6e 20 30 3b 0a 20 20 6d 65 6d 63 70 79 28 70  rn 0;.  memcpy(p
3fc0: 4e 65 77 2c 20 70 2c 20 73 69 7a 65 6f 66 28 2a  New, p, sizeof(*
3fd0: 70 4e 65 77 29 29 3b 0a 20 20 69 66 28 20 70 2d  pNew));.  if( p-
3fe0: 3e 74 6f 6b 65 6e 2e 7a 21 3d 30 20 29 7b 0a 20  >token.z!=0 ){. 
3ff0: 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a     pNew->token.z
4000: 20 3d 20 28 75 38 2a 29 73 71 6c 69 74 65 33 44   = (u8*)sqlite3D
4010: 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68  bStrNDup(db, (ch
4020: 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  ar*)p->token.z, 
4030: 70 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20  p->token.n);.   
4040: 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 64 79 6e   pNew->token.dyn
4050: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
4060: 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
4070: 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 3b 0a 20  >token.z==0 );. 
4080: 20 7d 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e 2e   }.  pNew->span.
4090: 7a 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70  z = 0;.  pNew->p
40a0: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
40b0: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65  prDup(db, p->pLe
40c0: 66 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69  ft);.  pNew->pRi
40d0: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
40e0: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67  rDup(db, p->pRig
40f0: 68 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  ht);.  pNew->pLi
4100: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
4110: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
4120: 4c 69 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  List);.  pNew->p
4130: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
4140: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d  SelectDup(db, p-
4150: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 72 65 74  >pSelect);.  ret
4160: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 76 6f 69 64  urn pNew;.}.void
4170: 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70   sqlite3TokenCop
4180: 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54  y(sqlite3 *db, T
4190: 6f 6b 65 6e 20 2a 70 54 6f 2c 20 54 6f 6b 65 6e  oken *pTo, Token
41a0: 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20   *pFrom){.  if( 
41b0: 70 54 6f 2d 3e 64 79 6e 20 29 20 73 71 6c 69 74  pTo->dyn ) sqlit
41c0: 65 33 5f 66 72 65 65 28 28 63 68 61 72 2a 29 70  e3_free((char*)p
41d0: 54 6f 2d 3e 7a 29 3b 0a 20 20 69 66 28 20 70 46  To->z);.  if( pF
41e0: 72 6f 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 70 54  rom->z ){.    pT
41f0: 6f 2d 3e 6e 20 3d 20 70 46 72 6f 6d 2d 3e 6e 3b  o->n = pFrom->n;
4200: 0a 20 20 20 20 70 54 6f 2d 3e 7a 20 3d 20 28 75  .    pTo->z = (u
4210: 38 2a 29 73 71 6c 69 74 65 33 44 62 53 74 72 4e  8*)sqlite3DbStrN
4220: 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70  Dup(db, (char*)p
4230: 46 72 6f 6d 2d 3e 7a 2c 20 70 46 72 6f 6d 2d 3e  From->z, pFrom->
4240: 6e 29 3b 0a 20 20 20 20 70 54 6f 2d 3e 64 79 6e  n);.    pTo->dyn
4250: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
4260: 20 20 20 70 54 6f 2d 3e 7a 20 3d 20 30 3b 0a 20     pTo->z = 0;. 
4270: 20 7d 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73   }.}.ExprList *s
4280: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
4290: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  p(sqlite3 *db, E
42a0: 78 70 72 4c 69 73 74 20 2a 70 29 7b 0a 20 20 45  xprList *p){.  E
42b0: 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  xprList *pNew;. 
42c0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
42d0: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70  _item *pItem, *p
42e0: 4f 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69  OldItem;.  int i
42f0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
4300: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20  eturn 0;.  pNew 
4310: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
4320: 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
4330: 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20  *pNew) );.  if( 
4340: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
4350: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 45 43 75   0;.  pNew->iECu
4360: 72 73 6f 72 20 3d 20 30 3b 0a 20 20 70 4e 65 77  rsor = 0;.  pNew
4370: 2d 3e 6e 45 78 70 72 20 3d 20 70 4e 65 77 2d 3e  ->nExpr = pNew->
4380: 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 45 78 70  nAlloc = p->nExp
4390: 72 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 70  r;.  pNew->a = p
43a0: 49 74 65 6d 20 3d 20 73 71 6c 69 74 65 33 44 62  Item = sqlite3Db
43b0: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 20 70  MallocRaw(db,  p
43c0: 2d 3e 6e 45 78 70 72 2a 73 69 7a 65 6f 66 28 70  ->nExpr*sizeof(p
43d0: 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28  ->a[0]) );.  if(
43e0: 20 70 49 74 65 6d 3d 3d 30 20 29 7b 0a 20 20 20   pItem==0 ){.   
43f0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
4400: 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ew);.    return 
4410: 30 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49 74  0;.  } .  pOldIt
4420: 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72  em = p->a;.  for
4430: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72  (i=0; i<p->nExpr
4440: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20  ; i++, pItem++, 
4450: 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  pOldItem++){.   
4460: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 2c   Expr *pNewExpr,
4470: 20 2a 70 4f 6c 64 45 78 70 72 3b 0a 20 20 20 20   *pOldExpr;.    
4480: 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70  pItem->pExpr = p
4490: 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65  NewExpr = sqlite
44a0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c  3ExprDup(db, pOl
44b0: 64 45 78 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d  dExpr = pOldItem
44c0: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ->pExpr);.    if
44d0: 28 20 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e  ( pOldExpr->span
44e0: 2e 7a 21 3d 30 20 26 26 20 70 4e 65 77 45 78 70  .z!=0 && pNewExp
44f0: 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c  r ){.      /* Al
4500: 77 61 79 73 20 6d 61 6b 65 20 61 20 63 6f 70 79  ways make a copy
4510: 20 6f 66 20 74 68 65 20 73 70 61 6e 20 66 6f 72   of the span for
4520: 20 74 6f 70 2d 6c 65 76 65 6c 20 65 78 70 72 65   top-level expre
4530: 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 0a 20 20  ssions in the.  
4540: 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
4550: 6e 20 6c 69 73 74 2e 20 20 54 68 65 20 6c 6f 67  n list.  The log
4560: 69 63 20 69 6e 20 53 45 4c 45 43 54 20 70 72 6f  ic in SELECT pro
4570: 63 65 73 73 69 6e 67 20 74 68 61 74 20 64 65 74  cessing that det
4580: 65 72 6d 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a  ermines.      **
4590: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f   the names of co
45a0: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73  lumns in the res
45b0: 75 6c 74 20 73 65 74 20 6e 65 65 64 73 20 74 68  ult set needs th
45c0: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  is information *
45d0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  /.      sqlite3T
45e0: 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70 4e  okenCopy(db, &pN
45f0: 65 77 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70  ewExpr->span, &p
4600: 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a  OldExpr->span);.
4610: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
4620: 28 20 70 4e 65 77 45 78 70 72 3d 3d 30 20 7c 7c  ( pNewExpr==0 ||
4630: 20 70 4e 65 77 45 78 70 72 2d 3e 73 70 61 6e 2e   pNewExpr->span.
4640: 7a 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  z!=0 .          
4650: 20 20 7c 7c 20 70 4f 6c 64 45 78 70 72 2d 3e 73    || pOldExpr->s
4660: 70 61 6e 2e 7a 3d 3d 30 0a 20 20 20 20 20 20 20  pan.z==0.       
4670: 20 20 20 20 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c       || db->mall
4680: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
4690: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
46a0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
46b0: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  b, pOldItem->zNa
46c0: 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  me);.    pItem->
46d0: 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c 64  sortOrder = pOld
46e0: 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b  Item->sortOrder;
46f0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 69 73 41 67  .    pItem->isAg
4700: 67 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 73  g = pOldItem->is
4710: 41 67 67 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  Agg;.    pItem->
4720: 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  done = 0;.  }.  
4730: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
4740: 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 73  /*.** If cursors
4750: 2c 20 74 72 69 67 67 65 72 73 2c 20 76 69 65 77  , triggers, view
4760: 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73  s and subqueries
4770: 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65 64   are all omitted
4780: 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75 69   from.** the bui
4790: 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f 66  ld, then none of
47a0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   the following r
47b0: 6f 75 74 69 6e 65 73 2c 20 65 78 63 65 70 74 20  outines, except 
47c0: 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33 53  for .** sqlite3S
47d0: 65 6c 65 63 74 44 75 70 28 29 2c 20 63 61 6e 20  electDup(), can 
47e0: 62 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69 74  be called. sqlit
47f0: 65 33 53 65 6c 65 63 74 44 75 70 28 29 20 69 73  e3SelectDup() is
4800: 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63 61   sometimes.** ca
4810: 6c 6c 65 64 20 77 69 74 68 20 61 20 4e 55 4c 4c  lled with a NULL
4820: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69   argument..*/.#i
4830: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
4840: 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
4850: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
4860: 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 5c 0a  OMIT_TRIGGER) \.
4870: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
4880: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
4890: 59 29 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  Y).SrcList *sqli
48a0: 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 73 71  te3SrcListDup(sq
48b0: 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c 69  lite3 *db, SrcLi
48c0: 73 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73  st *p){.  SrcLis
48d0: 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69  t *pNew;.  int i
48e0: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
48f0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
4900: 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20  rn 0;.  nByte = 
4910: 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d  sizeof(*p) + (p-
4920: 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66  >nSrc>0 ? sizeof
4930: 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e  (p->a[0]) * (p->
4940: 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20  nSrc-1) : 0);.  
4950: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
4960: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 6e 42  MallocRaw(db, nB
4970: 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  yte );.  if( pNe
4980: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
4990: 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d 20  .  pNew->nSrc = 
49a0: 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70  pNew->nAlloc = p
49b0: 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d  ->nSrc;.  for(i=
49c0: 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b  0; i<p->nSrc; i+
49d0: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
49e0: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65  rcList_item *pNe
49f0: 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61  wItem = &pNew->a
4a00: 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20  [i];.    struct 
4a10: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f  SrcList_item *pO
4a20: 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69  ldItem = &p->a[i
4a30: 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ];.    Table *pT
4a40: 61 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  ab;.    pNewItem
4a50: 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71  ->zDatabase = sq
4a60: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
4a70: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74  , pOldItem->zDat
4a80: 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65 77  abase);.    pNew
4a90: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
4aa0: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
4ab0: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d  , pOldItem->zNam
4ac0: 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  e);.    pNewItem
4ad0: 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74  ->zAlias = sqlit
4ae0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
4af0: 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  OldItem->zAlias)
4b00: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
4b10: 6a 6f 69 6e 74 79 70 65 20 3d 20 70 4f 6c 64 49  jointype = pOldI
4b20: 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20  tem->jointype;. 
4b30: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43 75     pNewItem->iCu
4b40: 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  rsor = pOldItem-
4b50: 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 4e  >iCursor;.    pN
4b60: 65 77 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61  ewItem->isPopula
4b70: 74 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  ted = pOldItem->
4b80: 69 73 50 6f 70 75 6c 61 74 65 64 3b 0a 20 20 20  isPopulated;.   
4b90: 20 70 54 61 62 20 3d 20 70 4e 65 77 49 74 65 6d   pTab = pNewItem
4ba0: 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49 74 65  ->pTab = pOldIte
4bb0: 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28  m->pTab;.    if(
4bc0: 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70   pTab ){.      p
4bd0: 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  Tab->nRef++;.   
4be0: 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d   }.    pNewItem-
4bf0: 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
4c00: 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
4c10: 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63  pOldItem->pSelec
4c20: 74 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  t);.    pNewItem
4c30: 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45  ->pOn = sqlite3E
4c40: 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  xprDup(db, pOldI
4c50: 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 70  tem->pOn);.    p
4c60: 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20  NewItem->pUsing 
4c70: 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44  = sqlite3IdListD
4c80: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
4c90: 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e  >pUsing);.    pN
4ca0: 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20  ewItem->colUsed 
4cb0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55  = pOldItem->colU
4cc0: 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  sed;.  }.  retur
4cd0: 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74  n pNew;.}.IdList
4ce0: 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44   *sqlite3IdListD
4cf0: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
4d00: 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64  IdList *p){.  Id
4d10: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  List *pNew;.  in
4d20: 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  t i;.  if( p==0 
4d30: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
4d40: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
4d50: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
4d60: 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69  of(*pNew) );.  i
4d70: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
4d80: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  urn 0;.  pNew->n
4d90: 49 64 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f  Id = pNew->nAllo
4da0: 63 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e  c = p->nId;.  pN
4db0: 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44  ew->a = sqlite3D
4dc0: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 70  bMallocRaw(db, p
4dd0: 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e  ->nId*sizeof(p->
4de0: 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70  a[0]) );.  if( p
4df0: 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20  New->a==0 ){.   
4e00: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
4e10: 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ew);.    return 
4e20: 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  0;.  }.  for(i=0
4e30: 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29  ; i<p->nId; i++)
4e40: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  {.    struct IdL
4e50: 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74  ist_item *pNewIt
4e60: 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d  em = &pNew->a[i]
4e70: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  ;.    struct IdL
4e80: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74  ist_item *pOldIt
4e90: 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  em = &p->a[i];. 
4ea0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
4eb0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
4ec0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
4ed0: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
4ee0: 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70  NewItem->idx = p
4ef0: 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20  OldItem->idx;.  
4f00: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
4f10: 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74  .}.Select *sqlit
4f20: 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69  e3SelectDup(sqli
4f30: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
4f40: 2a 70 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  *p){.  Select *p
4f50: 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  New;.  if( p==0 
4f60: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
4f70: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
4f80: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
4f90: 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20  of(*p) );.  if( 
4fa0: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
4fb0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 44 69   0;.  pNew->isDi
4fc0: 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69  stinct = p->isDi
4fd0: 73 74 69 6e 63 74 3b 0a 20 20 70 4e 65 77 2d 3e  stinct;.  pNew->
4fe0: 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  pEList = sqlite3
4ff0: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
5000: 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70 4e  p->pEList);.  pN
5010: 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74  ew->pSrc = sqlit
5020: 65 33 53 72 63 4c 69 73 74 44 75 70 28 64 62 2c  e3SrcListDup(db,
5030: 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 70 4e 65   p->pSrc);.  pNe
5040: 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  w->pWhere = sqli
5050: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
5060: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 70 4e 65  ->pWhere);.  pNe
5070: 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  w->pGroupBy = sq
5080: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
5090: 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  (db, p->pGroupBy
50a0: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69  );.  pNew->pHavi
50b0: 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ng = sqlite3Expr
50c0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 48 61 76 69  Dup(db, p->pHavi
50d0: 6e 67 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72  ng);.  pNew->pOr
50e0: 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45  derBy = sqlite3E
50f0: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
5100: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 70  ->pOrderBy);.  p
5110: 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b  New->op = p->op;
5120: 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20  .  pNew->pPrior 
5130: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
5140: 75 70 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72  up(db, p->pPrior
5150: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69  );.  pNew->pLimi
5160: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
5170: 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74  up(db, p->pLimit
5180: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73  );.  pNew->pOffs
5190: 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  et = sqlite3Expr
51a0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73  Dup(db, p->pOffs
51b0: 65 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69  et);.  pNew->iLi
51c0: 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  mit = -1;.  pNew
51d0: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b 0a  ->iOffset = -1;.
51e0: 20 20 70 4e 65 77 2d 3e 69 73 52 65 73 6f 6c 76    pNew->isResolv
51f0: 65 64 20 3d 20 70 2d 3e 69 73 52 65 73 6f 6c 76  ed = p->isResolv
5200: 65 64 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 41 67  ed;.  pNew->isAg
5210: 67 20 3d 20 70 2d 3e 69 73 41 67 67 3b 0a 20 20  g = p->isAgg;.  
5220: 70 4e 65 77 2d 3e 75 73 65 73 45 70 68 6d 20 3d  pNew->usesEphm =
5230: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 64 69 73 61   0;.  pNew->disa
5240: 6c 6c 6f 77 4f 72 64 65 72 42 79 20 3d 20 30 3b  llowOrderBy = 0;
5250: 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 6d  .  pNew->pRightm
5260: 6f 73 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ost = 0;.  pNew-
5270: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
5280: 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61   = -1;.  pNew->a
5290: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d  ddrOpenEphm[1] =
52a0: 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64   -1;.  pNew->add
52b0: 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d  rOpenEphm[2] = -
52c0: 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  1;.  return pNew
52d0: 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74  ;.}.#else.Select
52e0: 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44   *sqlite3SelectD
52f0: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
5300: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 61 73  Select *p){.  as
5310: 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20  sert( p==0 );.  
5320: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
5330: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  if.../*.** Add a
5340: 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
5350: 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20 65 78  the end of an ex
5360: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20  pression list.  
5370: 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69  If pList is.** i
5380: 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74  nitially NULL, t
5390: 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77  hen create a new
53a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
53b0: 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73  ..*/.ExprList *s
53c0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
53d0: 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a 70  pend(.  Parse *p
53e0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
53f0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
5400: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
5410: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
5420: 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68  /* List to which
5430: 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68   to append. Migh
5440: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  t be NULL */.  E
5450: 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
5460: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
5470: 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e  sion to be appen
5480: 64 65 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ded */.  Token *
5490: 70 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20  pName           
54a0: 20 2f 2a 20 41 53 20 6b 65 79 77 6f 72 64 20 66   /* AS keyword f
54b0: 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  or the expressio
54c0: 6e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  n */.){.  sqlite
54d0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
54e0: 64 62 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  db;.  if( pList=
54f0: 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
5500: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
5510: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
5520: 28 45 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20  (ExprList) );.  
5530: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
5540: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f  {.      goto no_
5550: 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  mem;.    }.    a
5560: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 41  ssert( pList->nA
5570: 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20  lloc==0 );.  }. 
5580: 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c   if( pList->nAll
5590: 6f 63 3c 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72  oc<=pList->nExpr
55a0: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
55b0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b  xprList_item *a;
55c0: 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c 69  .    int n = pLi
55d0: 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 34  st->nAlloc*2 + 4
55e0: 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65  ;.    a = sqlite
55f0: 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70  3DbRealloc(db, p
5600: 4c 69 73 74 2d 3e 61 2c 20 6e 2a 73 69 7a 65 6f  List->a, n*sizeo
5610: 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b  f(pList->a[0]));
5620: 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b  .    if( a==0 ){
5630: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d  .      goto no_m
5640: 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  em;.    }.    pL
5650: 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 20 20  ist->a = a;.    
5660: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  pList->nAlloc = 
5670: 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
5680: 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 29 3b 0a   pList->a!=0 );.
5690: 20 20 69 66 28 20 70 45 78 70 72 20 7c 7c 20 70    if( pExpr || p
56a0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 74 72 75  Name ){.    stru
56b0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
56c0: 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74   *pItem = &pList
56d0: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->a[pList->nExpr
56e0: 2b 2b 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ++];.    memset(
56f0: 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  pItem, 0, sizeof
5700: 28 2a 70 49 74 65 6d 29 29 3b 0a 20 20 20 20 70  (*pItem));.    p
5710: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
5720: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
5730: 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20  en(db, pName);. 
5740: 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20     pItem->pExpr 
5750: 3d 20 70 45 78 70 72 3b 0a 20 20 7d 0a 20 20 72  = pExpr;.  }.  r
5760: 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f  eturn pList;..no
5770: 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f 2a 20  _mem:     .  /* 
5780: 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65  Avoid leaking me
5790: 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20 68  mory if malloc h
57a0: 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20 20  as failed. */.  
57b0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
57c0: 65 28 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69  e(pExpr);.  sqli
57d0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
57e0: 65 28 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75  e(pList);.  retu
57f0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 0;.}../*.** I
5800: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
5810: 20 6c 69 73 74 20 70 45 4c 69 73 74 20 63 6f 6e   list pEList con
5820: 74 61 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20  tains more than 
5830: 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e 74 73 2c  iLimit elements,
5840: 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72  .** leave an err
5850: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
5860: 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  arse..*/.void sq
5870: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 68 65  lite3ExprListChe
5880: 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50 61 72 73  ckLength(.  Pars
5890: 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 45 78 70  e *pParse,.  Exp
58a0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 0a 20  rList *pEList,. 
58b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62   const char *zOb
58c0: 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74 20 6d 78  ject.){.  int mx
58d0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61   = pParse->db->a
58e0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
58f0: 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 74 65  IT_COLUMN];.  te
5900: 73 74 63 61 73 65 28 20 70 45 4c 69 73 74 20 26  stcase( pEList &
5910: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  & pEList->nExpr=
5920: 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74 63 61 73  =mx );.  testcas
5930: 65 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  e( pEList && pEL
5940: 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 2b 31  ist->nExpr==mx+1
5950: 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74   );.  if( pEList
5960: 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
5970: 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73 71 6c 69  r>mx ){.    sqli
5980: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
5990: 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f  se, "too many co
59a0: 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c 20 7a 4f  lumns in %s", zO
59b0: 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  bject);.  }.}../
59c0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
59d0: 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 2c  three functions,
59e0: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 29 2c   heightOfExpr(),
59f0: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
5a00: 74 28 29 0a 2a 2a 20 61 6e 64 20 68 65 69 67 68  t().** and heigh
5a10: 74 4f 66 53 65 6c 65 63 74 28 29 2c 20 61 72 65  tOfSelect(), are
5a20: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
5a30: 6e 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68  ne the maximum h
5a40: 65 69 67 68 74 0a 2a 2a 20 6f 66 20 61 6e 79 20  eight.** of any 
5a50: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
5a60: 72 65 66 65 72 65 6e 63 65 64 20 62 79 20 74 68  referenced by th
5a70: 65 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73  e structure pass
5a80: 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 66 69 72  ed as the.** fir
5a90: 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  st argument..**.
5aa0: 2a 2a 20 49 66 20 74 68 69 73 20 6d 61 78 69 6d  ** If this maxim
5ab0: 75 6d 20 68 65 69 67 68 74 20 69 73 20 67 72 65  um height is gre
5ac0: 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75  ater than the cu
5ad0: 72 72 65 6e 74 20 76 61 6c 75 65 20 70 6f 69 6e  rrent value poin
5ae0: 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 70 6e 48  ted.** to by pnH
5af0: 65 69 67 68 74 2c 20 74 68 65 20 73 65 63 6f 6e  eight, the secon
5b00: 64 20 70 61 72 61 6d 65 74 65 72 2c 20 74 68 65  d parameter, the
5b10: 6e 20 73 65 74 20 2a 70 6e 48 65 69 67 68 74 20  n set *pnHeight 
5b20: 74 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65  to that.** value
5b30: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
5b40: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30  MAX_EXPR_DEPTH>0
5b50: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
5b60: 67 68 74 4f 66 45 78 70 72 28 45 78 70 72 20 2a  ghtOfExpr(Expr *
5b70: 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74  p, int *pnHeight
5b80: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
5b90: 20 20 69 66 28 20 70 2d 3e 6e 48 65 69 67 68 74    if( p->nHeight
5ba0: 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a 20 20  >*pnHeight ){.  
5bb0: 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20      *pnHeight = 
5bc0: 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20  p->nHeight;.    
5bd0: 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  }.  }.}.static v
5be0: 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78 70 72  oid heightOfExpr
5bf0: 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70  List(ExprList *p
5c00: 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29  , int *pnHeight)
5c10: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
5c20: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
5c30: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b  i=0; i<p->nExpr;
5c40: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65 69   i++){.      hei
5c50: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69  ghtOfExpr(p->a[i
5c60: 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65 69 67 68  ].pExpr, pnHeigh
5c70: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
5c80: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67  static void heig
5c90: 68 74 4f 66 53 65 6c 65 63 74 28 53 65 6c 65 63  htOfSelect(Selec
5ca0: 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69  t *p, int *pnHei
5cb0: 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b  ght){.  if( p ){
5cc0: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
5cd0: 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 6e 48  r(p->pWhere, pnH
5ce0: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
5cf0: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 48 61 76  htOfExpr(p->pHav
5d00: 69 6e 67 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  ing, pnHeight);.
5d10: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
5d20: 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e 48 65  (p->pLimit, pnHe
5d30: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
5d40: 74 4f 66 45 78 70 72 28 70 2d 3e 70 4f 66 66 73  tOfExpr(p->pOffs
5d50: 65 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  et, pnHeight);. 
5d60: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c     heightOfExprL
5d70: 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 70  ist(p->pEList, p
5d80: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
5d90: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70  ightOfExprList(p
5da0: 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e 48 65  ->pGroupBy, pnHe
5db0: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
5dc0: 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  tOfExprList(p->p
5dd0: 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69 67 68  OrderBy, pnHeigh
5de0: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
5df0: 53 65 6c 65 63 74 28 70 2d 3e 70 50 72 69 6f 72  Select(p->pPrior
5e00: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d  , pnHeight);.  }
5e10: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
5e20: 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
5e30: 54 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  TH>0 */../*.** S
5e40: 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65 69  et the Expr.nHei
5e50: 67 68 74 20 76 61 72 69 61 62 6c 65 20 69 6e 20  ght variable in 
5e60: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70 61  the structure pa
5e70: 73 73 65 64 20 61 73 20 61 6e 20 0a 2a 2a 20 61  ssed as an .** a
5e80: 72 67 75 6d 65 6e 74 2e 20 41 6e 20 65 78 70 72  rgument. An expr
5e90: 65 73 73 69 6f 6e 20 77 69 74 68 20 6e 6f 20 63  ession with no c
5ea0: 68 69 6c 64 72 65 6e 2c 20 45 78 70 72 2e 70 4c  hildren, Expr.pL
5eb0: 69 73 74 20 6f 72 20 0a 2a 2a 20 45 78 70 72 2e  ist or .** Expr.
5ec0: 70 53 65 6c 65 63 74 20 6d 65 6d 62 65 72 20 68  pSelect member h
5ed0: 61 73 20 61 20 68 65 69 67 68 74 20 6f 66 20 31  as a height of 1
5ee0: 2e 20 41 6e 79 20 6f 74 68 65 72 20 65 78 70 72  . Any other expr
5ef0: 65 73 73 69 6f 6e 0a 2a 2a 20 68 61 73 20 61 20  ession.** has a 
5f00: 68 65 69 67 68 74 20 65 71 75 61 6c 20 74 6f 20  height equal to 
5f10: 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67  the maximum heig
5f20: 68 74 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20  ht of any other 
5f30: 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 64 20 45  .** referenced E
5f40: 78 70 72 20 70 6c 75 73 20 6f 6e 65 2e 0a 2a 2f  xpr plus one..*/
5f50: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
5f60: 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 76 6f 69  EXPR_DEPTH>0.voi
5f70: 64 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74  d sqlite3ExprSet
5f80: 48 65 69 67 68 74 28 45 78 70 72 20 2a 70 29 7b  Height(Expr *p){
5f90: 0a 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d  .  int nHeight =
5fa0: 20 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78   0;.  heightOfEx
5fb0: 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 6e 48  pr(p->pLeft, &nH
5fc0: 65 69 67 68 74 29 3b 0a 20 20 68 65 69 67 68 74  eight);.  height
5fd0: 4f 66 45 78 70 72 28 70 2d 3e 70 52 69 67 68 74  OfExpr(p->pRight
5fe0: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 68  , &nHeight);.  h
5ff0: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
6000: 70 2d 3e 70 4c 69 73 74 2c 20 26 6e 48 65 69 67  p->pList, &nHeig
6010: 68 74 29 3b 0a 20 20 68 65 69 67 68 74 4f 66 53  ht);.  heightOfS
6020: 65 6c 65 63 74 28 70 2d 3e 70 53 65 6c 65 63 74  elect(p->pSelect
6030: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 70  , &nHeight);.  p
6040: 2d 3e 6e 48 65 69 67 68 74 20 3d 20 6e 48 65 69  ->nHeight = nHei
6050: 67 68 74 20 2b 20 31 3b 0a 7d 0a 23 65 6e 64 69  ght + 1;.}.#endi
6060: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f  f /* SQLITE_MAX_
6070: 45 58 50 52 5f 44 45 50 54 48 3e 30 20 2a 2f 0a  EXPR_DEPTH>0 */.
6080: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
6090: 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74  e maximum height
60a0: 20 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73 69   of any expressi
60b0: 6f 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e 63  on tree referenc
60c0: 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 65 6c  ed.** by the sel
60d0: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61  ect statement pa
60e0: 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
60f0: 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  ent..*/.#if SQLI
6100: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
6110: 48 3e 30 0a 69 6e 74 20 73 71 6c 69 74 65 33 53  H>0.int sqlite3S
6120: 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28  electExprHeight(
6130: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e  Select *p){.  in
6140: 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20  t nHeight = 0;. 
6150: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
6160: 70 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20  p, &nHeight);.  
6170: 72 65 74 75 72 6e 20 6e 48 65 69 67 68 74 3b 0a  return nHeight;.
6180: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
6190: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
61a0: 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65  H>0 */../*.** De
61b0: 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65  lete an entire e
61c0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
61d0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
61e0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 45 78  xprListDelete(Ex
61f0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
6200: 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
6210: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
6220: 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c  *pItem;.  if( pL
6230: 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
6240: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
6250: 2d 3e 61 21 3d 30 20 7c 7c 20 28 70 4c 69 73 74  ->a!=0 || (pList
6260: 2d 3e 6e 45 78 70 72 3d 3d 30 20 26 26 20 70 4c  ->nExpr==0 && pL
6270: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 29 20  ist->nAlloc==0) 
6280: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  );.  assert( pLi
6290: 73 74 2d 3e 6e 45 78 70 72 3c 3d 70 4c 69 73 74  st->nExpr<=pList
62a0: 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 20 20 66 6f  ->nAlloc );.  fo
62b0: 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  r(pItem=pList->a
62c0: 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  , i=0; i<pList->
62d0: 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
62e0: 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  m++){.    sqlite
62f0: 33 45 78 70 72 44 65 6c 65 74 65 28 70 49 74 65  3ExprDelete(pIte
6300: 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73  m->pExpr);.    s
6310: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65  qlite3_free(pIte
6320: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  m->zName);.  }. 
6330: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c   sqlite3_free(pL
6340: 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74  ist->a);.  sqlit
6350: 65 33 5f 66 72 65 65 28 70 4c 69 73 74 29 3b 0a  e3_free(pList);.
6360: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
6370: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
6380: 2e 20 20 43 61 6c 6c 20 78 46 75 6e 63 20 66 6f  .  Call xFunc fo
6390: 72 20 65 61 63 68 20 6e 6f 64 65 20 76 69 73 69  r each node visi
63a0: 74 65 64 2e 20 20 78 46 75 6e 63 0a 2a 2a 20 69  ted.  xFunc.** i
63b0: 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  s called on the 
63c0: 6e 6f 64 65 20 62 65 66 6f 72 65 20 78 46 75 6e  node before xFun
63d0: 63 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  c is called on t
63e0: 68 65 20 6e 6f 64 65 73 20 63 68 69 6c 64 72 65  he nodes childre
63f0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  n..**.** The ret
6400: 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 78  urn value from x
6410: 46 75 6e 63 20 64 65 74 65 72 6d 69 6e 65 73 20  Func determines 
6420: 77 68 65 74 68 65 72 20 74 68 65 20 74 72 65 65  whether the tree
6430: 20 77 61 6c 6b 20 63 6f 6e 74 69 6e 75 65 73 2e   walk continues.
6440: 0a 2a 2a 20 30 20 6d 65 61 6e 73 20 63 6f 6e 74  .** 0 means cont
6450: 69 6e 75 65 20 77 61 6c 6b 69 6e 67 20 74 68 65  inue walking the
6460: 20 74 72 65 65 2e 20 20 31 20 6d 65 61 6e 73 20   tree.  1 means 
6470: 64 6f 20 6e 6f 74 20 77 61 6c 6b 20 63 68 69 6c  do not walk chil
6480: 64 72 65 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 63  dren.** of the c
6490: 75 72 72 65 6e 74 20 6e 6f 64 65 20 62 75 74 20  urrent node but 
64a0: 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 73 69  continue with si
64b0: 62 6c 69 6e 67 73 2e 20 20 32 20 6d 65 61 6e 73  blings.  2 means
64c0: 20 61 62 61 6e 64 6f 6e 0a 2a 2a 20 74 68 65 20   abandon.** the 
64d0: 74 72 65 65 20 77 61 6c 6b 20 63 6f 6d 70 6c 65  tree walk comple
64e0: 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tely..**.** The 
64f0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f  return value fro
6500: 6d 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  m this routine i
6510: 73 20 31 20 74 6f 20 61 62 61 6e 64 6f 6e 20 74  s 1 to abandon t
6520: 68 65 20 74 72 65 65 20 77 61 6c 6b 0a 2a 2a 20  he tree walk.** 
6530: 61 6e 64 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75  and 0 to continu
6540: 65 2e 0a 2a 2a 0a 2a 2a 20 4e 4f 54 49 43 45 3a  e..**.** NOTICE:
6550: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64    This routine d
6560: 6f 65 73 20 2a 6e 6f 74 2a 20 64 65 73 63 65 6e  oes *not* descen
6570: 64 20 69 6e 74 6f 20 73 75 62 71 75 65 72 69 65  d into subquerie
6580: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
6590: 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 45 78   walkExprList(Ex
65a0: 70 72 4c 69 73 74 20 2a 2c 20 69 6e 74 20 28 2a  prList *, int (*
65b0: 29 28 76 6f 69 64 20 2a 2c 20 45 78 70 72 2a 29  )(void *, Expr*)
65c0: 2c 20 76 6f 69 64 20 2a 29 3b 0a 73 74 61 74 69  , void *);.stati
65d0: 63 20 69 6e 74 20 77 61 6c 6b 45 78 70 72 54 72  c int walkExprTr
65e0: 65 65 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20  ee(Expr *pExpr, 
65f0: 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 76 6f 69  int (*xFunc)(voi
6600: 64 2a 2c 45 78 70 72 2a 29 2c 20 76 6f 69 64 20  d*,Expr*), void 
6610: 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 72 63  *pArg){.  int rc
6620: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ;.  if( pExpr==0
6630: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
6640: 63 20 3d 20 28 2a 78 46 75 6e 63 29 28 70 41 72  c = (*xFunc)(pAr
6650: 67 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28  g, pExpr);.  if(
6660: 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   rc==0 ){.    if
6670: 28 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70  ( walkExprTree(p
6680: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 78 46 75  Expr->pLeft, xFu
6690: 6e 63 2c 20 70 41 72 67 29 20 29 20 72 65 74 75  nc, pArg) ) retu
66a0: 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 77 61  rn 1;.    if( wa
66b0: 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78 70 72  lkExprTree(pExpr
66c0: 2d 3e 70 52 69 67 68 74 2c 20 78 46 75 6e 63 2c  ->pRight, xFunc,
66d0: 20 70 41 72 67 29 20 29 20 72 65 74 75 72 6e 20   pArg) ) return 
66e0: 31 3b 0a 20 20 20 20 69 66 28 20 77 61 6c 6b 45  1;.    if( walkE
66f0: 78 70 72 4c 69 73 74 28 70 45 78 70 72 2d 3e 70  xprList(pExpr->p
6700: 4c 69 73 74 2c 20 78 46 75 6e 63 2c 20 70 41 72  List, xFunc, pAr
6710: 67 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  g) ) return 1;. 
6720: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3e 31   }.  return rc>1
6730: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20  ;.}../*.** Call 
6740: 77 61 6c 6b 45 78 70 72 54 72 65 65 28 29 20 66  walkExprTree() f
6750: 6f 72 20 65 76 65 72 79 20 65 78 70 72 65 73 73  or every express
6760: 69 6f 6e 20 69 6e 20 6c 69 73 74 20 70 2e 0a 2a  ion in list p..*
6770: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c  /.static int wal
6780: 6b 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69  kExprList(ExprLi
6790: 73 74 20 2a 70 2c 20 69 6e 74 20 28 2a 78 46 75  st *p, int (*xFu
67a0: 6e 63 29 28 76 6f 69 64 20 2a 2c 20 45 78 70 72  nc)(void *, Expr
67b0: 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  *), void *pArg){
67c0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
67d0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
67e0: 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 21   *pItem;.  if( !
67f0: 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  p ) return 0;.  
6800: 66 6f 72 28 69 3d 70 2d 3e 6e 45 78 70 72 2c 20  for(i=p->nExpr, 
6810: 70 49 74 65 6d 3d 70 2d 3e 61 3b 20 69 3e 30 3b  pItem=p->a; i>0;
6820: 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i--, pItem++){.
6830: 20 20 20 20 69 66 28 20 77 61 6c 6b 45 78 70 72      if( walkExpr
6840: 54 72 65 65 28 70 49 74 65 6d 2d 3e 70 45 78 70  Tree(pItem->pExp
6850: 72 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 20  r, xFunc, pArg) 
6860: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
6870: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
6880: 2a 0a 2a 2a 20 43 61 6c 6c 20 77 61 6c 6b 45 78  *.** Call walkEx
6890: 70 72 54 72 65 65 28 29 20 66 6f 72 20 65 76 65  prTree() for eve
68a0: 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ry expression in
68b0: 20 53 65 6c 65 63 74 20 70 2c 20 6e 6f 74 20 69   Select p, not i
68c0: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 65 78 70 72  ncluding.** expr
68d0: 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65  essions that are
68e0: 20 70 61 72 74 20 6f 66 20 73 75 62 2d 73 65 6c   part of sub-sel
68f0: 65 63 74 73 20 69 6e 20 61 6e 79 20 46 52 4f 4d  ects in any FROM
6900: 20 63 6c 61 75 73 65 20 6f 72 20 74 68 65 20 4c   clause or the L
6910: 49 4d 49 54 0a 2a 2a 20 6f 72 20 4f 46 46 53 45  IMIT.** or OFFSE
6920: 54 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 2e 0a  T expressions...
6930: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61  */.static int wa
6940: 6c 6b 53 65 6c 65 63 74 45 78 70 72 28 53 65 6c  lkSelectExpr(Sel
6950: 65 63 74 20 2a 70 2c 20 69 6e 74 20 28 2a 78 46  ect *p, int (*xF
6960: 75 6e 63 29 28 76 6f 69 64 20 2a 2c 20 45 78 70  unc)(void *, Exp
6970: 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29  r*), void *pArg)
6980: 7b 0a 20 20 77 61 6c 6b 45 78 70 72 4c 69 73 74  {.  walkExprList
6990: 28 70 2d 3e 70 45 4c 69 73 74 2c 20 78 46 75 6e  (p->pEList, xFun
69a0: 63 2c 20 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b  c, pArg);.  walk
69b0: 45 78 70 72 54 72 65 65 28 70 2d 3e 70 57 68 65  ExprTree(p->pWhe
69c0: 72 65 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29  re, xFunc, pArg)
69d0: 3b 0a 20 20 77 61 6c 6b 45 78 70 72 4c 69 73 74  ;.  walkExprList
69e0: 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 78 46  (p->pGroupBy, xF
69f0: 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 77 61  unc, pArg);.  wa
6a00: 6c 6b 45 78 70 72 54 72 65 65 28 70 2d 3e 70 48  lkExprTree(p->pH
6a10: 61 76 69 6e 67 2c 20 78 46 75 6e 63 2c 20 70 41  aving, xFunc, pA
6a20: 72 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72 4c  rg);.  walkExprL
6a30: 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c  ist(p->pOrderBy,
6a40: 20 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20   xFunc, pArg);. 
6a50: 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
6a60: 7b 0a 20 20 20 20 77 61 6c 6b 53 65 6c 65 63 74  {.    walkSelect
6a70: 45 78 70 72 28 70 2d 3e 70 50 72 69 6f 72 2c 20  Expr(p->pPrior, 
6a80: 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20  xFunc, pArg);.  
6a90: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
6aa0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
6ab0: 74 69 6e 65 20 69 73 20 64 65 73 69 67 6e 65 64  tine is designed
6ac0: 20 61 73 20 61 6e 20 78 46 75 6e 63 20 66 6f 72   as an xFunc for
6ad0: 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 29 2e   walkExprTree().
6ae0: 0a 2a 2a 0a 2a 2a 20 70 41 72 67 20 69 73 20 72  .**.** pArg is r
6af0: 65 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20  eally a pointer 
6b00: 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20  to an integer.  
6b10: 49 66 20 77 65 20 63 61 6e 20 74 65 6c 6c 20 62  If we can tell b
6b20: 79 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 61 74 20  y looking.** at 
6b30: 70 45 78 70 72 20 74 68 61 74 20 74 68 65 20 65  pExpr that the e
6b40: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63  xpression that c
6b50: 6f 6e 74 61 69 6e 73 20 70 45 78 70 72 20 69 73  ontains pExpr is
6b60: 20 6e 6f 74 20 61 20 63 6f 6e 73 74 61 6e 74 0a   not a constant.
6b70: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  ** expression, t
6b80: 68 65 6e 20 73 65 74 20 2a 70 41 72 67 20 74 6f  hen set *pArg to
6b90: 20 30 20 61 6e 64 20 72 65 74 75 72 6e 20 32 20   0 and return 2 
6ba0: 74 6f 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 74  to abandon the t
6bb0: 72 65 65 20 77 61 6c 6b 2e 0a 2a 2a 20 49 66 20  ree walk..** If 
6bc0: 70 45 78 70 72 20 64 6f 65 73 20 64 6f 65 73 20  pExpr does does 
6bd0: 6e 6f 74 20 64 69 73 71 75 61 6c 69 66 79 20 74  not disqualify t
6be0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72  he expression fr
6bf0: 6f 6d 20 62 65 69 6e 67 20 61 20 63 6f 6e 73 74  om being a const
6c00: 61 6e 74 0a 2a 2a 20 74 68 65 6e 20 64 6f 20 6e  ant.** then do n
6c10: 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 66  othing..**.** Af
6c20: 74 65 72 20 77 61 6c 6b 69 6e 67 20 74 68 65 20  ter walking the 
6c30: 77 68 6f 6c 65 20 74 72 65 65 2c 20 69 66 20 6e  whole tree, if n
6c40: 6f 20 6e 6f 64 65 73 20 61 72 65 20 66 6f 75 6e  o nodes are foun
6c50: 64 20 74 68 61 74 20 64 69 73 71 75 61 6c 69 66  d that disqualif
6c60: 79 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73  y.** the express
6c70: 69 6f 6e 20 61 73 20 63 6f 6e 73 74 61 6e 74 2c  ion as constant,
6c80: 20 74 68 65 6e 20 77 65 20 61 73 73 75 6d 65 20   then we assume 
6c90: 74 68 65 20 77 68 6f 6c 65 20 65 78 70 72 65 73  the whole expres
6ca0: 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 74  sion.** is const
6cb0: 61 6e 74 2e 20 20 53 65 65 20 73 71 6c 69 74 65  ant.  See sqlite
6cc0: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
6cd0: 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  ) for additional
6ce0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
6cf0: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
6d00: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 76  NodeIsConstant(v
6d10: 6f 69 64 20 2a 70 41 72 67 2c 20 45 78 70 72 20  oid *pArg, Expr 
6d20: 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 2a  *pExpr){.  int *
6d30: 70 4e 20 3d 20 28 69 6e 74 2a 29 70 41 72 67 3b  pN = (int*)pArg;
6d40: 0a 0a 20 20 2f 2a 20 49 66 20 2a 70 41 72 67 20  ..  /* If *pArg 
6d50: 69 73 20 33 20 74 68 65 6e 20 61 6e 79 20 74 65  is 3 then any te
6d60: 72 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  rm of the expres
6d70: 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20  sion that comes 
6d80: 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e  from.  ** the ON
6d90: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
6da0: 73 20 6f 66 20 61 20 6a 6f 69 6e 20 64 69 73 71  s of a join disq
6db0: 75 61 6c 69 66 69 65 73 20 74 68 65 20 65 78 70  ualifies the exp
6dc0: 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f  ression.  ** fro
6dd0: 6d 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72  m being consider
6de0: 65 64 20 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a  ed constant. */.
6df0: 20 20 69 66 28 20 28 2a 70 4e 29 3d 3d 33 20 26    if( (*pN)==3 &
6e00: 26 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70  & ExprHasAnyProp
6e10: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
6e20: 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20  romJoin) ){.    
6e30: 2a 70 4e 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  *pN = 0;.    ret
6e40: 75 72 6e 20 32 3b 0a 20 20 7d 0a 0a 20 20 73 77  urn 2;.  }..  sw
6e50: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
6e60: 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64  ){.    /* Consid
6e70: 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20  er functions to 
6e80: 62 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20 61  be constant if a
6e90: 6c 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e  ll their argumen
6ea0: 74 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a  ts are constant.
6eb0: 20 20 20 20 2a 2a 20 61 6e 64 20 2a 70 41 72 67      ** and *pArg
6ec0: 3d 3d 32 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ==2 */.    case 
6ed0: 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  TK_FUNCTION:.   
6ee0: 20 20 20 69 66 28 20 28 2a 70 4e 29 3d 3d 32 20     if( (*pN)==2 
6ef0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
6f00: 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67    /* Fall throug
6f10: 68 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  h */.    case TK
6f20: 5f 49 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _ID:.    case TK
6f30: 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73  _COLUMN:.    cas
6f40: 65 20 54 4b 5f 44 4f 54 3a 0a 20 20 20 20 63 61  e TK_DOT:.    ca
6f50: 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
6f60: 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ON:.    case TK_
6f70: 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 23 69 66 6e  AGG_COLUMN:.#ifn
6f80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6f90: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
6fa0: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20  e TK_SELECT:.   
6fb0: 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
6fc0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
6fd0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
6fe0: 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 74  ELECT );.      t
6ff0: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
7000: 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b  op==TK_EXISTS );
7010: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 74 65  .#endif.      te
7020: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
7030: 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20 20 20  p==TK_ID );.    
7040: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
7050: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
7060: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
7070: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
7080: 4b 5f 44 4f 54 20 29 3b 0a 20 20 20 20 20 20 74  K_DOT );.      t
7090: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
70a0: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op==TK_AGG_FUNCT
70b0: 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ION );.      tes
70c0: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
70d0: 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
70e0: 29 3b 0a 20 20 20 20 20 20 2a 70 4e 20 3d 20 30  );.      *pN = 0
70f0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32  ;.      return 2
7100: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  ;.    case TK_IN
7110: 3a 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  :.      if( pExp
7120: 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  r->pSelect ){.  
7130: 20 20 20 20 20 20 2a 70 4e 20 3d 20 30 3b 0a 20        *pN = 0;. 
7140: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b         return 2;
7150: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 64 65 66  .      }.    def
7160: 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75  ault:.      retu
7170: 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rn 0;.  }.}../*.
7180: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
7190: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
71a0: 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70  urn 1 if the exp
71b0: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
71c0: 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20  ant.** and 0 if 
71d0: 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69  it involves vari
71e0: 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69 6f  ables or functio
71f0: 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46  n calls..**.** F
7200: 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
7210: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
7220: 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65  , a double-quote
7230: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61  d string (ex: "a
7240: 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  bc").** is consi
7250: 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65  dered a variable
7260: 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75   but a single-qu
7270: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
7280: 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20   'abc') is.** a 
7290: 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74  constant..*/.int
72a0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
72b0: 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 29 7b  nstant(Expr *p){
72c0: 0a 20 20 69 6e 74 20 69 73 43 6f 6e 73 74 20 3d  .  int isConst =
72d0: 20 31 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72   1;.  walkExprTr
72e0: 65 65 28 70 2c 20 65 78 70 72 4e 6f 64 65 49 73  ee(p, exprNodeIs
72f0: 43 6f 6e 73 74 61 6e 74 2c 20 26 69 73 43 6f 6e  Constant, &isCon
7300: 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 73  st);.  return is
7310: 43 6f 6e 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Const;.}../*.** 
7320: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
7330: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
7340: 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73   1 if the expres
7350: 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
7360: 0a 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  .** that does no
7370: 20 6f 72 69 67 69 6e 61 74 65 20 66 72 6f 6d 20   originate from 
7380: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
7390: 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f 69  clauses of a joi
73a0: 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69  n..** Return 0 i
73b0: 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61  f it involves va
73c0: 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74  riables or funct
73d0: 69 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74 65 72  ion calls or ter
73e0: 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e  ms from.** an ON
73f0: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
7400: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
7410: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
7420: 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a  tJoin(Expr *p){.
7430: 20 20 69 6e 74 20 69 73 43 6f 6e 73 74 20 3d 20    int isConst = 
7440: 33 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65  3;.  walkExprTre
7450: 65 28 70 2c 20 65 78 70 72 4e 6f 64 65 49 73 43  e(p, exprNodeIsC
7460: 6f 6e 73 74 61 6e 74 2c 20 26 69 73 43 6f 6e 73  onstant, &isCons
7470: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 73 43  t);.  return isC
7480: 6f 6e 73 74 21 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  onst!=0;.}../*.*
7490: 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
74a0: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
74b0: 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72  rn 1 if the expr
74c0: 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61  ession is consta
74d0: 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74  nt.** or a funct
74e0: 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20 63 6f  ion call with co
74f0: 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73  nstant arguments
7500: 2e 20 20 52 65 74 75 72 6e 20 61 6e 64 20 30 20  .  Return and 0 
7510: 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  if there.** are 
7520: 61 6e 79 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a  any variables..*
7530: 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72  *.** For the pur
7540: 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75  poses of this fu
7550: 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65  nction, a double
7560: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
7570: 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73  ex: "abc").** is
7580: 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61   considered a va
7590: 72 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e  riable but a sin
75a0: 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  gle-quoted strin
75b0: 67 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73  g (ex: 'abc') is
75c0: 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a  .** a constant..
75d0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
75e0: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75  prIsConstantOrFu
75f0: 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a 70 29 7b  nction(Expr *p){
7600: 0a 20 20 69 6e 74 20 69 73 43 6f 6e 73 74 20 3d  .  int isConst =
7610: 20 32 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72   2;.  walkExprTr
7620: 65 65 28 70 2c 20 65 78 70 72 4e 6f 64 65 49 73  ee(p, exprNodeIs
7630: 43 6f 6e 73 74 61 6e 74 2c 20 26 69 73 43 6f 6e  Constant, &isCon
7640: 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 73  st);.  return is
7650: 43 6f 6e 73 74 21 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  Const!=0;.}../*.
7660: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
7670: 73 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20 63  sion p codes a c
7680: 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20  onstant integer 
7690: 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  that is small en
76a0: 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69  ough.** to fit i
76b0: 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  n a 32-bit integ
76c0: 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64  er, return 1 and
76d0: 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f   put the value o
76e0: 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  f the integer.**
76f0: 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66   in *pValue.  If
7700: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
7710: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
7720: 72 20 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f  r or if it is to
7730: 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20  o big.** to fit 
7740: 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62  in a signed 32-b
7750: 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75  it integer, retu
7760: 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a  rn 0 and leave *
7770: 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64  pValue unchanged
7780: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
7790: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 45 78  ExprIsInteger(Ex
77a0: 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c  pr *p, int *pVal
77b0: 75 65 29 7b 0a 20 20 73 77 69 74 63 68 28 20 70  ue){.  switch( p
77c0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
77d0: 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20   TK_INTEGER: {. 
77e0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
77f0: 47 65 74 49 6e 74 33 32 28 28 63 68 61 72 2a 29  GetInt32((char*)
7800: 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 56 61 6c  p->token.z, pVal
7810: 75 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ue) ){.        r
7820: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
7830: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7840: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
7850: 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72  UPLUS: {.      r
7860: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
7870: 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c  rIsInteger(p->pL
7880: 65 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20  eft, pValue);.  
7890: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
78a0: 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20  UMINUS: {.      
78b0: 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66 28  int v;.      if(
78c0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
78d0: 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20  teger(p->pLeft, 
78e0: 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  &v) ){.        *
78f0: 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20  pValue = -v;.   
7900: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
7910: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
7920: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
7930: 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20  fault: break;.  
7940: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
7950: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
7960: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
7970: 73 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d  string is a row-
7980: 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a  id column name..
7990: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73  */.int sqlite3Is
79a0: 52 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72  Rowid(const char
79b0: 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69   *z){.  if( sqli
79c0: 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f  te3StrICmp(z, "_
79d0: 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65  ROWID_")==0 ) re
79e0: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
79f0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
7a00: 22 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65  "ROWID")==0 ) re
7a10: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
7a20: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
7a30: 22 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75  "OID")==0 ) retu
7a40: 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 1;.  return 0
7a50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
7a60: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63   the name of a c
7a70: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66 6f 72  olumn of the for
7a80: 6d 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20 6f  m X.Y.Z or Y.Z o
7a90: 72 20 6a 75 73 74 20 5a 2c 20 6c 6f 6f 6b 20 75  r just Z, look u
7aa0: 70 0a 2a 2a 20 74 68 61 74 20 6e 61 6d 65 20 69  p.** that name i
7ab0: 6e 20 74 68 65 20 73 65 74 20 6f 66 20 73 6f 75  n the set of sou
7ac0: 72 63 65 20 74 61 62 6c 65 73 20 69 6e 20 70 53  rce tables in pS
7ad0: 72 63 4c 69 73 74 20 61 6e 64 20 6d 61 6b 65 20  rcList and make 
7ae0: 74 68 65 20 70 45 78 70 72 20 0a 2a 2a 20 65 78  the pExpr .** ex
7af0: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 72 65  pression node re
7b00: 66 65 72 20 62 61 63 6b 20 74 6f 20 74 68 61 74  fer back to that
7b10: 20 73 6f 75 72 63 65 20 63 6f 6c 75 6d 6e 2e 20   source column. 
7b20: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
7b30: 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61  hanges.** are ma
7b40: 64 65 20 74 6f 20 70 45 78 70 72 3a 0a 2a 2a 0a  de to pExpr:.**.
7b50: 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 69 44 62  **    pExpr->iDb
7b60: 20 20 20 20 20 20 20 20 20 20 20 53 65 74 20 74             Set t
7b70: 68 65 20 69 6e 64 65 78 20 69 6e 20 64 62 2d 3e  he index in db->
7b80: 61 44 62 5b 5d 20 6f 66 20 74 68 65 20 64 61 74  aDb[] of the dat
7b90: 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a  abase holding.**
7ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bb0: 20 20 20 20 20 20 20 20 20 74 68 65 20 74 61 62           the tab
7bc0: 6c 65 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d  le..**    pExpr-
7bd0: 3e 69 54 61 62 6c 65 20 20 20 20 20 20 20 20 53  >iTable        S
7be0: 65 74 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72  et to the cursor
7bf0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
7c00: 74 61 62 6c 65 20 6f 62 74 61 69 6e 65 64 0a 2a  table obtained.*
7c10: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
7c20: 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d 20 70            from p
7c30: 53 72 63 4c 69 73 74 2e 0a 2a 2a 20 20 20 20 70  SrcList..**    p
7c40: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 20 20  Expr->iColumn   
7c50: 20 20 20 20 53 65 74 20 74 6f 20 74 68 65 20 63      Set to the c
7c60: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74  olumn number wit
7c70: 68 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  hin the table..*
7c80: 2a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20  *    pExpr->op  
7c90: 20 20 20 20 20 20 20 20 20 20 53 65 74 20 74 6f            Set to
7ca0: 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 0a 2a 2a 20 20   TK_COLUMN..**  
7cb0: 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 20    pExpr->pLeft  
7cc0: 20 20 20 20 20 20 20 41 6e 79 20 65 78 70 72 65         Any expre
7cd0: 73 73 69 6f 6e 20 74 68 69 73 20 70 6f 69 6e 74  ssion this point
7ce0: 73 20 74 6f 20 69 73 20 64 65 6c 65 74 65 64 0a  s to is deleted.
7cf0: 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69  **    pExpr->pRi
7d00: 67 68 74 20 20 20 20 20 20 20 20 41 6e 79 20 65  ght        Any e
7d10: 78 70 72 65 73 73 69 6f 6e 20 74 68 69 73 20 70  xpression this p
7d20: 6f 69 6e 74 73 20 74 6f 20 69 73 20 64 65 6c 65  oints to is dele
7d30: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ted..**.** The p
7d40: 44 62 54 6f 6b 65 6e 20 69 73 20 74 68 65 20 6e  DbToken is the n
7d50: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
7d60: 61 73 65 20 28 74 68 65 20 22 58 22 29 2e 20 20  ase (the "X").  
7d70: 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62  This value may b
7d80: 65 0a 2a 2a 20 4e 55 4c 4c 20 6d 65 61 6e 69 6e  e.** NULL meanin
7d90: 67 20 74 68 61 74 20 6e 61 6d 65 20 69 73 20 6f  g that name is o
7da0: 66 20 74 68 65 20 66 6f 72 6d 20 59 2e 5a 20 6f  f the form Y.Z o
7db0: 72 20 5a 2e 20 20 41 6e 79 20 61 76 61 69 6c 61  r Z.  Any availa
7dc0: 62 6c 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ble database.** 
7dd0: 63 61 6e 20 62 65 20 75 73 65 64 2e 20 20 54 68  can be used.  Th
7de0: 65 20 70 54 61 62 6c 65 54 6f 6b 65 6e 20 69 73  e pTableToken is
7df0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
7e00: 20 74 61 62 6c 65 20 28 74 68 65 20 22 59 22 29   table (the "Y")
7e10: 2e 20 20 54 68 69 73 0a 2a 2a 20 76 61 6c 75 65  .  This.** value
7e20: 20 63 61 6e 20 62 65 20 4e 55 4c 4c 20 69 66 20   can be NULL if 
7e30: 70 44 62 54 6f 6b 65 6e 20 69 73 20 61 6c 73 6f  pDbToken is also
7e40: 20 4e 55 4c 4c 2e 20 20 49 66 20 70 54 61 62 6c   NULL.  If pTabl
7e50: 65 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20 69  eToken is NULL i
7e60: 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20  t.** means that 
7e70: 74 68 65 20 66 6f 72 6d 20 6f 66 20 74 68 65 20  the form of the 
7e80: 6e 61 6d 65 20 69 73 20 5a 20 61 6e 64 20 74 68  name is Z and th
7e90: 61 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20  at columns from 
7ea0: 61 6e 79 20 74 61 62 6c 65 0a 2a 2a 20 63 61 6e  any table.** can
7eb0: 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20   be used..**.** 
7ec0: 49 66 20 74 68 65 20 6e 61 6d 65 20 63 61 6e 6e  If the name cann
7ed0: 6f 74 20 62 65 20 72 65 73 6f 6c 76 65 64 20 75  ot be resolved u
7ee0: 6e 61 6d 62 69 67 75 6f 75 73 6c 79 2c 20 6c 65  nambiguously, le
7ef0: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
7f00: 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73  sage.** in pPars
7f10: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e  e and return non
7f20: 2d 7a 65 72 6f 2e 20 20 52 65 74 75 72 6e 20 7a  -zero.  Return z
7f30: 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a  ero on success..
7f40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
7f50: 6f 6b 75 70 4e 61 6d 65 28 0a 20 20 50 61 72 73  okupName(.  Pars
7f60: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
7f70: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
7f80: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
7f90: 65 6e 20 2a 70 44 62 54 6f 6b 65 6e 2c 20 20 20  en *pDbToken,   
7fa0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
7fb0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
7fc0: 6e 69 6e 67 20 74 61 62 6c 65 2c 20 6f 72 20 4e  ning table, or N
7fd0: 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ULL */.  Token *
7fe0: 70 54 61 62 6c 65 54 6f 6b 65 6e 2c 20 20 2f 2a  pTableToken,  /*
7ff0: 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 63   Name of table c
8000: 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e  ontaining column
8010: 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54  , or NULL */.  T
8020: 6f 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e 54 6f 6b  oken *pColumnTok
8030: 65 6e 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  en, /* Name of t
8040: 68 65 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20 20  he column. */.  
8050: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
8060: 2c 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65  ,    /* The name
8070: 20 63 6f 6e 74 65 78 74 20 75 73 65 64 20 74 6f   context used to
8080: 20 72 65 73 6f 6c 76 65 20 74 68 65 20 6e 61 6d   resolve the nam
8090: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  e */.  Expr *pEx
80a0: 70 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  pr          /* M
80b0: 61 6b 65 20 74 68 69 73 20 45 58 50 52 20 6e 6f  ake this EXPR no
80c0: 64 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  de point to the 
80d0: 73 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e 20  selected column 
80e0: 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44  */.){.  char *zD
80f0: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  b = 0;       /* 
8100: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
8110: 62 61 73 65 2e 20 20 54 68 65 20 22 58 22 20 69  base.  The "X" i
8120: 6e 20 58 2e 59 2e 5a 20 2a 2f 0a 20 20 63 68 61  n X.Y.Z */.  cha
8130: 72 20 2a 7a 54 61 62 20 3d 20 30 3b 20 20 20 20  r *zTab = 0;    
8140: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
8150: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 22 59 22   table.  The "Y"
8160: 20 69 6e 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a   in X.Y.Z or Y.Z
8170: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c   */.  char *zCol
8180: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61   = 0;      /* Na
8190: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
81a0: 2e 20 20 54 68 65 20 22 5a 22 20 2a 2f 0a 20 20  .  The "Z" */.  
81b0: 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
81c0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
81d0: 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 63  nters */.  int c
81e0: 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nt = 0;         
81f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74  /* Number of mat
8200: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ching column nam
8210: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 54  es */.  int cntT
8220: 61 62 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  ab = 0;      /* 
8230: 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69  Number of matchi
8240: 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 2a  ng table names *
8250: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
8260: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f  = pParse->db;  /
8270: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 2a  * The database *
8280: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
8290: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20  st_item *pItem; 
82a0: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 66 6f 72        /* Use for
82b0: 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 53   looping over pS
82c0: 72 63 4c 69 73 74 20 69 74 65 6d 73 20 2a 2f 0a  rcList items */.
82d0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
82e0: 5f 69 74 65 6d 20 2a 70 4d 61 74 63 68 20 3d 20  _item *pMatch = 
82f0: 30 3b 20 20 2f 2a 20 54 68 65 20 6d 61 74 63 68  0;  /* The match
8300: 69 6e 67 20 70 53 72 63 4c 69 73 74 20 69 74 65  ing pSrcList ite
8310: 6d 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  m */.  NameConte
8320: 78 74 20 2a 70 54 6f 70 4e 43 20 3d 20 70 4e 43  xt *pTopNC = pNC
8330: 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  ;        /* Firs
8340: 74 20 6e 61 6d 65 63 6f 6e 74 65 78 74 20 69 6e  t namecontext in
8350: 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 53   the list */.  S
8360: 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d  chema *pSchema =
8370: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
8380: 20 2f 2a 20 53 63 68 65 6d 61 20 6f 66 20 74 68   /* Schema of th
8390: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  e expression */.
83a0: 0a 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 75  .  assert( pColu
83b0: 6d 6e 54 6f 6b 65 6e 20 26 26 20 70 43 6f 6c 75  mnToken && pColu
83c0: 6d 6e 54 6f 6b 65 6e 2d 3e 7a 20 29 3b 20 2f 2a  mnToken->z ); /*
83d0: 20 54 68 65 20 5a 20 69 6e 20 58 2e 59 2e 5a 20   The Z in X.Y.Z 
83e0: 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 20 2a  cannot be NULL *
83f0: 2f 0a 20 20 7a 44 62 20 3d 20 73 71 6c 69 74 65  /.  zDb = sqlite
8400: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
8410: 62 2c 20 70 44 62 54 6f 6b 65 6e 29 3b 0a 20 20  b, pDbToken);.  
8420: 7a 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4e 61  zTab = sqlite3Na
8430: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
8440: 70 54 61 62 6c 65 54 6f 6b 65 6e 29 3b 0a 20 20  pTableToken);.  
8450: 7a 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61  zCol = sqlite3Na
8460: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
8470: 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 29 3b 0a 20  pColumnToken);. 
8480: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
8490: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
84a0: 6f 20 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64  o lookupname_end
84b0: 3b 0a 20 20 7d 0a 0a 20 20 70 45 78 70 72 2d 3e  ;.  }..  pExpr->
84c0: 69 54 61 62 6c 65 20 3d 20 2d 31 3b 0a 20 20 77  iTable = -1;.  w
84d0: 68 69 6c 65 28 20 70 4e 43 20 26 26 20 63 6e 74  hile( pNC && cnt
84e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72 4c  ==0 ){.    ExprL
84f0: 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20  ist *pEList;.   
8500: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69   SrcList *pSrcLi
8510: 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69  st = pNC->pSrcLi
8520: 73 74 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 72  st;..    if( pSr
8530: 63 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 66  cList ){.      f
8540: 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 53  or(i=0, pItem=pS
8550: 72 63 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 53 72  rcList->a; i<pSr
8560: 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  cList->nSrc; i++
8570: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
8580: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
8590: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62  .        int iDb
85a0: 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e  ;.        Column
85b0: 20 2a 70 43 6f 6c 3b 0a 20 20 0a 20 20 20 20 20   *pCol;.  .     
85c0: 20 20 20 70 54 61 62 20 3d 20 70 49 74 65 6d 2d     pTab = pItem-
85d0: 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 61  >pTab;.        a
85e0: 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
85f0: 3b 0a 20 20 20 20 20 20 20 20 69 44 62 20 3d 20  ;.        iDb = 
8600: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
8610: 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
8620: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20  Schema);.       
8630: 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e   assert( pTab->n
8640: 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  Col>0 );.       
8650: 20 69 66 28 20 7a 54 61 62 20 29 7b 0a 20 20 20   if( zTab ){.   
8660: 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d         if( pItem
8670: 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20  ->zAlias ){.    
8680: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
8690: 61 62 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e  abName = pItem->
86a0: 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20  zAlias;.        
86b0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
86c0: 74 72 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65 2c  trICmp(zTabName,
86d0: 20 7a 54 61 62 29 21 3d 30 20 29 20 63 6f 6e 74   zTab)!=0 ) cont
86e0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
86f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
8700: 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d     char *zTabNam
8710: 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  e = pTab->zName;
8720: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
8730: 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20   zTabName==0 || 
8740: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
8750: 54 61 62 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d  TabName, zTab)!=
8760: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
8770: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 44            if( zD
8780: 62 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53  b!=0 && sqlite3S
8790: 74 72 49 43 6d 70 28 64 62 2d 3e 61 44 62 5b 69  trICmp(db->aDb[i
87a0: 44 62 5d 2e 7a 4e 61 6d 65 2c 20 7a 44 62 29 21  Db].zName, zDb)!
87b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
87c0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
87d0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
87e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
87f0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d  }.        if( 0=
8800: 3d 28 63 6e 74 54 61 62 2b 2b 29 20 29 7b 0a 20  =(cntTab++) ){. 
8810: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
8820: 69 54 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e  iTable = pItem->
8830: 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20  iCursor;.       
8840: 20 20 20 70 53 63 68 65 6d 61 20 3d 20 70 54 61     pSchema = pTa
8850: 62 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20  b->pSchema;.    
8860: 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70        pMatch = p
8870: 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Item;.        }.
8880: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c          for(j=0,
8890: 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c   pCol=pTab->aCol
88a0: 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
88b0: 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  j++, pCol++){.  
88c0: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
88d0: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d  te3StrICmp(pCol-
88e0: 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30  >zName, zCol)==0
88f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8900: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
8910: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  l = pTab->aCol[j
8920: 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  ].zColl;.       
8930: 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70 55 73       IdList *pUs
8940: 69 6e 67 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ing;.           
8950: 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20   cnt++;.        
8960: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
8970: 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  e = pItem->iCurs
8980: 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  or;.            
8990: 70 4d 61 74 63 68 20 3d 20 70 49 74 65 6d 3b 0a  pMatch = pItem;.
89a0: 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63 68              pSch
89b0: 65 6d 61 20 3d 20 70 54 61 62 2d 3e 70 53 63 68  ema = pTab->pSch
89c0: 65 6d 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ema;.           
89d0: 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 74   /* Substitute t
89e0: 68 65 20 72 6f 77 69 64 20 28 63 6f 6c 75 6d 6e  he rowid (column
89f0: 20 2d 31 29 20 66 6f 72 20 74 68 65 20 49 4e 54   -1) for the INT
8a00: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
8a10: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
8a20: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
8a30: 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20   j==pTab->iPKey 
8a40: 3f 20 2d 31 20 3a 20 6a 3b 0a 20 20 20 20 20 20  ? -1 : j;.      
8a50: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66        pExpr->aff
8a60: 69 6e 69 74 79 20 3d 20 70 54 61 62 2d 3e 61 43  inity = pTab->aC
8a70: 6f 6c 5b 6a 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  ol[j].affinity;.
8a80: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
8a90: 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20  (pExpr->flags & 
8aa0: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3d 3d  EP_ExpCollate)==
8ab0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
8ac0: 20 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20     pExpr->pColl 
8ad0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
8ae0: 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29  lSeq(db, ENC(db)
8af0: 2c 20 7a 43 6f 6c 6c 2c 2d 31 2c 20 30 29 3b 0a  , zColl,-1, 0);.
8b00: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
8b10: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c            if( i<
8b20: 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 2d 31  pSrcList->nSrc-1
8b30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8b40: 20 20 69 66 28 20 70 49 74 65 6d 5b 31 5d 2e 6a    if( pItem[1].j
8b50: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54  ointype & JT_NAT
8b60: 55 52 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  URAL ){.        
8b70: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
8b80: 69 73 20 6d 61 74 63 68 20 6f 63 63 75 72 72 65  is match occurre
8b90: 64 20 69 6e 20 74 68 65 20 6c 65 66 74 20 74 61  d in the left ta
8ba0: 62 6c 65 20 6f 66 20 61 20 6e 61 74 75 72 61 6c  ble of a natural
8bb0: 20 6a 6f 69 6e 2c 0a 20 20 20 20 20 20 20 20 20   join,.         
8bc0: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 73         ** then s
8bd0: 6b 69 70 20 74 68 65 20 72 69 67 68 74 20 74 61  kip the right ta
8be0: 62 6c 65 20 74 6f 20 61 76 6f 69 64 20 61 20 64  ble to avoid a d
8bf0: 75 70 6c 69 63 61 74 65 20 6d 61 74 63 68 20 2a  uplicate match *
8c00: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
8c10: 20 20 70 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20    pItem++;.     
8c20: 20 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a             i++;.
8c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65                }e
8c40: 6c 73 65 20 69 66 28 20 28 70 55 73 69 6e 67 20  lse if( (pUsing 
8c50: 3d 20 70 49 74 65 6d 5b 31 5d 2e 70 55 73 69 6e  = pItem[1].pUsin
8c60: 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  g)!=0 ){.       
8c70: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
8c80: 68 69 73 20 6d 61 74 63 68 20 6f 63 63 75 72 73  his match occurs
8c90: 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 74 68 61   on a column tha
8ca0: 74 20 69 73 20 69 6e 20 74 68 65 20 55 53 49 4e  t is in the USIN
8cb0: 47 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20  G clause.       
8cc0: 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61           ** of a
8cd0: 20 6a 6f 69 6e 2c 20 73 6b 69 70 20 74 68 65 20   join, skip the 
8ce0: 73 65 61 72 63 68 20 6f 66 20 74 68 65 20 72 69  search of the ri
8cf0: 67 68 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65  ght table of the
8d00: 20 6a 6f 69 6e 0a 20 20 20 20 20 20 20 20 20 20   join.          
8d10: 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69        ** to avoi
8d20: 64 20 61 20 64 75 70 6c 69 63 61 74 65 20 6d 61  d a duplicate ma
8d30: 74 63 68 20 74 68 65 72 65 2e 20 2a 2f 0a 20 20  tch there. */.  
8d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
8d50: 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t k;.           
8d60: 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c       for(k=0; k<
8d70: 70 55 73 69 6e 67 2d 3e 6e 49 64 3b 20 6b 2b 2b  pUsing->nId; k++
8d80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
8d90: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
8da0: 53 74 72 49 43 6d 70 28 70 55 73 69 6e 67 2d 3e  StrICmp(pUsing->
8db0: 61 5b 6b 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  a[k].zName, zCol
8dc0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
8dd0: 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
8de0: 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  m++;.           
8df0: 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20           i++;.  
8e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
8e20: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
8e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
8e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
8e50: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
8e60: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
8e70: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8e80: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
8e90: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
8ea0: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
8eb0: 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 68 61  .    /* If we ha
8ec0: 76 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 72  ve not already r
8ed0: 65 73 6f 6c 76 65 64 20 74 68 65 20 6e 61 6d 65  esolved the name
8ee0: 2c 20 74 68 65 6e 20 6d 61 79 62 65 20 0a 20 20  , then maybe .  
8ef0: 20 20 2a 2a 20 69 74 20 69 73 20 61 20 6e 65 77    ** it is a new
8f00: 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 74 72 69 67  .* or old.* trig
8f10: 67 65 72 20 61 72 67 75 6d 65 6e 74 20 72 65 66  ger argument ref
8f20: 65 72 65 6e 63 65 0a 20 20 20 20 2a 2f 0a 20 20  erence.    */.  
8f30: 20 20 69 66 28 20 7a 44 62 3d 3d 30 20 26 26 20    if( zDb==0 && 
8f40: 7a 54 61 62 21 3d 30 20 26 26 20 63 6e 74 3d 3d  zTab!=0 && cnt==
8f50: 30 20 26 26 20 70 50 61 72 73 65 2d 3e 74 72 69  0 && pParse->tri
8f60: 67 53 74 61 63 6b 21 3d 30 20 29 7b 0a 20 20 20  gStack!=0 ){.   
8f70: 20 20 20 54 72 69 67 67 65 72 53 74 61 63 6b 20     TriggerStack 
8f80: 2a 70 54 72 69 67 67 65 72 53 74 61 63 6b 20 3d  *pTriggerStack =
8f90: 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61   pParse->trigSta
8fa0: 63 6b 3b 0a 20 20 20 20 20 20 54 61 62 6c 65 20  ck;.      Table 
8fb0: 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20  *pTab = 0;.     
8fc0: 20 75 33 32 20 2a 70 69 43 6f 6c 4d 61 73 6b 3b   u32 *piColMask;
8fd0: 0a 20 20 20 20 20 20 69 66 28 20 70 54 72 69 67  .      if( pTrig
8fe0: 67 65 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64 78  gerStack->newIdx
8ff0: 20 21 3d 20 2d 31 20 26 26 20 73 71 6c 69 74 65   != -1 && sqlite
9000: 33 53 74 72 49 43 6d 70 28 22 6e 65 77 22 2c 20  3StrICmp("new", 
9010: 7a 54 61 62 29 20 3d 3d 20 30 20 29 7b 0a 20 20  zTab) == 0 ){.  
9020: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
9030: 62 6c 65 20 3d 20 70 54 72 69 67 67 65 72 53 74  ble = pTriggerSt
9040: 61 63 6b 2d 3e 6e 65 77 49 64 78 3b 0a 20 20 20  ack->newIdx;.   
9050: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72       assert( pTr
9060: 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62  iggerStack->pTab
9070: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62   );.        pTab
9080: 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63 6b   = pTriggerStack
9090: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
90a0: 70 69 43 6f 6c 4d 61 73 6b 20 3d 20 26 28 70 54  piColMask = &(pT
90b0: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6e 65 77  riggerStack->new
90c0: 43 6f 6c 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20  ColMask);.      
90d0: 7d 65 6c 73 65 20 69 66 28 20 70 54 72 69 67 67  }else if( pTrigg
90e0: 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 49 64 78 20  erStack->oldIdx 
90f0: 21 3d 20 2d 31 20 26 26 20 73 71 6c 69 74 65 33  != -1 && sqlite3
9100: 53 74 72 49 43 6d 70 28 22 6f 6c 64 22 2c 20 7a  StrICmp("old", z
9110: 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Tab)==0 ){.     
9120: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
9130: 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63 6b   = pTriggerStack
9140: 2d 3e 6f 6c 64 49 64 78 3b 0a 20 20 20 20 20 20  ->oldIdx;.      
9150: 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67    assert( pTrigg
9160: 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 20 29 3b  erStack->pTab );
9170: 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20  .        pTab = 
9180: 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70  pTriggerStack->p
9190: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 70 69 43  Tab;.        piC
91a0: 6f 6c 4d 61 73 6b 20 3d 20 26 28 70 54 72 69 67  olMask = &(pTrig
91b0: 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 43 6f 6c  gerStack->oldCol
91c0: 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  Mask);.      }..
91d0: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 20 29        if( pTab )
91e0: 7b 20 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  { .        int i
91f0: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c  Col;.        Col
9200: 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 70 54 61 62  umn *pCol = pTab
9210: 2d 3e 61 43 6f 6c 3b 0a 0a 20 20 20 20 20 20 20  ->aCol;..       
9220: 20 70 53 63 68 65 6d 61 20 3d 20 70 54 61 62 2d   pSchema = pTab-
9230: 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20  >pSchema;.      
9240: 20 20 63 6e 74 54 61 62 2b 2b 3b 0a 20 20 20 20    cntTab++;.    
9250: 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
9260: 69 43 6f 6c 20 3c 20 70 54 61 62 2d 3e 6e 43 6f  iCol < pTab->nCo
9270: 6c 3b 20 69 43 6f 6c 2b 2b 2c 20 70 43 6f 6c 2b  l; iCol++, pCol+
9280: 2b 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69  +) {.          i
9290: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
92a0: 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a  p(pCol->zName, z
92b0: 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Col)==0 ){.     
92c0: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
92d0: 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d  r *zColl = pTab-
92e0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 43 6f 6c  >aCol[iCol].zCol
92f0: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  l;.            c
9300: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt++;.          
9310: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
9320: 20 3d 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69   = iCol==pTab->i
9330: 50 4b 65 79 20 3f 20 2d 31 20 3a 20 69 43 6f 6c  PKey ? -1 : iCol
9340: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
9350: 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  xpr->affinity = 
9360: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
9370: 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20  .affinity;.     
9380: 20 20 20 20 20 20 20 69 66 28 20 28 70 45 78 70         if( (pExp
9390: 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78  r->flags & EP_Ex
93a0: 70 43 6f 6c 6c 61 74 65 29 3d 3d 30 20 29 7b 0a  pCollate)==0 ){.
93b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
93c0: 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c  xpr->pColl = sql
93d0: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
93e0: 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f  db, ENC(db), zCo
93f0: 6c 6c 2c 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20  ll,-1, 0);.     
9400: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9410: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62       pExpr->pTab
9420: 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20   = pTab;.       
9430: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30       if( iCol>=0
9440: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
9450: 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
9460: 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20  ==31 );.        
9470: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
9480: 69 43 6f 6c 3d 3d 33 32 20 29 3b 0a 20 20 20 20  iCol==32 );.    
9490: 20 20 20 20 20 20 20 20 20 20 2a 70 69 43 6f 6c            *piCol
94a0: 4d 61 73 6b 20 7c 3d 20 28 28 75 33 32 29 31 3c  Mask |= ((u32)1<
94b0: 3c 69 43 6f 6c 29 20 7c 20 28 69 43 6f 6c 3e 3d  <iCol) | (iCol>=
94c0: 33 32 3f 30 78 66 66 66 66 66 66 66 66 3a 30 29  32?0xffffffff:0)
94d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
94e0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
94f0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
9500: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
9510: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
9520: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
9530: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 2a  _OMIT_TRIGGER) *
9540: 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  /..    /*.    **
9550: 20 50 65 72 68 61 70 73 20 74 68 65 20 6e 61 6d   Perhaps the nam
9560: 65 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  e is a reference
9570: 20 74 6f 20 74 68 65 20 52 4f 57 49 44 0a 20 20   to the ROWID.  
9580: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e 74    */.    if( cnt
9590: 3d 3d 30 20 26 26 20 63 6e 74 54 61 62 3d 3d 31  ==0 && cntTab==1
95a0: 20 26 26 20 73 71 6c 69 74 65 33 49 73 52 6f 77   && sqlite3IsRow
95b0: 69 64 28 7a 43 6f 6c 29 20 29 7b 0a 20 20 20 20  id(zCol) ){.    
95c0: 20 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20    cnt = 1;.     
95d0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
95e0: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 45 78 70  = -1;.      pExp
95f0: 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51  r->affinity = SQ
9600: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
9610: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
9620: 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 69 6e      ** If the in
9630: 70 75 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f  put is of the fo
9640: 72 6d 20 5a 20 28 6e 6f 74 20 59 2e 5a 20 6f 72  rm Z (not Y.Z or
9650: 20 58 2e 59 2e 5a 29 20 74 68 65 6e 20 74 68 65   X.Y.Z) then the
9660: 20 6e 61 6d 65 20 5a 0a 20 20 20 20 2a 2a 20 6d   name Z.    ** m
9670: 69 67 68 74 20 72 65 66 65 72 20 74 6f 20 61 6e  ight refer to an
9680: 20 72 65 73 75 6c 74 2d 73 65 74 20 61 6c 69 61   result-set alia
9690: 73 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e 73  s.  This happens
96a0: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77  , for example, w
96b0: 68 65 6e 0a 20 20 20 20 2a 2a 20 77 65 20 61 72  hen.    ** we ar
96c0: 65 20 72 65 73 6f 6c 76 69 6e 67 20 6e 61 6d 65  e resolving name
96d0: 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
96e0: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 6c  lause of the fol
96f0: 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 3a 0a  lowing command:.
9700: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
9710: 20 20 53 45 4c 45 43 54 20 61 2b 62 20 41 53 20    SELECT a+b AS 
9720: 78 20 46 52 4f 4d 20 74 61 62 6c 65 20 57 48 45  x FROM table WHE
9730: 52 45 20 78 3c 31 30 3b 0a 20 20 20 20 2a 2a 0a  RE x<10;.    **.
9740: 20 20 20 20 2a 2a 20 49 6e 20 63 61 73 65 73 20      ** In cases 
9750: 6c 69 6b 65 20 74 68 69 73 2c 20 72 65 70 6c 61  like this, repla
9760: 63 65 20 70 45 78 70 72 20 77 69 74 68 20 61 20  ce pExpr with a 
9770: 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70 72  copy of the expr
9780: 65 73 73 69 6f 6e 20 74 68 61 74 0a 20 20 20 20  ession that.    
9790: 2a 2a 20 66 6f 72 6d 73 20 74 68 65 20 72 65 73  ** forms the res
97a0: 75 6c 74 20 73 65 74 20 65 6e 74 72 79 20 28 22  ult set entry ("
97b0: 61 2b 62 22 20 69 6e 20 74 68 65 20 65 78 61 6d  a+b" in the exam
97c0: 70 6c 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20  ple) and return 
97d0: 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20  immediately..   
97e0: 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
97f0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  e expression in 
9800: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 73  the result set s
9810: 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61  hould have alrea
9820: 64 79 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 72  dy been.    ** r
9830: 65 73 6f 6c 76 65 64 20 62 79 20 74 68 65 20 74  esolved by the t
9840: 69 6d 65 20 74 68 65 20 57 48 45 52 45 20 63 6c  ime the WHERE cl
9850: 61 75 73 65 20 69 73 20 72 65 73 6f 6c 76 65 64  ause is resolved
9860: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
9870: 20 63 6e 74 3d 3d 30 20 26 26 20 28 70 45 4c 69   cnt==0 && (pELi
9880: 73 74 20 3d 20 70 4e 43 2d 3e 70 45 4c 69 73 74  st = pNC->pEList
9890: 29 21 3d 30 20 26 26 20 7a 54 61 62 3d 3d 30 20  )!=0 && zTab==0 
98a0: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  ){.      for(j=0
98b0: 3b 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; j<pEList->nExp
98c0: 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; j++){.       
98d0: 20 63 68 61 72 20 2a 7a 41 73 20 3d 20 70 45 4c   char *zAs = pEL
98e0: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ist->a[j].zName;
98f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 41 73  .        if( zAs
9900: 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74  !=0 && sqlite3St
9910: 72 49 43 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c 29  rICmp(zAs, zCol)
9920: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
9930: 20 45 78 70 72 20 2a 70 44 75 70 2c 20 2a 70 4f   Expr *pDup, *pO
9940: 72 69 67 3b 0a 20 20 20 20 20 20 20 20 20 20 61  rig;.          a
9950: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
9960: 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d  eft==0 && pExpr-
9970: 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
9980: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9990: 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20  pExpr->pList==0 
99a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
99b0: 65 72 74 28 20 70 45 78 70 72 2d 3e 70 53 65 6c  ert( pExpr->pSel
99c0: 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ect==0 );.      
99d0: 20 20 20 20 70 4f 72 69 67 20 3d 20 70 45 4c 69      pOrig = pELi
99e0: 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 3b 0a  st->a[j].pExpr;.
99f0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
9a00: 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 26 26 20  NC->allowAgg && 
9a10: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9a20: 70 4f 72 69 67 2c 20 45 50 5f 41 67 67 29 20 29  pOrig, EP_Agg) )
9a30: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
9a40: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
9a50: 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66  arse, "misuse of
9a60: 20 61 6c 69 61 73 65 64 20 61 67 67 72 65 67 61   aliased aggrega
9a70: 74 65 20 25 73 22 2c 20 7a 41 73 29 3b 0a 20 20  te %s", zAs);.  
9a80: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
9a90: 33 5f 66 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20  3_free(zCol);.  
9aa0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
9ab0: 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   2;.          }.
9ac0: 20 20 20 20 20 20 20 20 20 20 70 44 75 70 20 3d            pDup =
9ad0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
9ae0: 64 62 2c 20 70 4f 72 69 67 29 3b 0a 20 20 20 20  db, pOrig);.    
9af0: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
9b00: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
9b10: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20  ollate ){.      
9b20: 20 20 20 20 20 20 70 44 75 70 2d 3e 70 43 6f 6c        pDup->pCol
9b30: 6c 20 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c  l = pExpr->pColl
9b40: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 44  ;.            pD
9b50: 75 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  up->flags |= EP_
9b60: 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20  ExpCollate;.    
9b70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9b80: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 73 70 61    if( pExpr->spa
9b90: 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74 65 33 5f  n.dyn ) sqlite3_
9ba0: 66 72 65 65 28 28 63 68 61 72 2a 29 70 45 78 70  free((char*)pExp
9bb0: 72 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20 20 20  r->span.z);.    
9bc0: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
9bd0: 3e 74 6f 6b 65 6e 2e 64 79 6e 20 29 20 73 71 6c  >token.dyn ) sql
9be0: 69 74 65 33 5f 66 72 65 65 28 28 63 68 61 72 2a  ite3_free((char*
9bf0: 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 29  )pExpr->token.z)
9c00: 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  ;.          memc
9c10: 70 79 28 70 45 78 70 72 2c 20 70 44 75 70 2c 20  py(pExpr, pDup, 
9c20: 73 69 7a 65 6f 66 28 2a 70 45 78 70 72 29 29 3b  sizeof(*pExpr));
9c30: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
9c40: 65 33 5f 66 72 65 65 28 70 44 75 70 29 3b 0a 20  e3_free(pDup);. 
9c50: 20 20 20 20 20 20 20 20 20 63 6e 74 20 3d 20 31           cnt = 1
9c60: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 61 74  ;.          pMat
9c70: 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ch = 0;.        
9c80: 20 20 61 73 73 65 72 74 28 20 7a 54 61 62 3d 3d    assert( zTab==
9c90: 30 20 26 26 20 7a 44 62 3d 3d 30 20 29 3b 0a 20  0 && zDb==0 );. 
9ca0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6c 6f           goto lo
9cb0: 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 5f 32 3b 0a  okupname_end_2;.
9cc0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9cd0: 7d 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  } .    }..    /*
9ce0: 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20   Advance to the 
9cf0: 6e 65 78 74 20 6e 61 6d 65 20 63 6f 6e 74 65 78  next name contex
9d00: 74 2e 20 20 54 68 65 20 6c 6f 6f 70 20 77 69 6c  t.  The loop wil
9d10: 6c 20 65 78 69 74 20 77 68 65 6e 20 65 69 74 68  l exit when eith
9d20: 65 72 0a 20 20 20 20 2a 2a 20 77 65 20 68 61 76  er.    ** we hav
9d30: 65 20 61 20 6d 61 74 63 68 20 28 63 6e 74 3e 30  e a match (cnt>0
9d40: 29 20 6f 72 20 77 68 65 6e 20 77 65 20 72 75 6e  ) or when we run
9d50: 20 6f 75 74 20 6f 66 20 6e 61 6d 65 20 63 6f 6e   out of name con
9d60: 74 65 78 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  texts..    */.  
9d70: 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 29 7b 0a    if( cnt==0 ){.
9d80: 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d        pNC = pNC-
9d90: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
9da0: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  }..  /*.  ** If 
9db0: 58 20 61 6e 64 20 59 20 61 72 65 20 4e 55 4c 4c  X and Y are NULL
9dc0: 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (in other words
9dd0: 20 69 66 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c   if only the col
9de0: 75 6d 6e 20 6e 61 6d 65 20 5a 20 69 73 0a 20 20  umn name Z is.  
9df0: 2a 2a 20 73 75 70 70 6c 69 65 64 29 20 61 6e 64  ** supplied) and
9e00: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 5a 20   the value of Z 
9e10: 69 73 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 64  is enclosed in d
9e20: 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2c 20 74 68  ouble-quotes, th
9e30: 65 6e 0a 20 20 2a 2a 20 5a 20 69 73 20 61 20 73  en.  ** Z is a s
9e40: 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 20 69 66  tring literal if
9e50: 20 69 74 20 64 6f 65 73 6e 27 74 20 6d 61 74 63   it doesn't matc
9e60: 68 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d  h any column nam
9e70: 65 73 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 2a  es.  In that.  *
9e80: 2a 20 63 61 73 65 2c 20 77 65 20 6e 65 65 64 20  * case, we need 
9e90: 74 6f 20 72 65 74 75 72 6e 20 72 69 67 68 74 20  to return right 
9ea0: 61 77 61 79 20 61 6e 64 20 6e 6f 74 20 6d 61 6b  away and not mak
9eb0: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 74 6f  e any changes to
9ec0: 0a 20 20 2a 2a 20 70 45 78 70 72 2e 0a 20 20 2a  .  ** pExpr..  *
9ed0: 2a 0a 20 20 2a 2a 20 42 65 63 61 75 73 65 20 6e  *.  ** Because n
9ee0: 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73 20  o reference was 
9ef0: 6d 61 64 65 20 74 6f 20 6f 75 74 65 72 20 63 6f  made to outer co
9f00: 6e 74 65 78 74 73 2c 20 74 68 65 20 70 4e 43 2d  ntexts, the pNC-
9f10: 3e 6e 52 65 66 0a 20 20 2a 2a 20 66 69 65 6c 64  >nRef.  ** field
9f20: 73 20 61 72 65 20 6e 6f 74 20 63 68 61 6e 67 65  s are not change
9f30: 64 20 69 6e 20 61 6e 79 20 63 6f 6e 74 65 78 74  d in any context
9f40: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74  ..  */.  if( cnt
9f50: 3d 3d 30 20 26 26 20 7a 54 61 62 3d 3d 30 20 26  ==0 && zTab==0 &
9f60: 26 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e  & pColumnToken->
9f70: 7a 5b 30 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20  z[0]=='"' ){.   
9f80: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
9f90: 6f 6c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ol);.    return 
9fa0: 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  0;.  }..  /*.  *
9fb0: 2a 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74  * cnt==0 means t
9fc0: 68 65 72 65 20 77 61 73 20 6e 6f 74 20 6d 61 74  here was not mat
9fd0: 63 68 2e 20 20 63 6e 74 3e 31 20 6d 65 61 6e 73  ch.  cnt>1 means
9fe0: 20 74 68 65 72 65 20 77 65 72 65 20 74 77 6f 20   there were two 
9ff0: 6f 72 0a 20 20 2a 2a 20 6d 6f 72 65 20 6d 61 74  or.  ** more mat
a000: 63 68 65 73 2e 20 20 45 69 74 68 65 72 20 77 61  ches.  Either wa
a010: 79 2c 20 77 65 20 68 61 76 65 20 61 6e 20 65 72  y, we have an er
a020: 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ror..  */.  if( 
a030: 63 6e 74 21 3d 31 20 29 7b 0a 20 20 20 20 63 6f  cnt!=1 ){.    co
a040: 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a  nst char *zErr;.
a050: 20 20 20 20 7a 45 72 72 20 3d 20 63 6e 74 3d 3d      zErr = cnt==
a060: 30 20 3f 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c  0 ? "no such col
a070: 75 6d 6e 22 20 3a 20 22 61 6d 62 69 67 75 6f 75  umn" : "ambiguou
a080: 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 22 3b 0a  s column name";.
a090: 20 20 20 20 69 66 28 20 7a 44 62 20 29 7b 0a 20      if( zDb ){. 
a0a0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
a0b0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
a0c0: 3a 20 25 73 2e 25 73 2e 25 73 22 2c 20 7a 45 72  : %s.%s.%s", zEr
a0d0: 72 2c 20 7a 44 62 2c 20 7a 54 61 62 2c 20 7a 43  r, zDb, zTab, zC
a0e0: 6f 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ol);.    }else i
a0f0: 66 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20 20  f( zTab ){.     
a100: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
a110: 28 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73  (pParse, "%s: %s
a120: 2e 25 73 22 2c 20 7a 45 72 72 2c 20 7a 54 61 62  .%s", zErr, zTab
a130: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 65 6c  , zCol);.    }el
a140: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
a150: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
a160: 2c 20 22 25 73 3a 20 25 73 22 2c 20 7a 45 72 72  , "%s: %s", zErr
a170: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20  , zCol);.    }. 
a180: 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 45 72 72 2b     pTopNC->nErr+
a190: 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  +;.  }..  /* If 
a1a0: 61 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 20  a column from a 
a1b0: 74 61 62 6c 65 20 69 6e 20 70 53 72 63 4c 69 73  table in pSrcLis
a1c0: 74 20 69 73 20 72 65 66 65 72 65 6e 63 65 64 2c  t is referenced,
a1d0: 20 74 68 65 6e 20 72 65 63 6f 72 64 0a 20 20 2a   then record.  *
a1e0: 2a 20 74 68 69 73 20 66 61 63 74 20 69 6e 20 74  * this fact in t
a1f0: 68 65 20 70 53 72 63 4c 69 73 74 2e 61 5b 5d 2e  he pSrcList.a[].
a200: 63 6f 6c 55 73 65 64 20 62 69 74 6d 61 73 6b 2e  colUsed bitmask.
a210: 20 20 43 6f 6c 75 6d 6e 20 30 20 63 61 75 73 65    Column 0 cause
a220: 73 0a 20 20 2a 2a 20 62 69 74 20 30 20 74 6f 20  s.  ** bit 0 to 
a230: 62 65 20 73 65 74 2e 20 20 43 6f 6c 75 6d 6e 20  be set.  Column 
a240: 31 20 73 65 74 73 20 62 69 74 20 31 2e 20 20 41  1 sets bit 1.  A
a250: 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 66  nd so forth.  If
a260: 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e   the.  ** column
a270: 20 6e 75 6d 62 65 72 20 69 73 20 67 72 65 61 74   number is great
a280: 65 72 20 74 68 61 6e 20 74 68 65 20 6e 75 6d 62  er than the numb
a290: 65 72 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68  er of bits in th
a2a0: 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 74  e bitmask.  ** t
a2b0: 68 65 6e 20 73 65 74 20 74 68 65 20 68 69 67 68  hen set the high
a2c0: 2d 6f 72 64 65 72 20 62 69 74 20 6f 66 20 74 68  -order bit of th
a2d0: 65 20 62 69 74 6d 61 73 6b 2e 0a 20 20 2a 2f 0a  e bitmask..  */.
a2e0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
a2f0: 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 4d 61 74 63  lumn>=0 && pMatc
a300: 68 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  h!=0 ){.    int 
a310: 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  n = pExpr->iColu
a320: 6d 6e 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  mn;.    testcase
a330: 28 20 6e 3d 3d 73 69 7a 65 6f 66 28 42 69 74 6d  ( n==sizeof(Bitm
a340: 61 73 6b 29 2a 38 2d 31 20 29 3b 0a 20 20 20 20  ask)*8-1 );.    
a350: 69 66 28 20 6e 3e 3d 73 69 7a 65 6f 66 28 42 69  if( n>=sizeof(Bi
a360: 74 6d 61 73 6b 29 2a 38 20 29 7b 0a 20 20 20 20  tmask)*8 ){.    
a370: 20 20 6e 20 3d 20 73 69 7a 65 6f 66 28 42 69 74    n = sizeof(Bit
a380: 6d 61 73 6b 29 2a 38 2d 31 3b 0a 20 20 20 20 7d  mask)*8-1;.    }
a390: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 61  .    assert( pMa
a3a0: 74 63 68 2d 3e 69 43 75 72 73 6f 72 3d 3d 70 45  tch->iCursor==pE
a3b0: 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20  xpr->iTable );. 
a3c0: 20 20 20 70 4d 61 74 63 68 2d 3e 63 6f 6c 55 73     pMatch->colUs
a3d0: 65 64 20 7c 3d 20 28 28 42 69 74 6d 61 73 6b 29  ed |= ((Bitmask)
a3e0: 31 29 3c 3c 6e 3b 0a 20 20 7d 0a 0a 6c 6f 6f 6b  1)<<n;.  }..look
a3f0: 75 70 6e 61 6d 65 5f 65 6e 64 3a 0a 20 20 2f 2a  upname_end:.  /*
a400: 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 72 65   Clean up and re
a410: 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  turn.  */.  sqli
a420: 74 65 33 5f 66 72 65 65 28 7a 44 62 29 3b 0a 20  te3_free(zDb);. 
a430: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
a440: 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ab);.  sqlite3Ex
a450: 70 72 44 65 6c 65 74 65 28 70 45 78 70 72 2d 3e  prDelete(pExpr->
a460: 70 4c 65 66 74 29 3b 0a 20 20 70 45 78 70 72 2d  pLeft);.  pExpr-
a470: 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 73 71  >pLeft = 0;.  sq
a480: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
a490: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
a4a0: 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20    pExpr->pRight 
a4b0: 3d 20 30 3b 0a 20 20 70 45 78 70 72 2d 3e 6f 70  = 0;.  pExpr->op
a4c0: 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 6c 6f   = TK_COLUMN;.lo
a4d0: 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 5f 32 3a 0a  okupname_end_2:.
a4e0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
a4f0: 43 6f 6c 29 3b 0a 20 20 69 66 28 20 63 6e 74 3d  Col);.  if( cnt=
a500: 3d 31 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =1 ){.    assert
a510: 28 20 70 4e 43 21 3d 30 20 29 3b 0a 20 20 20 20  ( pNC!=0 );.    
a520: 73 71 6c 69 74 65 33 41 75 74 68 52 65 61 64 28  sqlite3AuthRead(
a530: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 70  pParse, pExpr, p
a540: 53 63 68 65 6d 61 2c 20 70 4e 43 2d 3e 70 53 72  Schema, pNC->pSr
a550: 63 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20  cList);.    if( 
a560: 70 4d 61 74 63 68 20 26 26 20 21 70 4d 61 74 63  pMatch && !pMatc
a570: 68 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  h->pSelect ){.  
a580: 20 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20      pExpr->pTab 
a590: 3d 20 70 4d 61 74 63 68 2d 3e 70 54 61 62 3b 0a  = pMatch->pTab;.
a5a0: 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 63      }.    /* Inc
a5b0: 72 65 6d 65 6e 74 20 74 68 65 20 6e 52 65 66 20  rement the nRef 
a5c0: 76 61 6c 75 65 20 6f 6e 20 61 6c 6c 20 6e 61 6d  value on all nam
a5d0: 65 20 63 6f 6e 74 65 78 74 73 20 66 72 6f 6d 20  e contexts from 
a5e0: 54 6f 70 4e 43 20 75 70 20 74 6f 0a 20 20 20 20  TopNC up to.    
a5f0: 2a 2a 20 74 68 65 20 70 6f 69 6e 74 20 77 68 65  ** the point whe
a600: 72 65 20 74 68 65 20 6e 61 6d 65 20 6d 61 74 63  re the name matc
a610: 68 65 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28  hed. */.    for(
a620: 3b 3b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ;;){.      asser
a630: 74 28 20 70 54 6f 70 4e 43 21 3d 30 20 29 3b 0a  t( pTopNC!=0 );.
a640: 20 20 20 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 52        pTopNC->nR
a650: 65 66 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ef++;.      if( 
a660: 70 54 6f 70 4e 43 3d 3d 70 4e 43 20 29 20 62 72  pTopNC==pNC ) br
a670: 65 61 6b 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e  eak;.      pTopN
a680: 43 20 3d 20 70 54 6f 70 4e 43 2d 3e 70 4e 65 78  C = pTopNC->pNex
a690: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  t;.    }.    ret
a6a0: 75 72 6e 20 30 3b 0a 20 20 7d 20 65 6c 73 65 20  urn 0;.  } else 
a6b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
a6c0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
a6d0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 64 65 73  s routine is des
a6e0: 69 67 6e 65 64 20 61 73 20 61 6e 20 78 46 75 6e  igned as an xFun
a6f0: 63 20 66 6f 72 20 77 61 6c 6b 45 78 70 72 54 72  c for walkExprTr
a700: 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 73 6f  ee()..**.** Reso
a710: 6c 76 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d  lve symbolic nam
a720: 65 73 20 69 6e 74 6f 20 54 4b 5f 43 4f 4c 55 4d  es into TK_COLUM
a730: 4e 20 6f 70 65 72 61 74 6f 72 73 20 66 6f 72 20  N operators for 
a740: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 6e  the current.** n
a750: 6f 64 65 20 69 6e 20 74 68 65 20 65 78 70 72 65  ode in the expre
a760: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
a770: 75 72 6e 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75  urn 0 to continu
a780: 65 20 74 68 65 20 73 65 61 72 63 68 20 64 6f 77  e the search dow
a790: 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 6f 72  n.** the tree or
a7a0: 20 32 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20   2 to abort the 
a7b0: 74 72 65 65 20 77 61 6c 6b 2e 0a 2a 2a 0a 2a 2a  tree walk..**.**
a7c0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   This routine al
a7d0: 73 6f 20 64 6f 65 73 20 65 72 72 6f 72 20 63 68  so does error ch
a7e0: 65 63 6b 69 6e 67 20 61 6e 64 20 6e 61 6d 65 20  ecking and name 
a7f0: 72 65 73 6f 6c 75 74 69 6f 6e 20 66 6f 72 0a 2a  resolution for.*
a800: 2a 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73  * function names
a810: 2e 20 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20  .  The operator 
a820: 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75  for aggregate fu
a830: 6e 63 74 69 6f 6e 73 20 69 73 20 63 68 61 6e 67  nctions is chang
a840: 65 64 0a 2a 2a 20 74 6f 20 54 4b 5f 41 47 47 5f  ed.** to TK_AGG_
a850: 46 55 4e 43 54 49 4f 4e 2e 0a 2a 2f 0a 73 74 61  FUNCTION..*/.sta
a860: 74 69 63 20 69 6e 74 20 6e 61 6d 65 52 65 73 6f  tic int nameReso
a870: 6c 76 65 72 53 74 65 70 28 76 6f 69 64 20 2a 70  lverStep(void *p
a880: 41 72 67 2c 20 45 78 70 72 20 2a 70 45 78 70 72  Arg, Expr *pExpr
a890: 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  ){.  NameContext
a8a0: 20 2a 70 4e 43 20 3d 20 28 4e 61 6d 65 43 6f 6e   *pNC = (NameCon
a8b0: 74 65 78 74 2a 29 70 41 72 67 3b 0a 20 20 50 61  text*)pArg;.  Pa
a8c0: 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 0a 20 20  rse *pParse;..  
a8d0: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
a8e0: 65 74 75 72 6e 20 31 3b 0a 20 20 61 73 73 65 72  eturn 1;.  asser
a8f0: 74 28 20 70 4e 43 21 3d 30 20 29 3b 0a 20 20 70  t( pNC!=0 );.  p
a900: 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61  Parse = pNC->pPa
a910: 72 73 65 3b 0a 0a 20 20 69 66 28 20 45 78 70 72  rse;..  if( Expr
a920: 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
a930: 45 78 70 72 2c 20 45 50 5f 52 65 73 6f 6c 76 65  Expr, EP_Resolve
a940: 64 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  d) ) return 1;. 
a950: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
a960: 28 70 45 78 70 72 2c 20 45 50 5f 52 65 73 6f 6c  (pExpr, EP_Resol
a970: 76 65 64 29 3b 0a 23 69 66 6e 64 65 66 20 4e 44  ved);.#ifndef ND
a980: 45 42 55 47 0a 20 20 69 66 28 20 70 4e 43 2d 3e  EBUG.  if( pNC->
a990: 70 53 72 63 4c 69 73 74 20 26 26 20 70 4e 43 2d  pSrcList && pNC-
a9a0: 3e 70 53 72 63 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  >pSrcList->nAllo
a9b0: 63 3e 30 20 29 7b 0a 20 20 20 20 53 72 63 4c 69  c>0 ){.    SrcLi
a9c0: 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70  st *pSrcList = p
a9d0: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20  NC->pSrcList;.  
a9e0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
a9f0: 28 69 3d 30 3b 20 69 3c 70 4e 43 2d 3e 70 53 72  (i=0; i<pNC->pSr
aa00: 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  cList->nSrc; i++
aa10: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
aa20: 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pSrcList->a[i].
aa30: 69 43 75 72 73 6f 72 3e 3d 30 20 26 26 20 70 53  iCursor>=0 && pS
aa40: 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75  rcList->a[i].iCu
aa50: 72 73 6f 72 3c 70 50 61 72 73 65 2d 3e 6e 54 61  rsor<pParse->nTa
aa60: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  b);.    }.  }.#e
aa70: 6e 64 69 66 0a 20 20 73 77 69 74 63 68 28 20 70  ndif.  switch( p
aa80: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
aa90: 2f 2a 20 44 6f 75 62 6c 65 2d 71 75 6f 74 65 64  /* Double-quoted
aaa0: 20 73 74 72 69 6e 67 73 20 28 65 78 3a 20 22 61   strings (ex: "a
aab0: 62 63 22 29 20 61 72 65 20 75 73 65 64 20 61 73  bc") are used as
aac0: 20 69 64 65 6e 74 69 66 69 65 72 73 20 69 66 0a   identifiers if.
aad0: 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e      ** possible.
aae0: 20 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 79    Otherwise they
aaf0: 20 72 65 6d 61 69 6e 20 61 73 20 73 74 72 69 6e   remain as strin
ab00: 67 73 2e 20 20 53 69 6e 67 6c 65 2d 71 75 6f 74  gs.  Single-quot
ab10: 65 64 0a 20 20 20 20 2a 2a 20 73 74 72 69 6e 67  ed.    ** string
ab20: 73 20 28 65 78 3a 20 27 61 62 63 27 29 20 61 72  s (ex: 'abc') ar
ab30: 65 20 61 6c 77 61 79 73 20 73 74 72 69 6e 67 20  e always string 
ab40: 6c 69 74 65 72 61 6c 73 2e 0a 20 20 20 20 2a 2f  literals..    */
ab50: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
ab60: 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ING: {.      if(
ab70: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b   pExpr->token.z[
ab80: 30 5d 3d 3d 27 5c 27 27 20 29 20 62 72 65 61 6b  0]=='\'' ) break
ab90: 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20  ;.      /* Fall 
aba0: 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b  thru into the TK
abb0: 5f 49 44 20 63 61 73 65 20 69 66 20 74 68 69 73  _ID case if this
abc0: 20 69 73 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f   is a double-quo
abd0: 74 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  ted string */.  
abe0: 20 20 7d 0a 20 20 20 20 2f 2a 20 41 20 6c 6f 6e    }.    /* A lon
abf0: 65 20 69 64 65 6e 74 69 66 69 65 72 20 69 73 20  e identifier is 
ac00: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f  the name of a co
ac10: 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lumn..    */.   
ac20: 20 63 61 73 65 20 54 4b 5f 49 44 3a 20 7b 0a 20   case TK_ID: {. 
ac30: 20 20 20 20 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28       lookupName(
ac40: 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 26 70  pParse, 0, 0, &p
ac50: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 70 4e 43  Expr->token, pNC
ac60: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
ac70: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
ac80: 20 20 0a 20 20 20 20 2f 2a 20 41 20 74 61 62 6c    .    /* A tabl
ac90: 65 20 6e 61 6d 65 20 61 6e 64 20 63 6f 6c 75 6d  e name and colum
aca0: 6e 20 6e 61 6d 65 3a 20 20 20 20 20 49 44 2e 49  n name:     ID.I
acb0: 44 0a 20 20 20 20 2a 2a 20 4f 72 20 61 20 64 61  D.    ** Or a da
acc0: 74 61 62 61 73 65 2c 20 74 61 62 6c 65 20 61 6e  tabase, table an
acd0: 64 20 63 6f 6c 75 6d 6e 3a 20 20 49 44 2e 49 44  d column:  ID.ID
ace0: 2e 49 44 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  .ID.    */.    c
acf0: 61 73 65 20 54 4b 5f 44 4f 54 3a 20 7b 0a 20 20  ase TK_DOT: {.  
ad00: 20 20 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75      Token *pColu
ad10: 6d 6e 3b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20  mn;.      Token 
ad20: 2a 70 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 54  *pTable;.      T
ad30: 6f 6b 65 6e 20 2a 70 44 62 3b 0a 20 20 20 20 20  oken *pDb;.     
ad40: 20 45 78 70 72 20 2a 70 52 69 67 68 74 3b 0a 0a   Expr *pRight;..
ad50: 20 20 20 20 20 20 2f 2a 20 69 66 28 20 70 53 72        /* if( pSr
ad60: 63 4c 69 73 74 3d 3d 30 20 29 20 62 72 65 61 6b  cList==0 ) break
ad70: 3b 20 2a 2f 0a 20 20 20 20 20 20 70 52 69 67 68  ; */.      pRigh
ad80: 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68  t = pExpr->pRigh
ad90: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 69  t;.      if( pRi
ada0: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29  ght->op==TK_ID )
adb0: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 20 3d 20  {.        pDb = 
adc0: 30 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 6c  0;.        pTabl
add0: 65 20 3d 20 26 70 45 78 70 72 2d 3e 70 4c 65 66  e = &pExpr->pLef
ade0: 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  t->token;.      
adf0: 20 20 70 43 6f 6c 75 6d 6e 20 3d 20 26 70 52 69    pColumn = &pRi
ae00: 67 68 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20  ght->token;.    
ae10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ae20: 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74 2d   assert( pRight-
ae30: 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 3b 0a 20  >op==TK_DOT );. 
ae40: 20 20 20 20 20 20 20 70 44 62 20 3d 20 26 70 45         pDb = &pE
ae50: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65  xpr->pLeft->toke
ae60: 6e 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 6c  n;.        pTabl
ae70: 65 20 3d 20 26 70 52 69 67 68 74 2d 3e 70 4c 65  e = &pRight->pLe
ae80: 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20  ft->token;.     
ae90: 20 20 20 70 43 6f 6c 75 6d 6e 20 3d 20 26 70 52     pColumn = &pR
aea0: 69 67 68 74 2d 3e 70 52 69 67 68 74 2d 3e 74 6f  ight->pRight->to
aeb0: 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ken;.      }.   
aec0: 20 20 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70 50     lookupName(pP
aed0: 61 72 73 65 2c 20 70 44 62 2c 20 70 54 61 62 6c  arse, pDb, pTabl
aee0: 65 2c 20 70 43 6f 6c 75 6d 6e 2c 20 70 4e 43 2c  e, pColumn, pNC,
aef0: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 72   pExpr);.      r
af00: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a  eturn 1;.    }..
af10: 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 66      /* Resolve f
af20: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 0a 20 20  unction names.  
af30: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b    */.    case TK
af40: 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20  _CONST_FUNC:.   
af50: 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
af60: 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c  N: {.      ExprL
af70: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
af80: 70 72 2d 3e 70 4c 69 73 74 3b 20 20 20 20 2f 2a  pr->pList;    /*
af90: 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6c 69   The argument li
afa0: 73 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  st */.      int 
afb0: 6e 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73  n = pList ? pLis
afc0: 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 20 20 2f  t->nExpr : 0;  /
afd0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
afe0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69  ments */.      i
aff0: 6e 74 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20  nt no_such_func 
b000: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 72  = 0;       /* Tr
b010: 75 65 20 69 66 20 6e 6f 20 73 75 63 68 20 66 75  ue if no such fu
b020: 6e 63 74 69 6f 6e 20 65 78 69 73 74 73 20 2a 2f  nction exists */
b030: 0a 20 20 20 20 20 20 69 6e 74 20 77 72 6f 6e 67  .      int wrong
b040: 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 30 3b 20 20  _num_args = 0;  
b050: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 72     /* True if wr
b060: 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  ong number of ar
b070: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  guments */.     
b080: 20 69 6e 74 20 69 73 5f 61 67 67 20 3d 20 30 3b   int is_agg = 0;
b090: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b0a0: 54 72 75 65 20 69 66 20 69 73 20 61 6e 20 61 67  True if is an ag
b0b0: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
b0c0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   */.      int i;
b0d0: 0a 20 20 20 20 20 20 69 6e 74 20 61 75 74 68 3b  .      int auth;
b0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0f0: 20 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 61 74     /* Authorizat
b100: 69 6f 6e 20 74 6f 20 75 73 65 20 74 68 65 20 66  ion to use the f
b110: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  unction */.     
b120: 20 69 6e 74 20 6e 49 64 3b 20 20 20 20 20 20 20   int nId;       
b130: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b140: 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  Number of charac
b150: 74 65 72 73 20 69 6e 20 66 75 6e 63 74 69 6f 6e  ters in function
b160: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 63   name */.      c
b170: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 20  onst char *zId; 
b180: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
b190: 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 2e  e function name.
b1a0: 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63 44 65   */.      FuncDe
b1b0: 66 20 2a 70 44 65 66 3b 20 20 20 20 20 20 20 20  f *pDef;        
b1c0: 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61        /* Informa
b1d0: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66  tion about the f
b1e0: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  unction */.     
b1f0: 20 69 6e 74 20 65 6e 63 20 3d 20 45 4e 43 28 70   int enc = ENC(p
b200: 50 61 72 73 65 2d 3e 64 62 29 3b 20 20 2f 2a 20  Parse->db);  /* 
b210: 54 68 65 20 64 61 74 61 62 61 73 65 20 65 6e 63  The database enc
b220: 6f 64 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 20 20  oding */..      
b230: 7a 49 64 20 3d 20 28 63 68 61 72 2a 29 70 45 78  zId = (char*)pEx
b240: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20  pr->token.z;.   
b250: 20 20 20 6e 49 64 20 3d 20 70 45 78 70 72 2d 3e     nId = pExpr->
b260: 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 70  token.n;.      p
b270: 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Def = sqlite3Fin
b280: 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  dFunction(pParse
b290: 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20  ->db, zId, nId, 
b2a0: 6e 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20  n, enc, 0);.    
b2b0: 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29 7b    if( pDef==0 ){
b2c0: 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20  .        pDef = 
b2d0: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
b2e0: 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ion(pParse->db, 
b2f0: 7a 49 64 2c 20 6e 49 64 2c 20 2d 31 2c 20 65 6e  zId, nId, -1, en
b300: 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  c, 0);.        i
b310: 66 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20  f( pDef==0 ){.  
b320: 20 20 20 20 20 20 20 20 6e 6f 5f 73 75 63 68 5f          no_such_
b330: 66 75 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  func = 1;.      
b340: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b350: 20 20 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67     wrong_num_arg
b360: 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  s = 1;.        }
b370: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
b380: 20 20 20 20 20 20 69 73 5f 61 67 67 20 3d 20 70        is_agg = p
b390: 44 65 66 2d 3e 78 46 75 6e 63 3d 3d 30 3b 0a 20  Def->xFunc==0;. 
b3a0: 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53       }.#ifndef S
b3b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
b3c0: 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 20 20 69  RIZATION.      i
b3d0: 66 28 20 70 44 65 66 20 29 7b 0a 20 20 20 20 20  f( pDef ){.     
b3e0: 20 20 20 61 75 74 68 20 3d 20 73 71 6c 69 74 65     auth = sqlite
b3f0: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
b400: 65 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 54 49  e, SQLITE_FUNCTI
b410: 4f 4e 2c 20 30 2c 20 70 44 65 66 2d 3e 7a 4e 61  ON, 0, pDef->zNa
b420: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  me, 0);.        
b430: 69 66 28 20 61 75 74 68 21 3d 53 51 4c 49 54 45  if( auth!=SQLITE
b440: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
b450: 20 69 66 28 20 61 75 74 68 3d 3d 53 51 4c 49 54   if( auth==SQLIT
b460: 45 5f 44 45 4e 59 20 29 7b 0a 20 20 20 20 20 20  E_DENY ){.      
b470: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
b480: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
b490: 6f 74 20 61 75 74 68 6f 72 69 7a 65 64 20 74 6f  ot authorized to
b4a0: 20 75 73 65 20 66 75 6e 63 74 69 6f 6e 3a 20 25   use function: %
b4b0: 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
b4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4d0: 20 20 20 20 20 20 20 20 70 44 65 66 2d 3e 7a 4e          pDef->zN
b4e0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
b4f0: 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20    pNC->nErr++;. 
b500: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
b510: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
b520: 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20   TK_NULL;.      
b530: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
b540: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
b550: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
b560: 20 69 73 5f 61 67 67 20 26 26 20 21 70 4e 43 2d   is_agg && !pNC-
b570: 3e 61 6c 6c 6f 77 41 67 67 20 29 7b 0a 20 20 20  >allowAgg ){.   
b580: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
b590: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69  rMsg(pParse, "mi
b5a0: 73 75 73 65 20 6f 66 20 61 67 67 72 65 67 61 74  suse of aggregat
b5b0: 65 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28  e function %.*s(
b5c0: 29 22 2c 20 6e 49 64 2c 7a 49 64 29 3b 0a 20 20  )", nId,zId);.  
b5d0: 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b        pNC->nErr+
b5e0: 2b 3b 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67  +;.        is_ag
b5f0: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  g = 0;.      }el
b600: 73 65 20 69 66 28 20 6e 6f 5f 73 75 63 68 5f 66  se if( no_such_f
b610: 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73  unc ){.        s
b620: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
b630: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
b640: 66 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73 22 2c  function: %.*s",
b650: 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20   nId, zId);.    
b660: 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b      pNC->nErr++;
b670: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
b680: 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20   wrong_num_args 
b690: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
b6a0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
b6b0: 65 2c 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20  e,"wrong number 
b6c0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  of arguments to 
b6d0: 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22  function %.*s()"
b6e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  ,.             n
b6f0: 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20  Id, zId);.      
b700: 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20    pNC->nErr++;. 
b710: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
b720: 20 69 73 5f 61 67 67 20 29 7b 0a 20 20 20 20 20   is_agg ){.     
b730: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
b740: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3b 0a  K_AGG_FUNCTION;.
b750: 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 68 61 73          pNC->has
b760: 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Agg = 1;.      }
b770: 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f 61 67  .      if( is_ag
b780: 67 20 29 20 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67  g ) pNC->allowAg
b790: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72  g = 0;.      for
b7a0: 28 69 3d 30 3b 20 70 4e 43 2d 3e 6e 45 72 72 3d  (i=0; pNC->nErr=
b7b0: 3d 30 20 26 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b  =0 && i<n; i++){
b7c0: 0a 20 20 20 20 20 20 20 20 77 61 6c 6b 45 78 70  .        walkExp
b7d0: 72 54 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69  rTree(pList->a[i
b7e0: 5d 2e 70 45 78 70 72 2c 20 6e 61 6d 65 52 65 73  ].pExpr, nameRes
b7f0: 6f 6c 76 65 72 53 74 65 70 2c 20 70 4e 43 29 3b  olverStep, pNC);
b800: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
b810: 66 28 20 69 73 5f 61 67 67 20 29 20 70 4e 43 2d  f( is_agg ) pNC-
b820: 3e 61 6c 6c 6f 77 41 67 67 20 3d 20 31 3b 0a 20  >allowAgg = 1;. 
b830: 20 20 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20       /* FIX ME: 
b840: 20 43 6f 6d 70 75 74 65 20 70 45 78 70 72 2d 3e   Compute pExpr->
b850: 61 66 66 69 6e 69 74 79 20 62 61 73 65 64 20 6f  affinity based o
b860: 6e 20 74 68 65 20 65 78 70 65 63 74 65 64 20 72  n the expected r
b870: 65 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 74  eturn.      ** t
b880: 79 70 65 20 6f 66 20 74 68 65 20 66 75 6e 63 74  ype of the funct
b890: 69 6f 6e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion .      */.  
b8a0: 20 20 20 20 72 65 74 75 72 6e 20 69 73 5f 61 67      return is_ag
b8b0: 67 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  g;.    }.#ifndef
b8c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
b8d0: 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
b8e0: 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 63 61  K_SELECT:.    ca
b8f0: 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 23 65  se TK_EXISTS:.#e
b900: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b  ndif.    case TK
b910: 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  _IN: {.      if(
b920: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20   pExpr->pSelect 
b930: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
b940: 52 65 66 20 3d 20 70 4e 43 2d 3e 6e 52 65 66 3b  Ref = pNC->nRef;
b950: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b960: 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 20 20 20  OMIT_CHECK.     
b970: 20 20 20 69 66 28 20 70 4e 43 2d 3e 69 73 43 68     if( pNC->isCh
b980: 65 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eck ){.         
b990: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
b9a0: 28 70 50 61 72 73 65 2c 22 73 75 62 71 75 65 72  (pParse,"subquer
b9b0: 69 65 73 20 70 72 6f 68 69 62 69 74 65 64 20 69  ies prohibited i
b9c0: 6e 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  n CHECK constrai
b9d0: 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 20 20 7d  nts");.        }
b9e0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
b9f0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73  sqlite3SelectRes
ba00: 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70 45 78  olve(pParse, pEx
ba10: 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 70 4e 43  pr->pSelect, pNC
ba20: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
ba30: 74 28 20 70 4e 43 2d 3e 6e 52 65 66 3e 3d 6e 52  t( pNC->nRef>=nR
ba40: 65 66 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ef );.        if
ba50: 28 20 6e 52 65 66 21 3d 70 4e 43 2d 3e 6e 52 65  ( nRef!=pNC->nRe
ba60: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  f ){.          E
ba70: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
ba80: 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65  Expr, EP_VarSele
ba90: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ct);.        }. 
baa0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
bab0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
bac0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
bad0: 45 43 4b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ECK.    case TK_
bae0: 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20  VARIABLE: {.    
baf0: 20 20 69 66 28 20 70 4e 43 2d 3e 69 73 43 68 65    if( pNC->isChe
bb00: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ck ){.        sq
bb10: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
bb20: 61 72 73 65 2c 22 70 61 72 61 6d 65 74 65 72 73  arse,"parameters
bb30: 20 70 72 6f 68 69 62 69 74 65 64 20 69 6e 20 43   prohibited in C
bb40: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73  HECK constraints
bb50: 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
bb60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
bb70: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75  endif.  }.  retu
bb80: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 0;.}../*.** T
bb90: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b  his routine walk
bba0: 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  s an expression 
bbb0: 74 72 65 65 20 61 6e 64 20 72 65 73 6f 6c 76 65  tree and resolve
bbc0: 73 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 0a  s references to.
bbd0: 2a 2a 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73  ** table columns
bbe0: 2e 20 20 4e 6f 64 65 73 20 6f 66 20 74 68 65 20  .  Nodes of the 
bbf0: 66 6f 72 6d 20 49 44 2e 49 44 20 6f 72 20 49 44  form ID.ID or ID
bc00: 20 72 65 73 6f 6c 76 65 20 69 6e 74 6f 20 61 6e   resolve into an
bc10: 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 74 68 65  .** index to the
bc20: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 74 61   table in the ta
bc30: 62 6c 65 20 6c 69 73 74 20 61 6e 64 20 61 20 63  ble list and a c
bc40: 6f 6c 75 6d 6e 20 6f 66 66 73 65 74 2e 20 20 54  olumn offset.  T
bc50: 68 65 20 0a 2a 2a 20 45 78 70 72 2e 6f 70 63 6f  he .** Expr.opco
bc60: 64 65 20 66 6f 72 20 73 75 63 68 20 6e 6f 64 65  de for such node
bc70: 73 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20  s is changed to 
bc80: 54 4b 5f 43 4f 4c 55 4d 4e 2e 20 20 54 68 65 20  TK_COLUMN.  The 
bc90: 45 78 70 72 2e 69 54 61 62 6c 65 0a 2a 2a 20 76  Expr.iTable.** v
bca0: 61 6c 75 65 20 69 73 20 63 68 61 6e 67 65 64 20  alue is changed 
bcb0: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
bcc0: 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74  the referenced t
bcd0: 61 62 6c 65 20 69 6e 20 70 54 61 62 4c 69 73 74  able in pTabList
bce0: 0a 2a 2a 20 70 6c 75 73 20 74 68 65 20 22 62 61  .** plus the "ba
bcf0: 73 65 22 20 76 61 6c 75 65 2e 20 20 54 68 65 20  se" value.  The 
bd00: 62 61 73 65 20 76 61 6c 75 65 20 77 69 6c 6c 20  base value will 
bd10: 75 6c 74 69 6d 61 74 65 6c 79 20 62 65 63 6f 6d  ultimately becom
bd20: 65 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 63 75  e the.** VDBE cu
bd30: 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
bd40: 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 69 73  a cursor that is
bd50: 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74 6f 20 74   pointing into t
bd60: 68 65 20 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a  he referenced.**
bd70: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 45 78 70   table.  The Exp
bd80: 72 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  r.iColumn value 
bd90: 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 74 68  is changed to th
bda0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63  e index of the c
bdb0: 6f 6c 75 6d 6e 20 0a 2a 2a 20 6f 66 20 74 68 65  olumn .** of the
bdc0: 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c   referenced tabl
bdd0: 65 2e 20 20 54 68 65 20 45 78 70 72 2e 69 43 6f  e.  The Expr.iCo
bde0: 6c 75 6d 6e 20 76 61 6c 75 65 20 66 6f 72 20 74  lumn value for t
bdf0: 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20 52 4f  he special.** RO
be00: 57 49 44 20 63 6f 6c 75 6d 6e 20 69 73 20 2d 31  WID column is -1
be10: 2e 20 20 41 6e 79 20 49 4e 54 45 47 45 52 20 50  .  Any INTEGER P
be20: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
be30: 6e 20 69 73 20 74 72 69 65 64 20 61 73 20 61 6e  n is tried as an
be40: 0a 2a 2a 20 61 6c 69 61 73 20 66 6f 72 20 52 4f  .** alias for RO
be50: 57 49 44 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20  WID..**.** Also 
be60: 72 65 73 6f 6c 76 65 20 66 75 6e 63 74 69 6f 6e  resolve function
be70: 20 6e 61 6d 65 73 20 61 6e 64 20 63 68 65 63 6b   names and check
be80: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 66   the functions f
be90: 6f 72 20 70 72 6f 70 65 72 0a 2a 2a 20 75 73 61  or proper.** usa
bea0: 67 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 61  ge.  Make sure a
beb0: 6c 6c 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  ll function name
bec0: 73 20 61 72 65 20 72 65 63 6f 67 6e 69 7a 65 64  s are recognized
bed0: 20 61 6e 64 20 61 6c 6c 20 66 75 6e 63 74 69 6f   and all functio
bee0: 6e 73 0a 2a 2a 20 68 61 76 65 20 74 68 65 20 63  ns.** have the c
bef0: 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66  orrect number of
bf00: 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 4c 65 61   arguments.  Lea
bf10: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
bf20: 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65  age.** in pParse
bf30: 2d 3e 7a 45 72 72 4d 73 67 20 69 66 20 61 6e 79  ->zErrMsg if any
bf40: 74 68 69 6e 67 20 69 73 20 61 6d 69 73 73 2e 20  thing is amiss. 
bf50: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
bf60: 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a  er of errors..**
bf70: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
bf80: 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61  ssion contains a
bf90: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
bfa0: 6e 73 20 74 68 65 6e 20 73 65 74 20 74 68 65 20  ns then set the 
bfb0: 45 50 5f 41 67 67 0a 2a 2a 20 70 72 6f 70 65 72  EP_Agg.** proper
bfc0: 74 79 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ty on the expres
bfd0: 73 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sion..*/.int sql
bfe0: 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e  ite3ExprResolveN
bff0: 61 6d 65 73 28 20 0a 20 20 4e 61 6d 65 43 6f 6e  ames( .  NameCon
c000: 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 20 20  text *pNC,      
c010: 20 2f 2a 20 4e 61 6d 65 73 70 61 63 65 20 74 6f   /* Namespace to
c020: 20 72 65 73 6f 6c 76 65 20 65 78 70 72 65 73 73   resolve express
c030: 69 6f 6e 73 20 69 6e 2e 20 2a 2f 0a 20 20 45 78  ions in. */.  Ex
c040: 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20  pr *pExpr       
c050: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
c060: 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e  ression to be an
c070: 61 6c 79 7a 65 64 2e 20 2a 2f 0a 29 7b 0a 20 20  alyzed. */.){.  
c080: 69 6e 74 20 73 61 76 65 64 48 61 73 41 67 67 3b  int savedHasAgg;
c090: 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ..  if( pExpr==0
c0a0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 69 66   ) return 0;.#if
c0b0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
c0c0: 5f 44 45 50 54 48 3e 30 0a 20 20 7b 0a 20 20 20  _DEPTH>0.  {.   
c0d0: 20 69 6e 74 20 6d 78 44 65 70 74 68 20 3d 20 70   int mxDepth = p
c0e0: 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e  NC->pParse->db->
c0f0: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
c100: 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b  MIT_EXPR_DEPTH];
c110: 0a 20 20 20 20 69 66 28 20 28 70 45 78 70 72 2d  .    if( (pExpr-
c120: 3e 6e 48 65 69 67 68 74 2b 70 4e 43 2d 3e 70 50  >nHeight+pNC->pP
c130: 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 29 3e 6d  arse->nHeight)>m
c140: 78 44 65 70 74 68 20 29 7b 0a 20 20 20 20 20 20  xDepth ){.      
c150: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
c160: 70 4e 43 2d 3e 70 50 61 72 73 65 2c 20 0a 20 20  pNC->pParse, .  
c170: 20 20 20 20 20 20 20 22 45 78 70 72 65 73 73 69         "Expressi
c180: 6f 6e 20 74 72 65 65 20 69 73 20 74 6f 6f 20 6c  on tree is too l
c190: 61 72 67 65 20 28 6d 61 78 69 6d 75 6d 20 64 65  arge (maximum de
c1a0: 70 74 68 20 25 64 29 22 2c 20 6d 78 44 65 70 74  pth %d)", mxDept
c1b0: 68 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  h.      );.     
c1c0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
c1d0: 0a 20 20 20 20 70 4e 43 2d 3e 70 50 61 72 73 65  .    pNC->pParse
c1e0: 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 70 45 78  ->nHeight += pEx
c1f0: 70 72 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 7d  pr->nHeight;.  }
c200: 0a 23 65 6e 64 69 66 0a 20 20 73 61 76 65 64 48  .#endif.  savedH
c210: 61 73 41 67 67 20 3d 20 70 4e 43 2d 3e 68 61 73  asAgg = pNC->has
c220: 41 67 67 3b 0a 20 20 70 4e 43 2d 3e 68 61 73 41  Agg;.  pNC->hasA
c230: 67 67 20 3d 20 30 3b 0a 20 20 77 61 6c 6b 45 78  gg = 0;.  walkEx
c240: 70 72 54 72 65 65 28 70 45 78 70 72 2c 20 6e 61  prTree(pExpr, na
c250: 6d 65 52 65 73 6f 6c 76 65 72 53 74 65 70 2c 20  meResolverStep, 
c260: 70 4e 43 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  pNC);.#if SQLITE
c270: 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e  _MAX_EXPR_DEPTH>
c280: 30 0a 20 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d  0.  pNC->pParse-
c290: 3e 6e 48 65 69 67 68 74 20 2d 3d 20 70 45 78 70  >nHeight -= pExp
c2a0: 72 2d 3e 6e 48 65 69 67 68 74 3b 0a 23 65 6e 64  r->nHeight;.#end
c2b0: 69 66 0a 20 20 69 66 28 20 70 4e 43 2d 3e 6e 45  if.  if( pNC->nE
c2c0: 72 72 3e 30 20 29 7b 0a 20 20 20 20 45 78 70 72  rr>0 ){.    Expr
c2d0: 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70  SetProperty(pExp
c2e0: 72 2c 20 45 50 5f 45 72 72 6f 72 29 3b 0a 20 20  r, EP_Error);.  
c2f0: 7d 0a 20 20 69 66 28 20 70 4e 43 2d 3e 68 61 73  }.  if( pNC->has
c300: 41 67 67 20 29 7b 0a 20 20 20 20 45 78 70 72 53  Agg ){.    ExprS
c310: 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  etProperty(pExpr
c320: 2c 20 45 50 5f 41 67 67 29 3b 0a 20 20 7d 65 6c  , EP_Agg);.  }el
c330: 73 65 20 69 66 28 20 73 61 76 65 64 48 61 73 41  se if( savedHasA
c340: 67 67 20 29 7b 0a 20 20 20 20 70 4e 43 2d 3e 68  gg ){.    pNC->h
c350: 61 73 41 67 67 20 3d 20 31 3b 0a 20 20 7d 0a 20  asAgg = 1;.  }. 
c360: 20 72 65 74 75 72 6e 20 45 78 70 72 48 61 73 50   return ExprHasP
c370: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
c380: 50 5f 45 72 72 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a  P_Error);.}../*.
c390: 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 69 6e 73  ** A pointer ins
c3a0: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
c3b0: 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20  ructure is used 
c3c0: 74 6f 20 70 61 73 73 20 69 6e 66 6f 72 6d 61 74  to pass informat
c3d0: 69 6f 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20 77  ion.** through w
c3e0: 61 6c 6b 45 78 70 72 54 72 65 65 20 69 6e 74 6f  alkExprTree into
c3f0: 20 63 6f 64 65 53 75 62 71 75 65 72 79 53 74 65   codeSubquerySte
c400: 70 28 29 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  p()..*/.typedef 
c410: 73 74 72 75 63 74 20 51 75 65 72 79 43 6f 64 65  struct QueryCode
c420: 72 20 51 75 65 72 79 43 6f 64 65 72 3b 0a 73 74  r QueryCoder;.st
c430: 72 75 63 74 20 51 75 65 72 79 43 6f 64 65 72 20  ruct QueryCoder 
c440: 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
c450: 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e;       /* The 
c460: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
c470: 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  */.  NameContext
c480: 20 2a 70 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d   *pNC;    /* Nam
c490: 65 73 70 61 63 65 20 6f 66 20 66 69 72 73 74 20  espace of first 
c4a0: 65 6e 63 6c 6f 73 69 6e 67 20 71 75 65 72 79 20  enclosing query 
c4b0: 2a 2f 0a 7d 3b 0a 0a 23 69 66 64 65 66 20 53 51  */.};..#ifdef SQ
c4c0: 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20  LITE_TEST.  int 
c4d0: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 69  sqlite3_enable_i
c4e0: 6e 5f 6f 70 74 20 3d 20 31 3b 0a 23 65 6c 73 65  n_opt = 1;.#else
c4f0: 0a 20 20 23 64 65 66 69 6e 65 20 73 71 6c 69 74  .  #define sqlit
c500: 65 33 5f 65 6e 61 62 6c 65 5f 69 6e 5f 6f 70 74  e3_enable_in_opt
c510: 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   1.#endif../*.**
c520: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
c530: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
c540: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
c550: 65 6e 61 62 6c 65 64 20 61 6e 64 0a 2a 2a 20 74  enabled and.** t
c560: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
c570: 65 6e 74 20 70 20 65 78 69 73 74 73 20 61 6e 64  ent p exists and
c580: 20 69 73 20 6f 66 20 74 68 65 0a 2a 2a 20 73 69   is of the.** si
c590: 6d 70 6c 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a  mple form:.**.**
c5a0: 20 20 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c       SELECT <col
c5b0: 75 6d 6e 3e 20 46 52 4f 4d 20 3c 74 61 62 6c 65  umn> FROM <table
c5c0: 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  >.**.** If this 
c5d0: 69 73 20 74 68 65 20 63 61 73 65 2c 20 69 74 20  is the case, it 
c5e0: 6d 61 79 20 62 65 20 70 6f 73 73 69 62 6c 65 20  may be possible 
c5f0: 74 6f 20 75 73 65 20 61 6e 20 65 78 69 73 74 69  to use an existi
c600: 6e 67 20 74 61 62 6c 65 0a 2a 2a 20 6f 72 20 69  ng table.** or i
c610: 6e 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66 20  ndex instead of 
c620: 67 65 6e 65 72 61 74 69 6e 67 20 61 6e 20 65 70  generating an ep
c630: 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a  heremal table..*
c640: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
c650: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 73  _OMIT_SUBQUERY.s
c660: 74 61 74 69 63 20 69 6e 74 20 69 73 43 61 6e 64  tatic int isCand
c670: 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 53 65  idateForInOpt(Se
c680: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c  lect *p){.  SrcL
c690: 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 45 78 70  ist *pSrc;.  Exp
c6a0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
c6b0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
c6c0: 69 66 28 20 21 73 71 6c 69 74 65 33 5f 65 6e 61  if( !sqlite3_ena
c6d0: 62 6c 65 5f 69 6e 5f 6f 70 74 20 29 20 72 65 74  ble_in_opt ) ret
c6e0: 75 72 6e 20 30 3b 20 2f 2a 20 49 4e 20 6f 70 74  urn 0; /* IN opt
c6f0: 69 6d 69 7a 61 74 69 6f 6e 20 6d 75 73 74 20 62  imization must b
c700: 65 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69  e enabled */.  i
c710: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
c720: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
c730: 20 20 20 20 20 20 2f 2a 20 72 69 67 68 74 2d 68        /* right-h
c740: 61 6e 64 20 73 69 64 65 20 6f 66 20 49 4e 20 69  and side of IN i
c750: 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66  s SELECT */.  if
c760: 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 20 72 65  ( p->pPrior ) re
c770: 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
c780: 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f       /* Not a co
c790: 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f  mpound SELECT */
c7a0: 0a 20 20 69 66 28 20 70 2d 3e 69 73 44 69 73 74  .  if( p->isDist
c7b0: 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b  inct ) return 0;
c7c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20            /* No 
c7d0: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
c7e0: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 73 41   */.  if( p->isA
c7f0: 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  gg ) return 0;  
c800: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c810: 43 6f 6e 74 61 69 6e 73 20 6e 6f 20 61 67 67 72  Contains no aggr
c820: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
c830: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f  */.  if( p->pGro
c840: 75 70 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b  upBy ) return 0;
c850: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
c860: 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63  as no GROUP BY c
c870: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70  lause */.  if( p
c880: 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72  ->pLimit ) retur
c890: 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
c8a0: 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49    /* Has no LIMI
c8b0: 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66  T clause */.  if
c8c0: 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29 20 72  ( p->pOffset ) r
c8d0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
c8e0: 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72  ->pWhere ) retur
c8f0: 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
c900: 20 20 2f 2a 20 48 61 73 20 6e 6f 20 57 48 45 52    /* Has no WHER
c910: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 70 53  E clause */.  pS
c920: 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
c930: 69 66 28 20 70 53 72 63 3d 3d 30 20 29 20 72 65  if( pSrc==0 ) re
c940: 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
c950: 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
c960: 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  le table in the 
c970: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
c980: 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21   if( pSrc->nSrc!
c990: 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =1 ) return 0;. 
c9a0: 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e   if( pSrc->a[0].
c9b0: 70 53 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e  pSelect ) return
c9c0: 20 30 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20   0;     /* FROM 
c9d0: 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61 20  clause is not a 
c9e0: 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 70 54  subquery */.  pT
c9f0: 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e  ab = pSrc->a[0].
ca00: 70 54 61 62 3b 0a 20 20 69 66 28 20 70 54 61 62  pTab;.  if( pTab
ca10: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
ca20: 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
ca30: 65 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ect ) return 0; 
ca40: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d           /* FROM
ca50: 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61   clause is not a
ca60: 20 76 69 65 77 20 2a 2f 0a 20 20 69 66 28 20 49   view */.  if( I
ca70: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
ca80: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
ca90: 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
caa0: 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74   not a virtual t
cab0: 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74  able */.  pEList
cac0: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
cad0: 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  if( pEList->nExp
cae0: 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  r!=1 ) return 0;
caf0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63 6f         /* One co
cb00: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75  lumn in the resu
cb10: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 66 28 20  lt set */.  if( 
cb20: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
cb30: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
cb40: 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a  N ) return 0; /*
cb50: 20 52 65 73 75 6c 74 20 69 73 20 61 20 63 6f 6c   Result is a col
cb60: 75 6d 6e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  umn */.  return 
cb70: 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  1;.}.#endif /* S
cb80: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
cb90: 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  ERY */../*.** Th
cba0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
cbb0: 73 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65  sed by the imple
cbc0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
cbd0: 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74   IN (...) operat
cbe0: 6f 72 2e 0a 2a 2a 20 49 74 27 73 20 6a 6f 62 20  or..** It's job 
cbf0: 69 73 20 74 6f 20 66 69 6e 64 20 6f 72 20 63 72  is to find or cr
cc00: 65 61 74 65 20 61 20 62 2d 74 72 65 65 20 73 74  eate a b-tree st
cc10: 72 75 63 74 75 72 65 20 74 68 61 74 20 6d 61 79  ructure that may
cc20: 20 62 65 20 75 73 65 64 0a 2a 2a 20 65 69 74 68   be used.** eith
cc30: 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6d  er to test for m
cc40: 65 6d 62 65 72 73 68 69 70 20 6f 66 20 74 68 65  embership of the
cc50: 20 28 2e 2e 2e 29 20 73 65 74 20 6f 72 20 74 6f   (...) set or to
cc60: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
cc70: 0a 2a 2a 20 69 74 73 20 6d 65 6d 62 65 72 73 2c  .** its members,
cc80: 20 73 6b 69 70 70 69 6e 67 20 64 75 70 6c 69 63   skipping duplic
cc90: 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ates..**.** The 
cca0: 63 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 6f 6e  cursor opened on
ccb0: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 28   the structure (
ccc0: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c 20  database table, 
ccd0: 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 0a  database index .
cce0: 2a 2a 20 6f 72 20 65 70 68 65 72 6d 61 6c 20 74  ** or ephermal t
ccf0: 61 62 6c 65 29 20 69 73 20 73 74 6f 72 65 64 20  able) is stored 
cd00: 69 6e 20 70 58 2d 3e 69 54 61 62 6c 65 20 62 65  in pX->iTable be
cd10: 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69  fore this functi
cd20: 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 20 54  on returns..** T
cd30: 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
cd40: 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 65 20  e indicates the 
cd50: 73 74 72 75 63 74 75 72 65 20 74 79 70 65 2c 20  structure type, 
cd60: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
cd70: 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  *   IN_INDEX_ROW
cd80: 49 44 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20  ID - The cursor 
cd90: 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20  was opened on a 
cda0: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a  database table..
cdb0: 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e  **   IN_INDEX_IN
cdc0: 44 45 58 20 2d 20 54 68 65 20 63 75 72 73 6f 72  DEX - The cursor
cdd0: 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
cde0: 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 2e   database index.
cdf0: 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45  .**   IN_INDEX_E
ce00: 50 48 20 2d 20 20 20 54 68 65 20 63 75 72 73 6f  PH -   The curso
ce10: 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
ce20: 61 20 73 70 65 63 69 61 6c 6c 79 20 63 72 65 61  a specially crea
ce30: 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ted and.**      
ce40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f                po
ce50: 70 75 6c 61 74 65 64 20 65 70 68 65 72 65 6d 61  pulated epherema
ce60: 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41  l table..**.** A
ce70: 6e 20 65 78 69 73 74 69 6e 67 20 73 74 72 75 63  n existing struc
ce80: 74 75 72 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65  ture may only be
ce90: 20 75 73 65 64 20 69 66 20 74 68 65 20 53 45 4c   used if the SEL
cea0: 45 43 54 20 69 73 20 6f 66 20 74 68 65 20 73 69  ECT is of the si
ceb0: 6d 70 6c 65 0a 2a 2a 20 66 6f 72 6d 3a 0a 2a 2a  mple.** form:.**
cec0: 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c  .**     SELECT <
ced0: 63 6f 6c 75 6d 6e 3e 20 46 52 4f 4d 20 3c 74 61  column> FROM <ta
cee0: 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ble>.**.** If th
cef0: 65 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20 70  e mustBeUnique p
cf00: 61 72 61 6d 65 74 65 72 20 69 73 20 66 61 6c 73  arameter is fals
cf10: 65 2c 20 74 68 65 20 73 74 72 75 63 74 75 72 65  e, the structure
cf20: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a   will be used .*
cf30: 2a 20 66 6f 72 20 66 61 73 74 20 73 65 74 20 6d  * for fast set m
cf40: 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 2e  embership tests.
cf50: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e   In this case an
cf60: 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65   epheremal table
cf70: 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75 73 65   must .** be use
cf80: 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e  d unless <column
cf90: 3e 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20  > is an INTEGER 
cfa0: 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 61  PRIMARY KEY or a
cfb0: 6e 20 69 6e 64 65 78 20 63 61 6e 20 0a 2a 2a 20  n index can .** 
cfc0: 62 65 20 66 6f 75 6e 64 20 77 69 74 68 20 3c 63  be found with <c
cfd0: 6f 6c 75 6d 6e 3e 20 61 73 20 69 74 73 20 6c 65  olumn> as its le
cfe0: 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 2e 0a  ft-most column..
cff0: 2a 2a 0a 2a 2a 20 49 66 20 6d 75 73 74 42 65 55  **.** If mustBeU
d000: 6e 69 71 75 65 20 69 73 20 74 72 75 65 2c 20 74  nique is true, t
d010: 68 65 6e 20 74 68 65 20 73 74 72 75 63 74 75 72  hen the structur
d020: 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  e will be used t
d030: 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68 72  o iterate.** thr
d040: 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d 65 6d  ough the set mem
d050: 62 65 72 73 2c 20 73 6b 69 70 70 69 6e 67 20 61  bers, skipping a
d060: 6e 79 20 64 75 70 6c 69 63 61 74 65 73 2e 20 49  ny duplicates. I
d070: 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 0a 2a  n this case an.*
d080: 2a 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c  * epheremal tabl
d090: 65 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 75  e must be used u
d0a0: 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63 74  nless the select
d0b0: 65 64 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 67  ed <column> is g
d0c0: 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20  uaranteed.** to 
d0d0: 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74 68  be unique - eith
d0e0: 65 72 20 62 65 63 61 75 73 65 20 69 74 20 69 73  er because it is
d0f0: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
d100: 41 52 59 20 4b 45 59 20 6f 72 20 69 74 0a 2a 2a  ARY KEY or it.**
d110: 20 69 73 20 75 6e 69 71 75 65 20 62 79 20 76 69   is unique by vi
d120: 72 74 75 65 20 6f 66 20 61 20 63 6f 6e 73 74 72  rtue of a constr
d130: 61 69 6e 74 20 6f 72 20 69 6d 70 6c 69 63 69 74  aint or implicit
d140: 20 69 6e 64 65 78 2e 0a 2a 2f 0a 23 69 66 6e 64   index..*/.#ifnd
d150: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
d160: 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69  UBQUERY.int sqli
d170: 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 50  te3FindInIndex(P
d180: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
d190: 70 72 20 2a 70 58 2c 20 69 6e 74 20 6d 75 73 74  pr *pX, int must
d1a0: 42 65 55 6e 69 71 75 65 29 7b 0a 20 20 53 65 6c  BeUnique){.  Sel
d1b0: 65 63 74 20 2a 70 3b 0a 20 20 69 6e 74 20 65 54  ect *p;.  int eT
d1c0: 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ype = 0;.  int i
d1d0: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
d1e0: 61 62 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ab++;..  /* The 
d1f0: 66 6f 6c 6c 77 69 6e 67 20 69 66 28 2e 2e 2e 29  follwing if(...)
d200: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
d210: 72 75 65 20 69 66 20 74 68 65 20 53 45 4c 45 43  rue if the SELEC
d220: 54 20 69 73 20 6f 66 20 74 68 65 20 0a 20 20 2a  T is of the .  *
d230: 2a 20 73 69 6d 70 6c 65 20 66 6f 72 6d 3a 0a 20  * simple form:. 
d240: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
d250: 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52 4f  ECT <column> FRO
d260: 4d 20 3c 74 61 62 6c 65 3e 0a 20 20 2a 2a 0a 20  M <table>.  **. 
d270: 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   ** If this is t
d280: 68 65 20 63 61 73 65 2c 20 69 74 20 6d 61 79 20  he case, it may 
d290: 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75  be possible to u
d2a0: 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74  se an existing t
d2b0: 61 62 6c 65 0a 20 20 2a 2a 20 6f 72 20 69 6e 64  able.  ** or ind
d2c0: 65 78 20 69 6e 73 74 65 61 64 20 6f 66 20 67 65  ex instead of ge
d2d0: 6e 65 72 61 74 69 6e 67 20 61 6e 20 65 70 68 65  nerating an ephe
d2e0: 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 20 20 2a  remal table..  *
d2f0: 2f 0a 20 20 70 20 3d 20 70 58 2d 3e 70 53 65 6c  /.  p = pX->pSel
d300: 65 63 74 3b 0a 20 20 69 66 28 20 69 73 43 61 6e  ect;.  if( isCan
d310: 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
d320: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
d330: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
d340: 62 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  b;.    Index *pI
d350: 64 78 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  dx;.    Expr *pE
d360: 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  xpr = p->pEList-
d370: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
d380: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70   int iCol = pExp
d390: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
d3a0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
d3b0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
d3c0: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 66  ;..    /* This f
d3d0: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
d3e0: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 74 77 6f 20  called from two 
d3f0: 70 6c 61 63 65 73 2e 20 49 6e 20 62 6f 74 68 20  places. In both 
d400: 63 61 73 65 73 20 74 68 65 20 76 64 62 65 0a 20  cases the vdbe. 
d410: 20 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64     ** has alread
d420: 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
d430: 2e 20 53 6f 20 61 73 73 75 6d 65 20 73 71 6c 69  . So assume sqli
d440: 74 65 33 47 65 74 56 64 62 65 28 29 20 69 73 20  te3GetVdbe() is 
d450: 61 6c 77 61 79 73 0a 20 20 20 20 2a 2a 20 73 75  always.    ** su
d460: 63 63 65 73 73 66 75 6c 20 68 65 72 65 2e 0a 20  ccessful here.. 
d470: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
d480: 28 76 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f  (v);.    if( iCo
d490: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  l<0 ){.      int
d4a0: 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65   iMem = ++pParse
d4b0: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 6e  ->nMem;.      in
d4c0: 74 20 69 41 64 64 72 3b 0a 20 20 20 20 20 20 54  t iAddr;.      T
d4d0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 2d 3e  able *pTab = p->
d4e0: 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  pSrc->a[0].pTab;
d4f0: 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d  .      int iDb =
d500: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
d510: 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
d520: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
d530: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
d540: 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 0a 20  tree(v, iDb);.. 
d550: 20 20 20 20 20 69 41 64 64 72 20 3d 20 73 71 6c       iAddr = sql
d560: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
d570: 2c 20 4f 50 5f 49 66 2c 20 69 4d 65 6d 29 3b 0a  , OP_If, iMem);.
d580: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d590: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
d5a0: 74 65 67 65 72 2c 20 31 2c 20 69 4d 65 6d 29 3b  teger, 1, iMem);
d5b0: 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ..      sqlite3O
d5c0: 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c  penTable(pParse,
d5d0: 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62   iTab, iDb, pTab
d5e0: 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a  , OP_OpenRead);.
d5f0: 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e        eType = IN
d600: 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 0a 20  _INDEX_ROWID;.. 
d610: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d620: 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64  JumpHere(v, iAdd
d630: 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r);.    }else{. 
d640: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c       /* The coll
d650: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75  ation sequence u
d660: 73 65 64 20 62 79 20 74 68 65 20 63 6f 6d 70 61  sed by the compa
d670: 72 69 73 6f 6e 2e 20 49 66 20 61 6e 20 69 6e 64  rison. If an ind
d680: 65 78 20 69 73 20 74 6f 20 0a 20 20 20 20 20 20  ex is to .      
d690: 2a 2a 20 62 65 20 75 73 65 64 20 69 6e 20 70 6c  ** be used in pl
d6a0: 61 63 65 20 6f 66 20 61 20 74 65 6d 70 2d 74 61  ace of a temp-ta
d6b0: 62 6c 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20  ble, it must be 
d6c0: 6f 72 64 65 72 65 64 20 61 63 63 6f 72 64 69 6e  ordered accordin
d6d0: 67 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68  g.      ** to th
d6e0: 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  is collation seq
d6f0: 75 65 6e 63 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  uence..      */.
d700: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
d710: 52 65 71 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  Req = sqlite3Bin
d720: 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
d730: 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c  q(pParse, pX->pL
d740: 65 66 74 2c 20 70 45 78 70 72 29 3b 0a 0a 20 20  eft, pExpr);..  
d750: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
d760: 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74  t the affinity t
d770: 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64  hat will be used
d780: 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 65 20   to perform the 
d790: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72  .      ** compar
d7a0: 69 73 6f 6e 20 69 73 20 74 68 65 20 73 61 6d 65  ison is the same
d7b0: 20 61 73 20 74 68 65 20 61 66 66 69 6e 69 74 79   as the affinity
d7c0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20   of the column. 
d7d0: 49 66 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69  If.      ** it i
d7e0: 73 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74  s not, it is not
d7f0: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65   possible to use
d800: 20 61 6e 79 20 69 6e 64 65 78 2e 0a 20 20 20 20   any index..    
d810: 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65    */.      Table
d820: 20 2a 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63   *pTab = p->pSrc
d830: 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 20  ->a[0].pTab;.   
d840: 20 20 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f     char aff = co
d850: 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79  mparisonAffinity
d860: 28 70 58 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  (pX);.      int 
d870: 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 28 70  affinity_ok = (p
d880: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
d890: 61 66 66 69 6e 69 74 79 3d 3d 61 66 66 7c 7c 61  affinity==aff||a
d8a0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
d8b0: 4f 4e 45 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72  ONE);..      for
d8c0: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
d8d0: 65 78 3b 20 70 49 64 78 20 26 26 20 65 54 79 70  ex; pIdx && eTyp
d8e0: 65 3d 3d 30 20 26 26 20 61 66 66 69 6e 69 74 79  e==0 && affinity
d8f0: 5f 6f 6b 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  _ok; pIdx=pIdx->
d900: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
d910: 69 66 28 20 28 70 49 64 78 2d 3e 61 69 43 6f 6c  if( (pIdx->aiCol
d920: 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 29 0a 20 20  umn[0]==iCol).  
d930: 20 20 20 20 20 20 20 26 26 20 28 70 52 65 71 3d         && (pReq=
d940: 3d 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c  =sqlite3FindColl
d950: 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c  Seq(db, ENC(db),
d960: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d   pIdx->azColl[0]
d970: 2c 20 2d 31 2c 20 30 29 29 0a 20 20 20 20 20 20  , -1, 0)).      
d980: 20 20 20 26 26 20 28 21 6d 75 73 74 42 65 55 6e     && (!mustBeUn
d990: 69 71 75 65 20 7c 7c 20 28 70 49 64 78 2d 3e 6e  ique || (pIdx->n
d9a0: 43 6f 6c 75 6d 6e 3d 3d 31 20 26 26 20 70 49 64  Column==1 && pId
d9b0: 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  x->onError!=OE_N
d9c0: 6f 6e 65 29 29 0a 20 20 20 20 20 20 20 20 29 7b  one)).        ){
d9d0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
d9e0: 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  Db;.          in
d9f0: 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73  t iMem = ++pPars
da00: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20  e->nMem;.       
da10: 20 20 20 69 6e 74 20 69 41 64 64 72 3b 0a 20 20     int iAddr;.  
da20: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 4b          char *pK
da30: 65 79 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20  ey;.  .         
da40: 20 70 4b 65 79 20 3d 20 28 63 68 61 72 20 2a 29   pKey = (char *)
da50: 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69  sqlite3IndexKeyi
da60: 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78  nfo(pParse, pIdx
da70: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 44 62  );.          iDb
da80: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
da90: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 64 78  ToIndex(db, pIdx
daa0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
dab0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
dac0: 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44  eUsesBtree(v, iD
dad0: 62 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69  b);..          i
dae0: 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
daf0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
db00: 66 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  f, iMem);.      
db10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
db20: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
db30: 67 65 72 2c 20 31 2c 20 69 4d 65 6d 29 3b 0a 20  ger, 1, iMem);. 
db40: 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69   .          sqli
db50: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
db60: 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
db70: 73 2c 20 30 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c  s, 0, pIdx->nCol
db80: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  umn);.          
db90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dba0: 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  4(v, OP_OpenRead
dbb0: 2c 20 69 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e  , iTab, pIdx->tn
dbc0: 75 6d 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20  um, iDb,.       
dbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbe0: 20 20 20 20 20 20 20 20 70 4b 65 79 2c 50 34 5f          pKey,P4_
dbf0: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
dc00: 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
dc10: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
dc20: 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b  , pIdx->zName));
dc30: 0a 20 20 20 20 20 20 20 20 20 20 65 54 79 70 65  .          eType
dc40: 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45   = IN_INDEX_INDE
dc50: 58 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 73 71  X;..          sq
dc60: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
dc70: 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20  e(v, iAddr);.   
dc80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
dc90: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
dca0: 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20  eType==0 ){.    
dcb0: 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65  sqlite3CodeSubse
dcc0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 58 29  lect(pParse, pX)
dcd0: 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e  ;.    eType = IN
dce0: 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20 7d 65  _INDEX_EPH;.  }e
dcf0: 6c 73 65 7b 0a 20 20 20 20 70 58 2d 3e 69 54 61  lse{.    pX->iTa
dd00: 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 7d 0a  ble = iTab;.  }.
dd10: 20 20 72 65 74 75 72 6e 20 65 54 79 70 65 3b 0a    return eType;.
dd20: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
dd30: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
dd40: 72 20 73 63 61 6c 61 72 20 73 75 62 71 75 65 72  r scalar subquer
dd50: 69 65 73 20 75 73 65 64 20 61 73 20 61 6e 20 65  ies used as an e
dd60: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 6e 64  xpression.** and
dd70: 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e 20 20   IN operators.  
dd80: 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  Examples:.**.** 
dd90: 20 20 20 20 28 53 45 4c 45 43 54 20 61 20 46 52      (SELECT a FR
dda0: 4f 4d 20 62 29 20 20 20 20 20 20 20 20 20 20 2d  OM b)          -
ddb0: 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20  - subquery.**   
ddc0: 20 20 45 58 49 53 54 53 20 28 53 45 4c 45 43 54    EXISTS (SELECT
ddd0: 20 61 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d 20   a FROM b)   -- 
dde0: 45 58 49 53 54 53 20 73 75 62 71 75 65 72 79 0a  EXISTS subquery.
ddf0: 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 34 2c 35  **     x IN (4,5
de00: 2c 31 31 29 20 20 20 20 20 20 20 20 20 20 20 20  ,11)            
de10: 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72    -- IN operator
de20: 20 77 69 74 68 20 6c 69 73 74 20 6f 6e 20 72 69   with list on ri
de30: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a 2a  ght-hand side.**
de40: 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43       x IN (SELEC
de50: 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20  T a FROM b)     
de60: 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77  -- IN operator w
de70: 69 74 68 20 73 75 62 71 75 65 72 79 20 6f 6e 20  ith subquery on 
de80: 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20  the right.**.** 
de90: 54 68 65 20 70 45 78 70 72 20 70 61 72 61 6d 65  The pExpr parame
dea0: 74 65 72 20 64 65 73 63 72 69 62 65 73 20 74 68  ter describes th
deb0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
dec0: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 49  t contains the I
ded0: 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 6f 72  N.** operator or
dee0: 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 23 69   subquery..*/.#i
def0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
df00: 54 5f 53 55 42 51 55 45 52 59 0a 76 6f 69 64 20  T_SUBQUERY.void 
df10: 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65  sqlite3CodeSubse
df20: 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72  lect(Parse *pPar
df30: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
df40: 7b 0a 20 20 69 6e 74 20 74 65 73 74 41 64 64 72  {.  int testAddr
df50: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
df60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
df70: 6e 65 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64  ne-time test add
df80: 72 65 73 73 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ress */.  Vdbe *
df90: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
dfa0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
dfb0: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
dfc0: 0a 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64  ...  /* This cod
dfd0: 65 20 6d 75 73 74 20 62 65 20 72 75 6e 20 69 6e  e must be run in
dfe0: 20 69 74 73 20 65 6e 74 69 72 65 74 79 20 65 76   its entirety ev
dff0: 65 72 79 20 74 69 6d 65 20 69 74 20 69 73 20 65  ery time it is e
e000: 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20  ncountered.  ** 
e010: 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  if any of the fo
e020: 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 3a  llowing is true:
e030: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20  .  **.  **    * 
e040: 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
e050: 73 69 64 65 20 69 73 20 61 20 63 6f 72 72 65 6c  side is a correl
e060: 61 74 65 64 20 73 75 62 71 75 65 72 79 0a 20 20  ated subquery.  
e070: 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67  **    *  The rig
e080: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20  ht-hand side is 
e090: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
e0a0: 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61  st containing va
e0b0: 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20  riables.  **    
e0c0: 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69 64 65  *  We are inside
e0d0: 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a   a trigger.  **.
e0e0: 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74    ** If all of t
e0f0: 68 65 20 61 62 6f 76 65 20 61 72 65 20 66 61 6c  he above are fal
e100: 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20  se, then we can 
e110: 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 6a 75  run this code ju
e120: 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76  st once.  ** sav
e130: 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20 61  e the results, a
e140: 6e 64 20 72 65 75 73 65 20 74 68 65 20 73 61 6d  nd reuse the sam
e150: 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62 73  e result on subs
e160: 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f  equent invocatio
e170: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ns..  */.  if( !
e180: 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72  ExprHasAnyProper
e190: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72  ty(pExpr, EP_Var
e1a0: 53 65 6c 65 63 74 29 20 26 26 20 21 70 50 61 72  Select) && !pPar
e1b0: 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 29 7b  se->trigStack ){
e1c0: 0a 20 20 20 20 69 6e 74 20 6d 65 6d 20 3d 20 2b  .    int mem = +
e1d0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
e1e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e1f0: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 6d  dOp1(v, OP_If, m
e200: 65 6d 29 3b 0a 20 20 20 20 74 65 73 74 41 64 64  em);.    testAdd
e210: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
e220: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
e230: 67 65 72 2c 20 31 2c 20 6d 65 6d 29 3b 0a 20 20  ger, 1, mem);.  
e240: 20 20 61 73 73 65 72 74 28 20 74 65 73 74 41 64    assert( testAd
e250: 64 72 3e 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  dr>0 || pParse->
e260: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
e270: 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63   );.  }..  switc
e280: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
e290: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
e2a0: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 61 66 66  {.      char aff
e2b0: 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 4b 65 79  inity;.      Key
e2c0: 49 6e 66 6f 20 6b 65 79 49 6e 66 6f 3b 0a 20 20  Info keyInfo;.  
e2d0: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20      int addr;   
e2e0: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
e2f0: 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  of OP_OpenEpheme
e300: 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ral instruction 
e310: 2a 2f 0a 0a 20 20 20 20 20 20 61 66 66 69 6e 69  */..      affini
e320: 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ty = sqlite3Expr
e330: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
e340: 70 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20 20 2f  pLeft);..      /
e350: 2a 20 57 68 65 74 68 65 72 20 74 68 69 73 20 69  * Whether this i
e360: 73 20 61 6e 20 27 78 20 49 4e 28 53 45 4c 45 43  s an 'x IN(SELEC
e370: 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78 20  T...)' or an 'x 
e380: 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a  IN(<exprlist>)'.
e390: 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73        ** express
e3a0: 69 6f 6e 20 69 74 20 69 73 20 68 61 6e 64 6c 65  ion it is handle
e3b0: 64 20 74 68 65 20 73 61 6d 65 20 77 61 79 2e 20  d the same way. 
e3c0: 41 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  A virtual table 
e3d0: 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  is .      ** fil
e3e0: 6c 65 64 20 77 69 74 68 20 73 69 6e 67 6c 65 2d  led with single-
e3f0: 66 69 65 6c 64 20 69 6e 64 65 78 20 6b 65 79 73  field index keys
e400: 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68   representing th
e410: 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20  e results.      
e420: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 53 45 4c 45  ** from the SELE
e430: 43 54 20 6f 72 20 74 68 65 20 3c 65 78 70 72 6c  CT or the <exprl
e440: 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ist>..      **. 
e450: 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 27       ** If the '
e460: 78 27 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  x' expression is
e470: 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c   a column value,
e480: 20 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e   or the SELECT..
e490: 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65  ..      ** state
e4a0: 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 61 20 63  ment returns a c
e4b0: 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65  olumn value, the
e4c0: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f  n the affinity o
e4d0: 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  f that.      ** 
e4e0: 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 74  column is used t
e4f0: 6f 20 62 75 69 6c 64 20 74 68 65 20 69 6e 64 65  o build the inde
e500: 78 20 6b 65 79 73 2e 20 49 66 20 62 6f 74 68 20  x keys. If both 
e510: 27 78 27 20 61 6e 64 20 74 68 65 0a 20 20 20 20  'x' and the.    
e520: 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73    ** SELECT... s
e530: 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c  tatement are col
e540: 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72  umns, then numer
e550: 69 63 20 61 66 66 69 6e 69 74 79 20 69 73 20 75  ic affinity is u
e560: 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 69 66 20  sed.      ** if 
e570: 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61  either column ha
e580: 73 20 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e 54  s NUMERIC or INT
e590: 45 47 45 52 20 61 66 66 69 6e 69 74 79 2e 20 49  EGER affinity. I
e5a0: 66 20 6e 65 69 74 68 65 72 0a 20 20 20 20 20 20  f neither.      
e5b0: 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68 65 20 53  ** 'x' nor the S
e5c0: 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65  ELECT... stateme
e5d0: 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20  nt are columns, 
e5e0: 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66  then numeric aff
e5f0: 69 6e 69 74 79 0a 20 20 20 20 20 20 2a 2a 20 69  inity.      ** i
e600: 73 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f  s used..      */
e610: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54  .      pExpr->iT
e620: 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  able = pParse->n
e630: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64  Tab++;.      add
e640: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
e650: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
e660: 45 70 68 65 6d 65 72 61 6c 2c 20 70 45 78 70 72  Ephemeral, pExpr
e670: 2d 3e 69 54 61 62 6c 65 2c 20 31 29 3b 0a 20 20  ->iTable, 1);.  
e680: 20 20 20 20 6d 65 6d 73 65 74 28 26 6b 65 79 49      memset(&keyI
e690: 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6b  nfo, 0, sizeof(k
e6a0: 65 79 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20  eyInfo));.      
e6b0: 6b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d  keyInfo.nField =
e6c0: 20 31 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70   1;..      if( p
e6d0: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b  Expr->pSelect ){
e6e0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65  .        /* Case
e6f0: 20 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20   1:     expr IN 
e700: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20  (SELECT ...).   
e710: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
e720: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
e730: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 72 65   to write the re
e740: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c  sults of the sel
e750: 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d  ect into the tem
e760: 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a  porary.        *
e770: 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65  * table allocate
e780: 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f  d and opened abo
e790: 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ve..        */. 
e7a0: 20 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73         SelectDes
e7b0: 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20  t dest;.        
e7c0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
e7d0: 3b 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ;..        sqlit
e7e0: 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
e7f0: 28 26 64 65 73 74 2c 20 53 52 54 5f 53 65 74 2c  (&dest, SRT_Set,
e800: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b   pExpr->iTable);
e810: 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 61 66  .        dest.af
e820: 66 69 6e 69 74 79 20 3d 20 28 69 6e 74 29 61 66  finity = (int)af
e830: 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20  finity;.        
e840: 61 73 73 65 72 74 28 20 28 70 45 78 70 72 2d 3e  assert( (pExpr->
e850: 69 54 61 62 6c 65 26 30 78 30 30 30 30 46 46 46  iTable&0x0000FFF
e860: 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  F)==pExpr->iTabl
e870: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
e880: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
e890: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 53  Parse, pExpr->pS
e8a0: 65 6c 65 63 74 2c 20 26 64 65 73 74 2c 20 30 2c  elect, &dest, 0,
e8b0: 20 30 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20   0, 0, 0) ){.   
e8c0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
e8d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e8e0: 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   pEList = pExpr-
e8f0: 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  >pSelect->pEList
e900: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  ;.        if( pE
e910: 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
e920: 6e 45 78 70 72 3e 30 20 29 7b 20 0a 20 20 20 20  nExpr>0 ){ .    
e930: 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43        keyInfo.aC
e940: 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33  oll[0] = sqlite3
e950: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
e960: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
e970: 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20 20 20 20  pr->pLeft,.     
e980: 20 20 20 20 20 20 20 20 20 70 45 4c 69 73 74 2d           pEList-
e990: 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[0].pExpr);.  
e9a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
e9b0: 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 70  lse if( pExpr->p
e9c0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
e9d0: 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20 65  /* Case 2:     e
e9e0: 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74  xpr IN (exprlist
e9f0: 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ).        **.   
ea00: 20 20 20 20 20 2a 2a 20 46 6f 72 20 65 61 63 68       ** For each
ea10: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 62 75 69   expression, bui
ea20: 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20  ld an index key 
ea30: 66 72 6f 6d 20 74 68 65 20 65 76 61 6c 75 61 74  from the evaluat
ea40: 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ion and.        
ea50: 2a 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74  ** store it in t
ea60: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
ea70: 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73  le. If <expr> is
ea80: 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20   a column, then 
ea90: 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  use.        ** t
eaa0: 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69  hat columns affi
eab0: 6e 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64 69  nity when buildi
eac0: 6e 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49  ng index keys. I
ead0: 66 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a  f <expr> is not.
eae0: 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c          ** a col
eaf0: 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69 63  umn, use numeric
eb00: 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 20   affinity..     
eb10: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e     */.        in
eb20: 74 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78 70  t i;.        Exp
eb30: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
eb40: 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20  Expr->pList;.   
eb50: 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
eb60: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
eb70: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31  ;.        int r1
eb80: 2c 20 72 32 3b 0a 0a 20 20 20 20 20 20 20 20 69  , r2;..        i
eb90: 66 28 20 21 61 66 66 69 6e 69 74 79 20 29 7b 0a  f( !affinity ){.
eba0: 20 20 20 20 20 20 20 20 20 20 61 66 66 69 6e 69            affini
ebb0: 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ty = SQLITE_AFF_
ebc0: 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NONE;.        }.
ebd0: 20 20 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e          keyInfo.
ebe0: 61 43 6f 6c 6c 5b 30 5d 20 3d 20 70 45 78 70 72  aColl[0] = pExpr
ebf0: 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a  ->pLeft->pColl;.
ec00: 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70  .        /* Loop
ec10: 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78   through each ex
ec20: 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70  pression in <exp
ec30: 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20  rlist>. */.     
ec40: 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
ec50: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
ec60: 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20  );.        r2 = 
ec70: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
ec80: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
ec90: 20 20 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e     for(i=pList->
eca0: 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69  nExpr, pItem=pLi
ecb0: 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  st->a; i>0; i--,
ecc0: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
ecd0: 20 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d       Expr *pE2 =
ece0: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a   pItem->pExpr;..
ecf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
ed00: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
ed10: 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74  s not constant t
ed20: 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  hen we will need
ed30: 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   to.          **
ed40: 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 73   disable the tes
ed50: 74 20 74 68 61 74 20 77 61 73 20 67 65 6e 65 72  t that was gener
ed60: 61 74 65 64 20 61 62 6f 76 65 20 74 68 61 74 20  ated above that 
ed70: 6d 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20  makes sure.     
ed80: 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64       ** this cod
ed90: 65 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20  e only executes 
eda0: 6f 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20 66  once.  Because f
edb0: 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e  or a non-constan
edc0: 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65  t.          ** e
edd0: 78 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65  xpression we nee
ede0: 64 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20  d to rerun this 
edf0: 63 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a  code each time..
ee00: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
ee10: 20 20 20 20 20 20 20 69 66 28 20 74 65 73 74 41         if( testA
ee20: 64 64 72 20 26 26 20 21 73 71 6c 69 74 65 33 45  ddr && !sqlite3E
ee30: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45  xprIsConstant(pE
ee40: 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  2) ){.          
ee50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
ee60: 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 74 65 73  ngeToNoop(v, tes
ee70: 74 41 64 64 72 2d 31 2c 20 32 29 3b 0a 20 20 20  tAddr-1, 2);.   
ee80: 20 20 20 20 20 20 20 20 20 74 65 73 74 41 64 64           testAdd
ee90: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  r = 0;.         
eea0: 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   }..          /*
eeb0: 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 78   Evaluate the ex
eec0: 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73  pression and ins
eed0: 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20  ert it into the 
eee0: 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20  temp table */.  
eef0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
ef00: 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b  disableColCache+
ef10: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  +;.          sql
ef20: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
ef30: 72 73 65 2c 20 70 45 32 2c 20 72 31 29 3b 0a 20  rse, pE2, r1);. 
ef40: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
ef50: 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65   pParse->disable
ef60: 43 6f 6c 43 61 63 68 65 3e 30 20 29 3b 0a 20 20  ColCache>0 );.  
ef70: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
ef80: 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d  disableColCache-
ef90: 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  -;.          sql
efa0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
efb0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
efc0: 20 72 31 2c 20 31 2c 20 72 32 2c 20 26 61 66 66   r1, 1, r2, &aff
efd0: 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20  inity, 1);.     
efe0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
eff0: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
f000: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20  nge(pParse, r1, 
f010: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  1);.          sq
f020: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
f030: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
f040: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
f050: 72 32 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  r2);.        }. 
f060: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
f070: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
f080: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
f090: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
f0a0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
f0b0: 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r2);.      }.   
f0c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
f0d0: 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20  angeP4(v, addr, 
f0e0: 28 76 6f 69 64 20 2a 29 26 6b 65 79 49 6e 66 6f  (void *)&keyInfo
f0f0: 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
f100: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f110: 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  }..    case TK_E
f120: 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20  XISTS:.    case 
f130: 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20  TK_SELECT: {.   
f140: 20 20 20 2f 2a 20 54 68 69 73 20 68 61 73 20 74     /* This has t
f150: 6f 20 62 65 20 61 20 73 63 61 6c 61 72 20 53 45  o be a scalar SE
f160: 4c 45 43 54 2e 20 20 47 65 6e 65 72 61 74 65 20  LECT.  Generate 
f170: 63 6f 64 65 20 74 6f 20 70 75 74 20 74 68 65 0a  code to put the.
f180: 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f        ** value o
f190: 66 20 74 68 69 73 20 73 65 6c 65 63 74 20 69 6e  f this select in
f1a0: 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61   a memory cell a
f1b0: 6e 64 20 72 65 63 6f 72 64 20 74 68 65 20 6e 75  nd record the nu
f1c0: 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f 66  mber.      ** of
f1d0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   the memory cell
f1e0: 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20   in iColumn..   
f1f0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74     */.      stat
f200: 69 63 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 6f  ic const Token o
f210: 6e 65 20 3d 20 7b 20 28 75 38 2a 29 22 31 22 2c  ne = { (u8*)"1",
f220: 20 30 2c 20 31 20 7d 3b 0a 20 20 20 20 20 20 53   0, 1 };.      S
f230: 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 20  elect *pSel;.   
f240: 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65     SelectDest de
f250: 73 74 3b 0a 0a 20 20 20 20 20 20 70 53 65 6c 20  st;..      pSel 
f260: 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  = pExpr->pSelect
f270: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
f280: 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
f290: 65 73 74 2c 20 30 2c 20 2b 2b 70 50 61 72 73 65  est, 0, ++pParse
f2a0: 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 69  ->nMem);.      i
f2b0: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
f2c0: 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20  _SELECT ){.     
f2d0: 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20     dest.eDest = 
f2e0: 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20  SRT_Mem;.       
f2f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f300: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
f310: 2c 20 64 65 73 74 2e 69 50 61 72 6d 29 3b 0a 20  , dest.iParm);. 
f320: 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
f330: 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 73 75 62  nt((v, "Init sub
f340: 71 75 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b  query result"));
f350: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
f360: 20 20 20 20 20 20 64 65 73 74 2e 65 44 65 73 74        dest.eDest
f370: 20 3d 20 53 52 54 5f 45 78 69 73 74 73 3b 0a 20   = SRT_Exists;. 
f380: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
f390: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
f3a0: 6e 74 65 67 65 72 2c 20 30 2c 20 64 65 73 74 2e  nteger, 0, dest.
f3b0: 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20  iParm);.        
f3c0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
f3d0: 22 49 6e 69 74 20 45 58 49 53 54 53 20 72 65 73  "Init EXISTS res
f3e0: 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a  ult"));.      }.
f3f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
f400: 72 44 65 6c 65 74 65 28 70 53 65 6c 2d 3e 70 4c  rDelete(pSel->pL
f410: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 53 65  imit);.      pSe
f420: 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69  l->pLimit = sqli
f430: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
f440: 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20   TK_INTEGER, 0, 
f450: 30 2c 20 26 6f 6e 65 29 3b 0a 20 20 20 20 20 20  0, &one);.      
f460: 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
f470: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20  t(pParse, pSel, 
f480: 26 64 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20  &dest, 0, 0, 0, 
f490: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  0) ){.        re
f4a0: 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
f4b0: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
f4c0: 6d 6e 20 3d 20 64 65 73 74 2e 69 50 61 72 6d 3b  mn = dest.iParm;
f4d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f4e0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 74    }.  }..  if( t
f4f0: 65 73 74 41 64 64 72 20 29 7b 0a 20 20 20 20 73  estAddr ){.    s
f500: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
f510: 72 65 28 76 2c 20 74 65 73 74 41 64 64 72 2d 31  re(v, testAddr-1
f520: 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
f530: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
f540: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
f550: 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 75 70  RY */../*.** Dup
f560: 6c 69 63 61 74 65 20 61 6e 20 38 2d 62 79 74 65  licate an 8-byte
f570: 20 76 61 6c 75 65 0a 2a 2f 0a 73 74 61 74 69 63   value.*/.static
f580: 20 63 68 61 72 20 2a 64 75 70 38 62 79 74 65 73   char *dup8bytes
f590: 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20  (Vdbe *v, const 
f5a0: 63 68 61 72 20 2a 69 6e 29 7b 0a 20 20 63 68 61  char *in){.  cha
f5b0: 72 20 2a 6f 75 74 20 3d 20 73 71 6c 69 74 65 33  r *out = sqlite3
f5c0: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 73 71 6c 69  DbMallocRaw(sqli
f5d0: 74 65 33 56 64 62 65 44 62 28 76 29 2c 20 38 29  te3VdbeDb(v), 8)
f5e0: 3b 0a 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20  ;.  if( out ){. 
f5f0: 20 20 20 6d 65 6d 63 70 79 28 6f 75 74 2c 20 69     memcpy(out, i
f600: 6e 2c 20 38 29 3b 0a 20 20 7d 0a 20 20 72 65 74  n, 8);.  }.  ret
f610: 75 72 6e 20 6f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn out;.}../*.*
f620: 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e  * Generate an in
f630: 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77  struction that w
f640: 69 6c 6c 20 70 75 74 20 74 68 65 20 66 6c 6f 61  ill put the floa
f650: 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61  ting point.** va
f660: 6c 75 65 20 64 65 73 63 72 69 62 65 64 20 62 79  lue described by
f670: 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20   z[0..n-1] into 
f680: 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a  register iMem..*
f690: 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72  *.** The z[] str
f6a0: 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c  ing will probabl
f6b0: 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65  y not be zero-te
f6c0: 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74  rminated.  But t
f6d0: 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72  he .** z[n] char
f6e0: 61 63 74 65 72 20 69 73 20 67 75 61 72 61 6e 74  acter is guarant
f6f0: 65 65 64 20 74 6f 20 62 65 20 73 6f 6d 65 74 68  eed to be someth
f700: 69 6e 67 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ing that does no
f710: 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74  t look.** like t
f720: 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20  he continuation 
f730: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a  of the number..*
f740: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
f750: 64 65 52 65 61 6c 28 56 64 62 65 20 2a 76 2c 20  deReal(Vdbe *v, 
f760: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
f770: 6e 74 20 6e 2c 20 69 6e 74 20 6e 65 67 61 74 65  nt n, int negate
f780: 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b  Flag, int iMem){
f790: 0a 20 20 61 73 73 65 72 74 28 20 7a 20 7c 7c 20  .  assert( z || 
f7a0: 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 56  v==0 || sqlite3V
f7b0: 64 62 65 44 62 28 76 29 2d 3e 6d 61 6c 6c 6f 63  dbeDb(v)->malloc
f7c0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
f7d0: 7a 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20  z ){.    double 
f7e0: 76 61 6c 75 65 3b 0a 20 20 20 20 63 68 61 72 20  value;.    char 
f7f0: 2a 7a 56 3b 0a 20 20 20 20 61 73 73 65 72 74 28  *zV;.    assert(
f800: 20 21 69 73 64 69 67 69 74 28 7a 5b 6e 5d 29 20   !isdigit(z[n]) 
f810: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 74  );.    sqlite3At
f820: 6f 46 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20  oF(z, &value);. 
f830: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73     if( sqlite3Is
f840: 4e 61 4e 28 76 61 6c 75 65 29 20 29 7b 0a 20 20  NaN(value) ){.  
f850: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f860: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
f870: 2c 20 30 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20  , 0, iMem);.    
f880: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
f890: 20 6e 65 67 61 74 65 46 6c 61 67 20 29 20 76 61   negateFlag ) va
f8a0: 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20 20  lue = -value;.  
f8b0: 20 20 20 20 7a 56 20 3d 20 64 75 70 38 62 79 74      zV = dup8byt
f8c0: 65 73 28 76 2c 20 28 63 68 61 72 2a 29 26 76 61  es(v, (char*)&va
f8d0: 6c 75 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lue);.      sqli
f8e0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
f8f0: 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65   OP_Real, 0, iMe
f900: 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 52 45 41  m, 0, zV, P4_REA
f910: 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  L);.    }.  }.}.
f920: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
f930: 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   an instruction 
f940: 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68  that will put th
f950: 65 20 69 6e 74 65 67 65 72 20 64 65 73 63 72 69  e integer descri
f960: 62 65 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b  be by.** text z[
f970: 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67  0..n-1] into reg
f980: 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a  ister iMem..**.*
f990: 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67  * The z[] string
f9a0: 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e   will probably n
f9b0: 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69  ot be zero-termi
f9c0: 6e 61 74 65 64 2e 20 20 42 75 74 20 74 68 65 20  nated.  But the 
f9d0: 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74  .** z[n] charact
f9e0: 65 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  er is guaranteed
f9f0: 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67   to be something
fa00: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c   that does not l
fa10: 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20  ook.** like the 
fa20: 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20  continuation of 
fa30: 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73  the number..*/.s
fa40: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49  tatic void codeI
fa50: 6e 74 65 67 65 72 28 56 64 62 65 20 2a 76 2c 20  nteger(Vdbe *v, 
fa60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
fa70: 6e 74 20 6e 2c 20 69 6e 74 20 6e 65 67 46 6c 61  nt n, int negFla
fa80: 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20  g, int iMem){.  
fa90: 61 73 73 65 72 74 28 20 7a 20 7c 7c 20 76 3d 3d  assert( z || v==
faa0: 30 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65  0 || sqlite3Vdbe
fab0: 44 62 28 76 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69  Db(v)->mallocFai
fac0: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 7a 20 29  led );.  if( z )
fad0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
fae0: 20 61 73 73 65 72 74 28 20 21 69 73 64 69 67 69   assert( !isdigi
faf0: 74 28 7a 5b 6e 5d 29 20 29 3b 0a 20 20 20 20 69  t(z[n]) );.    i
fb00: 66 28 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74  f( sqlite3GetInt
fb10: 33 32 28 7a 2c 20 26 69 29 20 29 7b 0a 20 20 20  32(z, &i) ){.   
fb20: 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29     if( negFlag )
fb30: 20 69 20 3d 20 2d 69 3b 0a 20 20 20 20 20 20 73   i = -i;.      s
fb40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
fb50: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
fb60: 69 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 7d 65  i, iMem);.    }e
fb70: 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 46  lse if( sqlite3F
fb80: 69 74 73 49 6e 36 34 42 69 74 73 28 7a 2c 20 6e  itsIn64Bits(z, n
fb90: 65 67 46 6c 61 67 29 20 29 7b 0a 20 20 20 20 20  egFlag) ){.     
fba0: 20 69 36 34 20 76 61 6c 75 65 3b 0a 20 20 20 20   i64 value;.    
fbb0: 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20 20 20 20    char *zV;.    
fbc0: 20 20 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28    sqlite3Atoi64(
fbd0: 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20 20 20  z, &value);.    
fbe0: 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 20    if( negFlag ) 
fbf0: 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a  value = -value;.
fc00: 20 20 20 20 20 20 7a 56 20 3d 20 64 75 70 38 62        zV = dup8b
fc10: 79 74 65 73 28 76 2c 20 28 63 68 61 72 2a 29 26  ytes(v, (char*)&
fc20: 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 73 71  value);.      sq
fc30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
fc40: 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20  v, OP_Int64, 0, 
fc50: 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f  iMem, 0, zV, P4_
fc60: 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65 6c 73  INT64);.    }els
fc70: 65 7b 0a 20 20 20 20 20 20 63 6f 64 65 52 65 61  e{.      codeRea
fc80: 6c 28 76 2c 20 7a 2c 20 6e 2c 20 6e 65 67 46 6c  l(v, z, n, negFl
fc90: 61 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 7d  ag, iMem);.    }
fca0: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  .  }.}.../*.** G
fcb0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
fcc0: 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20 74  t will extract t
fcd0: 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f  he iColumn-th co
fce0: 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62  lumn from.** tab
fcf0: 6c 65 20 70 54 61 62 20 61 6e 64 20 73 74 6f 72  le pTab and stor
fd00: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c  e the column val
fd10: 75 65 20 69 6e 20 61 20 72 65 67 69 73 74 65 72  ue in a register
fd20: 2e 20 20 41 6e 20 65 66 66 6f 72 74 0a 2a 2a 20  .  An effort.** 
fd30: 69 73 20 6d 61 64 65 20 74 6f 20 73 74 6f 72 65  is made to store
fd40: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75   the column valu
fd50: 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52  e in register iR
fd60: 65 67 2c 20 62 75 74 20 74 68 69 73 20 69 73 0a  eg, but this is.
fd70: 2a 2a 20 6e 6f 74 20 67 75 61 72 61 6e 74 65 65  ** not guarantee
fd80: 64 2e 20 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e  d.  The location
fd90: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76   of the column v
fda0: 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65 64  alue is returned
fdb0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75  ..**.** There mu
fdc0: 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63 75  st be an open cu
fdd0: 72 73 6f 72 20 74 6f 20 70 54 61 62 20 69 6e 20  rsor to pTab in 
fde0: 69 54 61 62 6c 65 20 77 68 65 6e 20 74 68 69 73  iTable when this
fdf0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63   routine.** is c
fe00: 61 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c 75  alled.  If iColu
fe10: 6d 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 69  mn<0 then code i
fe20: 73 20 67 65 6e 65 72 61 74 65 64 20 74 68 61 74  s generated that
fe30: 20 65 78 74 72 61 63 74 73 20 74 68 65 20 72 6f   extracts the ro
fe40: 77 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  wid..**.** This 
fe50: 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 61 74  routine might at
fe60: 74 65 6d 70 74 20 74 6f 20 72 65 75 73 65 20 74  tempt to reuse t
fe70: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
fe80: 63 6f 6c 75 6d 6e 20 74 68 61 74 0a 2a 2a 20 68  column that.** h
fe90: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
fea0: 6c 6f 61 64 65 64 20 69 6e 74 6f 20 61 20 72 65  loaded into a re
feb0: 67 69 73 74 65 72 2e 20 20 54 68 65 20 76 61 6c  gister.  The val
fec0: 75 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 0a 2a  ue will always.*
fed0: 2a 20 62 65 20 75 73 65 64 20 69 66 20 69 74 20  * be used if it 
fee0: 68 61 73 20 6e 6f 74 20 75 6e 64 65 72 67 6f 6e  has not undergon
fef0: 65 20 61 6e 79 20 61 66 66 69 6e 69 74 79 20 63  e any affinity c
ff00: 68 61 6e 67 65 73 2e 20 20 42 75 74 20 69 66 0a  hanges.  But if.
ff10: 2a 2a 20 61 6e 20 61 66 66 69 6e 69 74 79 20 63  ** an affinity c
ff20: 68 61 6e 67 65 20 68 61 73 20 6f 63 63 75 72 72  hange has occurr
ff30: 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63 61 63  ed, then the cac
ff40: 68 65 64 20 76 61 6c 75 65 20 77 69 6c 6c 20 6f  hed value will o
ff50: 6e 6c 79 20 62 65 0a 2a 2a 20 75 73 65 64 20 69  nly be.** used i
ff60: 66 20 61 6c 6c 6f 77 41 66 66 43 68 6e 67 20 69  f allowAffChng i
ff70: 73 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73  s true..*/.int s
ff80: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
ff90: 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65  tColumn(.  Parse
ffa0: 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50   *pParse,   /* P
ffb0: 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
ffc0: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
ffd0: 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  xt */.  Table *p
ffe0: 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63  Tab,     /* Desc
fff0: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74  ription of the t
10000 61 62 6c 65 20 77 65 20 61 72 65 20 72 65 61 64  able we are read
10010 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ing from */.  in
10020 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f  t iColumn,     /
10030 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74  * Index of the t
10040 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  able column */. 
10050 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
10060 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
10070 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
10080 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
10090 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53  Reg,        /* S
100a0 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65 72  tore results her
100b0 65 20 2a 2f 0a 20 20 69 6e 74 20 61 6c 6c 6f 77  e */.  int allow
100c0 41 66 66 43 68 6e 67 20 2f 2a 20 54 72 75 65 20  AffChng /* True 
100d0 69 66 20 70 72 69 6f 72 20 61 66 66 69 6e 69 74  if prior affinit
100e0 79 20 63 68 61 6e 67 65 73 20 61 72 65 20 4f 4b  y changes are OK
100f0 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
10100 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
10110 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
10120 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
10130 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  ;..  for(i=0, p=
10140 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
10150 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f  e; i<pParse->nCo
10160 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b  lCache; i++, p++
10170 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54  ){.    if( p->iT
10180 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20  able==iTable && 
10190 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c  p->iColumn==iCol
101a0 75 6d 6e 0a 20 20 20 20 20 20 20 20 20 20 20 26  umn.           &
101b0 26 20 28 21 70 2d 3e 61 66 66 43 68 61 6e 67 65  & (!p->affChange
101c0 20 7c 7c 20 61 6c 6c 6f 77 41 66 66 43 68 6e 67   || allowAffChng
101d0 29 20 29 7b 0a 23 69 66 20 30 0a 20 20 20 20 20  ) ){.#if 0.     
101e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
101f0 70 30 28 76 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a  p0(v, OP_Noop);.
10200 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
10210 74 28 28 76 2c 20 22 4f 50 54 3a 20 74 61 62 25  t((v, "OPT: tab%
10220 64 2e 63 6f 6c 25 64 20 2d 3e 20 72 25 64 22 2c  d.col%d -> r%d",
10230 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e   iTable, iColumn
10240 2c 20 70 2d 3e 69 52 65 67 29 29 3b 0a 23 65 6e  , p->iReg));.#en
10250 64 69 66 0a 20 20 20 20 20 20 72 65 74 75 72 6e  dif.      return
10260 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a   p->iReg;.    }.
10270 20 20 7d 20 20 0a 20 20 61 73 73 65 72 74 28 20    }  .  assert( 
10280 76 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 43  v!=0 );.  if( iC
10290 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 69  olumn<0 ){.    i
102a0 6e 74 20 6f 70 20 3d 20 28 70 54 61 62 20 26 26  nt op = (pTab &&
102b0 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
102c0 29 20 3f 20 4f 50 5f 56 52 6f 77 69 64 20 3a 20  ) ? OP_VRowid : 
102d0 4f 50 5f 52 6f 77 69 64 3b 0a 20 20 20 20 73 71  OP_Rowid;.    sq
102e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
102f0 76 2c 20 6f 70 2c 20 69 54 61 62 6c 65 2c 20 69  v, op, iTable, i
10300 52 65 67 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Reg);.  }else if
10310 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
10320 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10330 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
10340 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e   iTable, iColumn
10350 2c 20 69 52 65 67 29 3b 0a 20 20 7d 65 6c 73 65  , iReg);.  }else
10360 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 49  {.    int op = I
10370 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 3f  sVirtual(pTab) ?
10380 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50   OP_VColumn : OP
10390 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c  _Column;.    sql
103a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
103b0 2c 20 6f 70 2c 20 69 54 61 62 6c 65 2c 20 69 43  , op, iTable, iC
103c0 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20  olumn, iReg);.  
103d0 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44    sqlite3ColumnD
103e0 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c 20  efault(v, pTab, 
103f0 69 43 6f 6c 75 6d 6e 29 3b 0a 23 69 66 6e 64 65  iColumn);.#ifnde
10400 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
10410 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
10420 20 69 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b   if( pTab->aCol[
10430 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74  iColumn].affinit
10440 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  y==SQLITE_AFF_RE
10450 41 4c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  AL ){.      sqli
10460 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
10470 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79   OP_RealAffinity
10480 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 7d 0a 23  , iReg);.    }.#
10490 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66 28 20  endif.  }.  if( 
104a0 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43  pParse->disableC
104b0 6f 6c 43 61 63 68 65 3d 3d 30 20 29 7b 0a 20 20  olCache==0 ){.  
104c0 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 69 43    i = pParse->iC
104d0 6f 6c 43 61 63 68 65 3b 0a 20 20 20 20 70 20 3d  olCache;.    p =
104e0 20 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61   &pParse->aColCa
104f0 63 68 65 5b 69 5d 3b 0a 20 20 20 20 70 2d 3e 69  che[i];.    p->i
10500 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a  Table = iTable;.
10510 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d      p->iColumn =
10520 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 2d   iColumn;.    p-
10530 3e 69 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20  >iReg = iReg;.  
10540 20 20 70 2d 3e 61 66 66 43 68 61 6e 67 65 20 3d    p->affChange =
10550 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 20   0;.    i++;.   
10560 20 69 66 28 20 69 3e 3d 41 72 72 61 79 53 69 7a   if( i>=ArraySiz
10570 65 28 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  e(pParse->aColCa
10580 63 68 65 29 20 29 20 69 20 3d 20 30 3b 0a 20 20  che) ) i = 0;.  
10590 20 20 69 66 28 20 69 3e 70 50 61 72 73 65 2d 3e    if( i>pParse->
105a0 6e 43 6f 6c 43 61 63 68 65 20 29 20 70 50 61 72  nColCache ) pPar
105b0 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 3d 20  se->nColCache = 
105c0 69 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69  i;.    pParse->i
105d0 43 6f 6c 43 61 63 68 65 20 3d 20 69 3b 0a 20 20  ColCache = i;.  
105e0 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b  }.  return iReg;
105f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
10600 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  all column cache
10610 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61   entries associa
10620 74 65 64 20 77 69 74 68 20 74 68 65 20 76 64 62  ted with the vdb
10630 65 0a 2a 2a 20 63 75 72 73 6f 72 20 77 69 74 68  e.** cursor with
10640 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 69   cursor number i
10650 54 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  Table..*/.void s
10660 71 6c 69 74 65 33 45 78 70 72 43 6c 65 61 72 43  qlite3ExprClearC
10670 6f 6c 75 6d 6e 43 61 63 68 65 28 50 61 72 73 65  olumnCache(Parse
10680 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54   *pParse, int iT
10690 61 62 6c 65 29 7b 0a 20 20 69 66 28 20 69 54 61  able){.  if( iTa
106a0 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20 70 50 61  ble<0 ){.    pPa
106b0 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 3d  rse->nColCache =
106c0 20 30 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   0;.    pParse->
106d0 69 43 6f 6c 43 61 63 68 65 20 3d 20 30 3b 0a 20  iColCache = 0;. 
106e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
106f0 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
10700 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61  i<pParse->nColCa
10710 63 68 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  che; i++){.     
10720 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 43 6f   if( pParse->aCo
10730 6c 43 61 63 68 65 5b 69 5d 2e 69 54 61 62 6c 65  lCache[i].iTable
10740 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ==iTable ){.    
10750 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d      testcase( i=
10760 3d 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63  =pParse->nColCac
10770 68 65 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  he-1 );.        
10780 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
10790 65 5b 69 5d 20 3d 20 70 50 61 72 73 65 2d 3e 61  e[i] = pParse->a
107a0 43 6f 6c 43 61 63 68 65 5b 2d 2d 70 50 61 72 73  ColCache[--pPars
107b0 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 5d 3b 0a 20  e->nColCache];. 
107c0 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69         pParse->i
107d0 43 6f 6c 43 61 63 68 65 20 3d 20 70 50 61 72 73  ColCache = pPars
107e0 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 0a 20 20  e->nColCache;.  
107f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
10800 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20  }../*.** Record 
10810 74 68 65 20 66 61 63 74 20 74 68 61 74 20 61 6e  the fact that an
10820 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65   affinity change
10830 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 6f 6e   has occurred on
10840 20 69 43 6f 75 6e 74 0a 2a 2a 20 72 65 67 69 73   iCount.** regis
10850 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 77 69  ters starting wi
10860 74 68 20 69 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f  th iStart..*/.vo
10870 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
10880 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
10890 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
108a0 20 69 6e 74 20 69 53 74 61 72 74 2c 20 69 6e 74   int iStart, int
108b0 20 69 43 6f 75 6e 74 29 7b 0a 20 20 69 6e 74 20   iCount){.  int 
108c0 69 45 6e 64 20 3d 20 69 53 74 61 72 74 20 2b 20  iEnd = iStart + 
108d0 69 43 6f 75 6e 74 20 2d 20 31 3b 0a 20 20 69 6e  iCount - 1;.  in
108e0 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
108f0 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61  i<pParse->nColCa
10900 63 68 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  che; i++){.    i
10910 6e 74 20 72 20 3d 20 70 50 61 72 73 65 2d 3e 61  nt r = pParse->a
10920 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65 67  ColCache[i].iReg
10930 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 53 74  ;.    if( r>=iSt
10940 61 72 74 20 26 26 20 72 3c 3d 69 45 6e 64 20 29  art && r<=iEnd )
10950 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
10960 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 61 66 66  aColCache[i].aff
10970 43 68 61 6e 67 65 20 3d 20 31 3b 0a 20 20 20 20  Change = 1;.    
10980 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  }.  }.}../*.** G
10990 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
109a0 6d 6f 76 65 73 20 63 6f 6e 74 65 6e 74 20 66 72  moves content fr
109b0 6f 6d 20 6f 6e 65 20 72 65 67 69 73 74 65 72 20  om one register 
109c0 74 6f 20 61 6e 6f 74 68 65 72 2e 0a 2a 2a 20 4b  to another..** K
109d0 65 65 70 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  eep the column c
109e0 61 63 68 65 20 75 70 2d 74 6f 2d 64 61 74 65 2e  ache up-to-date.
109f0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
10a00 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 50 61 72  ExprCodeMove(Par
10a10 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
10a20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b  iFrom, int iTo){
10a30 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
10a40 69 46 72 6f 6d 3d 3d 69 54 6f 20 29 20 72 65 74  iFrom==iTo ) ret
10a50 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  urn;.  sqlite3Vd
10a60 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d  beAddOp2(pParse-
10a70 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c  >pVdbe, OP_Move,
10a80 20 69 46 72 6f 6d 2c 20 69 54 6f 29 3b 0a 20 20   iFrom, iTo);.  
10a90 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
10aa0 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b  e->nColCache; i+
10ab0 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72  +){.    if( pPar
10ac0 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d  se->aColCache[i]
10ad0 2e 69 52 65 67 3d 3d 69 46 72 6f 6d 20 29 7b 0a  .iReg==iFrom ){.
10ae0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 43        pParse->aC
10af0 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65 67 20  olCache[i].iReg 
10b00 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d  = iTo;.    }.  }
10b10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
10b20 20 74 72 75 65 20 69 66 20 61 6e 79 20 72 65 67   true if any reg
10b30 69 73 74 65 72 20 69 6e 20 74 68 65 20 72 61 6e  ister in the ran
10b40 67 65 20 69 46 72 6f 6d 2e 2e 69 54 6f 20 28 69  ge iFrom..iTo (i
10b50 6e 63 6c 75 73 69 76 65 29 0a 2a 2a 20 69 73 20  nclusive).** is 
10b60 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
10b70 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
10b80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10b90 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68  usedAsColumnCach
10ba0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
10bb0 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20   int iFrom, int 
10bc0 69 54 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  iTo){.  int i;. 
10bd0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72   for(i=0; i<pPar
10be0 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69  se->nColCache; i
10bf0 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d  ++){.    int r =
10c00 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63   pParse->aColCac
10c10 68 65 5b 69 5d 2e 69 52 65 67 3b 0a 20 20 20 20  he[i].iReg;.    
10c20 69 66 28 20 72 3e 3d 69 46 72 6f 6d 20 26 26 20  if( r>=iFrom && 
10c30 72 3c 3d 69 54 6f 20 29 20 72 65 74 75 72 6e 20  r<=iTo ) return 
10c40 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
10c50 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 72  0;.}../*.** Ther
10c60 65 73 20 69 73 20 61 20 76 61 6c 75 65 20 69 6e  es is a value in
10c70 20 72 65 67 69 73 74 65 72 20 69 43 75 72 72 65   register iCurre
10c80 6e 74 2e 20 20 57 65 20 75 6c 74 69 6d 61 74 65  nt.  We ultimate
10c90 6c 79 20 77 61 6e 74 0a 2a 2a 20 74 68 65 20 76  ly want.** the v
10ca0 61 6c 75 65 20 74 6f 20 62 65 20 69 6e 20 72 65  alue to be in re
10cb0 67 69 73 74 65 72 20 69 54 61 72 67 65 74 2e 20  gister iTarget. 
10cc0 20 49 74 20 6d 69 67 68 74 20 62 65 20 74 68 61   It might be tha
10cd0 74 0a 2a 2a 20 69 43 75 72 72 65 6e 74 20 61 6e  t.** iCurrent an
10ce0 64 20 69 54 61 72 67 65 74 20 61 72 65 20 74 68  d iTarget are th
10cf0 65 20 73 61 6d 65 20 72 65 67 69 73 74 65 72 2e  e same register.
10d00 0a 2a 2a 0a 2a 2a 20 57 65 20 61 72 65 20 67 6f  .**.** We are go
10d10 69 6e 67 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  ing to modify th
10d20 65 20 76 61 6c 75 65 2c 20 73 6f 20 77 65 20 6e  e value, so we n
10d30 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  eed to make sure
10d40 20 69 74 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20   it.** is not a 
10d50 63 61 63 68 65 64 20 72 65 67 69 73 74 65 72 2e  cached register.
10d60 20 20 49 66 20 69 43 75 72 72 65 6e 74 20 69 73    If iCurrent is
10d70 20 61 20 63 61 63 68 65 64 20 72 65 67 69 73 74   a cached regist
10d80 65 72 2c 0a 2a 2a 20 74 68 65 6e 20 74 72 79 20  er,.** then try 
10d90 74 6f 20 6d 6f 76 65 20 74 68 65 20 76 61 6c 75  to move the valu
10da0 65 20 6f 76 65 72 20 74 6f 20 69 54 61 72 67 65  e over to iTarge
10db0 74 2e 20 20 49 66 20 69 54 61 72 67 65 74 20 69  t.  If iTarget i
10dc0 73 20 61 0a 2a 2a 20 63 61 63 68 65 64 20 72 65  s a.** cached re
10dd0 67 69 73 74 65 72 2c 20 74 68 65 6e 20 63 6c 65  gister, then cle
10de0 61 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  ar the correspon
10df0 64 69 6e 67 20 63 61 63 68 65 20 6c 69 6e 65 2e  ding cache line.
10e00 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
10e10 65 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20  e register that 
10e20 74 68 65 20 76 61 6c 75 65 20 65 6e 64 73 20 75  the value ends u
10e30 70 20 69 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  p in..*/.int sql
10e40 69 74 65 33 45 78 70 72 57 72 69 74 61 62 6c 65  ite3ExprWritable
10e50 52 65 67 69 73 74 65 72 28 50 61 72 73 65 20 2a  Register(Parse *
10e60 70 50 61 72 73 65 2c 20 69 6e 74 20 69 43 75 72  pParse, int iCur
10e70 72 65 6e 74 2c 20 69 6e 74 20 69 54 61 72 67 65  rent, int iTarge
10e80 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  t){.  int i;.  a
10e90 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
10ea0 56 64 62 65 21 3d 30 20 29 3b 0a 20 20 69 66 28  Vdbe!=0 );.  if(
10eb0 20 21 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61   !usedAsColumnCa
10ec0 63 68 65 28 70 50 61 72 73 65 2c 20 69 43 75 72  che(pParse, iCur
10ed0 72 65 6e 74 2c 20 69 43 75 72 72 65 6e 74 29 20  rent, iCurrent) 
10ee0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 69 43  ){.    return iC
10ef0 75 72 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 69 66  urrent;.  }.  if
10f00 28 20 69 43 75 72 72 65 6e 74 21 3d 69 54 61 72  ( iCurrent!=iTar
10f10 67 65 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  get ){.    sqlit
10f20 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61  e3VdbeAddOp2(pPa
10f30 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53  rse->pVdbe, OP_S
10f40 43 6f 70 79 2c 20 69 43 75 72 72 65 6e 74 2c 20  Copy, iCurrent, 
10f50 69 54 61 72 67 65 74 29 3b 0a 20 20 7d 0a 20 20  iTarget);.  }.  
10f60 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
10f70 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b  e->nColCache; i+
10f80 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72  +){.    if( pPar
10f90 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d  se->aColCache[i]
10fa0 2e 69 52 65 67 3d 3d 69 54 61 72 67 65 74 20 29  .iReg==iTarget )
10fb0 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
10fc0 61 43 6f 6c 43 61 63 68 65 5b 69 5d 20 3d 20 70  aColCache[i] = p
10fd0 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
10fe0 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43  [--pParse->nColC
10ff0 61 63 68 65 5d 3b 0a 20 20 20 20 20 20 70 50 61  ache];.      pPa
11000 72 73 65 2d 3e 69 43 6f 6c 43 61 63 68 65 20 3d  rse->iColCache =
11010 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63   pParse->nColCac
11020 68 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  he;.    }.  }.  
11030 72 65 74 75 72 6e 20 69 54 61 72 67 65 74 3b 0a  return iTarget;.
11040 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
11050 6c 61 73 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  last instruction
11060 20 63 6f 64 65 64 20 69 73 20 61 6e 20 65 70 68   coded is an eph
11070 65 6d 65 72 61 6c 20 63 6f 70 79 20 6f 66 20 61  emeral copy of a
11080 6e 79 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 67  ny of.** the reg
11090 69 73 74 65 72 73 20 69 6e 20 74 68 65 20 6e 52  isters in the nR
110a0 65 67 20 72 65 67 69 73 74 65 72 73 20 62 65 67  eg registers beg
110b0 69 6e 6e 69 6e 67 20 77 69 74 68 20 69 52 65 67  inning with iReg
110c0 2c 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 76 65 72  , then.** conver
110d0 74 20 74 68 65 20 6c 61 73 74 20 69 6e 73 74 72  t the last instr
110e0 75 63 74 69 6f 6e 20 66 72 6f 6d 20 4f 50 5f 53  uction from OP_S
110f0 43 6f 70 79 20 74 6f 20 4f 50 5f 43 6f 70 79 2e  Copy to OP_Copy.
11100 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
11110 45 78 70 72 48 61 72 64 43 6f 70 79 28 50 61 72  ExprHardCopy(Par
11120 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
11130 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b  iReg, int nReg){
11140 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 56  .  int addr;.  V
11150 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 56 64  dbeOp *pOp;.  Vd
11160 62 65 20 2a 76 3b 0a 0a 20 20 76 20 3d 20 70 50  be *v;..  v = pP
11170 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
11180 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
11190 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
111a0 0a 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33  .  pOp = sqlite3
111b0 56 64 62 65 47 65 74 4f 70 28 76 2c 20 61 64 64  VdbeGetOp(v, add
111c0 72 2d 31 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r-1);.  assert( 
111d0 70 4f 70 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  pOp || pParse->d
111e0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
111f0 29 3b 0a 20 20 69 66 28 20 70 4f 70 20 26 26 20  );.  if( pOp && 
11200 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
11210 53 43 6f 70 79 20 26 26 20 70 4f 70 2d 3e 70 31  SCopy && pOp->p1
11220 3e 3d 69 52 65 67 20 26 26 20 70 4f 70 2d 3e 70  >=iReg && pOp->p
11230 31 3c 69 52 65 67 2b 6e 52 65 67 20 29 7b 0a 20  1<iReg+nReg ){. 
11240 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
11250 20 4f 50 5f 43 6f 70 79 3b 0a 20 20 7d 0a 7d 0a   OP_Copy;.  }.}.
11260 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
11270 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20 63 75  code into the cu
11280 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20 65 76  rrent Vdbe to ev
11290 61 6c 75 61 74 65 20 74 68 65 20 67 69 76 65 6e  aluate the given
112a0 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  .** expression. 
112b0 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 6f 72   Attempt to stor
112c0 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
112d0 20 72 65 67 69 73 74 65 72 20 22 74 61 72 67 65   register "targe
112e0 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  t"..** Return th
112f0 65 20 72 65 67 69 73 74 65 72 20 77 68 65 72 65  e register where
11300 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f   results are sto
11310 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20  red..**.** With 
11320 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68  this routine, th
11330 65 72 65 20 69 73 20 6e 6f 20 67 75 61 72 61 6e  ere is no guaran
11340 74 65 65 64 20 74 68 61 74 20 72 65 73 75 6c 74  teed that result
11350 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73 74 6f  s will.** be sto
11360 72 65 64 20 69 6e 20 74 61 72 67 65 74 2e 20 20  red in target.  
11370 54 68 65 20 72 65 73 75 6c 74 20 6d 69 67 68 74  The result might
11380 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 73 6f   be stored in so
11390 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65 67 69  me other.** regi
113a0 73 74 65 72 20 69 66 20 69 74 20 69 73 20 63 6f  ster if it is co
113b0 6e 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f 20 73  nvenient to do s
113c0 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  o.  The calling 
113d0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74  function.** must
113e0 20 63 68 65 63 6b 20 74 68 65 20 72 65 74 75 72   check the retur
113f0 6e 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76 65 20  n code and move 
11400 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f 20 74  the results to t
11410 68 65 20 64 65 73 69 72 65 64 0a 2a 2a 20 72 65  he desired.** re
11420 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  gister..*/.int s
11430 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
11440 72 67 65 74 28 50 61 72 73 65 20 2a 70 50 61 72  rget(Parse *pPar
11450 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
11460 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20   int target){.  
11470 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
11480 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54 68 65  ->pVdbe;  /* The
11490 20 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72   VM under constr
114a0 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  uction */.  int 
114b0 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
114c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63        /* The opc
114d0 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20  ode being coded 
114e0 2a 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67 20 3d  */.  int inReg =
114f0 20 74 61 72 67 65 74 3b 20 20 20 20 20 20 20 2f   target;       /
11500 2a 20 52 65 73 75 6c 74 73 20 73 74 6f 72 65 64  * Results stored
11510 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 6e 52   in register inR
11520 65 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46  eg */.  int regF
11530 72 65 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20  ree1 = 0;       
11540 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f    /* If non-zero
11550 20 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f   free this tempo
11560 72 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f  rary register */
11570 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20  .  int regFree2 
11580 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
11590 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65  If non-zero free
115a0 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20   this temporary 
115b0 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e  register */.  in
115c0 74 20 72 31 2c 20 72 32 2c 20 72 33 2c 20 72 34  t r1, r2, r3, r4
115d0 3b 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f  ;       /* Vario
115e0 75 73 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  us register numb
115f0 65 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ers */..  assert
11600 28 20 76 21 3d 30 20 7c 7c 20 70 50 61 72 73 65  ( v!=0 || pParse
11610 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
11620 65 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ed );.  assert( 
11630 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67  target>0 && targ
11640 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  et<=pParse->nMem
11650 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29   );.  if( v==0 )
11660 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 69 66   return 0;..  if
11670 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20  ( pExpr==0 ){.  
11680 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a    op = TK_NULL;.
11690 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20    }else{.    op 
116a0 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d  = pExpr->op;.  }
116b0 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
116c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
116d0 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
116e0 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
116f0 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67  fo = pExpr->pAgg
11700 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75  Info;.      stru
11710 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
11720 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f  pCol = &pAggInfo
11730 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41  ->aCol[pExpr->iA
11740 67 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21  gg];.      if( !
11750 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
11760 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Mode ){.        
11770 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d  assert( pCol->iM
11780 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  em>0 );.        
11790 69 6e 52 65 67 20 3d 20 70 43 6f 6c 2d 3e 69 4d  inReg = pCol->iM
117a0 65 6d 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  em;.        brea
117b0 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  k;.      }else i
117c0 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65  f( pAggInfo->use
117d0 53 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a 20 20  SortingIdx ){.  
117e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
117f0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
11800 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e  lumn, pAggInfo->
11810 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20 20 20  sortingIdx,.    
11820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11830 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
11840 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74  iSorterColumn, t
11850 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
11860 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
11870 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73       /* Otherwis
11880 65 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e 74  e, fall thru int
11890 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20  o the TK_COLUMN 
118a0 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  case */.    }.  
118b0 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
118c0 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  : {.      if( pE
118d0 78 70 72 2d 3e 69 54 61 62 6c 65 3c 30 20 29 7b  xpr->iTable<0 ){
118e0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
118f0 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68   only happens wh
11900 65 6e 20 63 6f 64 69 6e 67 20 63 68 65 63 6b 20  en coding check 
11910 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
11920 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
11930 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3e 30 20  Parse->ckBase>0 
11940 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  );.        inReg
11950 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
11960 6e 20 2b 20 70 50 61 72 73 65 2d 3e 63 6b 42 61  n + pParse->ckBa
11970 73 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  se;.      }else{
11980 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
11990 65 28 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73  e( (pExpr->flags
119a0 20 26 20 45 50 5f 41 6e 79 41 66 66 29 21 3d 30   & EP_AnyAff)!=0
119b0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65   );.        inRe
119c0 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
119d0 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61  odeGetColumn(pPa
119e0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 54 61 62  rse, pExpr->pTab
119f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a10 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
11a20 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  n, pExpr->iTable
11a30 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20  , target,.      
11a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a50 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
11a60 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 41 6e 79  ->flags & EP_Any
11a70 41 66 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Aff);.      }.  
11a80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11a90 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
11aa0 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f  EGER: {.      co
11ab0 64 65 49 6e 74 65 67 65 72 28 76 2c 20 28 63 68  deInteger(v, (ch
11ac0 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  ar*)pExpr->token
11ad0 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  .z, pExpr->token
11ae0 2e 6e 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  .n, 0, target);.
11af0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11b00 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46   }.    case TK_F
11b10 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 63 6f  LOAT: {.      co
11b20 64 65 52 65 61 6c 28 76 2c 20 28 63 68 61 72 2a  deReal(v, (char*
11b30 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c  )pExpr->token.z,
11b40 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c   pExpr->token.n,
11b50 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
11b60 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
11b70 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49      case TK_STRI
11b80 4e 47 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  NG: {.      sqli
11b90 74 65 33 44 65 71 75 6f 74 65 45 78 70 72 28 70  te3DequoteExpr(p
11ba0 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72  Parse->db, pExpr
11bb0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11bc0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 4f 50 5f  VdbeAddOp4(v,OP_
11bd0 53 74 72 69 6e 67 38 2c 20 30 2c 20 74 61 72 67  String8, 0, targ
11be0 65 74 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  et, 0,.         
11bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
11c00 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b  char*)pExpr->tok
11c10 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  en.z, pExpr->tok
11c20 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  en.n);.      bre
11c30 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
11c40 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20  se TK_NULL: {.  
11c50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11c60 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
11c70 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
11c80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11c90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11ca0 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41  OMIT_BLOB_LITERA
11cb0 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c  L.    case TK_BL
11cc0 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  OB: {.      int 
11cd0 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  n;.      const c
11ce0 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63 68  har *z;.      ch
11cf0 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20 20  ar *zBlob;.     
11d00 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
11d10 74 6f 6b 65 6e 2e 6e 3e 3d 33 20 29 3b 0a 20 20  token.n>=3 );.  
11d20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
11d30 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d 3d 27  r->token.z[0]=='
11d40 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e 74 6f 6b  x' || pExpr->tok
11d50 65 6e 2e 7a 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a  en.z[0]=='X' );.
11d60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
11d70 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 31 5d 3d  xpr->token.z[1]=
11d80 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 61  ='\'' );.      a
11d90 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 74 6f  ssert( pExpr->to
11da0 6b 65 6e 2e 7a 5b 70 45 78 70 72 2d 3e 74 6f 6b  ken.z[pExpr->tok
11db0 65 6e 2e 6e 2d 31 5d 3d 3d 27 5c 27 27 20 29 3b  en.n-1]=='\'' );
11dc0 0a 20 20 20 20 20 20 6e 20 3d 20 70 45 78 70 72  .      n = pExpr
11dd0 2d 3e 74 6f 6b 65 6e 2e 6e 20 2d 20 33 3b 0a 20  ->token.n - 3;. 
11de0 20 20 20 20 20 7a 20 3d 20 28 63 68 61 72 2a 29       z = (char*)
11df0 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 2b  pExpr->token.z +
11e00 20 32 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20   2;.      zBlob 
11e10 3d 20 73 71 6c 69 74 65 33 48 65 78 54 6f 42 6c  = sqlite3HexToBl
11e20 6f 62 28 73 71 6c 69 74 65 33 56 64 62 65 44 62  ob(sqlite3VdbeDb
11e30 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20  (v), z, n);.    
11e40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11e50 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20  Op4(v, OP_Blob, 
11e60 6e 2f 32 2c 20 74 61 72 67 65 74 2c 20 30 2c 20  n/2, target, 0, 
11e70 7a 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49  zBlob, P4_DYNAMI
11e80 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  C);.      break;
11e90 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
11ea0 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42    case TK_VARIAB
11eb0 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  LE: {.      sqli
11ec0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11ed0 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45   OP_Variable, pE
11ee0 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72  xpr->iTable, tar
11ef0 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  get);.      if( 
11f00 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3e 31  pExpr->token.n>1
11f10 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
11f20 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
11f30 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 45  v, -1, (char*)pE
11f40 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45  xpr->token.z, pE
11f50 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20  xpr->token.n);. 
11f60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
11f70 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
11f80 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20  se TK_REGISTER: 
11f90 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20  {.      inReg = 
11fa0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20  pExpr->iTable;. 
11fb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11fc0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
11fd0 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20 63  _OMIT_CAST.    c
11fe0 61 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20  ase TK_CAST: {. 
11ff0 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
12000 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  ons of the form:
12010 20 20 20 43 41 53 54 28 70 4c 65 66 74 20 41 53     CAST(pLeft AS
12020 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20   token) */.     
12030 20 69 6e 74 20 61 66 66 2c 20 74 6f 5f 6f 70 3b   int aff, to_op;
12040 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73  .      inReg = s
12050 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
12060 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
12070 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65  pr->pLeft, targe
12080 74 29 3b 0a 20 20 20 20 20 20 61 66 66 20 3d 20  t);.      aff = 
12090 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
120a0 79 70 65 28 26 70 45 78 70 72 2d 3e 74 6f 6b 65  ype(&pExpr->toke
120b0 6e 29 3b 0a 20 20 20 20 20 20 74 6f 5f 6f 70 20  n);.      to_op 
120c0 3d 20 61 66 66 20 2d 20 53 51 4c 49 54 45 5f 41  = aff - SQLITE_A
120d0 46 46 5f 54 45 58 54 20 2b 20 4f 50 5f 54 6f 54  FF_TEXT + OP_ToT
120e0 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ext;.      asser
120f0 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 54  t( to_op==OP_ToT
12100 65 78 74 20 20 20 20 7c 7c 20 61 66 66 21 3d 53  ext    || aff!=S
12110 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 20  QLITE_AFF_TEXT  
12120 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72    );.      asser
12130 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42  t( to_op==OP_ToB
12140 6c 6f 62 20 20 20 20 7c 7c 20 61 66 66 21 3d 53  lob    || aff!=S
12150 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 20  QLITE_AFF_NONE  
12160 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72    );.      asser
12170 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e  t( to_op==OP_ToN
12180 75 6d 65 72 69 63 20 7c 7c 20 61 66 66 21 3d 53  umeric || aff!=S
12190 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
121a0 43 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  C );.      asser
121b0 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 49  t( to_op==OP_ToI
121c0 6e 74 20 20 20 20 20 7c 7c 20 61 66 66 21 3d 53  nt     || aff!=S
121d0 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
121e0 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  R );.      asser
121f0 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 52  t( to_op==OP_ToR
12200 65 61 6c 20 20 20 20 7c 7c 20 61 66 66 21 3d 53  eal    || aff!=S
12210 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 20  QLITE_AFF_REAL  
12220 20 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63    );.      testc
12230 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ase( to_op==OP_T
12240 6f 54 65 78 74 20 29 3b 0a 20 20 20 20 20 20 74  oText );.      t
12250 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d  estcase( to_op==
12260 4f 50 5f 54 6f 42 6c 6f 62 20 29 3b 0a 20 20 20  OP_ToBlob );.   
12270 20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f     testcase( to_
12280 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65 72 69 63  op==OP_ToNumeric
12290 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
122a0 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  se( to_op==OP_To
122b0 49 6e 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73  Int );.      tes
122c0 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50  tcase( to_op==OP
122d0 5f 54 6f 52 65 61 6c 20 29 3b 0a 20 20 20 20 20  _ToReal );.     
122e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
122f0 70 31 28 76 2c 20 74 6f 5f 6f 70 2c 20 69 6e 52  p1(v, to_op, inR
12300 65 67 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  eg);.      testc
12310 61 73 65 28 20 75 73 65 64 41 73 43 6f 6c 75 6d  ase( usedAsColum
12320 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 69  nCache(pParse, i
12330 6e 52 65 67 2c 20 69 6e 52 65 67 29 20 29 3b 0a  nReg, inReg) );.
12340 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
12350 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
12360 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 6e 52  ange(pParse, inR
12370 65 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72  eg, 1);.      br
12380 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
12390 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
123a0 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73  _CAST */.    cas
123b0 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
123c0 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
123d0 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
123e0 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73  e TK_GE:.    cas
123f0 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
12400 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20  e TK_EQ: {.     
12410 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d   assert( TK_LT==
12420 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20 61  OP_Lt );.      a
12430 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50  ssert( TK_LE==OP
12440 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Le );.      ass
12450 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47  ert( TK_GT==OP_G
12460 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
12470 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20  t( TK_GE==OP_Ge 
12480 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
12490 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b   TK_EQ==OP_Eq );
124a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
124b0 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20  K_NE==OP_Ne );. 
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 4c 54 20 29 3b 0a 20 20 20 20  p==TK_LT );.    
124e0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
124f0 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 74  TK_LE );.      t
12500 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
12510 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GT );.      test
12520 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 45 20  case( op==TK_GE 
12530 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
12540 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a  e( op==TK_EQ );.
12550 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
12560 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 20  op==TK_NE );.   
12570 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 4f 70     codeCompareOp
12580 65 72 61 6e 64 73 28 70 50 61 72 73 65 2c 20 70  erands(pParse, p
12590 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 31  Expr->pLeft, &r1
125a0 2c 20 26 72 65 67 46 72 65 65 31 2c 0a 20 20 20  , &regFree1,.   
125b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
125d0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
125e0 32 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  2, &regFree2);. 
125f0 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
12600 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
12610 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52  pLeft, pExpr->pR
12620 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20  ight, op,.      
12630 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
12640 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49 54  r2, inReg, SQLIT
12650 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20  E_STOREP2);.    
12660 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
12670 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
12680 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
12690 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
126a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
126b0 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20   case TK_AND:.  
126c0 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20    case TK_OR:.  
126d0 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a    case TK_PLUS:.
126e0 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52      case TK_STAR
126f0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49  :.    case TK_MI
12700 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NUS:.    case TK
12710 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54  _REM:.    case T
12720 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61  K_BITAND:.    ca
12730 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20  se TK_BITOR:.   
12740 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a   case TK_SLASH:.
12750 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49      case TK_LSHI
12760 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  FT:.    case TK_
12770 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73  RSHIFT: .    cas
12780 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20  e TK_CONCAT: {. 
12790 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
127a0 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 0a 20  AND==OP_And );. 
127b0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
127c0 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 0a 20 20 20  OR==OP_Or );.   
127d0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 50 4c     assert( TK_PL
127e0 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 0a 20 20  US==OP_Add );.  
127f0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d      assert( TK_M
12800 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63  INUS==OP_Subtrac
12810 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
12820 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65  t( TK_REM==OP_Re
12830 6d 61 69 6e 64 65 72 20 29 3b 0a 20 20 20 20 20  mainder );.     
12840 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 41   assert( TK_BITA
12850 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b  ND==OP_BitAnd );
12860 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
12870 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f  K_BITOR==OP_BitO
12880 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  r );.      asser
12890 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f  t( TK_SLASH==OP_
128a0 44 69 76 69 64 65 20 29 3b 0a 20 20 20 20 20 20  Divide );.      
128b0 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48 49 46  assert( TK_LSHIF
128c0 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20  T==OP_ShiftLeft 
128d0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
128e0 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53   TK_RSHIFT==OP_S
128f0 68 69 66 74 52 69 67 68 74 20 29 3b 0a 20 20 20  hiftRight );.   
12900 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 43 4f     assert( TK_CO
12910 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20  NCAT==OP_Concat 
12920 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
12930 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b  e( op==TK_AND );
12940 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
12950 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20   op==TK_OR );.  
12960 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
12970 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20 20  ==TK_PLUS );.   
12980 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
12990 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20 20 20  =TK_MINUS );.   
129a0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
129b0 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20 20 20 20  =TK_REM );.     
129c0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
129d0 4b 5f 42 49 54 41 4e 44 20 29 3b 0a 20 20 20 20  K_BITAND );.    
129e0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
129f0 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20 20 20 20  TK_BITOR );.    
12a00 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
12a10 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20 20 20  TK_SLASH );.    
12a20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
12a30 54 4b 5f 4c 53 48 49 46 54 20 29 3b 0a 20 20 20  TK_LSHIFT );.   
12a40 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
12a50 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a 20 20  =TK_RSHIFT );.  
12a60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
12a70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a 20  ==TK_CONCAT );. 
12a80 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
12a90 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
12aa0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
12ab0 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
12ac0 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
12ad0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
12ae0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
12af0 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
12b00 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
12b10 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c  dbeAddOp3(v, op,
12b20 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29   r2, r1, target)
12b30 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
12b40 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
12b50 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
12b60 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
12b70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12b80 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
12b90 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45  MINUS: {.      E
12ba0 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
12bb0 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
12bc0 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29   assert( pLeft )
12bd0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66  ;.      if( pLef
12be0 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20  t->op==TK_FLOAT 
12bf0 7c 7c 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  || pLeft->op==TK
12c00 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
12c10 20 20 20 20 54 6f 6b 65 6e 20 2a 70 20 3d 20 26      Token *p = &
12c20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  pLeft->token;.  
12c30 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d        if( pLeft-
12c40 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b  >op==TK_FLOAT ){
12c50 0a 20 20 20 20 20 20 20 20 20 20 63 6f 64 65 52  .          codeR
12c60 65 61 6c 28 76 2c 20 28 63 68 61 72 2a 29 70 2d  eal(v, (char*)p-
12c70 3e 7a 2c 20 70 2d 3e 6e 2c 20 31 2c 20 74 61 72  >z, p->n, 1, tar
12c80 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  get);.        }e
12c90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
12ca0 6f 64 65 49 6e 74 65 67 65 72 28 76 2c 20 28 63  odeInteger(v, (c
12cb0 68 61 72 2a 29 70 2d 3e 7a 2c 20 70 2d 3e 6e 2c  har*)p->z, p->n,
12cc0 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   1, target);.   
12cd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
12ce0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 67 46  se{.        regF
12cf0 72 65 65 31 20 3d 20 72 31 20 3d 20 73 71 6c 69  ree1 = r1 = sqli
12d00 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
12d10 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
12d20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12d30 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
12d40 30 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  0, r1);.        
12d50 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
12d60 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
12d70 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
12d80 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
12d90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12da0 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74 72  dOp3(v, OP_Subtr
12db0 61 63 74 2c 20 72 32 2c 20 72 31 2c 20 74 61 72  act, r2, r1, tar
12dc0 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65  get);.        te
12dd0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
12de0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ==0 );.      }. 
12df0 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72       inReg = tar
12e00 67 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  get;.      break
12e10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
12e20 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20   TK_BITNOT:.    
12e30 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20  case TK_NOT: {. 
12e40 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
12e50 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f  BITNOT==OP_BitNo
12e60 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
12e70 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f  t( TK_NOT==OP_No
12e80 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
12e90 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e  ase( op==TK_BITN
12ea0 4f 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  OT );.      test
12eb0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  case( op==TK_NOT
12ec0 20 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20   );.      inReg 
12ed0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
12ee0 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
12ef0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61  pExpr->pLeft, ta
12f00 72 67 65 74 29 3b 0a 20 20 20 20 20 20 74 65 73  rget);.      tes
12f10 74 63 61 73 65 28 20 69 6e 52 65 67 3d 3d 74 61  tcase( inReg==ta
12f20 72 67 65 74 20 29 3b 0a 20 20 20 20 20 20 74 65  rget );.      te
12f30 73 74 63 61 73 65 28 20 75 73 65 64 41 73 43 6f  stcase( usedAsCo
12f40 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65  lumnCache(pParse
12f50 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65 67 29 20  , inReg, inReg) 
12f60 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d  );.      inReg =
12f70 20 73 71 6c 69 74 65 33 45 78 70 72 57 72 69 74   sqlite3ExprWrit
12f80 61 62 6c 65 52 65 67 69 73 74 65 72 28 70 50 61  ableRegister(pPa
12f90 72 73 65 2c 20 69 6e 52 65 67 2c 20 74 61 72 67  rse, inReg, targ
12fa0 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
12fb0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
12fc0 6f 70 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20  op, inReg);.    
12fd0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
12fe0 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
12ff0 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
13000 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
13010 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
13020 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c  assert( TK_ISNUL
13030 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a  L==OP_IsNull );.
13040 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
13050 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74  _NOTNULL==OP_Not
13060 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 74 65  Null );.      te
13070 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
13080 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74  SNULL );.      t
13090 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
130a0 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  NOTNULL );.     
130b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
130c0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
130d0 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 1, target);.  
130e0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
130f0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
13100 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
13110 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
13120 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
13130 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
13140 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
13150 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
13160 6f 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  op, r1);.      s
13170 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13180 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74  (v, OP_AddImm, t
13190 61 72 67 65 74 2c 20 2d 31 29 3b 0a 20 20 20 20  arget, -1);.    
131a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
131b0 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
131c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
131d0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
131e0 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  GG_FUNCTION: {. 
131f0 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 49       AggInfo *pI
13200 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67  nfo = pExpr->pAg
13210 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28  gInfo;.      if(
13220 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20   pInfo==0 ){.   
13230 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
13240 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69  rMsg(pParse, "mi
13250 73 75 73 65 20 6f 66 20 61 67 67 72 65 67 61 74  suse of aggregat
13260 65 3a 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20  e: %T",.        
13270 20 20 20 20 26 70 45 78 70 72 2d 3e 73 70 61 6e      &pExpr->span
13280 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
13290 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20          inReg = 
132a0 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78  pInfo->aFunc[pEx
132b0 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a  pr->iAgg].iMem;.
132c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
132d0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
132e0 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e  ase TK_CONST_FUN
132f0 43 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  C:.    case TK_F
13300 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
13310 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
13320 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b   = pExpr->pList;
13330 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72  .      int nExpr
13340 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74   = pList ? pList
13350 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20  ->nExpr : 0;.   
13360 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66     FuncDef *pDef
13370 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 64 3b  ;.      int nId;
13380 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
13390 72 20 2a 7a 49 64 3b 0a 20 20 20 20 20 20 69 6e  r *zId;.      in
133a0 74 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b  t constMask = 0;
133b0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
133c0 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
133d0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
133e0 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43      u8 enc = ENC
133f0 28 64 62 29 3b 0a 20 20 20 20 20 20 43 6f 6c 6c  (db);.      Coll
13400 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a  Seq *pColl = 0;.
13410 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
13420 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 53 54 5f 46 55   op==TK_CONST_FU
13430 4e 43 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  NC );.      test
13440 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 46 55 4e  case( op==TK_FUN
13450 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 7a  CTION );.      z
13460 49 64 20 3d 20 28 63 68 61 72 2a 29 70 45 78 70  Id = (char*)pExp
13470 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20  r->token.z;.    
13480 20 20 6e 49 64 20 3d 20 70 45 78 70 72 2d 3e 74    nId = pExpr->t
13490 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 70 44  oken.n;.      pD
134a0 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ef = sqlite3Find
134b0 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d  Function(pParse-
134c0 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e  >db, zId, nId, n
134d0 45 78 70 72 2c 20 65 6e 63 2c 20 30 29 3b 0a 20  Expr, enc, 0);. 
134e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 65       assert( pDe
134f0 66 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  f!=0 );.      if
13500 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ( pList ){.     
13510 20 20 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74     nExpr = pList
13520 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->nExpr;.       
13530 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
13540 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
13550 2c 20 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , nExpr);.      
13560 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
13570 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
13580 2c 20 70 4c 69 73 74 2c 20 72 31 2c 20 31 29 3b  , pList, r1, 1);
13590 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
135a0 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 72 31        nExpr = r1
135b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69   = 0;.      }.#i
135c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
135d0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
135e0 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79       /* Possibly
135f0 20 6f 76 65 72 6c 6f 61 64 20 74 68 65 20 66 75   overload the fu
13600 6e 63 74 69 6f 6e 20 69 66 20 74 68 65 20 66 69  nction if the fi
13610 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 0a  rst argument is.
13620 20 20 20 20 20 20 2a 2a 20 61 20 76 69 72 74 75        ** a virtu
13630 61 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e  al table column.
13640 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
13650 2a 2a 20 46 6f 72 20 69 6e 66 69 78 20 66 75 6e  ** For infix fun
13660 63 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47 4c  ctions (LIKE, GL
13670 4f 42 2c 20 52 45 47 45 58 50 2c 20 61 6e 64 20  OB, REGEXP, and 
13680 4d 41 54 43 48 29 20 75 73 65 20 74 68 65 0a 20  MATCH) use the. 
13690 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 61       ** second a
136a0 72 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68 65  rgument, not the
136b0 20 66 69 72 73 74 2c 20 61 73 20 74 68 65 20 61   first, as the a
136c0 72 67 75 6d 65 6e 74 20 74 6f 20 74 65 73 74 20  rgument to test 
136d0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20  to.      ** see 
136e0 69 66 20 69 74 20 69 73 20 61 20 63 6f 6c 75 6d  if it is a colum
136f0 6e 20 69 6e 20 61 20 76 69 72 74 75 61 6c 20 74  n in a virtual t
13700 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20 64  able.  This is d
13710 6f 6e 65 20 62 65 63 61 75 73 65 0a 20 20 20 20  one because.    
13720 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f 70    ** the left op
13730 65 72 61 6e 64 20 6f 66 20 69 6e 66 69 78 20 66  erand of infix f
13740 75 6e 63 74 69 6f 6e 73 20 28 74 68 65 20 6f 70  unctions (the op
13750 65 72 61 6e 64 20 77 65 20 77 61 6e 74 20 74 6f  erand we want to
13760 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f  .      ** contro
13770 6c 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20 65  l overloading) e
13780 6e 64 73 20 75 70 20 61 73 20 74 68 65 20 73 65  nds up as the se
13790 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
137a0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 75   the.      ** fu
137b0 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 65 78 70  nction.  The exp
137c0 72 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62 20  ression "A glob 
137d0 42 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  B" is equivalent
137e0 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22 67   to .      ** "g
137f0 6c 6f 62 28 42 2c 41 29 2e 20 20 57 65 20 77 61  lob(B,A).  We wa
13800 6e 74 20 74 6f 20 75 73 65 20 74 68 65 20 41 20  nt to use the A 
13810 69 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 74 6f  in "A glob B" to
13820 20 74 65 73 74 0a 20 20 20 20 20 20 2a 2a 20 66   test.      ** f
13830 6f 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72  or function over
13840 6c 6f 61 64 69 6e 67 2e 20 20 42 75 74 20 77 65  loading.  But we
13850 20 75 73 65 20 74 68 65 20 42 20 74 65 72 6d 20   use the B term 
13860 69 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e 0a  in "glob(B,A)"..
13870 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
13880 66 28 20 6e 45 78 70 72 3e 3d 32 20 26 26 20 28  f( nExpr>=2 && (
13890 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
138a0 50 5f 49 6e 66 69 78 46 75 6e 63 29 20 29 7b 0a  P_InfixFunc) ){.
138b0 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73          pDef = s
138c0 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f  qlite3VtabOverlo
138d0 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70  adFunction(db, p
138e0 44 65 66 2c 20 6e 45 78 70 72 2c 20 70 4c 69 73  Def, nExpr, pLis
138f0 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a  t->a[1].pExpr);.
13900 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
13910 6e 45 78 70 72 3e 30 20 29 7b 0a 20 20 20 20 20  nExpr>0 ){.     
13920 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
13930 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e  3VtabOverloadFun
13940 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20  ction(db, pDef, 
13950 6e 45 78 70 72 2c 20 70 4c 69 73 74 2d 3e 61 5b  nExpr, pList->a[
13960 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  0].pExpr);.     
13970 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
13980 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
13990 20 26 26 20 69 3c 33 32 3b 20 69 2b 2b 29 7b 0a   && i<32; i++){.
139a0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
139b0 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
139c0 74 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  t(pList->a[i].pE
139d0 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
139e0 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 28    constMask |= (
139f0 31 3c 3c 69 29 3b 0a 20 20 20 20 20 20 20 20 7d  1<<i);.        }
13a00 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 44 65  .        if( pDe
13a10 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 26  f->needCollSeq &
13a20 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  & !pColl ){.    
13a30 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
13a40 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
13a50 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e  (pParse, pList->
13a60 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
13a70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
13a80 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 6e       if( pDef->n
13a90 65 65 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20  eedCollSeq ){.  
13aa0 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
13ab0 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73   ) pColl = pPars
13ac0 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  e->db->pDfltColl
13ad0 3b 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ; .        sqlit
13ae0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
13af0 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30  OP_CollSeq, 0, 0
13b00 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f  , 0, (char *)pCo
13b10 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
13b20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
13b30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
13b40 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c  (v, OP_Function,
13b50 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20   constMask, r1, 
13b60 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20  target,.        
13b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b80 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50 34 5f  (char*)pDef, P4_
13b90 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20  FUNCDEF);.      
13ba0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
13bb0 65 50 35 28 76 2c 20 6e 45 78 70 72 29 3b 0a 20  eP5(v, nExpr);. 
13bc0 20 20 20 20 20 69 66 28 20 6e 45 78 70 72 20 29       if( nExpr )
13bd0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
13be0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
13bf0 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 45  e(pParse, r1, nE
13c00 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  xpr);.      }.  
13c10 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
13c20 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
13c30 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e  ge(pParse, r1, n
13c40 45 78 70 72 29 3b 0a 20 20 20 20 20 20 62 72 65  Expr);.      bre
13c50 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
13c60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
13c70 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
13c80 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63  TK_EXISTS:.    c
13c90 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b  ase TK_SELECT: {
13ca0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
13cb0 20 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29   op==TK_EXISTS )
13cc0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
13cd0 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
13ce0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
13cf0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 29  pr->iColumn==0 )
13d00 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
13d10 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  3CodeSubselect(p
13d20 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
13d30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 52       }.      inR
13d40 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  eg = pExpr->iCol
13d50 75 6d 6e 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  umn;.      break
13d60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
13d70 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
13d80 69 6e 74 20 6a 31 2c 20 6a 32 2c 20 6a 33 2c 20  int j1, j2, j3, 
13d90 6a 34 2c 20 6a 35 3b 0a 20 20 20 20 20 20 63 68  j4, j5;.      ch
13da0 61 72 20 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  ar affinity;.   
13db0 20 20 20 69 6e 74 20 65 54 79 70 65 3b 0a 0a 20     int eType;.. 
13dc0 20 20 20 20 20 65 54 79 70 65 20 3d 20 73 71 6c       eType = sql
13dd0 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28  ite3FindInIndex(
13de0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30  pParse, pExpr, 0
13df0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 67  );..      /* Fig
13e00 75 72 65 20 6f 75 74 20 74 68 65 20 61 66 66 69  ure out the affi
13e10 6e 69 74 79 20 74 6f 20 75 73 65 20 74 6f 20 63  nity to use to c
13e20 72 65 61 74 65 20 61 20 6b 65 79 20 66 72 6f 6d  reate a key from
13e30 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20   the results.   
13e40 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 65 78 70     ** of the exp
13e50 72 65 73 73 69 6f 6e 2e 20 61 66 66 69 6e 69 74  ression. affinit
13e60 79 53 74 72 20 73 74 6f 72 65 73 20 61 20 73 74  yStr stores a st
13e70 61 74 69 63 20 73 74 72 69 6e 67 20 73 75 69 74  atic string suit
13e80 61 62 6c 65 20 66 6f 72 0a 20 20 20 20 20 20 2a  able for.      *
13e90 2a 20 50 34 20 6f 66 20 4f 50 5f 4d 61 6b 65 52  * P4 of OP_MakeR
13ea0 65 63 6f 72 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  ecord..      */.
13eb0 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d        affinity =
13ec0 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e   comparisonAffin
13ed0 69 74 79 28 70 45 78 70 72 29 3b 0a 0a 20 20 20  ity(pExpr);..   
13ee0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13ef0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
13f00 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a  er, 1, target);.
13f10 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
13f20 68 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22  he <expr> from "
13f30 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22  <expr> IN (...)"
13f40 2e 20 54 68 65 20 74 65 6d 70 6f 72 61 72 79 20  . The temporary 
13f50 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 70  table.      ** p
13f60 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 63 6f 6e  Expr->iTable con
13f70 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 73  tains the values
13f80 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68   that make up th
13f90 65 20 28 2e 2e 2e 29 20 73 65 74 2e 0a 20 20 20  e (...) set..   
13fa0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 31 20 3d     */.      r1 =
13fb0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
13fc0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
13fd0 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
13fe0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73  ree1);.      tes
13ff0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
14000 3d 30 20 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d  =0 );.      j1 =
14010 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14020 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  p1(v, OP_NotNull
14030 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
14040 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14050 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61  , OP_Null, 0, ta
14060 72 67 65 74 29 3b 0a 20 20 20 20 20 20 6a 32 20  rget);.      j2 
14070 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
14080 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29  dOp0(v, OP_Goto)
14090 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
140a0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
140b0 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  1);.      if( eT
140c0 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f  ype==IN_INDEX_RO
140d0 57 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 6a  WID ){.        j
140e0 33 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  3 = sqlite3VdbeA
140f0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp1(v, OP_Must
14100 42 65 49 6e 74 2c 20 72 31 29 3b 0a 20 20 20 20  BeInt, r1);.    
14110 20 20 20 20 6a 34 20 3d 20 73 71 6c 69 74 65 33      j4 = sqlite3
14120 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
14130 5f 4e 6f 74 45 78 69 73 74 73 2c 20 70 45 78 70  _NotExists, pExp
14140 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 20 72 31  r->iTable, 0, r1
14150 29 3b 0a 20 20 20 20 20 20 20 20 6a 35 20 3d 20  );.        j5 = 
14160 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14170 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20  0(v, OP_Goto);. 
14180 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
14190 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 33  beJumpHere(v, j3
141a0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
141b0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
141c0 2c 20 6a 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c  , j4);.      }el
141d0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 32 20 3d  se{.        r2 =
141e0 20 72 65 67 46 72 65 65 32 20 3d 20 73 71 6c 69   regFree2 = sqli
141f0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
14200 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
14210 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
14220 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
14230 64 2c 20 72 31 2c 20 31 2c 20 72 32 2c 20 26 61  d, r1, 1, r2, &a
14240 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20  ffinity, 1);.   
14250 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
14260 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
14270 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20  nge(pParse, r1, 
14280 31 29 3b 0a 20 20 20 20 20 20 20 20 6a 35 20 3d  1);.        j5 =
14290 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
142a0 70 33 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  p3(v, OP_Found, 
142b0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30  pExpr->iTable, 0
142c0 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , r2);.      }. 
142d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
142e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
142f0 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20 2d 31 29  Imm, target, -1)
14300 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
14310 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
14320 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
14330 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
14340 20 6a 35 29 3b 0a 20 20 20 20 20 20 62 72 65 61   j5);.      brea
14350 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
14360 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20      /*.    **   
14370 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44   x BETWEEN y AND
14380 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a   z.    **.    **
14390 20 54 68 69 73 20 69 73 20 65 71 75 69 76 61 6c   This is equival
143a0 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20  ent to.    **.  
143b0 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44    **    x>=y AND
143c0 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20   x<=z.    **.   
143d0 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65 64 20   ** X is stored 
143e0 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e  in pExpr->pLeft.
143f0 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73 74 6f  .    ** Y is sto
14400 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
14410 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e  ist->a[0].pExpr.
14420 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f  .    ** Z is sto
14430 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
14440 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e  ist->a[1].pExpr.
14450 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
14460 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
14470 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
14480 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
14490 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
144a0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 49  prList_item *pLI
144b0 74 65 6d 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  tem = pExpr->pLi
144c0 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 45 78 70  st->a;.      Exp
144d0 72 20 2a 70 52 69 67 68 74 20 3d 20 70 4c 49 74  r *pRight = pLIt
144e0 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20 20 20  em->pExpr;..    
144f0 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 4f 70 65    codeCompareOpe
14500 72 61 6e 64 73 28 70 50 61 72 73 65 2c 20 70 4c  rands(pParse, pL
14510 65 66 74 2c 20 26 72 31 2c 20 26 72 65 67 46 72  eft, &r1, &regFr
14520 65 65 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ee1,.           
14530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14540 20 20 20 20 20 20 20 70 52 69 67 68 74 2c 20 26         pRight, &
14550 72 32 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  r2, &regFree2);.
14560 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14570 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
14580 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
14590 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
145a0 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33      r3 = sqlite3
145b0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
145c0 65 29 3b 0a 20 20 20 20 20 20 72 34 20 3d 20 73  e);.      r4 = s
145d0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
145e0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
145f0 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
14600 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  se, pLeft, pRigh
14610 74 2c 20 4f 50 5f 47 65 2c 0a 20 20 20 20 20 20  t, OP_Ge,.      
14620 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
14630 72 32 2c 20 72 33 2c 20 53 51 4c 49 54 45 5f 53  r2, r3, SQLITE_S
14640 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20 70  TOREP2);.      p
14650 4c 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70  LItem++;.      p
14660 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e  Right = pLItem->
14670 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c  pExpr;.      sql
14680 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
14690 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
146a0 65 65 32 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee2);.      r2 =
146b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
146c0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 52 69  Temp(pParse, pRi
146d0 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
146e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
146f0 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
14700 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
14710 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  e(pParse, pLeft,
14720 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20   pRight, OP_Le, 
14730 72 31 2c 20 72 32 2c 20 72 34 2c 20 53 51 4c 49  r1, r2, r4, SQLI
14740 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20  TE_STOREP2);.   
14750 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14760 64 4f 70 33 28 76 2c 20 4f 50 5f 41 6e 64 2c 20  dOp3(v, OP_And, 
14770 72 33 2c 20 72 34 2c 20 74 61 72 67 65 74 29 3b  r3, r4, target);
14780 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
14790 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
147a0 72 73 65 2c 20 72 33 29 3b 0a 20 20 20 20 20 20  rse, r3);.      
147b0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
147c0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 34  mpReg(pParse, r4
147d0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
147e0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
147f0 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20  K_UPLUS: {.     
14800 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
14810 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
14820 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
14830 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  eft, target);.  
14840 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
14850 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
14860 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20 20  Form A:.    **  
14870 20 43 41 53 45 20 78 20 57 48 45 4e 20 65 31 20   CASE x WHEN e1 
14880 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20  THEN r1 WHEN e2 
14890 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e  THEN r2 ... WHEN
148a0 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45   eN THEN rN ELSE
148b0 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20   y END.    **.  
148c0 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20 20    ** Form B:.   
148d0 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20   **   CASE WHEN 
148e0 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20  e1 THEN r1 WHEN 
148f0 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57  e2 THEN r2 ... W
14900 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45  HEN eN THEN rN E
14910 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a  LSE y END.    **
14920 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20 69  .    ** Form A i
14930 73 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66 6f  s can be transfo
14940 72 6d 65 64 20 69 6e 74 6f 20 74 68 65 20 65 71  rmed into the eq
14950 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42 20  uivalent form B 
14960 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  as follows:.    
14970 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 78  **   CASE WHEN x
14980 3d 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e  =e1 THEN r1 WHEN
14990 20 78 3d 65 32 20 54 48 45 4e 20 72 32 20 2e 2e   x=e2 THEN r2 ..
149a0 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  ..    **        
149b0 57 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20 72  WHEN x=eN THEN r
149c0 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20  N ELSE y END.   
149d0 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69 66   **.    ** X (if
149e0 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20 69   it exists) is i
149f0 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a  n pExpr->pLeft..
14a00 20 20 20 20 2a 2a 20 59 20 69 73 20 69 6e 20 70      ** Y is in p
14a10 45 78 70 72 2d 3e 70 52 69 67 68 74 2e 20 20 54  Expr->pRight.  T
14a20 68 65 20 59 20 69 73 20 61 6c 73 6f 20 6f 70 74  he Y is also opt
14a30 69 6f 6e 61 6c 2e 20 20 49 66 20 74 68 65 72 65  ional.  If there
14a40 20 69 73 20 6e 6f 0a 20 20 20 20 2a 2a 20 45 4c   is no.    ** EL
14a50 53 45 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f  SE clause and no
14a60 20 6f 74 68 65 72 20 74 65 72 6d 20 6d 61 74 63   other term matc
14a70 68 65 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65  hes, then the re
14a80 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 20 20  sult of the.    
14a90 2a 2a 20 65 78 70 72 73 73 69 6f 6e 20 69 73 20  ** exprssion is 
14aa0 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69 20  NULL..    ** Ei 
14ab0 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69  is in pExpr->pLi
14ac0 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20 52  st->a[i*2] and R
14ad0 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c 69 73  i is pExpr->pLis
14ae0 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20  t->a[i*2+1]..   
14af0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
14b00 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65 78 70  esult of the exp
14b10 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20 52  ression is the R
14b20 69 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  i for the first 
14b30 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20 20 20  matching Ei,.   
14b40 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72 65 20   ** or if there 
14b50 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 45  is no matching E
14b60 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65 72 6d  i, the ELSE term
14b70 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72 65 20   Y, or if there 
14b80 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c 53  is.    ** no ELS
14b90 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20  E term, NULL..  
14ba0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b    */.    case TK
14bb0 5f 43 41 53 45 3a 20 7b 0a 20 20 20 20 20 20 69  _CASE: {.      i
14bc0 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20  nt endLabel;    
14bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14be0 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66   /* GOTO label f
14bf0 6f 72 20 65 6e 64 20 6f 66 20 43 41 53 45 20 73  or end of CASE s
14c00 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  tmt */.      int
14c10 20 6e 65 78 74 43 61 73 65 3b 20 20 20 20 20 20   nextCase;      
14c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14c30 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72  * GOTO label for
14c40 20 6e 65 78 74 20 57 48 45 4e 20 63 6c 61 75 73   next WHEN claus
14c50 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  e */.      int n
14c60 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20  Expr;           
14c70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14c80 32 78 20 6e 75 6d 62 65 72 20 6f 66 20 57 48 45  2x number of WHE
14c90 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20  N terms */.     
14ca0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
14cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14cc0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
14cd0 65 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  er */.      Expr
14ce0 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20  List *pEList;   
14cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14d00 20 4c 69 73 74 20 6f 66 20 57 48 45 4e 20 74 65   List of WHEN te
14d10 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72  rms */.      str
14d20 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
14d30 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f  m *aListelem;  /
14d40 2a 20 41 72 72 61 79 20 6f 66 20 57 48 45 4e 20  * Array of WHEN 
14d50 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45  terms */.      E
14d60 78 70 72 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20  xpr opCompare;  
14d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d80 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69 20 65 78   /* The X==Ei ex
14d90 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
14da0 20 20 45 78 70 72 20 63 61 63 68 65 58 3b 20 20    Expr cacheX;  
14db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14dc0 20 20 20 20 2f 2a 20 43 61 63 68 65 64 20 65 78      /* Cached ex
14dd0 70 72 65 73 73 69 6f 6e 20 58 20 2a 2f 0a 20 20  pression X */.  
14de0 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20      Expr *pX;   
14df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 20 65        /* The X e
14e10 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
14e20 20 20 20 45 78 70 72 20 2a 70 54 65 73 74 3b 20     Expr *pTest; 
14e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e40 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28 66       /* X==Ei (f
14e50 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73 74 20 45  orm A) or just E
14e60 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 0a 20  i (form B) */.. 
14e70 20 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70       assert(pExp
14e80 72 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  r->pList);.     
14e90 20 61 73 73 65 72 74 28 28 70 45 78 70 72 2d 3e   assert((pExpr->
14ea0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 25 20 32  pList->nExpr % 2
14eb0 29 20 3d 3d 20 30 29 3b 0a 20 20 20 20 20 20 61  ) == 0);.      a
14ec0 73 73 65 72 74 28 70 45 78 70 72 2d 3e 70 4c 69  ssert(pExpr->pLi
14ed0 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a  st->nExpr > 0);.
14ee0 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70        pEList = p
14ef0 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20  Expr->pList;.   
14f00 20 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70     aListelem = p
14f10 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  EList->a;.      
14f20 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e  nExpr = pEList->
14f30 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6e 64  nExpr;.      end
14f40 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56  Label = sqlite3V
14f50 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
14f60 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 20 3d  .      if( (pX =
14f70 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d   pExpr->pLeft)!=
14f80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 63  0 ){.        cac
14f90 68 65 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20  heX = *pX;.     
14fa0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d     testcase( pX-
14fb0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op==TK_COLUMN |
14fc0 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47  | pX->op==TK_REG
14fd0 49 53 54 45 52 20 29 3b 0a 20 20 20 20 20 20 20  ISTER );.       
14fe0 20 63 61 63 68 65 58 2e 69 54 61 62 6c 65 20 3d   cacheX.iTable =
14ff0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
15000 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 58 2c  Temp(pParse, pX,
15010 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
15020 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
15030 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
15040 20 20 20 20 20 20 63 61 63 68 65 58 2e 6f 70 20        cacheX.op 
15050 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20  = TK_REGISTER;. 
15060 20 20 20 20 20 20 20 63 61 63 68 65 58 2e 69 43         cacheX.iC
15070 6f 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20 20 20 20  olumn = 0;.     
15080 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20     opCompare.op 
15090 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20  = TK_EQ;.       
150a0 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74   opCompare.pLeft
150b0 20 3d 20 26 63 61 63 68 65 58 3b 0a 20 20 20 20   = &cacheX;.    
150c0 20 20 20 20 70 54 65 73 74 20 3d 20 26 6f 70 43      pTest = &opC
150d0 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20 20 7d 0a  ompare;.      }.
150e0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69        pParse->di
150f0 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b 3b  sableColCache++;
15100 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
15110 69 3c 6e 45 78 70 72 3b 20 69 3d 69 2b 32 29 7b  i<nExpr; i=i+2){
15120 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 58 20  .        if( pX 
15130 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 70 43  ){.          opC
15140 6f 6d 70 61 72 65 2e 70 52 69 67 68 74 20 3d 20  ompare.pRight = 
15150 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78  aListelem[i].pEx
15160 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  pr;.        }els
15170 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65  e{.          pTe
15180 73 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69  st = aListelem[i
15190 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
151a0 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74 43   }.        nextC
151b0 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ase = sqlite3Vdb
151c0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
151d0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
151e0 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43   pTest->op==TK_C
151f0 4f 4c 55 4d 4e 20 7c 7c 20 70 54 65 73 74 2d 3e  OLUMN || pTest->
15200 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
15210 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
15220 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
15230 61 72 73 65 2c 20 70 54 65 73 74 2c 20 6e 65 78  arse, pTest, nex
15240 74 43 61 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55  tCase, SQLITE_JU
15250 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
15260 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4c 69     testcase( aLi
15270 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70  stelem[i+1].pExp
15280 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
15290 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
152a0 63 61 73 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b  case( aListelem[
152b0 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d  i+1].pExpr->op==
152c0 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20  TK_REGISTER );. 
152d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
152e0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61  prCode(pParse, a
152f0 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45  Listelem[i+1].pE
15300 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
15310 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15320 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
15330 74 6f 2c 20 30 2c 20 65 6e 64 4c 61 62 65 6c 29  to, 0, endLabel)
15340 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
15350 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
15360 6c 28 76 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a  l(v, nextCase);.
15370 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
15380 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20  ( pExpr->pRight 
15390 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
153a0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
153b0 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
153c0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
153d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
153e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
153f0 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
15400 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
15410 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
15420 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
15430 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20  v, endLabel);.  
15440 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
15450 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61  se->disableColCa
15460 63 68 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 70  che>0 );.      p
15470 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f  Parse->disableCo
15480 6c 43 61 63 68 65 2d 2d 3b 0a 20 20 20 20 20 20  lCache--;.      
15490 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
154a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
154b0 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63 61 73  _TRIGGER.    cas
154c0 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20  e TK_RAISE: {.  
154d0 20 20 20 20 69 66 28 20 21 70 50 61 72 73 65 2d      if( !pParse-
154e0 3e 74 72 69 67 53 74 61 63 6b 20 29 7b 0a 20 20  >trigStack ){.  
154f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
15500 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
15510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15520 20 20 20 20 20 22 52 41 49 53 45 28 29 20 6d 61       "RAISE() ma
15530 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77  y only be used w
15540 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 2d  ithin a trigger-
15550 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20  program");.     
15560 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
15570 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
15580 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 4f  Expr->iColumn!=O
15590 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20  E_Ignore ){.    
155a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
155b0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 4f 45 5f  pr->iColumn==OE_
155c0 52 6f 6c 6c 62 61 63 6b 20 7c 7c 0a 20 20 20 20  Rollback ||.    
155d0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
155e0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f  pr->iColumn == O
155f0 45 5f 41 62 6f 72 74 20 7c 7c 0a 20 20 20 20 20  E_Abort ||.     
15600 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
15610 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45  r->iColumn == OE
15620 5f 46 61 69 6c 20 29 3b 0a 20 20 20 20 20 20 20  _Fail );.       
15630 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
15640 45 78 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c  Expr(pParse->db,
15650 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20   pExpr);.       
15660 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15670 4f 70 34 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20  Op4(v, OP_Halt, 
15680 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
15690 54 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  T, pExpr->iColum
156a0 6e 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  n, 0,.          
156b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
156c0 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65  har*)pExpr->toke
156d0 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  n.z, pExpr->toke
156e0 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c  n.n);.      } el
156f0 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 61 73  se {.         as
15700 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f  sert( pExpr->iCo
15710 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 49 67 6e 6f 72  lumn == OE_Ignor
15720 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71  e );.         sq
15730 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15740 76 2c 20 4f 50 5f 43 6f 6e 74 65 78 74 50 6f 70  v, OP_ContextPop
15750 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
15760 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15770 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
15780 30 2c 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53  0, pParse->trigS
15790 74 61 63 6b 2d 3e 69 67 6e 6f 72 65 4a 75 6d 70  tack->ignoreJump
157a0 29 3b 0a 20 20 20 20 20 20 20 20 20 56 64 62 65  );.         Vdbe
157b0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 61 69  Comment((v, "rai
157c0 73 65 28 49 47 4e 4f 52 45 29 22 29 29 3b 0a 20  se(IGNORE)"));. 
157d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
157e0 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
157f0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
15800 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
15810 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
15820 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
15830 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
15840 72 65 67 46 72 65 65 32 29 3b 0a 20 20 72 65 74  regFree2);.  ret
15850 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a  urn inReg;.}../*
15860 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
15870 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e  e to evaluate an
15880 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
15890 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
158a0 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69  s.** into a regi
158b0 73 74 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68  ster.  Return th
158c0 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  e register numbe
158d0 72 20 77 68 65 72 65 20 74 68 65 20 72 65 73 75  r where the resu
158e0 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65  lts.** are store
158f0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
15900 72 65 67 69 73 74 65 72 20 69 73 20 61 20 74 65  register is a te
15910 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
15920 20 74 68 61 74 20 63 61 6e 20 62 65 20 64 65 61   that can be dea
15930 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68 65  llocated,.** the
15940 6e 20 77 72 69 74 65 20 69 74 73 20 6e 75 6d 62  n write its numb
15950 65 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20 20  er into *pReg.  
15960 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 72 65  If the result re
15970 67 69 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a 2a  gister is not.**
15980 20 61 20 74 65 6d 70 6f 72 61 72 79 2c 20 74 68   a temporary, th
15990 65 6e 20 73 65 74 20 2a 70 52 65 67 20 74 6f 20  en set *pReg to 
159a0 7a 65 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  zero..*/.int sql
159b0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
159c0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
159d0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
159e0 20 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74 20 72   *pReg){.  int r
159f0 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
15a00 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
15a10 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65   int r2 = sqlite
15a20 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
15a30 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72  pParse, pExpr, r
15a40 31 29 3b 0a 20 20 69 66 28 20 72 32 3d 3d 72 31  1);.  if( r2==r1
15a50 20 29 7b 0a 20 20 20 20 2a 70 52 65 67 20 3d 20   ){.    *pReg = 
15a60 72 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r1;.  }else{.   
15a70 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
15a80 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
15a90 31 29 3b 0a 20 20 20 20 2a 70 52 65 67 20 3d 20  1);.    *pReg = 
15aa0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
15ab0 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  r2;.}../*.** Gen
15ac0 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
15ad0 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78  will evaluate ex
15ae0 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61  pression pExpr a
15af0 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20  nd store the.** 
15b00 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73  results in regis
15b10 74 65 72 20 74 61 72 67 65 74 2e 20 20 54 68 65  ter target.  The
15b20 20 72 65 73 75 6c 74 73 20 61 72 65 20 67 75 61   results are gua
15b30 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61  ranteed to appea
15b40 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72  r.** in register
15b50 20 74 61 72 67 65 74 2e 0a 2a 2f 0a 69 6e 74 20   target..*/.int 
15b60 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
15b70 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
15b80 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
15b90 74 61 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69  target){.  int i
15ba0 6e 52 65 67 3b 0a 0a 20 20 61 73 73 65 72 74 28  nReg;..  assert(
15bb0 20 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72   target>0 && tar
15bc0 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65  get<=pParse->nMe
15bd0 6d 20 29 3b 0a 20 20 69 6e 52 65 67 20 3d 20 73  m );.  inReg = s
15be0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
15bf0 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
15c00 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 61  pr, target);.  a
15c10 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
15c20 56 64 62 65 20 7c 7c 20 70 50 61 72 73 65 2d 3e  Vdbe || pParse->
15c30 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
15c40 20 29 3b 0a 20 20 69 66 28 20 69 6e 52 65 67 21   );.  if( inReg!
15c50 3d 74 61 72 67 65 74 20 26 26 20 70 50 61 72 73  =target && pPars
15c60 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20  e->pVdbe ){.    
15c70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15c80 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  2(pParse->pVdbe,
15c90 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67   OP_SCopy, inReg
15ca0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 0a 20  , target);.  }. 
15cb0 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
15cc0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
15cd0 65 20 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c  e code that eval
15ce0 75 74 65 73 20 74 68 65 20 67 69 76 65 6e 20 65  utes the given e
15cf0 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 75  xpression and pu
15d00 74 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  ts the result.**
15d10 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72   in register tar
15d20 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20  get..**.** Also 
15d30 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  make a copy of t
15d40 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  he expression re
15d50 73 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68  sults into anoth
15d60 65 72 20 22 63 61 63 68 65 22 20 72 65 67 69 73  er "cache" regis
15d70 74 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66  ter.** and modif
15d80 79 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  y the expression
15d90 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78   so that the nex
15da0 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 76 61  t time it is eva
15db0 6c 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72  luated,.** the r
15dc0 65 73 75 6c 74 20 69 73 20 61 20 63 6f 70 79 20  esult is a copy 
15dd0 6f 66 20 74 68 65 20 63 61 63 68 65 20 72 65 67  of the cache reg
15de0 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ister..**.** Thi
15df0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
15e00 64 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  d for expression
15e10 73 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20  s that are used 
15e20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d  multiple .** tim
15e30 65 73 2e 20 20 54 68 65 79 20 61 72 65 20 65 76  es.  They are ev
15e40 61 6c 75 61 74 65 64 20 6f 6e 63 65 20 61 6e 64  aluated once and
15e50 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
15e60 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  the expression.*
15e70 2a 20 61 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f  * are reused..*/
15e80 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
15e90 43 6f 64 65 41 6e 64 43 61 63 68 65 28 50 61 72  CodeAndCache(Par
15ea0 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
15eb0 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
15ec0 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  get){.  Vdbe *v 
15ed0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
15ee0 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a 20 20  .  int inReg;.  
15ef0 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
15f00 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
15f10 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
15f20 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
15f30 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70  >0 );.  if( pExp
15f40 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54  r->op!=TK_REGIST
15f50 45 52 20 29 7b 20 20 0a 20 20 20 20 69 6e 74 20  ER ){  .    int 
15f60 69 4d 65 6d 3b 0a 20 20 20 20 69 4d 65 6d 20 3d  iMem;.    iMem =
15f70 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
15f80 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15f90 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70  AddOp2(v, OP_Cop
15fa0 79 2c 20 69 6e 52 65 67 2c 20 69 4d 65 6d 29 3b  y, inReg, iMem);
15fb0 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62  .    pExpr->iTab
15fc0 6c 65 20 3d 20 69 4d 65 6d 3b 0a 20 20 20 20 70  le = iMem;.    p
15fd0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
15fe0 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 70  pExpr->op;.    p
15ff0 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45  Expr->op = TK_RE
16000 47 49 53 54 45 52 3b 0a 20 20 7d 0a 20 20 72 65  GISTER;.  }.  re
16010 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f  turn inReg;.}../
16020 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
16030 20 69 66 20 70 45 78 70 72 20 69 73 20 61 6e 20   if pExpr is an 
16040 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73  constant express
16050 69 6f 6e 20 74 68 61 74 20 69 73 20 61 70 70 72  ion that is appr
16060 6f 70 72 69 61 74 65 0a 2a 2a 20 66 6f 72 20 66  opriate.** for f
16070 61 63 74 6f 72 69 6e 67 20 6f 75 74 20 6f 66 20  actoring out of 
16080 61 20 6c 6f 6f 70 2e 20 20 41 70 70 72 6f 70 72  a loop.  Appropr
16090 69 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73  iate expressions
160a0 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a   are:.**.**    *
160b0 20 20 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e    Any expression
160c0 20 74 68 61 74 20 65 76 61 6c 75 61 74 65 73 20   that evaluates 
160d0 74 6f 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 6f  to two or more o
160e0 70 63 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  pcodes..**.**   
160f0 20 2a 20 20 41 6e 79 20 4f 50 5f 49 6e 74 65 67   *  Any OP_Integ
16100 65 72 2c 20 4f 50 5f 52 65 61 6c 2c 20 4f 50 5f  er, OP_Real, OP_
16110 53 74 72 69 6e 67 2c 20 4f 50 5f 42 6c 6f 62 2c  String, OP_Blob,
16120 20 4f 50 5f 4e 75 6c 6c 2c 20 0a 2a 2a 20 20 20   OP_Null, .**   
16130 20 20 20 20 6f 72 20 4f 50 5f 56 61 72 69 61 62      or OP_Variab
16140 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  le that does not
16150 20 6e 65 65 64 20 74 6f 20 62 65 20 70 6c 61 63   need to be plac
16160 65 64 20 69 6e 20 61 20 0a 2a 2a 20 20 20 20 20  ed in a .**     
16170 20 20 73 70 65 63 69 66 69 63 20 72 65 67 69 73    specific regis
16180 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  ter..**.** There
16190 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20   is no point in 
161a0 66 61 63 74 6f 72 69 6e 67 20 6f 75 74 20 73 69  factoring out si
161b0 6e 67 6c 65 2d 69 6e 73 74 72 75 63 74 69 6f 6e  ngle-instruction
161c0 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 65 78 70   constant.** exp
161d0 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 6e 65  ressions that ne
161e0 65 64 20 74 6f 20 62 65 20 70 6c 61 63 65 64 20  ed to be placed 
161f0 69 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  in a particular 
16200 72 65 67 69 73 74 65 72 2e 20 20 0a 2a 2a 20 57  register.  .** W
16210 65 20 63 6f 75 6c 64 20 66 61 63 74 6f 72 20 74  e could factor t
16220 68 65 6d 20 6f 75 74 2c 20 62 75 74 20 74 68 65  hem out, but the
16230 6e 20 77 65 20 77 6f 75 6c 64 20 65 6e 64 20 75  n we would end u
16240 70 20 61 64 64 69 6e 67 20 61 6e 0a 2a 2a 20 4f  p adding an.** O
16250 50 5f 53 43 6f 70 79 20 69 6e 73 74 72 75 63 74  P_SCopy instruct
16260 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 74 68 65 20  ion to move the 
16270 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 63  value into the c
16280 6f 72 72 65 63 74 20 72 65 67 69 73 74 65 72 0a  orrect register.
16290 2a 2a 20 6c 61 74 65 72 2e 20 20 57 65 20 6d 69  ** later.  We mi
162a0 67 68 74 20 61 73 20 77 65 6c 6c 20 6a 75 73 74  ght as well just
162b0 20 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61   use the origina
162c0 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e  l instruction an
162d0 64 0a 2a 2a 20 61 76 6f 69 64 20 74 68 65 20 4f  d.** avoid the O
162e0 50 5f 53 43 6f 70 79 2e 0a 2a 2f 0a 73 74 61 74  P_SCopy..*/.stat
162f0 69 63 20 69 6e 74 20 69 73 41 70 70 72 6f 70 72  ic int isAppropr
16300 69 61 74 65 46 6f 72 46 61 63 74 6f 72 69 6e 67  iateForFactoring
16310 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28  (Expr *p){.  if(
16320 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43   !sqlite3ExprIsC
16330 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70  onstantNotJoin(p
16340 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
16350 30 3b 20 20 2f 2a 20 4f 6e 6c 79 20 63 6f 6e 73  0;  /* Only cons
16360 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73  tant expressions
16370 20 61 72 65 20 61 70 70 72 6f 70 72 69 61 74 65   are appropriate
16380 20 66 6f 72 20 66 61 63 74 6f 72 69 6e 67 20 2a   for factoring *
16390 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e  /.  }.  if( (p->
163a0 66 6c 61 67 73 20 26 20 45 50 5f 46 69 78 65 64  flags & EP_Fixed
163b0 44 65 73 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Dest)==0 ){.    
163c0 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 41 6e  return 1;  /* An
163d0 79 20 63 6f 6e 73 74 61 6e 74 20 77 69 74 68 6f  y constant witho
163e0 75 74 20 61 20 66 69 78 65 64 20 64 65 73 74 69  ut a fixed desti
163f0 6e 61 74 69 6f 6e 20 69 73 20 61 70 70 72 6f 70  nation is approp
16400 72 69 61 74 65 20 2a 2f 0a 20 20 7d 0a 20 20 77  riate */.  }.  w
16410 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  hile( p->op==TK_
16420 55 50 4c 55 53 20 29 20 70 20 3d 20 70 2d 3e 70  UPLUS ) p = p->p
16430 4c 65 66 74 3b 0a 20 20 73 77 69 74 63 68 28 20  Left;.  switch( 
16440 70 2d 3e 6f 70 20 29 7b 0a 23 69 66 6e 64 65 66  p->op ){.#ifndef
16450 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f   SQLITE_OMIT_BLO
16460 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61  B_LITERAL.    ca
16470 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a 23 65 6e 64  se TK_BLOB:.#end
16480 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56  if.    case TK_V
16490 41 52 49 41 42 4c 45 3a 0a 20 20 20 20 63 61 73  ARIABLE:.    cas
164a0 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20  e TK_INTEGER:.  
164b0 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
164c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c  .    case TK_NUL
164d0 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  L:.    case TK_S
164e0 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 74  TRING: {.      t
164f0 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d  estcase( p->op==
16500 54 4b 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 20  TK_BLOB );.     
16510 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70   testcase( p->op
16520 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 3b  ==TK_VARIABLE );
16530 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
16540 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47   p->op==TK_INTEG
16550 45 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ER );.      test
16560 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  case( p->op==TK_
16570 46 4c 4f 41 54 20 29 3b 0a 20 20 20 20 20 20 74  FLOAT );.      t
16580 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d  estcase( p->op==
16590 54 4b 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  TK_NULL );.     
165a0 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70   testcase( p->op
165b0 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 3b 0a 20  ==TK_STRING );. 
165c0 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 2d 69       /* Single-i
165d0 6e 73 74 72 75 63 74 69 6f 6e 20 63 6f 6e 73 74  nstruction const
165e0 61 6e 74 73 20 77 69 74 68 20 61 20 66 69 78 65  ants with a fixe
165f0 64 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 61 72  d destination ar
16600 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 74 74 65  e.      ** bette
16610 72 20 64 6f 6e 65 20 69 6e 2d 6c 69 6e 65 2e 20  r done in-line. 
16620 20 49 66 20 77 65 20 66 61 63 74 6f 72 20 74 68   If we factor th
16630 65 6d 2c 20 74 68 65 79 20 77 69 6c 6c 20 6a 75  em, they will ju
16640 73 74 20 65 6e 64 0a 20 20 20 20 20 20 2a 2a 20  st end.      ** 
16650 75 70 20 67 65 6e 65 72 61 74 69 6e 67 20 61 6e  up generating an
16660 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20 6d 6f 76   OP_SCopy to mov
16670 65 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 74  e the value to t
16680 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 20  he destination. 
16690 20 20 20 20 20 2a 2a 20 72 65 67 69 73 74 65 72       ** register
166a0 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
166b0 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 0;.    }.    c
166c0 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b  ase TK_UMINUS: {
166d0 0a 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  .       if( p->p
166e0 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f  Left->op==TK_FLO
166f0 41 54 20 7c 7c 20 70 2d 3e 70 4c 65 66 74 2d 3e  AT || p->pLeft->
16700 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29  op==TK_INTEGER )
16710 7b 0a 20 20 20 20 20 20 20 20 20 72 65 74 75 72  {.         retur
16720 6e 20 30 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20  n 0;.       }.  
16730 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16740 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
16750 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
16760 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
16770 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20   1;.}../*.** If 
16780 70 45 78 70 72 20 69 73 20 61 20 63 6f 6e 73 74  pExpr is a const
16790 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 74  ant expression t
167a0 68 61 74 20 69 73 20 61 70 70 72 6f 70 72 69 61  hat is appropria
167b0 74 65 20 66 6f 72 0a 2a 2a 20 66 61 63 74 6f 72  te for.** factor
167c0 69 6e 67 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f  ing out of a loo
167d0 70 2c 20 74 68 65 6e 20 65 76 61 6c 75 61 74 65  p, then evaluate
167e0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
167f0 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74  ** into a regist
16800 65 72 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74  er and convert t
16810 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  he expression in
16820 74 6f 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52  to a TK_REGISTER
16830 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  .** expression..
16840 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 76  */.static int ev
16850 61 6c 43 6f 6e 73 74 45 78 70 72 28 76 6f 69 64  alConstExpr(void
16860 20 2a 70 41 72 67 2c 20 45 78 70 72 20 2a 70 45   *pArg, Expr *pE
16870 78 70 72 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  xpr){.  Parse *p
16880 50 61 72 73 65 20 3d 20 28 50 61 72 73 65 2a 29  Parse = (Parse*)
16890 70 41 72 67 3b 0a 20 20 73 77 69 74 63 68 28 20  pArg;.  switch( 
168a0 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
168b0 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45   case TK_REGISTE
168c0 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  R: {.      retur
168d0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 1;.    }.    c
168e0 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
168f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
16900 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63  _FUNCTION:.    c
16910 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e  ase TK_CONST_FUN
16920 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  C: {.      /* Th
16930 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 61  e arguments to a
16940 20 66 75 6e 63 74 69 6f 6e 20 68 61 76 65 20 61   function have a
16950 20 66 69 78 65 64 20 64 65 73 74 69 6e 61 74 69   fixed destinati
16960 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 4d 61 72  on..      ** Mar
16970 6b 20 74 68 65 6d 20 74 68 69 73 20 77 61 79 20  k them this way 
16980 74 6f 20 61 76 6f 69 64 20 67 65 6e 65 72 61 74  to avoid generat
16990 65 64 20 75 6e 6e 65 65 64 65 64 20 4f 50 5f 53  ed unneeded OP_S
169a0 43 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20 69 6e  Copy.      ** in
169b0 73 74 72 75 63 74 69 6f 6e 73 2e 20 0a 20 20 20  structions. .   
169c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72     */.      Expr
169d0 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
169e0 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20  xpr->pList;.    
169f0 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
16a00 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 70         int i = p
16a10 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
16a20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
16a30 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
16a40 20 3d 20 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20   = pList->a;.   
16a50 20 20 20 20 20 66 6f 72 28 3b 20 69 3e 30 3b 20       for(; i>0; 
16a60 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i--, pItem++){. 
16a70 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74           if( pIt
16a80 65 6d 2d 3e 70 45 78 70 72 20 29 20 70 49 74 65  em->pExpr ) pIte
16a90 6d 2d 3e 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  m->pExpr->flags 
16aa0 7c 3d 20 45 50 5f 46 69 78 65 64 44 65 73 74 3b  |= EP_FixedDest;
16ab0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16ac0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
16ad0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
16ae0 69 73 41 70 70 72 6f 70 72 69 61 74 65 46 6f 72  isAppropriateFor
16af0 46 61 63 74 6f 72 69 6e 67 28 70 45 78 70 72 29  Factoring(pExpr)
16b00 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 31 20 3d   ){.    int r1 =
16b10 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
16b20 0a 20 20 20 20 69 6e 74 20 72 32 3b 0a 20 20 20  .    int r2;.   
16b30 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
16b40 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
16b50 73 65 2c 20 70 45 78 70 72 2c 20 72 31 29 3b 0a  se, pExpr, r1);.
16b60 20 20 20 20 69 66 28 20 72 31 21 3d 72 32 20 29      if( r1!=r2 )
16b70 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
16b80 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
16b90 31 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69  1);.    pExpr->i
16ba0 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e  Column = pExpr->
16bb0 6f 70 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f  op;.    pExpr->o
16bc0 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b  p = TK_REGISTER;
16bd0 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62  .    pExpr->iTab
16be0 6c 65 20 3d 20 72 32 3b 0a 20 20 20 20 72 65 74  le = r2;.    ret
16bf0 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
16c00 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
16c10 50 72 65 65 76 61 6c 75 61 74 65 20 63 6f 6e 73  Preevaluate cons
16c20 74 61 6e 74 20 73 75 62 65 78 70 72 65 73 73 69  tant subexpressi
16c30 6f 6e 73 20 77 69 74 68 69 6e 20 70 45 78 70 72  ons within pExpr
16c40 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a   and store the.*
16c50 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67  * results in reg
16c60 69 73 74 65 72 73 2e 20 20 4d 6f 64 69 66 79 20  isters.  Modify 
16c70 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 74 68  pExpr so that th
16c80 65 20 63 6f 6e 73 74 61 6e 74 20 73 75 62 65 78  e constant subex
16c90 70 72 65 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20  presions.** are 
16ca0 54 4b 5f 52 45 47 49 53 54 45 52 20 6f 70 63 6f  TK_REGISTER opco
16cb0 64 65 73 20 74 68 61 74 20 72 65 66 65 72 20 74  des that refer t
16cc0 6f 20 74 68 65 20 70 72 65 63 6f 6d 70 75 74 65  o the precompute
16cd0 64 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 76 6f 69  d values..*/.voi
16ce0 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
16cf0 65 43 6f 6e 73 74 61 6e 74 73 28 50 61 72 73 65  eConstants(Parse
16d00 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
16d10 70 45 78 70 72 29 7b 0a 20 20 20 77 61 6c 6b 45  pExpr){.   walkE
16d20 78 70 72 54 72 65 65 28 70 45 78 70 72 2c 20 65  xprTree(pExpr, e
16d30 76 61 6c 43 6f 6e 73 74 45 78 70 72 2c 20 70 50  valConstExpr, pP
16d40 61 72 73 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  arse);.}.../*.**
16d50 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
16d60 68 61 74 20 70 75 73 68 65 73 20 74 68 65 20 76  hat pushes the v
16d70 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c  alue of every el
16d80 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76  ement of the giv
16d90 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  en.** expression
16da0 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 73 65 71   list into a seq
16db0 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65  uence of registe
16dc0 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  rs beginning at 
16dd0 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65  target..**.** Re
16de0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
16df0 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c  of elements eval
16e00 75 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  uated..*/.int sq
16e10 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
16e20 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
16e30 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50  pParse,     /* P
16e40 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
16e50 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
16e60 69 73 74 2c 20 20 20 2f 2a 20 54 68 65 20 65 78  ist,   /* The ex
16e70 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f  pression list to
16e80 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69   be coded */.  i
16e90 6e 74 20 74 61 72 67 65 74 2c 20 20 20 20 20 20  nt target,      
16ea0 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72    /* Where to wr
16eb0 69 74 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  ite results */. 
16ec0 20 69 6e 74 20 64 6f 48 61 72 64 43 6f 70 79 20   int doHardCopy 
16ed0 20 20 20 20 2f 2a 20 43 61 6c 6c 20 73 71 6c 69      /* Call sqli
16ee0 74 65 33 45 78 70 72 48 61 72 64 43 6f 70 79 20  te3ExprHardCopy 
16ef0 6f 6e 20 65 61 63 68 20 65 6c 65 6d 65 6e 74 20  on each element 
16f00 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
16f10 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
16f20 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
16f30 6e 74 20 69 2c 20 6e 3b 0a 20 20 61 73 73 65 72  nt i, n;.  asser
16f40 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70  t( pList!=0 || p
16f50 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
16f60 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
16f70 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
16f80 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
16f90 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e   assert( target>
16fa0 30 20 29 3b 0a 20 20 6e 20 3d 20 70 4c 69 73 74  0 );.  n = pList
16fb0 2d 3e 6e 45 78 70 72 3b 0a 20 20 66 6f 72 28 70  ->nExpr;.  for(p
16fc0 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
16fd0 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49  =0; i<n; i++, pI
16fe0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  tem++){.    sqli
16ff0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
17000 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  se, pItem->pExpr
17010 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20  , target+i);.   
17020 20 69 66 28 20 64 6f 48 61 72 64 43 6f 70 79 20   if( doHardCopy 
17030 29 20 73 71 6c 69 74 65 33 45 78 70 72 48 61 72  ) sqlite3ExprHar
17040 64 43 6f 70 79 28 70 50 61 72 73 65 2c 20 74 61  dCopy(pParse, ta
17050 72 67 65 74 2c 20 6e 29 3b 0a 20 20 7d 0a 20 20  rget, n);.  }.  
17060 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
17070 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
17080 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65   for a boolean e
17090 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74  xpression such t
170a0 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  hat a jump is ma
170b0 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62  de.** to the lab
170c0 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65  el "dest" if the
170d0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
170e0 72 75 65 20 62 75 74 20 65 78 65 63 75 74 69 6f  rue but executio
170f0 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73  n.** continues s
17100 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20  traight thru if 
17110 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
17120 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  s false..**.** I
17130 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
17140 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
17150 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65  LL (neither true
17160 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68 65   nor false), the
17170 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75  n.** take the ju
17180 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49 66  mp if the jumpIf
17190 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 53 51 4c  Null flag is SQL
171a0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a  ITE_JUMPIFNULL..
171b0 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20  **.** This code 
171c0 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66  depends on the f
171d0 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69 6e  act that certain
171e0 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65   token values (e
171f0 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65  x: TK_EQ).** are
17200 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63   the same as opc
17210 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20  ode values (ex: 
17220 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c  OP_Eq) that impl
17230 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73  ement the corres
17240 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61  ponding.** opera
17250 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63  tion.  Special c
17260 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e  omments in vdbe.
17270 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f  c and the mkopco
17280 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69  deh.awk script i
17290 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72  n.** the make pr
172a0 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65 73  ocess cause thes
172b0 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67  e values to alig
172c0 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69 6e  n.  Assert()s in
172d0 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c   the code.** bel
172e0 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20 74  ow verify that t
172f0 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61  he numbers are a
17300 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79  ligned correctly
17310 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
17320 33 45 78 70 72 49 66 54 72 75 65 28 50 61 72 73  3ExprIfTrue(Pars
17330 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
17340 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
17350 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
17360 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
17370 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
17380 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e  int op = 0;.  in
17390 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a  t regFree1 = 0;.
173a0 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d    int regFree2 =
173b0 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32   0;.  int r1, r2
173c0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d  ;..  assert( jum
173d0 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
173e0 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75  JUMPIFNULL || ju
173f0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
17400 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78   if( v==0 || pEx
17410 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
17420 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70    op = pExpr->op
17430 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
17440 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  {.    case TK_AN
17450 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  D: {.      int d
17460 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  2 = sqlite3VdbeM
17470 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
17480 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
17490 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
174a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50      testcase( pP
174b0 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c  arse->disableCol
174c0 43 61 63 68 65 3d 3d 30 20 29 3b 0a 20 20 20 20  Cache==0 );.    
174d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
174e0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
174f0 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 6a 75  pr->pLeft, d2,ju
17500 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f  mpIfNull^SQLITE_
17510 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
17520 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62     pParse->disab
17530 6c 65 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20 20  leColCache++;.  
17540 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
17550 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
17560 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
17570 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
17580 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
17590 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c  arse->disableCol
175a0 43 61 63 68 65 3e 30 20 29 3b 0a 20 20 20 20 20  Cache>0 );.     
175b0 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65   pParse->disable
175c0 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20 20 20 20  ColCache--;.    
175d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
175e0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29  olveLabel(v, d2)
175f0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
17600 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
17610 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  _OR: {.      tes
17620 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
17630 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  l==0 );.      te
17640 73 74 63 61 73 65 28 20 70 50 61 72 73 65 2d 3e  stcase( pParse->
17650 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 3d  disableColCache=
17660 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
17670 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
17680 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
17690 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
176a0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 70 50 61  Null);.      pPa
176b0 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43  rse->disableColC
176c0 61 63 68 65 2b 2b 3b 0a 20 20 20 20 20 20 73 71  ache++;.      sq
176d0 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
176e0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
176f0 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
17700 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
17710 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
17720 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 3e  disableColCache>
17730 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  0 );.      pPars
17740 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63  e->disableColCac
17750 68 65 2d 2d 3b 0a 20 20 20 20 20 20 62 72 65 61  he--;.      brea
17760 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
17770 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
17780 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
17790 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
177a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
177b0 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
177c0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
177d0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
177e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
177f0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  }.    case TK_LT
17800 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
17810 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
17820 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
17830 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
17840 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
17850 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
17860 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29  ( TK_LT==OP_Lt )
17870 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
17880 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a  TK_LE==OP_Le );.
17890 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
178a0 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20  _GT==OP_Gt );.  
178b0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
178c0 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20  E==OP_Ge );.    
178d0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d    assert( TK_EQ=
178e0 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20  =OP_Eq );.      
178f0 61 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f  assert( TK_NE==O
17900 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 74 65  P_Ne );.      te
17910 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c  stcase( op==TK_L
17920 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
17930 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29  ase( op==TK_LE )
17940 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
17950 28 20 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20  ( op==TK_GT );. 
17960 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
17970 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20  p==TK_GE );.    
17980 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
17990 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 74  TK_EQ );.      t
179a0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
179b0 4e 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  NE );.      test
179c0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
179d0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 64  ==0 );.      cod
179e0 65 43 6f 6d 70 61 72 65 4f 70 65 72 61 6e 64 73  eCompareOperands
179f0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
17a00 70 4c 65 66 74 2c 20 26 72 31 2c 20 26 72 65 67  pLeft, &r1, &reg
17a10 46 72 65 65 31 2c 0a 20 20 20 20 20 20 20 20 20  Free1,.         
17a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a30 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
17a40 70 52 69 67 68 74 2c 20 26 72 32 2c 20 26 72 65  pRight, &r2, &re
17a50 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63  gFree2);.      c
17a60 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
17a70 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
17a80 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
17a90 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  op,.            
17aa0 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65        r1, r2, de
17ab0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
17ac0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
17ad0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
17ae0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17af0 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
17b00 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17b10 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
17b20 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
17b30 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
17b40 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53     assert( TK_IS
17b50 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  NULL==OP_IsNull 
17b60 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
17b70 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f   TK_NOTNULL==OP_
17b80 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20  NotNull );.     
17b90 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
17ba0 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  K_ISNULL );.    
17bb0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
17bc0 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20  TK_NOTNULL );.  
17bd0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
17be0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
17bf0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
17c00 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
17c10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17c20 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31  AddOp2(v, op, r1
17c30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74  , dest);.      t
17c40 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
17c50 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  1==0 );.      br
17c60 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
17c70 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
17c80 7b 0a 20 20 20 20 20 20 2f 2a 20 20 20 20 78 20  {.      /*    x 
17c90 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a  BETWEEN y AND z.
17ca0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
17cb0 2a 20 49 73 20 65 71 75 69 76 61 6c 65 6e 74 20  * Is equivalent 
17cc0 74 6f 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  to .      **.   
17cd0 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e     **    x>=y AN
17ce0 44 20 78 3c 3d 7a 0a 20 20 20 20 20 20 2a 2a 0a  D x<=z.      **.
17cf0 20 20 20 20 20 20 2a 2a 20 43 6f 64 65 20 69 74        ** Code it
17d00 20 61 73 20 73 75 63 68 2c 20 74 61 6b 69 6e 67   as such, taking
17d10 20 63 61 72 65 20 74 6f 20 64 6f 20 74 68 65 20   care to do the 
17d20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65 73  common subexpres
17d30 73 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 65 6c  sion.      ** el
17d40 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 78 2e  ementation of x.
17d50 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
17d60 45 78 70 72 20 65 78 70 72 41 6e 64 3b 0a 20 20  Expr exprAnd;.  
17d70 20 20 20 20 45 78 70 72 20 63 6f 6d 70 4c 65 66      Expr compLef
17d80 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 63 6f  t;.      Expr co
17d90 6d 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 45  mpRight;.      E
17da0 78 70 72 20 65 78 70 72 58 3b 0a 0a 20 20 20 20  xpr exprX;..    
17db0 20 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70 72    exprX = *pExpr
17dc0 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 65  ->pLeft;.      e
17dd0 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41  xprAnd.op = TK_A
17de0 4e 44 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e  ND;.      exprAn
17df0 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c  d.pLeft = &compL
17e00 65 66 74 3b 0a 20 20 20 20 20 20 65 78 70 72 41  eft;.      exprA
17e10 6e 64 2e 70 52 69 67 68 74 20 3d 20 26 63 6f 6d  nd.pRight = &com
17e20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 63 6f  pRight;.      co
17e30 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47  mpLeft.op = TK_G
17e40 45 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65 66  E;.      compLef
17e50 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58  t.pLeft = &exprX
17e60 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65 66 74  ;.      compLeft
17e70 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d  .pRight = pExpr-
17e80 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  >pList->a[0].pEx
17e90 70 72 3b 0a 20 20 20 20 20 20 63 6f 6d 70 52 69  pr;.      compRi
17ea0 67 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a  ght.op = TK_LE;.
17eb0 20 20 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e        compRight.
17ec0 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a  pLeft = &exprX;.
17ed0 20 20 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e        compRight.
17ee0 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
17ef0 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
17f00 72 3b 0a 20 20 20 20 20 20 65 78 70 72 58 2e 69  r;.      exprX.i
17f10 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 45  Table = sqlite3E
17f20 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
17f30 73 65 2c 20 26 65 78 70 72 58 2c 20 26 72 65 67  se, &exprX, &reg
17f40 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65  Free1);.      te
17f50 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
17f60 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70  ==0 );.      exp
17f70 72 58 2e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53  rX.op = TK_REGIS
17f80 54 45 52 3b 0a 20 20 20 20 20 20 74 65 73 74 63  TER;.      testc
17f90 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
17fa0 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
17fb0 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
17fc0 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20  arse, &exprAnd, 
17fd0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
17fe0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
17ff0 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
18000 74 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20  t: {.      r1 = 
18010 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
18020 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
18030 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  r, &regFree1);. 
18040 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18050 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 2c  AddOp3(v, OP_If,
18060 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49   r1, dest, jumpI
18070 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20  fNull!=0);.     
18080 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
18090 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
180a0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
180b0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
180c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
180d0 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
180e0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
180f0 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73  , regFree1);.  s
18100 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
18110 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
18120 46 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a  Free2);  .}../*.
18130 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
18140 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65   for a boolean e
18150 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74  xpression such t
18160 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  hat a jump is ma
18170 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62  de.** to the lab
18180 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65  el "dest" if the
18190 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
181a0 61 6c 73 65 20 62 75 74 20 65 78 65 63 75 74 69  alse but executi
181b0 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20  on.** continues 
181c0 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66  straight thru if
181d0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
181e0 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49  is true..**.** I
181f0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
18200 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
18210 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65  LL (neither true
18220 20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e   nor false) then
18230 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70  .** jump if jump
18240 49 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54 45  IfNull is SQLITE
18250 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66  _JUMPIFNULL or f
18260 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a  all through if j
18270 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20  umpIfNull.** is 
18280 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  0..*/.void sqlit
18290 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 50 61  e3ExprIfFalse(Pa
182a0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
182b0 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65  r *pExpr, int de
182c0 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  st, int jumpIfNu
182d0 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ll){.  Vdbe *v =
182e0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
182f0 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20    int op = 0;.  
18300 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
18310 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32  ;.  int regFree2
18320 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20   = 0;.  int r1, 
18330 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a  r2;..  assert( j
18340 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
18350 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20  E_JUMPIFNULL || 
18360 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
18370 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70  .  if( v==0 || p
18380 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
18390 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75  ;..  /* The valu
183a0 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61  e of pExpr->op a
183b0 6e 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65  nd op are relate
183c0 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  d as follows:.  
183d0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45  **.  **       pE
183e0 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20  xpr->op         
183f0 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20     op.  **      
18400 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20   ---------      
18410 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20      ----------. 
18420 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e   **       TK_ISN
18430 55 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f  ULL          OP_
18440 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20  NotNull.  **    
18450 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20     TK_NOTNULL   
18460 20 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a        OP_IsNull.
18470 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45    **       TK_NE
18480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
18490 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Eq.  **       T
184a0 4b 5f 45 51 20 20 20 20 20 20 20 20 20 20 20 20  K_EQ            
184b0 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20    OP_Ne.  **    
184c0 20 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20     TK_GT        
184d0 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a        OP_Le.  **
184e0 20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20         TK_LE    
184f0 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a            OP_Gt.
18500 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45    **       TK_GE
18510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
18520 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Lt.  **       T
18530 4b 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20 20  K_LT            
18540 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a    OP_Ge.  **.  *
18550 2a 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75  * For other valu
18560 65 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c  es of pExpr->op,
18570 20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64   op is undefined
18580 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a   and unused..  *
18590 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54  * The value of T
185a0 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74  K_ and OP_ const
185b0 61 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67 65  ants are arrange
185c0 64 20 73 75 63 68 20 74 68 61 74 20 77 65 0a 20  d such that we. 
185d0 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20   ** can compute 
185e0 74 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76  the mapping abov
185f0 65 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c  e using the foll
18600 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e  owing expression
18610 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73  ..  ** Assert()s
18620 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
18630 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20   computation is 
18640 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20  correct..  */.  
18650 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70  op = ((pExpr->op
18660 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e  +(TK_ISNULL&1))^
18670 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29  1)-(TK_ISNULL&1)
18680 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63  ;..  /* Verify c
18690 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74  orrect alignment
186a0 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20   of TK_ and OP_ 
186b0 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20  constants.  */. 
186c0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
186d0 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c  op!=TK_ISNULL ||
186e0 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20   op==OP_NotNull 
186f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
18700 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55  pr->op!=TK_NOTNU
18710 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e  LL || op==OP_IsN
18720 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ull );.  assert(
18730 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e   pExpr->op!=TK_N
18740 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29  E || op==OP_Eq )
18750 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
18760 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20  r->op!=TK_EQ || 
18770 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61  op==OP_Ne );.  a
18780 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
18790 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_LT || op==O
187a0 50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Ge );.  assert
187b0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
187c0 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20  LE || op==OP_Gt 
187d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
187e0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c  pr->op!=TK_GT ||
187f0 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20   op==OP_Le );.  
18800 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
18810 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_GE || op==
18820 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74  OP_Lt );..  swit
18830 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
18840 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
18850 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
18860 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
18870 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
18880 61 73 65 28 20 70 50 61 72 73 65 2d 3e 64 69 73  ase( pParse->dis
18890 61 62 6c 65 43 6f 6c 43 61 63 68 65 3d 3d 30 20  ableColCache==0 
188a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
188b0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
188c0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
188d0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
188e0 6c 6c 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  ll);.      pPars
188f0 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63  e->disableColCac
18900 68 65 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69  he++;.      sqli
18910 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
18920 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
18930 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
18940 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61  IfNull);.      a
18950 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
18960 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 3e 30  isableColCache>0
18970 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65   );.      pParse
18980 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68  ->disableColCach
18990 65 2d 2d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  e--;.      break
189a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
189b0 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20   TK_OR: {.      
189c0 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
189d0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
189e0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
189f0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
18a00 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
18a10 65 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62  e( pParse->disab
18a20 6c 65 43 6f 6c 43 61 63 68 65 3d 3d 30 20 29 3b  leColCache==0 );
18a30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
18a40 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
18a50 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
18a60 32 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51  2, jumpIfNull^SQ
18a70 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
18a80 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
18a90 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b  disableColCache+
18aa0 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  +;.      sqlite3
18ab0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
18ac0 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
18ad0 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
18ae0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ull);.      asse
18af0 72 74 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61  rt( pParse->disa
18b00 62 6c 65 43 6f 6c 43 61 63 68 65 3e 30 20 29 3b  bleColCache>0 );
18b10 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  .      pParse->d
18b20 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d 2d  isableColCache--
18b30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
18b40 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
18b50 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72  v, d2);.      br
18b60 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
18b70 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
18b80 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
18b90 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
18ba0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
18bb0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
18bc0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
18bd0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  }.    case TK_LT
18be0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
18bf0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
18c00 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
18c10 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
18c20 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
18c30 3a 20 7b 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 4c 54 20 29 3b  se( op==TK_LT );
18c50 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
18c60 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20   op==TK_LE );.  
18c70 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
18c80 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20  ==TK_GT );.     
18c90 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
18ca0 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65  K_GE );.      te
18cb0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45  stcase( op==TK_E
18cc0 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Q );.      testc
18cd0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29  ase( op==TK_NE )
18ce0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
18cf0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
18d00 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
18d10 70 61 72 65 4f 70 65 72 61 6e 64 73 28 70 50 61  pareOperands(pPa
18d20 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
18d30 74 2c 20 26 72 31 2c 20 26 72 65 67 46 72 65 65  t, &r1, &regFree
18d40 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
18d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d60 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67       pExpr->pRig
18d70 68 74 2c 20 26 72 32 2c 20 26 72 65 67 46 72 65  ht, &r2, &regFre
18d80 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  e2);.      codeC
18d90 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
18da0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
18db0 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
18dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18dd0 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20    r1, r2, dest, 
18de0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
18df0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
18e00 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
18e10 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
18e20 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
18e30 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
18e40 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
18e50 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
18e60 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 74  TNULL: {.      t
18e70 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
18e80 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
18e90 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
18ea0 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  _NOTNULL );.    
18eb0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
18ec0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
18ed0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
18ee0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
18ef0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18f00 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20  dOp2(v, op, r1, 
18f10 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73  dest);.      tes
18f20 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
18f30 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
18f40 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
18f50 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
18f60 20 20 20 20 20 20 2f 2a 20 20 20 20 78 20 42 45        /*    x BE
18f70 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20  TWEEN y AND z.  
18f80 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
18f90 49 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  Is equivalent to
18fa0 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20   .      **.     
18fb0 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20   **    x>=y AND 
18fc0 78 3c 3d 7a 0a 20 20 20 20 20 20 2a 2a 0a 20 20  x<=z.      **.  
18fd0 20 20 20 20 2a 2a 20 43 6f 64 65 20 69 74 20 61      ** Code it a
18fe0 73 20 73 75 63 68 2c 20 74 61 6b 69 6e 67 20 63  s such, taking c
18ff0 61 72 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f  are to do the co
19000 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65 73 73 69  mmon subexpressi
19010 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d  on.      ** elem
19020 65 6e 74 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 20  entation of x.. 
19030 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45 78       */.      Ex
19040 70 72 20 65 78 70 72 41 6e 64 3b 0a 20 20 20 20  pr exprAnd;.    
19050 20 20 45 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b    Expr compLeft;
19060 0a 20 20 20 20 20 20 45 78 70 72 20 63 6f 6d 70  .      Expr comp
19070 52 69 67 68 74 3b 0a 20 20 20 20 20 20 45 78 70  Right;.      Exp
19080 72 20 65 78 70 72 58 3b 0a 0a 20 20 20 20 20 20  r exprX;..      
19090 65 78 70 72 58 20 3d 20 2a 70 45 78 70 72 2d 3e  exprX = *pExpr->
190a0 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 65 78 70  pLeft;.      exp
190b0 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44  rAnd.op = TK_AND
190c0 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e 64 2e  ;.      exprAnd.
190d0 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66  pLeft = &compLef
190e0 74 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e 64  t;.      exprAnd
190f0 2e 70 52 69 67 68 74 20 3d 20 26 63 6f 6d 70 52  .pRight = &compR
19100 69 67 68 74 3b 0a 20 20 20 20 20 20 63 6f 6d 70  ight;.      comp
19110 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b  Left.op = TK_GE;
19120 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e  .      compLeft.
19130 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a  pLeft = &exprX;.
19140 20 20 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 70        compLeft.p
19150 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70  Right = pExpr->p
19160 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
19170 3b 0a 20 20 20 20 20 20 63 6f 6d 70 52 69 67 68  ;.      compRigh
19180 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20  t.op = TK_LE;.  
19190 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c      compRight.pL
191a0 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20  eft = &exprX;.  
191b0 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52      compRight.pR
191c0 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  ight = pExpr->pL
191d0 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
191e0 0a 20 20 20 20 20 20 65 78 70 72 58 2e 69 54 61  .      exprX.iTa
191f0 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ble = sqlite3Exp
19200 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
19210 2c 20 26 65 78 70 72 58 2c 20 26 72 65 67 46 72  , &exprX, &regFr
19220 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ee1);.      test
19230 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
19240 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 58  0 );.      exprX
19250 2e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45  .op = TK_REGISTE
19260 52 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  R;.      testcas
19270 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
19280 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
19290 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
192a0 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64  rse, &exprAnd, d
192b0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
192c0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
192d0 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
192e0 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  : {.      r1 = s
192f0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
19300 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
19310 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
19320 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19330 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp3(v, OP_IfNo
19340 74 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d  t, r1, dest, jum
19350 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20  pIfNull!=0);.   
19360 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
19370 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
19380 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
19390 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
193a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
193b0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
193c0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
193d0 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20  se, regFree1);. 
193e0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
193f0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
19400 65 67 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a  egFree2);.}../*.
19410 2a 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d  ** Do a deep com
19420 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65  parison of two e
19430 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e  xpression trees.
19440 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 28 6e    Return TRUE (n
19450 6f 6e 2d 7a 65 72 6f 29 0a 2a 2a 20 69 66 20 74  on-zero).** if t
19460 68 65 79 20 61 72 65 20 69 64 65 6e 74 69 63 61  hey are identica
19470 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 46 41 4c  l and return FAL
19480 53 45 20 69 66 20 74 68 65 79 20 64 69 66 66 65  SE if they diffe
19490 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a  r in any way..**
194a0 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68  .** Sometimes th
194b0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
194c0 72 65 74 75 72 6e 20 46 41 4c 53 45 20 65 76 65  return FALSE eve
194d0 6e 20 69 66 20 74 68 65 20 74 77 6f 20 65 78 70  n if the two exp
194e0 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c  ressions.** real
194f0 6c 79 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e  ly are equivalen
19500 74 2e 20 20 49 66 20 77 65 20 63 61 6e 6e 6f 74  t.  If we cannot
19510 20 70 72 6f 76 65 20 74 68 61 74 20 74 68 65 20   prove that the 
19520 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 0a  expressions are.
19530 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 77 65  ** identical, we
19540 20 72 65 74 75 72 6e 20 46 41 4c 53 45 20 6a 75   return FALSE ju
19550 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e 20 20  st to be safe.  
19560 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  So if this routi
19570 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 66 61  ne.** returns fa
19580 6c 73 65 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f  lse, then you do
19590 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77   not really know
195a0 20 66 6f 72 20 63 65 72 74 61 69 6e 20 69 66 20   for certain if 
195b0 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65  the two.** expre
195c0 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73  ssions are the s
195d0 61 6d 65 2e 20 20 42 75 74 20 69 66 20 79 6f 75  ame.  But if you
195e0 20 67 65 74 20 61 20 54 52 55 45 20 72 65 74 75   get a TRUE retu
195f0 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20  rn, then you.** 
19600 63 61 6e 20 62 65 20 73 75 72 65 20 74 68 65 20  can be sure the 
19610 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20  expressions are 
19620 74 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74 68  the same.  In th
19630 65 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a 2a  e places where.*
19640 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
19650 73 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73 20  s used, it does 
19660 6e 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74 20  not hurt to get 
19670 61 6e 20 65 78 74 72 61 20 46 41 4c 53 45 20 2d  an extra FALSE -
19680 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69   that.** just mi
19690 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 73 6f  ght result in so
196a0 6d 65 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77  me slightly slow
196b0 65 72 20 63 6f 64 65 2e 20 20 42 75 74 20 72 65  er code.  But re
196c0 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e  turning.** an in
196d0 63 6f 72 72 65 63 74 20 54 52 55 45 20 63 6f 75  correct TRUE cou
196e0 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c  ld lead to a mal
196f0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  function..*/.int
19700 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
19710 61 72 65 28 45 78 70 72 20 2a 70 41 2c 20 45 78  are(Expr *pA, Ex
19720 70 72 20 2a 70 42 29 7b 0a 20 20 69 6e 74 20 69  pr *pB){.  int i
19730 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 7c 7c 70  ;.  if( pA==0||p
19740 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  B==0 ){.    retu
19750 72 6e 20 70 42 3d 3d 70 41 3b 0a 20 20 7d 0a 20  rn pB==pA;.  }. 
19760 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d   if( pA->op!=pB-
19770 3e 6f 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  >op ) return 0;.
19780 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73    if( (pA->flags
19790 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 21   & EP_Distinct)!
197a0 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20 45 50  =(pB->flags & EP
197b0 5f 44 69 73 74 69 6e 63 74 29 20 29 20 72 65 74  _Distinct) ) ret
197c0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
197d0 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
197e0 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e  (pA->pLeft, pB->
197f0 70 4c 65 66 74 29 20 29 20 72 65 74 75 72 6e 20  pLeft) ) return 
19800 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  0;.  if( !sqlite
19810 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d  3ExprCompare(pA-
19820 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e 70 52 69  >pRight, pB->pRi
19830 67 68 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ght) ) return 0;
19840 0a 20 20 69 66 28 20 70 41 2d 3e 70 4c 69 73 74  .  if( pA->pList
19850 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 2d 3e   ){.    if( pB->
19860 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
19870 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70 41 2d  n 0;.    if( pA-
19880 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70  >pList->nExpr!=p
19890 42 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  B->pList->nExpr 
198a0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
198b0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 70  for(i=0; i<pA->p
198c0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
198d0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 73 71  ){.      if( !sq
198e0 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
198f0 28 70 41 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d  (pA->pList->a[i]
19900 2e 70 45 78 70 72 2c 20 70 42 2d 3e 70 4c 69 73  .pExpr, pB->pLis
19910 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  t->a[i].pExpr) )
19920 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
19930 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
19940 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42  }.  }else if( pB
19950 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 72  ->pList ){.    r
19960 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
19970 66 28 20 70 41 2d 3e 70 53 65 6c 65 63 74 20 7c  f( pA->pSelect |
19980 7c 20 70 42 2d 3e 70 53 65 6c 65 63 74 20 29 20  | pB->pSelect ) 
19990 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
199a0 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e  pA->iTable!=pB->
199b0 69 54 61 62 6c 65 20 7c 7c 20 70 41 2d 3e 69 43  iTable || pA->iC
199c0 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75  olumn!=pB->iColu
199d0 6d 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  mn ) return 0;. 
199e0 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f   if( pA->op!=TK_
199f0 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 74 6f  COLUMN && pA->to
19a00 6b 65 6e 2e 7a 20 29 7b 0a 20 20 20 20 69 66 28  ken.z ){.    if(
19a10 20 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20   pB->token.z==0 
19a20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
19a30 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 21  if( pB->token.n!
19a40 3d 70 41 2d 3e 74 6f 6b 65 6e 2e 6e 20 29 20 72  =pA->token.n ) r
19a50 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28  eturn 0;.    if(
19a60 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
19a70 28 28 63 68 61 72 2a 29 70 41 2d 3e 74 6f 6b 65  ((char*)pA->toke
19a80 6e 2e 7a 2c 28 63 68 61 72 2a 29 70 42 2d 3e 74  n.z,(char*)pB->t
19a90 6f 6b 65 6e 2e 7a 2c 70 42 2d 3e 74 6f 6b 65 6e  oken.z,pB->token
19aa0 2e 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  .n)!=0 ){.      
19ab0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
19ac0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
19ad0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  }.../*.** Add a 
19ae0 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
19af0 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  he pAggInfo->aCo
19b00 6c 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75  l[] array.  Retu
19b10 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a  rn the index of.
19b20 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65  ** the new eleme
19b30 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65  nt.  Return a ne
19b40 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66  gative number if
19b50 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a   malloc fails..*
19b60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64  /.static int add
19b70 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71  AggInfoColumn(sq
19b80 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e  lite3 *db, AggIn
19b90 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e  fo *pInfo){.  in
19ba0 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43  t i;.  pInfo->aC
19bb0 6f 6c 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61  ol = sqlite3Arra
19bc0 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20  yAllocate(.     
19bd0 20 20 64 62 2c 0a 20 20 20 20 20 20 20 70 49 6e    db,.       pIn
19be0 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20  fo->aCol,.      
19bf0 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61   sizeof(pInfo->a
19c00 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20  Col[0]),.       
19c10 33 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f  3,.       &pInfo
19c20 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  ->nColumn,.     
19c30 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d    &pInfo->nColum
19c40 6e 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 20 26  nAlloc,.       &
19c50 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  i.  );.  return 
19c60 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20  i;.}    ../*.** 
19c70 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
19c80 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66  t to the pAggInf
19c90 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61 79  o->aFunc[] array
19ca0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  .  Return the in
19cb0 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  dex of.** the ne
19cc0 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75  w element.  Retu
19cd0 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75  rn a negative nu
19ce0 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66  mber if malloc f
19cf0 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
19d00 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 46 75  int addAggInfoFu
19d10 6e 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  nc(sqlite3 *db, 
19d20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b  AggInfo *pInfo){
19d30 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66  .  int i;.  pInf
19d40 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69 74  o->aFunc = sqlit
19d50 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28  e3ArrayAllocate(
19d60 0a 20 20 20 20 20 20 20 64 62 2c 20 0a 20 20 20  .       db, .   
19d70 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63      pInfo->aFunc
19d80 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28  ,.       sizeof(
19d90 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29  pInfo->aFunc[0])
19da0 2c 0a 20 20 20 20 20 20 20 33 2c 0a 20 20 20 20  ,.       3,.    
19db0 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63     &pInfo->nFunc
19dc0 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d  ,.       &pInfo-
19dd0 3e 6e 46 75 6e 63 41 6c 6c 6f 63 2c 0a 20 20 20  >nFuncAlloc,.   
19de0 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65      &i.  );.  re
19df0 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f  turn i;.}    ../
19e00 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20  *.** This is an 
19e10 78 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b 45 78  xFunc for walkEx
19e20 70 72 54 72 65 65 28 29 20 75 73 65 64 20 74 6f  prTree() used to
19e30 20 69 6d 70 6c 65 6d 65 6e 74 20 0a 2a 2a 20 73   implement .** s
19e40 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
19e50 65 41 67 67 72 65 67 61 74 65 73 28 29 2e 20 20  eAggregates().  
19e60 53 65 65 20 73 71 6c 69 74 65 33 45 78 70 72 41  See sqlite3ExprA
19e70 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
19e80 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .** for addition
19e90 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
19ea0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
19eb0 6e 65 20 61 6e 61 6c 79 7a 65 73 20 74 68 65 20  ne analyzes the 
19ec0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
19ed0 6f 6e 20 61 74 20 70 45 78 70 72 2e 0a 2a 2f 0a  on at pExpr..*/.
19ee0 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79  static int analy
19ef0 7a 65 41 67 67 72 65 67 61 74 65 28 76 6f 69 64  zeAggregate(void
19f00 20 2a 70 41 72 67 2c 20 45 78 70 72 20 2a 70 45   *pArg, Expr *pE
19f10 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  xpr){.  int i;. 
19f20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
19f30 43 20 3d 20 28 4e 61 6d 65 43 6f 6e 74 65 78 74  C = (NameContext
19f40 20 2a 29 70 41 72 67 3b 0a 20 20 50 61 72 73 65   *)pArg;.  Parse
19f50 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e   *pParse = pNC->
19f60 70 50 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73  pParse;.  SrcLis
19f70 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e  t *pSrcList = pN
19f80 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 41  C->pSrcList;.  A
19f90 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
19fa0 20 3d 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f   = pNC->pAggInfo
19fb0 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  ;..  switch( pEx
19fc0 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
19fd0 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
19fe0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
19ff0 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LUMN: {.      /*
1a000 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
1a010 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69   the column is i
1a020 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62  n one of the tab
1a030 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a  les in the FROM.
1a040 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20        ** clause 
1a050 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65  of the aggregate
1a060 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20   query */.      
1a070 69 66 28 20 70 53 72 63 4c 69 73 74 20 29 7b 0a  if( pSrcList ){.
1a080 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53          struct S
1a090 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1a0a0 65 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61  em = pSrcList->a
1a0b0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
1a0c0 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e  0; i<pSrcList->n
1a0d0 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  Src; i++, pItem+
1a0e0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74  +){.          st
1a0f0 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
1a100 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20   *pCol;.        
1a110 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61    if( pExpr->iTa
1a120 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72  ble==pItem->iCur
1a130 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  sor ){.         
1a140 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63     /* If we reac
1a150 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74  h this point, it
1a160 20 6d 65 61 6e 73 20 74 68 61 74 20 70 45 78 70   means that pExp
1a170 72 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61  r refers to a ta
1a180 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ble.            
1a190 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 20 74 68  ** that is in th
1a1a0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
1a1b0 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71   the aggregate q
1a1c0 75 65 72 79 2e 20 20 0a 20 20 20 20 20 20 20 20  uery.  .        
1a1d0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20      **.         
1a1e0 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e     ** Make an en
1a1f0 74 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  try for the colu
1a200 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e  mn in pAggInfo->
1a210 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a  aCol[] if there.
1a220 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
1a230 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20 74  s not an entry t
1a240 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20  here already..  
1a250 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
1a260 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a           int k;.
1a270 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
1a280 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f   = pAggInfo->aCo
1a290 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  l;.            f
1a2a0 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e  or(k=0; k<pAggIn
1a2b0 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b  fo->nColumn; k++
1a2c0 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  , pCol++){.     
1a2d0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f           if( pCo
1a2e0 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72  l->iTable==pExpr
1a2f0 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20  ->iTable &&.    
1a300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
1a310 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78  ol->iColumn==pEx
1a320 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pr->iColumn ){. 
1a330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
1a340 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
1a350 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1a360 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1a370 69 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f  if( (k>=pAggInfo
1a380 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20  ->nColumn).     
1a390 20 20 20 20 20 20 20 20 26 26 20 28 6b 20 3d 20          && (k = 
1a3a0 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e  addAggInfoColumn
1a3b0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67  (pParse->db, pAg
1a3c0 67 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20  gInfo))>=0 .    
1a3d0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
1a3e0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20           pCol = 
1a3f0 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b  &pAggInfo->aCol[
1a400 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k];.            
1a410 20 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70    pCol->pTab = p
1a420 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Expr->pTab;.    
1a430 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
1a440 69 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e  iTable = pExpr->
1a450 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20  iTable;.        
1a460 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c        pCol->iCol
1a470 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  umn = pExpr->iCo
1a480 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  lumn;.          
1a490 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d      pCol->iMem =
1a4a0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1a4b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1a4c0 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
1a4d0 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  mn = -1;.       
1a4e0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78         pCol->pEx
1a4f0 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  pr = pExpr;.    
1a500 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 41            if( pA
1a510 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79  ggInfo->pGroupBy
1a520 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1a530 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20      int j, n;.  
1a540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
1a550 70 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41  prList *pGB = pA
1a560 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79  ggInfo->pGroupBy
1a570 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1a580 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
1a590 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20  t_item *pTerm = 
1a5a0 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20  pGB->a;.        
1a5b0 20 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d          n = pGB-
1a5c0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >nExpr;.        
1a5d0 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
1a5e0 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d   j<n; j++, pTerm
1a5f0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
1a600 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20         Expr *pE 
1a610 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
1a620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a630 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
1a640 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69  _COLUMN && pE->i
1a650 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54  Table==pExpr->iT
1a660 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20  able &&.        
1a670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1a680 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72  ->iColumn==pExpr
1a690 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->iColumn ){.   
1a6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6b0 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
1a6c0 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20  lumn = j;.      
1a6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
1a6e0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
1a6f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1a700 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1a710 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1a720 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f           if( pCo
1a730 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
1a740 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
1a750 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
1a760 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67  terColumn = pAgg
1a770 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f  Info->nSortingCo
1a780 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20  lumn++;.        
1a790 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1a7a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1a7b0 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f    /* There is no
1a7c0 77 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70  w an entry for p
1a7d0 45 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f  Expr in pAggInfo
1a7e0 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72  ->aCol[] (either
1a7f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1a800 62 65 63 61 75 73 65 20 69 74 20 77 61 73 20 74  because it was t
1a810 68 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62  here before or b
1a820 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 20 63  ecause we just c
1a830 72 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20  reated it)..    
1a840 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65          ** Conve
1a850 72 74 20 74 68 65 20 70 45 78 70 72 20 74 6f 20  rt the pExpr to 
1a860 62 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  be a TK_AGG_COLU
1a870 4d 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20  MN referring to 
1a880 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 20  that.           
1a890 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   ** pAggInfo->aC
1a8a0 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20  ol[] entry..    
1a8b0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1a8c0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41         pExpr->pA
1a8d0 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66  ggInfo = pAggInf
1a8e0 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  o;.            p
1a8f0 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47  Expr->op = TK_AG
1a900 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20  G_COLUMN;.      
1a910 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67        pExpr->iAg
1a920 67 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20 20  g = k;.         
1a930 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1a940 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70      } /* endif p
1a950 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49  Expr->iTable==pI
1a960 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a  tem->iCursor */.
1a970 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64          } /* end
1a980 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63 4c   loop over pSrcL
1a990 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ist */.      }. 
1a9a0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1a9b0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1a9c0 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  _AGG_FUNCTION: {
1a9d0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 4e  .      /* The pN
1a9e0 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 74 65 73  C->nDepth==0 tes
1a9f0 74 20 63 61 75 73 65 73 20 61 67 67 72 65 67 61  t causes aggrega
1aa00 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20  te functions in 
1aa10 73 75 62 71 75 65 72 69 65 73 0a 20 20 20 20 20  subqueries.     
1aa20 20 2a 2a 20 74 6f 20 62 65 20 69 67 6e 6f 72 65   ** to be ignore
1aa30 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  d */.      if( p
1aa40 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 29 7b  NC->nDepth==0 ){
1aa50 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
1aa60 6b 20 74 6f 20 73 65 65 20 69 66 20 70 45 78 70  k to see if pExp
1aa70 72 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65  r is a duplicate
1aa80 20 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72   of another aggr
1aa90 65 67 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a  egate .        *
1aaa0 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  * function that 
1aab0 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
1aac0 65 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63  e pAggInfo struc
1aad0 74 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ture.        */.
1aae0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
1aaf0 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74  ggInfo_func *pIt
1ab00 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61  em = pAggInfo->a
1ab10 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f  Func;.        fo
1ab20 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  r(i=0; i<pAggInf
1ab30 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
1ab40 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
1ab50 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
1ab60 70 72 43 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d  prCompare(pItem-
1ab70 3e 70 45 78 70 72 2c 20 70 45 78 70 72 29 20 29  >pExpr, pExpr) )
1ab80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  {.            br
1ab90 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
1aba0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1abb0 20 20 20 69 66 28 20 69 3e 3d 70 41 67 67 49 6e     if( i>=pAggIn
1abc0 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20  fo->nFunc ){.   
1abd0 20 20 20 20 20 20 20 2f 2a 20 70 45 78 70 72 20         /* pExpr 
1abe0 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61  is original.  Ma
1abf0 6b 65 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69  ke a new entry i
1ac00 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  n pAggInfo->aFun
1ac10 63 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  c[].          */
1ac20 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65 6e  .          u8 en
1ac30 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e  c = ENC(pParse->
1ac40 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  db);.          i
1ac50 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e   = addAggInfoFun
1ac60 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41  c(pParse->db, pA
1ac70 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  ggInfo);.       
1ac80 20 20 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20     if( i>=0 ){. 
1ac90 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
1aca0 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46   = &pAggInfo->aF
1acb0 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  unc[i];.        
1acc0 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72      pItem->pExpr
1acd0 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20   = pExpr;.      
1ace0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65        pItem->iMe
1acf0 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  m = ++pParse->nM
1ad00 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  em;.            
1ad10 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73  pItem->pFunc = s
1ad20 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
1ad30 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20  on(pParse->db,. 
1ad40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad50 20 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e    (char*)pExpr->
1ad60 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e  token.z, pExpr->
1ad70 74 6f 6b 65 6e 2e 6e 2c 0a 20 20 20 20 20 20 20  token.n,.       
1ad80 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
1ad90 72 2d 3e 70 4c 69 73 74 20 3f 20 70 45 78 70 72  r->pList ? pExpr
1ada0 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  ->pList->nExpr :
1adb0 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20   0, enc, 0);.   
1adc0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
1add0 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44  pr->flags & EP_D
1ade0 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20  istinct ){.     
1adf0 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
1ae00 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72  iDistinct = pPar
1ae10 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
1ae20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1ae30 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
1ae40 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20  em->iDistinct = 
1ae50 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -1;.            
1ae60 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
1ae70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1ae80 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72 20 70 6f  /* Make pExpr po
1ae90 69 6e 74 20 74 6f 20 74 68 65 20 61 70 70 72 6f  int to the appro
1aea0 70 72 69 61 74 65 20 70 41 67 67 49 6e 66 6f 2d  priate pAggInfo-
1aeb0 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20  >aFunc[] entry. 
1aec0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1aed0 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20    pExpr->iAgg = 
1aee0 69 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  i;.        pExpr
1aef0 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67  ->pAggInfo = pAg
1af00 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 72  gInfo;.        r
1af10 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
1af20 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1af30 20 52 65 63 75 72 73 69 76 65 6c 79 20 77 61 6c   Recursively wal
1af40 6b 20 73 75 62 71 75 65 72 69 65 73 20 6c 6f 6f  k subqueries loo
1af50 6b 69 6e 67 20 66 6f 72 20 54 4b 5f 43 4f 4c 55  king for TK_COLU
1af60 4d 4e 20 6e 6f 64 65 73 20 74 68 61 74 20 6e 65  MN nodes that ne
1af70 65 64 0a 20 20 2a 2a 20 74 6f 20 62 65 20 63 68  ed.  ** to be ch
1af80 61 6e 67 65 64 20 74 6f 20 54 4b 5f 41 47 47 5f  anged to TK_AGG_
1af90 43 4f 4c 55 4d 4e 2e 20 20 42 75 74 20 69 6e 63  COLUMN.  But inc
1afa0 72 65 6d 65 6e 74 20 6e 44 65 70 74 68 20 73 6f  rement nDepth so
1afb0 20 74 68 61 74 0a 20 20 2a 2a 20 54 4b 5f 41 47   that.  ** TK_AG
1afc0 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73  G_FUNCTION nodes
1afd0 20 69 6e 20 73 75 62 71 75 65 72 69 65 73 20 77   in subqueries w
1afe0 69 6c 6c 20 62 65 20 75 6e 63 68 61 6e 67 65 64  ill be unchanged
1aff0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78  ..  */.  if( pEx
1b000 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  pr->pSelect ){. 
1b010 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2b 2b     pNC->nDepth++
1b020 3b 0a 20 20 20 20 77 61 6c 6b 53 65 6c 65 63 74  ;.    walkSelect
1b030 45 78 70 72 28 70 45 78 70 72 2d 3e 70 53 65 6c  Expr(pExpr->pSel
1b040 65 63 74 2c 20 61 6e 61 6c 79 7a 65 41 67 67 72  ect, analyzeAggr
1b050 65 67 61 74 65 2c 20 70 4e 43 29 3b 0a 20 20 20  egate, pNC);.   
1b060 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2d 2d 3b 0a   pNC->nDepth--;.
1b070 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1b080 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  }../*.** Analyze
1b090 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
1b0a0 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f  ssion looking fo
1b0b0 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  r aggregate func
1b0c0 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72  tions and.** for
1b0d0 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20   variables that 
1b0e0 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64 65 64  need to be added
1b0f0 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e   to the pParse->
1b100 61 41 67 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a  aAgg[] array..**
1b110 20 4d 61 6b 65 20 61 64 64 69 74 69 6f 6e 61 6c   Make additional
1b120 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65 20   entries to the 
1b130 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61  pParse->aAgg[] a
1b140 72 72 61 79 20 61 73 20 6e 65 63 65 73 73 61 72  rray as necessar
1b150 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  y..**.** This ro
1b160 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c  utine should onl
1b170 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65  y be called afte
1b180 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
1b190 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61   has been.** ana
1b1a0 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33  lyzed by sqlite3
1b1b0 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73  ExprResolveNames
1b1c0 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
1b1d0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
1b1e0 67 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e  gregates(NameCon
1b1f0 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20  text *pNC, Expr 
1b200 2a 70 45 78 70 72 29 7b 0a 20 20 77 61 6c 6b 45  *pExpr){.  walkE
1b210 78 70 72 54 72 65 65 28 70 45 78 70 72 2c 20 61  xprTree(pExpr, a
1b220 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 2c  nalyzeAggregate,
1b230 20 70 4e 43 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNC);.}../*.** 
1b240 43 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72  Call sqlite3Expr
1b250 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
1b260 73 28 29 20 66 6f 72 20 65 76 65 72 79 20 65 78  s() for every ex
1b270 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a  pression in an.*
1b280 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * expression lis
1b290 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  t.  Return the n
1b2a0 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
1b2b0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
1b2c0 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65  or is found, the
1b2d0 20 61 6e 61 6c 79 73 69 73 20 69 73 20 63 75 74   analysis is cut
1b2e0 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20   short..*/.void 
1b2f0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
1b300 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f  zeAggList(NameCo
1b310 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72  ntext *pNC, Expr
1b320 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
1b330 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
1b340 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
1b350 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
1b360 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49 74  t ){.    for(pIt
1b370 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
1b380 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
1b390 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
1b3a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1b3b0 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
1b3c0 74 65 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e  tes(pNC, pItem->
1b3d0 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
1b3e0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  }.}../*.** Alloc
1b3f0 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74  ate or deallocat
1b400 65 20 74 65 6d 70 6f 72 61 72 79 20 75 73 65 20  e temporary use 
1b410 72 65 67 69 73 74 65 72 73 20 64 75 72 69 6e 67  registers during
1b420 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e   code generation
1b430 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1b440 47 65 74 54 65 6d 70 52 65 67 28 50 61 72 73 65  GetTempReg(Parse
1b450 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74   *pParse){.  int
1b460 20 69 2c 20 72 3b 0a 20 20 69 66 28 20 70 50 61   i, r;.  if( pPa
1b470 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d 30  rse->nTempReg==0
1b480 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2b   ){.    return +
1b490 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1b4a0 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
1b4b0 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
1b4c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 20 3d 20  ; i++){.    r = 
1b4d0 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
1b4e0 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 75 73 65  [i];.    if( use
1b4f0 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70  dAsColumnCache(p
1b500 50 61 72 73 65 2c 20 72 2c 20 72 29 20 29 20 63  Parse, r, r) ) c
1b510 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 20 20 69  ontinue;.  }.  i
1b520 66 28 20 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 54  f( i>=pParse->nT
1b530 65 6d 70 52 65 67 20 29 7b 0a 20 20 20 20 72 65  empReg ){.    re
1b540 74 75 72 6e 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  turn ++pParse->n
1b550 4d 65 6d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  Mem;.  }.  while
1b560 28 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54 65 6d  ( i<pParse->nTem
1b570 70 52 65 67 2d 31 20 29 7b 0a 20 20 20 20 70 50  pReg-1 ){.    pP
1b580 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 69  arse->aTempReg[i
1b590 5d 20 3d 20 70 50 61 72 73 65 2d 3e 61 54 65 6d  ] = pParse->aTem
1b5a0 70 52 65 67 5b 69 2b 31 5d 3b 0a 20 20 7d 0a 20  pReg[i+1];.  }. 
1b5b0 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
1b5c0 67 2d 2d 3b 0a 20 20 72 65 74 75 72 6e 20 72 3b  g--;.  return r;
1b5d0 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  .}.void sqlite3R
1b5e0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 50 61  eleaseTempReg(Pa
1b5f0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1b600 20 69 52 65 67 29 7b 0a 20 20 69 66 28 20 69 52   iReg){.  if( iR
1b610 65 67 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54  eg && pParse->nT
1b620 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65  empReg<ArraySize
1b630 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65  (pParse->aTempRe
1b640 67 29 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  g) ){.    pParse
1b650 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73  ->aTempReg[pPars
1b660 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d  e->nTempReg++] =
1b670 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   iReg;.  }.}../*
1b680 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72 20  .** Allocate or 
1b690 64 65 61 6c 6c 6f 63 61 74 65 20 61 20 62 6c 6f  deallocate a blo
1b6a0 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e 73 65  ck of nReg conse
1b6b0 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72 73  cutive registers
1b6c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47  .*/.int sqlite3G
1b6d0 65 74 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73  etTempRange(Pars
1b6e0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e  e *pParse, int n
1b6f0 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e  Reg){.  int i, n
1b700 3b 0a 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  i = pParse->
1b710 69 52 61 6e 67 65 52 65 67 3b 0a 20 20 6e 20 3d  iRangeReg;.  n =
1b720 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52   pParse->nRangeR
1b730 65 67 3b 0a 20 20 69 66 28 20 6e 52 65 67 3c 3d  eg;.  if( nReg<=
1b740 6e 20 26 26 20 21 75 73 65 64 41 73 43 6f 6c 75  n && !usedAsColu
1b750 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c 20  mnCache(pParse, 
1b760 69 2c 20 69 2b 6e 2d 31 29 20 29 7b 0a 20 20 20  i, i+n-1) ){.   
1b770 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52   pParse->iRangeR
1b780 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20  eg += nReg;.    
1b790 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
1b7a0 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65 6c  g -= nReg;.  }el
1b7b0 73 65 7b 0a 20 20 20 20 69 20 3d 20 70 50 61 72  se{.    i = pPar
1b7c0 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
1b7d0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
1b7e0 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nReg;.  }.  retu
1b7f0 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  rn i;.}.void sql
1b800 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1b810 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72  ange(Parse *pPar
1b820 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e  se, int iReg, in
1b830 74 20 6e 52 65 67 29 7b 0a 20 20 69 66 28 20 6e  t nReg){.  if( n
1b840 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e  Reg>pParse->nRan
1b850 67 65 52 65 67 20 29 7b 0a 20 20 20 20 70 50 61  geReg ){.    pPa
1b860 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d  rse->nRangeReg =
1b870 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73   nReg;.    pPars
1b880 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d 20 69  e->iRangeReg = i
1b890 52 65 67 3b 0a 20 20 7d 0a 7d 0a                 Reg;.  }.}.