/ Hex Artifact Content
Login

Artifact 17f7deae5c7a7813a86295813e757219d1a25cf9:


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 38 35 20 32 30 30 38 2f 30 37 2f 30 39 20  .385 2008/07/09 
0220: 30 31 3a 33 39 3a 34 34 20 64 72 68 20 45 78 70  01:39:44 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 28 70 35 20 26 20 53  );.  if( (p5 & S
1e90: 51 4c 49 54 45 5f 41 46 46 5f 4d 41 53 4b 29 21  QLITE_AFF_MASK)!
1ea0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
1eb0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1ec0: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
1ed0: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69  Change(pParse, i
1ee0: 6e 31 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  n1, 1);.    sqli
1ef0: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
1f00: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
1f10: 65 2c 20 69 6e 32 2c 20 31 29 3b 0a 20 20 7d 0a  e, in2, 1);.  }.
1f20: 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d    return addr;.}
1f30: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
1f40: 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 2f 2a  _EXPR_DEPTH>0./*
1f50: 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 61  .** Check that a
1f60: 72 67 75 6d 65 6e 74 20 6e 48 65 69 67 68 74 20  rgument nHeight 
1f70: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
1f80: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78  equal to the max
1f90: 69 6d 75 6d 0a 2a 2a 20 65 78 70 72 65 73 73 69  imum.** expressi
1fa0: 6f 6e 20 64 65 70 74 68 20 61 6c 6c 6f 77 65 64  on depth allowed
1fb0: 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20  . If it is not, 
1fc0: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
1fd0: 65 73 73 61 67 65 20 69 6e 0a 2a 2a 20 70 50 61  essage in.** pPa
1fe0: 72 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rse..*/.static i
1ff0: 6e 74 20 63 68 65 63 6b 45 78 70 72 48 65 69 67  nt checkExprHeig
2000: 68 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ht(Parse *pParse
2010: 2c 20 69 6e 74 20 6e 48 65 69 67 68 74 29 7b 0a  , int nHeight){.
2020: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2030: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6d 78 48 65  E_OK;.  int mxHe
2040: 69 67 68 74 20 3d 20 70 50 61 72 73 65 2d 3e 64  ight = pParse->d
2050: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
2060: 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54  _LIMIT_EXPR_DEPT
2070: 48 5d 3b 0a 20 20 69 66 28 20 6e 48 65 69 67 68  H];.  if( nHeigh
2080: 74 3e 6d 78 48 65 69 67 68 74 20 29 7b 0a 20 20  t>mxHeight ){.  
2090: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
20a0: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
20b0: 20 20 22 45 78 70 72 65 73 73 69 6f 6e 20 74 72    "Expression tr
20c0: 65 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20  ee is too large 
20d0: 28 6d 61 78 69 6d 75 6d 20 64 65 70 74 68 20 25  (maximum depth %
20e0: 64 29 22 2c 20 6d 78 48 65 69 67 68 74 0a 20 20  d)", mxHeight.  
20f0: 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51    );.    rc = SQ
2100: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
2110: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2120: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
2130: 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73   three functions
2140: 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 29  , heightOfExpr()
2150: 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69  , heightOfExprLi
2160: 73 74 28 29 0a 2a 2a 20 61 6e 64 20 68 65 69 67  st().** and heig
2170: 68 74 4f 66 53 65 6c 65 63 74 28 29 2c 20 61 72  htOfSelect(), ar
2180: 65 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  e used to determ
2190: 69 6e 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  ine the maximum 
21a0: 68 65 69 67 68 74 0a 2a 2a 20 6f 66 20 61 6e 79  height.** of any
21b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
21c0: 20 72 65 66 65 72 65 6e 63 65 64 20 62 79 20 74   referenced by t
21d0: 68 65 20 73 74 72 75 63 74 75 72 65 20 70 61 73  he structure pas
21e0: 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 66 69  sed as the.** fi
21f0: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  rst argument..**
2200: 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d 61 78 69  .** If this maxi
2210: 6d 75 6d 20 68 65 69 67 68 74 20 69 73 20 67 72  mum height is gr
2220: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63  eater than the c
2230: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 70 6f 69  urrent value poi
2240: 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 70 6e  nted.** to by pn
2250: 48 65 69 67 68 74 2c 20 74 68 65 20 73 65 63 6f  Height, the seco
2260: 6e 64 20 70 61 72 61 6d 65 74 65 72 2c 20 74 68  nd parameter, th
2270: 65 6e 20 73 65 74 20 2a 70 6e 48 65 69 67 68 74  en set *pnHeight
2280: 20 74 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75   to that.** valu
2290: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
22a0: 64 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 45  d heightOfExpr(E
22b0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48  xpr *p, int *pnH
22c0: 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20  eight){.  if( p 
22d0: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 48  ){.    if( p->nH
22e0: 65 69 67 68 74 3e 2a 70 6e 48 65 69 67 68 74 20  eight>*pnHeight 
22f0: 29 7b 0a 20 20 20 20 20 20 2a 70 6e 48 65 69 67  ){.      *pnHeig
2300: 68 74 20 3d 20 70 2d 3e 6e 48 65 69 67 68 74 3b  ht = p->nHeight;
2310: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61  .    }.  }.}.sta
2320: 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f  tic void heightO
2330: 66 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69  fExprList(ExprLi
2340: 73 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65  st *p, int *pnHe
2350: 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29  ight){.  if( p )
2360: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
2370: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
2380: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
2390: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
23a0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 6e  ->a[i].pExpr, pn
23b0: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20  Height);.    }. 
23c0: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
23d0: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
23e0: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 2a  Select *p, int *
23f0: 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28  pnHeight){.  if(
2400: 20 70 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74   p ){.    height
2410: 4f 66 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65  OfExpr(p->pWhere
2420: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
2430: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
2440: 3e 70 48 61 76 69 6e 67 2c 20 70 6e 48 65 69 67  >pHaving, pnHeig
2450: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
2460: 66 45 78 70 72 28 70 2d 3e 70 4c 69 6d 69 74 2c  fExpr(p->pLimit,
2470: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
2480: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
2490: 70 4f 66 66 73 65 74 2c 20 70 6e 48 65 69 67 68  pOffset, pnHeigh
24a0: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
24b0: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69  ExprList(p->pELi
24c0: 73 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  st, pnHeight);. 
24d0: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c     heightOfExprL
24e0: 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c  ist(p->pGroupBy,
24f0: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
2500: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
2510: 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 6e  (p->pOrderBy, pn
2520: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
2530: 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e 70  ghtOfSelect(p->p
2540: 50 72 69 6f 72 2c 20 70 6e 48 65 69 67 68 74 29  Prior, pnHeight)
2550: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
2560: 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65 69  et the Expr.nHei
2570: 67 68 74 20 76 61 72 69 61 62 6c 65 20 69 6e 20  ght variable in 
2580: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70 61  the structure pa
2590: 73 73 65 64 20 61 73 20 61 6e 20 0a 2a 2a 20 61  ssed as an .** a
25a0: 72 67 75 6d 65 6e 74 2e 20 41 6e 20 65 78 70 72  rgument. An expr
25b0: 65 73 73 69 6f 6e 20 77 69 74 68 20 6e 6f 20 63  ession with no c
25c0: 68 69 6c 64 72 65 6e 2c 20 45 78 70 72 2e 70 4c  hildren, Expr.pL
25d0: 69 73 74 20 6f 72 20 0a 2a 2a 20 45 78 70 72 2e  ist or .** Expr.
25e0: 70 53 65 6c 65 63 74 20 6d 65 6d 62 65 72 20 68  pSelect member h
25f0: 61 73 20 61 20 68 65 69 67 68 74 20 6f 66 20 31  as a height of 1
2600: 2e 20 41 6e 79 20 6f 74 68 65 72 20 65 78 70 72  . Any other expr
2610: 65 73 73 69 6f 6e 0a 2a 2a 20 68 61 73 20 61 20  ession.** has a 
2620: 68 65 69 67 68 74 20 65 71 75 61 6c 20 74 6f 20  height equal to 
2630: 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67  the maximum heig
2640: 68 74 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20  ht of any other 
2650: 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 64 20 45  .** referenced E
2660: 78 70 72 20 70 6c 75 73 20 6f 6e 65 2e 0a 2a 2f  xpr plus one..*/
2670: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
2680: 72 53 65 74 48 65 69 67 68 74 28 45 78 70 72 20  rSetHeight(Expr 
2690: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67  *p){.  int nHeig
26a0: 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74  ht = 0;.  height
26b0: 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c  OfExpr(p->pLeft,
26c0: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 68 65   &nHeight);.  he
26d0: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 52  ightOfExpr(p->pR
26e0: 69 67 68 74 2c 20 26 6e 48 65 69 67 68 74 29 3b  ight, &nHeight);
26f0: 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c  .  heightOfExprL
2700: 69 73 74 28 70 2d 3e 70 4c 69 73 74 2c 20 26 6e  ist(p->pList, &n
2710: 48 65 69 67 68 74 29 3b 0a 20 20 68 65 69 67 68  Height);.  heigh
2720: 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e 70 53 65  tOfSelect(p->pSe
2730: 6c 65 63 74 2c 20 26 6e 48 65 69 67 68 74 29 3b  lect, &nHeight);
2740: 0a 20 20 70 2d 3e 6e 48 65 69 67 68 74 20 3d 20  .  p->nHeight = 
2750: 6e 48 65 69 67 68 74 20 2b 20 31 3b 0a 7d 0a 0a  nHeight + 1;.}..
2760: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78  /*.** Set the Ex
2770: 70 72 2e 6e 48 65 69 67 68 74 20 76 61 72 69 61  pr.nHeight varia
2780: 62 6c 65 20 75 73 69 6e 67 20 74 68 65 20 65 78  ble using the ex
2790: 70 72 53 65 74 48 65 69 67 68 74 28 29 20 66 75  prSetHeight() fu
27a0: 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a 20 74 68  nction. If.** th
27b0: 65 20 68 65 69 67 68 74 20 69 73 20 67 72 65 61  e height is grea
27c0: 74 65 72 20 74 68 61 6e 20 74 68 65 20 6d 61 78  ter than the max
27d0: 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 65 78 70  imum allowed exp
27e0: 72 65 73 73 69 6f 6e 20 64 65 70 74 68 2c 0a 2a  ression depth,.*
27f0: 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  * leave an error
2800: 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76   in pParse..*/.v
2810: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53  oid sqlite3ExprS
2820: 65 74 48 65 69 67 68 74 28 50 61 72 73 65 20 2a  etHeight(Parse *
2830: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 29  pParse, Expr *p)
2840: 7b 0a 20 20 65 78 70 72 53 65 74 48 65 69 67 68  {.  exprSetHeigh
2850: 74 28 70 29 3b 0a 20 20 63 68 65 63 6b 45 78 70  t(p);.  checkExp
2860: 72 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20  rHeight(pParse, 
2870: 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 7d 0a 0a  p->nHeight);.}..
2880: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
2890: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20   maximum height 
28a0: 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  of any expressio
28b0: 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65  n tree reference
28c0: 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 65 6c 65  d.** by the sele
28d0: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  ct statement pas
28e0: 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
28f0: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
2900: 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67  e3SelectExprHeig
2910: 68 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  ht(Select *p){. 
2920: 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30   int nHeight = 0
2930: 3b 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65  ;.  heightOfSele
2940: 63 74 28 70 2c 20 26 6e 48 65 69 67 68 74 29 3b  ct(p, &nHeight);
2950: 0a 20 20 72 65 74 75 72 6e 20 6e 48 65 69 67 68  .  return nHeigh
2960: 74 3b 0a 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65  t;.}.#else.  #de
2970: 66 69 6e 65 20 63 68 65 63 6b 45 78 70 72 48 65  fine checkExprHe
2980: 69 67 68 74 28 78 2c 79 29 0a 20 20 23 64 65 66  ight(x,y).  #def
2990: 69 6e 65 20 65 78 70 72 53 65 74 48 65 69 67 68  ine exprSetHeigh
29a0: 74 28 79 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53  t(y).#endif /* S
29b0: 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
29c0: 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  EPTH>0 */../*.**
29d0: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77   Construct a new
29e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
29f0: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
2a00: 69 6e 74 65 72 20 74 6f 20 69 74 2e 20 20 4d 65  inter to it.  Me
2a10: 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73  mory.** for this
2a20: 20 6e 6f 64 65 20 69 73 20 6f 62 74 61 69 6e 65   node is obtaine
2a30: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
2a40: 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63 61  alloc().  The ca
2a50: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a  lling function.*
2a60: 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  * is responsible
2a70: 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65   for making sure
2a80: 20 74 68 65 20 6e 6f 64 65 20 65 76 65 6e 74 75   the node eventu
2a90: 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e  ally gets freed.
2aa0: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
2ab0: 33 45 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33  3Expr(.  sqlite3
2ac0: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
2ad0: 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 73   /* Handle for s
2ae0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
2af0: 72 6f 28 29 20 28 6d 61 79 20 62 65 20 6e 75 6c  ro() (may be nul
2b00: 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20  l) */.  int op, 
2b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b20: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70  /* Expression op
2b30: 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  code */.  Expr *
2b40: 70 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20  pLeft,          
2b50: 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e    /* Left operan
2b60: 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69  d */.  Expr *pRi
2b70: 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ght,           /
2b80: 2a 20 52 69 67 68 74 20 6f 70 65 72 61 6e 64 20  * Right operand 
2b90: 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e  */.  const Token
2ba0: 20 2a 70 54 6f 6b 65 6e 20 20 20 20 20 2f 2a 20   *pToken     /* 
2bb0: 41 72 67 75 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a  Argument token *
2bc0: 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  /.){.  Expr *pNe
2bd0: 77 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  w;.  pNew = sqli
2be0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
2bf0: 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29  db, sizeof(Expr)
2c00: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
2c10: 20 29 7b 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20   ){.    /* When 
2c20: 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2c 20 64 65  malloc fails, de
2c30: 6c 65 74 65 20 70 4c 65 66 74 20 61 6e 64 20 70  lete pLeft and p
2c40: 52 69 67 68 74 2e 20 45 78 70 72 65 73 73 69 6f  Right. Expressio
2c50: 6e 73 20 70 61 73 73 65 64 20 74 6f 20 0a 20 20  ns passed to .  
2c60: 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69    ** this functi
2c70: 6f 6e 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62  on must always b
2c80: 65 20 61 6c 6c 6f 63 61 74 65 64 20 77 69 74 68  e allocated with
2c90: 20 73 71 6c 69 74 65 33 45 78 70 72 28 29 20 66   sqlite3Expr() f
2ca0: 6f 72 20 74 68 69 73 20 0a 20 20 20 20 2a 2a 20  or this .    ** 
2cb0: 72 65 61 73 6f 6e 2e 20 0a 20 20 20 20 2a 2f 0a  reason. .    */.
2cc0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
2cd0: 65 6c 65 74 65 28 70 4c 65 66 74 29 3b 0a 20 20  elete(pLeft);.  
2ce0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
2cf0: 65 74 65 28 70 52 69 67 68 74 29 3b 0a 20 20 20  ete(pRight);.   
2d00: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
2d10: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 6f 70 3b 0a   pNew->op = op;.
2d20: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
2d30: 70 4c 65 66 74 3b 0a 20 20 70 4e 65 77 2d 3e 70  pLeft;.  pNew->p
2d40: 52 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a  Right = pRight;.
2d50: 20 20 70 4e 65 77 2d 3e 69 41 67 67 20 3d 20 2d    pNew->iAgg = -
2d60: 31 3b 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e 2e  1;.  pNew->span.
2d70: 7a 20 3d 20 28 75 38 2a 29 22 22 3b 0a 20 20 69  z = (u8*)"";.  i
2d80: 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  f( pToken ){.   
2d90: 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d   assert( pToken-
2da0: 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 70  >dyn==0 );.    p
2db0: 4e 65 77 2d 3e 73 70 61 6e 20 3d 20 70 4e 65 77  New->span = pNew
2dc0: 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b 65  ->token = *pToke
2dd0: 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  n;.  }else if( p
2de0: 4c 65 66 74 20 29 7b 0a 20 20 20 20 69 66 28 20  Left ){.    if( 
2df0: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  pRight ){.      
2e00: 69 66 28 20 70 52 69 67 68 74 2d 3e 73 70 61 6e  if( pRight->span
2e10: 2e 64 79 6e 3d 3d 30 20 26 26 20 70 4c 65 66 74  .dyn==0 && pLeft
2e20: 2d 3e 73 70 61 6e 2e 64 79 6e 3d 3d 30 20 29 7b  ->span.dyn==0 ){
2e30: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2e40: 45 78 70 72 53 70 61 6e 28 70 4e 65 77 2c 20 26  ExprSpan(pNew, &
2e50: 70 4c 65 66 74 2d 3e 73 70 61 6e 2c 20 26 70 52  pLeft->span, &pR
2e60: 69 67 68 74 2d 3e 73 70 61 6e 29 3b 0a 20 20 20  ight->span);.   
2e70: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
2e80: 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45  Right->flags & E
2e90: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b 0a  P_ExpCollate ){.
2ea0: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c          pNew->fl
2eb0: 61 67 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c  ags |= EP_ExpCol
2ec0: 6c 61 74 65 3b 0a 20 20 20 20 20 20 20 20 70 4e  late;.        pN
2ed0: 65 77 2d 3e 70 43 6f 6c 6c 20 3d 20 70 52 69 67  ew->pColl = pRig
2ee0: 68 74 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  ht->pColl;.     
2ef0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
2f00: 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20   pLeft->flags & 
2f10: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b  EP_ExpCollate ){
2f20: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61  .      pNew->fla
2f30: 67 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c  gs |= EP_ExpColl
2f40: 61 74 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  ate;.      pNew-
2f50: 3e 70 43 6f 6c 6c 20 3d 20 70 4c 65 66 74 2d 3e  >pColl = pLeft->
2f60: 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d  pColl;.    }.  }
2f70: 0a 0a 20 20 65 78 70 72 53 65 74 48 65 69 67 68  ..  exprSetHeigh
2f80: 74 28 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72  t(pNew);.  retur
2f90: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
2fa0: 20 57 6f 72 6b 73 20 6c 69 6b 65 20 73 71 6c 69   Works like sqli
2fb0: 74 65 33 45 78 70 72 28 29 20 65 78 63 65 70 74  te3Expr() except
2fc0: 20 74 68 61 74 20 69 74 20 74 61 6b 65 73 20 61   that it takes a
2fd0: 6e 20 65 78 74 72 61 20 50 61 72 73 65 2a 0a 2a  n extra Parse*.*
2fe0: 2a 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 6e  * argument and n
2ff0: 6f 74 69 66 69 65 73 20 74 68 65 20 61 73 73 6f  otifies the asso
3000: 63 69 61 74 65 64 20 63 6f 6e 6e 65 63 74 69 6f  ciated connectio
3010: 6e 20 6f 62 6a 65 63 74 20 69 66 20 6d 61 6c 6c  n object if mall
3020: 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 45 78 70  oc fails..*/.Exp
3030: 72 20 2a 73 71 6c 69 74 65 33 50 45 78 70 72 28  r *sqlite3PExpr(
3040: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
3050: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
3060: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
3070: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
3080: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
3090: 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20  pression opcode 
30a0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74  */.  Expr *pLeft
30b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
30c0: 4c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  Left operand */.
30d0: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20    Expr *pRight, 
30e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67            /* Rig
30f0: 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  ht operand */.  
3100: 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f  const Token *pTo
3110: 6b 65 6e 20 20 20 20 20 2f 2a 20 41 72 67 75 6d  ken     /* Argum
3120: 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a  ent token */.){.
3130: 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69    Expr *p = sqli
3140: 74 65 33 45 78 70 72 28 70 50 61 72 73 65 2d 3e  te3Expr(pParse->
3150: 64 62 2c 20 6f 70 2c 20 70 4c 65 66 74 2c 20 70  db, op, pLeft, p
3160: 52 69 67 68 74 2c 20 70 54 6f 6b 65 6e 29 3b 0a  Right, pToken);.
3170: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63    if( p ){.    c
3180: 68 65 63 6b 45 78 70 72 48 65 69 67 68 74 28 70  heckExprHeight(p
3190: 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68  Parse, p->nHeigh
31a0: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
31b0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65   p;.}../*.** Whe
31c0: 6e 20 64 6f 69 6e 67 20 61 20 6e 65 73 74 65 64  n doing a nested
31d0: 20 70 61 72 73 65 2c 20 79 6f 75 20 63 61 6e 20   parse, you can 
31e0: 69 6e 63 6c 75 64 65 20 74 65 72 6d 73 20 69 6e  include terms in
31f0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a   an expression.*
3200: 2a 20 74 68 61 74 20 6c 6f 6f 6b 20 6c 69 6b 65  * that look like
3210: 20 74 68 69 73 3a 20 20 20 23 31 20 23 32 20 2e   this:   #1 #2 .
3220: 2e 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73 20  ..  These terms 
3230: 72 65 66 65 72 20 74 6f 20 72 65 67 69 73 74 65  refer to registe
3240: 72 73 0a 2a 2a 20 69 6e 20 74 68 65 20 76 69 72  rs.** in the vir
3250: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 23  tual machine.  #
3260: 4e 20 69 73 20 74 68 65 20 4e 2d 74 68 20 72 65  N is the N-th re
3270: 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  gister..**.** Th
3280: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
3290: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
32a0: 65 72 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  er to deal with 
32b0: 6f 6e 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d  on of those term
32c0: 73 2e 0a 2a 2a 20 49 74 20 69 6d 6d 65 64 69 61  s..** It immedia
32d0: 74 65 6c 79 20 67 65 6e 65 72 61 74 65 73 20 63  tely generates c
32e0: 6f 64 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65  ode to store the
32f0: 20 76 61 6c 75 65 20 69 6e 20 61 20 6d 65 6d 6f   value in a memo
3300: 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 20  ry location..** 
3310: 54 68 65 20 72 65 74 75 72 6e 73 20 61 6e 20 65  The returns an e
3320: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 77  xpression that w
3330: 69 6c 6c 20 63 6f 64 65 20 74 6f 20 65 78 74 72  ill code to extr
3340: 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 66 72  act the value fr
3350: 6f 6d 0a 2a 2a 20 74 68 61 74 20 6d 65 6d 6f 72  om.** that memor
3360: 79 20 6c 6f 63 61 74 69 6f 6e 20 61 73 20 6e 65  y location as ne
3370: 65 64 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  eded..*/.Expr *s
3380: 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 45 78  qlite3RegisterEx
3390: 70 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  pr(Parse *pParse
33a0: 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29  , Token *pToken)
33b0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
33c0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 45  arse->pVdbe;.  E
33d0: 78 70 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 50  xpr *p;.  if( pP
33e0: 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20  arse->nested==0 
33f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
3400: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3410: 6e 65 61 72 20 5c 22 25 54 5c 22 3a 20 73 79 6e  near \"%T\": syn
3420: 74 61 78 20 65 72 72 6f 72 22 2c 20 70 54 6f 6b  tax error", pTok
3430: 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  en);.    return 
3440: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
3450: 72 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c  rse, TK_NULL, 0,
3460: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66   0, 0);.  }.  if
3470: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( v==0 ) return 
3480: 30 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  0;.  p = sqlite3
3490: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
34a0: 5f 52 45 47 49 53 54 45 52 2c 20 30 2c 20 30 2c  _REGISTER, 0, 0,
34b0: 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20   pToken);.  if( 
34c0: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  p==0 ){.    retu
34d0: 72 6e 20 30 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63  rn 0;  /* Malloc
34e0: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20   failed */.  }. 
34f0: 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 61 74 6f   p->iTable = ato
3500: 69 28 28 63 68 61 72 2a 29 26 70 54 6f 6b 65 6e  i((char*)&pToken
3510: 2d 3e 7a 5b 31 5d 29 3b 0a 20 20 72 65 74 75 72  ->z[1]);.  retur
3520: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f  n p;.}../*.** Jo
3530: 69 6e 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  in two expressio
3540: 6e 73 20 75 73 69 6e 67 20 61 6e 20 41 4e 44 20  ns using an AND 
3550: 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 65 69  operator.  If ei
3560: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ther expression 
3570: 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e  is.** NULL, then
3580: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68 65   just return the
3590: 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f   other expressio
35a0: 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  n..*/.Expr *sqli
35b0: 74 65 33 45 78 70 72 41 6e 64 28 73 71 6c 69 74  te3ExprAnd(sqlit
35c0: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c  e3 *db, Expr *pL
35d0: 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68  eft, Expr *pRigh
35e0: 74 29 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d  t){.  if( pLeft=
35f0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
3600: 20 70 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65   pRight;.  }else
3610: 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29   if( pRight==0 )
3620: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65  {.    return pLe
3630: 66 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ft;.  }else{.   
3640: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
3650: 78 70 72 28 64 62 2c 20 54 4b 5f 41 4e 44 2c 20  xpr(db, TK_AND, 
3660: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30  pLeft, pRight, 0
3670: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
3680: 53 65 74 20 74 68 65 20 45 78 70 72 2e 73 70 61  Set the Expr.spa
3690: 6e 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 67  n field of the g
36a0: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
36b0: 74 6f 20 73 70 61 6e 20 61 6c 6c 0a 2a 2a 20 74  to span all.** t
36c0: 65 78 74 20 62 65 74 77 65 65 6e 20 74 68 65 20  ext between the 
36d0: 74 77 6f 20 67 69 76 65 6e 20 74 6f 6b 65 6e 73  two given tokens
36e0: 2e 20 20 42 6f 74 68 20 74 6f 6b 65 6e 73 20 6d  .  Both tokens m
36f0: 75 73 74 20 62 65 20 70 6f 69 6e 74 69 6e 67 0a  ust be pointing.
3700: 2a 2a 20 61 74 20 74 68 65 20 73 61 6d 65 20 73  ** at the same s
3710: 74 72 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tring..*/.void s
3720: 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28 45  qlite3ExprSpan(E
3730: 78 70 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65  xpr *pExpr, Toke
3740: 6e 20 2a 70 4c 65 66 74 2c 20 54 6f 6b 65 6e 20  n *pLeft, Token 
3750: 2a 70 52 69 67 68 74 29 7b 0a 20 20 61 73 73 65  *pRight){.  asse
3760: 72 74 28 20 70 52 69 67 68 74 21 3d 30 20 29 3b  rt( pRight!=0 );
3770: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74  .  assert( pLeft
3780: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 45 78  !=0 );.  if( pEx
3790: 70 72 20 26 26 20 70 52 69 67 68 74 2d 3e 7a 20  pr && pRight->z 
37a0: 26 26 20 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20  && pLeft->z ){. 
37b0: 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a     pExpr->span.z
37c0: 20 3d 20 70 4c 65 66 74 2d 3e 7a 3b 0a 20 20 20   = pLeft->z;.   
37d0: 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 20 3d   pExpr->span.n =
37e0: 20 70 52 69 67 68 74 2d 3e 6e 20 2b 20 28 70 52   pRight->n + (pR
37f0: 69 67 68 74 2d 3e 7a 20 2d 20 70 4c 65 66 74 2d  ight->z - pLeft-
3800: 3e 7a 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  >z);.  }.}../*.*
3810: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65  * Construct a ne
3820: 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  w expression nod
3830: 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e  e for a function
3840: 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a   with multiple.*
3850: 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a  * arguments..*/.
3860: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
3870: 72 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20  rFunction(Parse 
3880: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73  *pParse, ExprLis
3890: 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20  t *pList, Token 
38a0: 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72  *pToken){.  Expr
38b0: 20 2a 70 4e 65 77 3b 0a 20 20 61 73 73 65 72 74   *pNew;.  assert
38c0: 28 20 70 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e  ( pToken );.  pN
38d0: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
38e0: 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
38f0: 3e 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  >db, sizeof(Expr
3900: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
3910: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
3920: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
3930: 70 4c 69 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64  pList); /* Avoid
3940: 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20   leaking memory 
3950: 77 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  when malloc fail
3960: 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  s */.    return 
3970: 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f  0;.  }.  pNew->o
3980: 70 20 3d 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3b  p = TK_FUNCTION;
3990: 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 73 74 20 3d  .  pNew->pList =
39a0: 20 70 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74   pList;.  assert
39b0: 28 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e 3d 3d 30  ( pToken->dyn==0
39c0: 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 74 6f 6b 65   );.  pNew->toke
39d0: 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 70  n = *pToken;.  p
39e0: 4e 65 77 2d 3e 73 70 61 6e 20 3d 20 70 4e 65 77  New->span = pNew
39f0: 2d 3e 74 6f 6b 65 6e 3b 0a 0a 20 20 73 71 6c 69  ->token;..  sqli
3a00: 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74  te3ExprSetHeight
3a10: 28 70 50 61 72 73 65 2c 20 70 4e 65 77 29 3b 0a  (pParse, pNew);.
3a20: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
3a30: 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 61  ../*.** Assign a
3a40: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
3a50: 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f   to an expressio
3a60: 6e 20 74 68 61 74 20 65 6e 63 6f 64 65 73 20 61  n that encodes a
3a70: 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69 6e 20   wildcard.** in 
3a80: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c  the original SQL
3a90: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a   statement.  .**
3aa0: 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 63 6f  .** Wildcards co
3ab0: 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69  nsisting of a si
3ac0: 6e 67 6c 65 20 22 3f 22 20 61 72 65 20 61 73 73  ngle "?" are ass
3ad0: 69 67 6e 65 64 20 74 68 65 20 6e 65 78 74 20 73  igned the next s
3ae0: 65 71 75 65 6e 74 69 61 6c 0a 2a 2a 20 76 61 72  equential.** var
3af0: 69 61 62 6c 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a  iable number..**
3b00: 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66  .** Wildcards of
3b10: 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22   the form "?nnn"
3b20: 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 68   are assigned th
3b30: 65 20 6e 75 6d 62 65 72 20 22 6e 6e 6e 22 2e 20  e number "nnn". 
3b40: 20 57 65 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65   We make.** sure
3b50: 20 22 6e 6e 6e 22 20 69 73 20 6e 6f 74 20 74 6f   "nnn" is not to
3b60: 6f 20 62 65 20 74 6f 20 61 76 6f 69 64 20 61 20  o be to avoid a 
3b70: 64 65 6e 69 61 6c 20 6f 66 20 73 65 72 76 69 63  denial of servic
3b80: 65 20 61 74 74 61 63 6b 20 77 68 65 6e 0a 2a 2a  e attack when.**
3b90: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
3ba0: 6e 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20 61 6e  nt comes from an
3bb0: 20 65 78 74 65 72 6e 61 6c 20 73 6f 75 72 63 65   external source
3bc0: 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64  ..**.** Wildcard
3bd0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3a  s of the form ":
3be0: 61 61 61 22 20 6f 72 20 22 24 61 61 61 22 20 61  aaa" or "$aaa" a
3bf0: 72 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20  re assigned the 
3c00: 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61  same number.** a
3c10: 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 69  s the previous i
3c20: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 73  nstance of the s
3c30: 61 6d 65 20 77 69 6c 64 63 61 72 64 2e 20 20 4f  ame wildcard.  O
3c40: 72 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  r if this is the
3c50: 20 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e   first.** instan
3c60: 63 65 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61  ce of the wildca
3c70: 72 64 2c 20 74 68 65 20 6e 65 78 74 20 73 65 71  rd, the next seq
3c80: 75 65 6e 69 61 6c 20 76 61 72 69 61 62 6c 65 20  uenial variable 
3c90: 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73  number is.** ass
3ca0: 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  igned..*/.void s
3cb0: 71 6c 69 74 65 33 45 78 70 72 41 73 73 69 67 6e  qlite3ExprAssign
3cc0: 56 61 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20  VarNumber(Parse 
3cd0: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
3ce0: 45 78 70 72 29 7b 0a 20 20 54 6f 6b 65 6e 20 2a  Expr){.  Token *
3cf0: 70 54 6f 6b 65 6e 3b 0a 20 20 73 71 6c 69 74 65  pToken;.  sqlite
3d00: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
3d10: 64 62 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72  db;..  if( pExpr
3d20: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
3d30: 70 54 6f 6b 65 6e 20 3d 20 26 70 45 78 70 72 2d  pToken = &pExpr-
3d40: 3e 74 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74  >token;.  assert
3d50: 28 20 70 54 6f 6b 65 6e 2d 3e 6e 3e 3d 31 20 29  ( pToken->n>=1 )
3d60: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b  ;.  assert( pTok
3d70: 65 6e 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 61 73  en->z!=0 );.  as
3d80: 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b  sert( pToken->z[
3d90: 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  0]!=0 );.  if( p
3da0: 54 6f 6b 65 6e 2d 3e 6e 3d 3d 31 20 29 7b 0a 20  Token->n==1 ){. 
3db0: 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f     /* Wildcard o
3dc0: 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 22 2e 20  f the form "?". 
3dd0: 20 41 73 73 69 67 6e 20 74 68 65 20 6e 65 78 74   Assign the next
3de0: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
3df0: 20 2a 2f 0a 20 20 20 20 70 45 78 70 72 2d 3e 69   */.    pExpr->i
3e00: 54 61 62 6c 65 20 3d 20 2b 2b 70 50 61 72 73 65  Table = ++pParse
3e10: 2d 3e 6e 56 61 72 3b 0a 20 20 7d 65 6c 73 65 20  ->nVar;.  }else 
3e20: 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d  if( pToken->z[0]
3e30: 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 2f 2a 20  =='?' ){.    /* 
3e40: 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20  Wildcard of the 
3e50: 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f  form "?nnn".  Co
3e60: 6e 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61  nvert "nnn" to a
3e70: 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 0a 20 20  n integer and.  
3e80: 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20 74    ** use it as t
3e90: 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  he variable numb
3ea0: 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b  er */.    int i;
3eb0: 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62  .    pExpr->iTab
3ec0: 6c 65 20 3d 20 69 20 3d 20 61 74 6f 69 28 28 63  le = i = atoi((c
3ed0: 68 61 72 2a 29 26 70 54 6f 6b 65 6e 2d 3e 7a 5b  har*)&pToken->z[
3ee0: 31 5d 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  1]);.    testcas
3ef0: 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 74  e( i==0 );.    t
3f00: 65 73 74 63 61 73 65 28 20 69 3d 3d 31 20 29 3b  estcase( i==1 );
3f10: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69  .    testcase( i
3f20: 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ==db->aLimit[SQL
3f30: 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
3f40: 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31 20 29 3b 0a  LE_NUMBER]-1 );.
3f50: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d      testcase( i=
3f60: 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  =db->aLimit[SQLI
3f70: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
3f80: 45 5f 4e 55 4d 42 45 52 5d 20 29 3b 0a 20 20 20  E_NUMBER] );.   
3f90: 20 69 66 28 20 69 3c 31 20 7c 7c 20 69 3e 64 62   if( i<1 || i>db
3fa0: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
3fb0: 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
3fc0: 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 20 20  UMBER] ){.      
3fd0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
3fe0: 70 50 61 72 73 65 2c 20 22 76 61 72 69 61 62 6c  pParse, "variabl
3ff0: 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 62 65  e number must be
4000: 20 62 65 74 77 65 65 6e 20 3f 31 20 61 6e 64 20   between ?1 and 
4010: 3f 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ?%d",.          
4020: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
4030: 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
4040: 5f 4e 55 4d 42 45 52 5d 29 3b 0a 20 20 20 20 7d  _NUMBER]);.    }
4050: 0a 20 20 20 20 69 66 28 20 69 3e 70 50 61 72 73  .    if( i>pPars
4060: 65 2d 3e 6e 56 61 72 20 29 7b 0a 20 20 20 20 20  e->nVar ){.     
4070: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20   pParse->nVar = 
4080: 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  i;.    }.  }else
4090: 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72  {.    /* Wildcar
40a0: 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ds of the form "
40b0: 3a 61 61 61 22 20 6f 72 20 22 24 61 61 61 22 2e  :aaa" or "$aaa".
40c0: 20 20 52 65 75 73 65 20 74 68 65 20 73 61 6d 65    Reuse the same
40d0: 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a   variable.    **
40e0: 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20 70   number as the p
40f0: 72 69 6f 72 20 61 70 70 65 61 72 61 6e 63 65 20  rior appearance 
4100: 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  of the same name
4110: 2c 20 6f 72 20 69 66 20 74 68 65 20 6e 61 6d 65  , or if the name
4120: 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 65 76 65  .    ** has neve
4130: 72 20 61 70 70 65 61 72 65 64 20 62 65 66 6f 72  r appeared befor
4140: 65 2c 20 72 65 75 73 65 20 74 68 65 20 73 61 6d  e, reuse the sam
4150: 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  e variable numbe
4160: 72 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  r.    */.    int
4170: 20 69 2c 20 6e 3b 0a 20 20 20 20 6e 20 3d 20 70   i, n;.    n = p
4180: 54 6f 6b 65 6e 2d 3e 6e 3b 0a 20 20 20 20 66 6f  Token->n;.    fo
4190: 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d  r(i=0; i<pParse-
41a0: 3e 6e 56 61 72 45 78 70 72 3b 20 69 2b 2b 29 7b  >nVarExpr; i++){
41b0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 3b  .      Expr *pE;
41c0: 0a 20 20 20 20 20 20 69 66 28 20 28 70 45 20 3d  .      if( (pE =
41d0: 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78   pParse->apVarEx
41e0: 70 72 5b 69 5d 29 21 3d 30 0a 20 20 20 20 20 20  pr[i])!=0.      
41f0: 20 20 20 20 26 26 20 70 45 2d 3e 74 6f 6b 65 6e      && pE->token
4200: 2e 6e 3d 3d 6e 0a 20 20 20 20 20 20 20 20 20 20  .n==n.          
4210: 26 26 20 6d 65 6d 63 6d 70 28 70 45 2d 3e 74 6f  && memcmp(pE->to
4220: 6b 65 6e 2e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 7a  ken.z, pToken->z
4230: 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , n)==0 ){.     
4240: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
4250: 20 3d 20 70 45 2d 3e 69 54 61 62 6c 65 3b 0a 20   = pE->iTable;. 
4260: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4270: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
4280: 69 66 28 20 69 3e 3d 70 50 61 72 73 65 2d 3e 6e  if( i>=pParse->n
4290: 56 61 72 45 78 70 72 20 29 7b 0a 20 20 20 20 20  VarExpr ){.     
42a0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
42b0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b   ++pParse->nVar;
42c0: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73  .      if( pPars
42d0: 65 2d 3e 6e 56 61 72 45 78 70 72 3e 3d 70 50 61  e->nVarExpr>=pPa
42e0: 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c  rse->nVarExprAll
42f0: 6f 63 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  oc-1 ){.        
4300: 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72  pParse->nVarExpr
4310: 41 6c 6c 6f 63 20 2b 3d 20 70 50 61 72 73 65 2d  Alloc += pParse-
4320: 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 20 2b  >nVarExprAlloc +
4330: 20 31 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61   10;.        pPa
4340: 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 20 3d  rse->apVarExpr =
4350: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
4360: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
4370: 72 65 65 28 0a 20 20 20 20 20 20 20 20 20 20 20  ree(.           
4380: 20 20 20 64 62 2c 0a 20 20 20 20 20 20 20 20 20     db,.         
4390: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 70 56       pParse->apV
43a0: 61 72 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  arExpr,.        
43b0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56        pParse->nV
43c0: 61 72 45 78 70 72 41 6c 6c 6f 63 2a 73 69 7a 65  arExprAlloc*size
43d0: 6f 66 28 70 50 61 72 73 65 2d 3e 61 70 56 61 72  of(pParse->apVar
43e0: 45 78 70 72 5b 30 5d 29 0a 20 20 20 20 20 20 20  Expr[0]).       
43f0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
4400: 20 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d        if( !db->m
4410: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
4420: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
4430: 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72  Parse->apVarExpr
4440: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  !=0 );.        p
4450: 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72  Parse->apVarExpr
4460: 5b 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70  [pParse->nVarExp
4470: 72 2b 2b 5d 20 3d 20 70 45 78 70 72 3b 0a 20 20  r++] = pExpr;.  
4480: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20      }.    }.  } 
4490: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
44a0: 6e 45 72 72 20 26 26 20 70 50 61 72 73 65 2d 3e  nErr && pParse->
44b0: 6e 56 61 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  nVar>db->aLimit[
44c0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
44d0: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b  IABLE_NUMBER] ){
44e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
44f0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
4500: 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61 72 69 61  o many SQL varia
4510: 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  bles");.  }.}../
4520: 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79  *.** Recursively
4530: 20 64 65 6c 65 74 65 20 61 6e 20 65 78 70 72 65   delete an expre
4540: 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76  ssion tree..*/.v
4550: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 44  oid sqlite3ExprD
4560: 65 6c 65 74 65 28 45 78 70 72 20 2a 70 29 7b 0a  elete(Expr *p){.
4570: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
4580: 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 73 70  urn;.  if( p->sp
4590: 61 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74 65 33  an.dyn ) sqlite3
45a0: 5f 66 72 65 65 28 28 63 68 61 72 2a 29 70 2d 3e  _free((char*)p->
45b0: 73 70 61 6e 2e 7a 29 3b 0a 20 20 69 66 28 20 70  span.z);.  if( p
45c0: 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 29 20 73 71  ->token.dyn ) sq
45d0: 6c 69 74 65 33 5f 66 72 65 65 28 28 63 68 61 72  lite3_free((char
45e0: 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20  *)p->token.z);. 
45f0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
4600: 74 65 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  te(p->pLeft);.  
4610: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
4620: 65 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  e(p->pRight);.  
4630: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
4640: 65 6c 65 74 65 28 70 2d 3e 70 4c 69 73 74 29 3b  elete(p->pList);
4650: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
4660: 44 65 6c 65 74 65 28 70 2d 3e 70 53 65 6c 65 63  Delete(p->pSelec
4670: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  t);.  sqlite3_fr
4680: 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ee(p);.}../*.** 
4690: 54 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 20 66  The Expr.token f
46a0: 69 65 6c 64 20 6d 69 67 68 74 20 62 65 20 61 20  ield might be a 
46b0: 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 20 74  string literal t
46c0: 68 61 74 20 69 73 20 71 75 6f 74 65 64 2e 0a 2a  hat is quoted..*
46d0: 2a 20 49 66 20 73 6f 2c 20 72 65 6d 6f 76 65 20  * If so, remove 
46e0: 74 68 65 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61  the quotation ma
46f0: 72 6b 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  rks..*/.void sql
4700: 69 74 65 33 44 65 71 75 6f 74 65 45 78 70 72 28  ite3DequoteExpr(
4710: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
4720: 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 45 78 70  r *p){.  if( Exp
4730: 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28  rHasAnyProperty(
4740: 70 2c 20 45 50 5f 44 65 71 75 6f 74 65 64 29 20  p, EP_Dequoted) 
4750: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
4760: 20 7d 0a 20 20 45 78 70 72 53 65 74 50 72 6f 70   }.  ExprSetProp
4770: 65 72 74 79 28 70 2c 20 45 50 5f 44 65 71 75 6f  erty(p, EP_Dequo
4780: 74 65 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 74  ted);.  if( p->t
4790: 6f 6b 65 6e 2e 64 79 6e 3d 3d 30 20 29 7b 0a 20  oken.dyn==0 ){. 
47a0: 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43     sqlite3TokenC
47b0: 6f 70 79 28 64 62 2c 20 26 70 2d 3e 74 6f 6b 65  opy(db, &p->toke
47c0: 6e 2c 20 26 70 2d 3e 74 6f 6b 65 6e 29 3b 0a 20  n, &p->token);. 
47d0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75   }.  sqlite3Dequ
47e0: 6f 74 65 28 28 63 68 61 72 2a 29 70 2d 3e 74 6f  ote((char*)p->to
47f0: 6b 65 6e 2e 7a 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ken.z);.}.../*.*
4800: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
4810: 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65  group of routine
4820: 73 20 6d 61 6b 65 20 64 65 65 70 20 63 6f 70 69  s make deep copi
4830: 65 73 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  es of expression
4840: 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  s,.** expression
4850: 20 6c 69 73 74 73 2c 20 49 44 20 6c 69 73 74 73   lists, ID lists
4860: 2c 20 61 6e 64 20 73 65 6c 65 63 74 20 73 74 61  , and select sta
4870: 74 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 63 6f  tements.  The co
4880: 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64  pies can.** be d
4890: 65 6c 65 74 65 64 20 28 62 79 20 62 65 69 6e 67  eleted (by being
48a0: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 69 72   passed to their
48b0: 20 72 65 73 70 65 63 74 69 76 65 20 2e 2e 2e 44   respective ...D
48c0: 65 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65 73  elete() routines
48d0: 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65 66 66  ).** without eff
48e0: 65 63 74 69 6e 67 20 74 68 65 20 6f 72 69 67 69  ecting the origi
48f0: 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  nals..**.** The 
4900: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c  expression list,
4910: 20 49 44 2c 20 61 6e 64 20 73 6f 75 72 63 65 20   ID, and source 
4920: 6c 69 73 74 73 20 72 65 74 75 72 6e 20 62 79 20  lists return by 
4930: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
4940: 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33  up(),.** sqlite3
4950: 49 64 4c 69 73 74 44 75 70 28 29 2c 20 61 6e 64  IdListDup(), and
4960: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
4970: 75 70 28 29 20 63 61 6e 20 6e 6f 74 20 62 65 20  up() can not be 
4980: 66 75 72 74 68 65 72 20 65 78 70 61 6e 64 65 64  further expanded
4990: 20 0a 2a 2a 20 62 79 20 73 75 62 73 65 71 75 65   .** by subseque
49a0: 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  nt calls to sqli
49b0: 74 65 2a 4c 69 73 74 41 70 70 65 6e 64 28 29 20  te*ListAppend() 
49c0: 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20  routines..**.** 
49d0: 41 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74 20  Any tables that 
49e0: 74 68 65 20 53 72 63 4c 69 73 74 20 6d 69 67 68  the SrcList migh
49f0: 74 20 70 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e  t point to are n
4a00: 6f 74 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a  ot duplicated..*
4a10: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
4a20: 78 70 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a  xprDup(sqlite3 *
4a30: 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  db, Expr *p){.  
4a40: 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 66  Expr *pNew;.  if
4a50: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
4a60: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
4a70: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
4a80: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b  b, sizeof(*p) );
4a90: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
4aa0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d   return 0;.  mem
4ab0: 63 70 79 28 70 4e 65 77 2c 20 70 2c 20 73 69 7a  cpy(pNew, p, siz
4ac0: 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69  eof(*pNew));.  i
4ad0: 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 21 3d 30  f( p->token.z!=0
4ae0: 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f   ){.    pNew->to
4af0: 6b 65 6e 2e 7a 20 3d 20 28 75 38 2a 29 73 71 6c  ken.z = (u8*)sql
4b00: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
4b10: 2c 20 28 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65  , (char*)p->toke
4b20: 6e 2e 7a 2c 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 29  n.z, p->token.n)
4b30: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65  ;.    pNew->toke
4b40: 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c  n.dyn = 1;.  }el
4b50: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
4b60: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30  pNew->token.z==0
4b70: 20 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e   );.  }.  pNew->
4b80: 73 70 61 6e 2e 7a 20 3d 20 30 3b 0a 20 20 70 4e  span.z = 0;.  pN
4b90: 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69  ew->pLeft = sqli
4ba0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
4bb0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 70 4e 65 77  ->pLeft);.  pNew
4bc0: 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74  ->pRight = sqlit
4bd0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
4be0: 3e 70 52 69 67 68 74 29 3b 0a 20 20 70 4e 65 77  >pRight);.  pNew
4bf0: 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  ->pList = sqlite
4c00: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
4c10: 20 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 70 4e   p->pList);.  pN
4c20: 65 77 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  ew->pSelect = sq
4c30: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
4c40: 62 2c 20 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  b, p->pSelect);.
4c50: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
4c60: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54 6f 6b  .void sqlite3Tok
4c70: 65 6e 43 6f 70 79 28 73 71 6c 69 74 65 33 20 2a  enCopy(sqlite3 *
4c80: 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20  db, Token *pTo, 
4c90: 54 6f 6b 65 6e 20 2a 70 46 72 6f 6d 29 7b 0a 20  Token *pFrom){. 
4ca0: 20 69 66 28 20 70 54 6f 2d 3e 64 79 6e 20 29 20   if( pTo->dyn ) 
4cb0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 28 63 68  sqlite3_free((ch
4cc0: 61 72 2a 29 70 54 6f 2d 3e 7a 29 3b 0a 20 20 69  ar*)pTo->z);.  i
4cd0: 66 28 20 70 46 72 6f 6d 2d 3e 7a 20 29 7b 0a 20  f( pFrom->z ){. 
4ce0: 20 20 20 70 54 6f 2d 3e 6e 20 3d 20 70 46 72 6f     pTo->n = pFro
4cf0: 6d 2d 3e 6e 3b 0a 20 20 20 20 70 54 6f 2d 3e 7a  m->n;.    pTo->z
4d00: 20 3d 20 28 75 38 2a 29 73 71 6c 69 74 65 33 44   = (u8*)sqlite3D
4d10: 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68  bStrNDup(db, (ch
4d20: 61 72 2a 29 70 46 72 6f 6d 2d 3e 7a 2c 20 70 46  ar*)pFrom->z, pF
4d30: 72 6f 6d 2d 3e 6e 29 3b 0a 20 20 20 20 70 54 6f  rom->n);.    pTo
4d40: 2d 3e 64 79 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c  ->dyn = 1;.  }el
4d50: 73 65 7b 0a 20 20 20 20 70 54 6f 2d 3e 7a 20 3d  se{.    pTo->z =
4d60: 20 30 3b 0a 20 20 7d 0a 7d 0a 45 78 70 72 4c 69   0;.  }.}.ExprLi
4d70: 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c  st *sqlite3ExprL
4d80: 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  istDup(sqlite3 *
4d90: 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 29  db, ExprList *p)
4da0: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e  {.  ExprList *pN
4db0: 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  ew;.  struct Exp
4dc0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
4dd0: 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20 20  m, *pOldItem;.  
4de0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d  int i;.  if( p==
4df0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
4e00: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
4e10: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
4e20: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20  zeof(*pNew) );. 
4e30: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
4e40: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
4e50: 3e 69 45 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20  >iECursor = 0;. 
4e60: 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20 70   pNew->nExpr = p
4e70: 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d  New->nAlloc = p-
4e80: 3e 6e 45 78 70 72 3b 0a 20 20 70 4e 65 77 2d 3e  >nExpr;.  pNew->
4e90: 61 20 3d 20 70 49 74 65 6d 20 3d 20 73 71 6c 69  a = pItem = sqli
4ea0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
4eb0: 62 2c 20 20 70 2d 3e 6e 45 78 70 72 2a 73 69 7a  b,  p->nExpr*siz
4ec0: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a  eof(p->a[0]) );.
4ed0: 20 20 69 66 28 20 70 49 74 65 6d 3d 3d 30 20 29    if( pItem==0 )
4ee0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
4ef0: 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 72 65  ee(pNew);.    re
4f00: 74 75 72 6e 20 30 3b 0a 20 20 7d 20 0a 20 20 70  turn 0;.  } .  p
4f10: 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a  OldItem = p->a;.
4f20: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
4f30: 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
4f40: 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29  m++, pOldItem++)
4f50: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  {.    Expr *pNew
4f60: 45 78 70 72 2c 20 2a 70 4f 6c 64 45 78 70 72 3b  Expr, *pOldExpr;
4f70: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70  .    pItem->pExp
4f80: 72 20 3d 20 70 4e 65 77 45 78 70 72 20 3d 20 73  r = pNewExpr = s
4f90: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
4fa0: 2c 20 70 4f 6c 64 45 78 70 72 20 3d 20 70 4f 6c  , pOldExpr = pOl
4fb0: 64 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  dItem->pExpr);. 
4fc0: 20 20 20 69 66 28 20 70 4f 6c 64 45 78 70 72 2d     if( pOldExpr-
4fd0: 3e 73 70 61 6e 2e 7a 21 3d 30 20 26 26 20 70 4e  >span.z!=0 && pN
4fe0: 65 77 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  ewExpr ){.      
4ff0: 2f 2a 20 41 6c 77 61 79 73 20 6d 61 6b 65 20 61  /* Always make a
5000: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 70 61   copy of the spa
5010: 6e 20 66 6f 72 20 74 6f 70 2d 6c 65 76 65 6c 20  n for top-level 
5020: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
5030: 68 65 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72  he.      ** expr
5040: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 54 68  ession list.  Th
5050: 65 20 6c 6f 67 69 63 20 69 6e 20 53 45 4c 45 43  e logic in SELEC
5060: 54 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 61  T processing tha
5070: 74 20 64 65 74 65 72 6d 69 6e 65 73 0a 20 20 20  t determines.   
5080: 20 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65 73 20     ** the names 
5090: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
50a0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6e 65 65  e result set nee
50b0: 64 73 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74  ds this informat
50c0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ion */.      sql
50d0: 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 64 62  ite3TokenCopy(db
50e0: 2c 20 26 70 4e 65 77 45 78 70 72 2d 3e 73 70 61  , &pNewExpr->spa
50f0: 6e 2c 20 26 70 4f 6c 64 45 78 70 72 2d 3e 73 70  n, &pOldExpr->sp
5100: 61 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  an);.    }.    a
5110: 73 73 65 72 74 28 20 70 4e 65 77 45 78 70 72 3d  ssert( pNewExpr=
5120: 3d 30 20 7c 7c 20 70 4e 65 77 45 78 70 72 2d 3e  =0 || pNewExpr->
5130: 73 70 61 6e 2e 7a 21 3d 30 20 0a 20 20 20 20 20  span.z!=0 .     
5140: 20 20 20 20 20 20 20 7c 7c 20 70 4f 6c 64 45 78         || pOldEx
5150: 70 72 2d 3e 73 70 61 6e 2e 7a 3d 3d 30 0a 20 20  pr->span.z==0.  
5160: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 64 62 2d            || db-
5170: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
5180: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  .    pItem->zNam
5190: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
51a0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
51b0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49  ->zName);.    pI
51c0: 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d  tem->sortOrder =
51d0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f   pOldItem->sortO
51e0: 72 64 65 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d  rder;.    pItem-
51f0: 3e 69 73 41 67 67 20 3d 20 70 4f 6c 64 49 74 65  >isAgg = pOldIte
5200: 6d 2d 3e 69 73 41 67 67 3b 0a 20 20 20 20 70 49  m->isAgg;.    pI
5210: 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20  tem->done = 0;. 
5220: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
5230: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75  ;.}../*.** If cu
5240: 72 73 6f 72 73 2c 20 74 72 69 67 67 65 72 73 2c  rsors, triggers,
5250: 20 76 69 65 77 73 20 61 6e 64 20 73 75 62 71 75   views and subqu
5260: 65 72 69 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d  eries are all om
5270: 69 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68  itted from.** th
5280: 65 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f  e build, then no
5290: 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
52a0: 69 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20 65 78  ing routines, ex
52b0: 63 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c  cept for .** sql
52c0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 2c  ite3SelectDup(),
52d0: 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20   can be called. 
52e0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
52f0: 28 29 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a  () is sometimes.
5300: 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61  ** called with a
5310: 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a   NULL argument..
5320: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
5330: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
5340: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
5350: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
5360: 52 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65  R) \. || !define
5370: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
5380: 42 51 55 45 52 59 29 0a 53 72 63 4c 69 73 74 20  BQUERY).SrcList 
5390: 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44  *sqlite3SrcListD
53a0: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
53b0: 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20 53  SrcList *p){.  S
53c0: 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  rcList *pNew;.  
53d0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79  int i;.  int nBy
53e0: 74 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  te;.  if( p==0 )
53f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79   return 0;.  nBy
5400: 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20  te = sizeof(*p) 
5410: 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73  + (p->nSrc>0 ? s
5420: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a  izeof(p->a[0]) *
5430: 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30   (p->nSrc-1) : 0
5440: 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
5450: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
5460: 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  b, nByte );.  if
5470: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
5480: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53  rn 0;.  pNew->nS
5490: 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f  rc = pNew->nAllo
54a0: 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66  c = p->nSrc;.  f
54b0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72  or(i=0; i<p->nSr
54c0: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  c; i++){.    str
54d0: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
54e0: 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e   *pNewItem = &pN
54f0: 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74  ew->a[i];.    st
5500: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
5510: 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70  m *pOldItem = &p
5520: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c  ->a[i];.    Tabl
5530: 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e 65  e *pTab;.    pNe
5540: 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  wItem->zDatabase
5550: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
5560: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
5570: 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  >zDatabase);.   
5580: 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pNewItem->zName
5590: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
55a0: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
55b0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65  >zName);.    pNe
55c0: 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20  wItem->zAlias = 
55d0: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
55e0: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41  db, pOldItem->zA
55f0: 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65 77 49  lias);.    pNewI
5600: 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 3d 20  tem->jointype = 
5610: 70 4f 6c 64 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79  pOldItem->jointy
5620: 70 65 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  pe;.    pNewItem
5630: 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64  ->iCursor = pOld
5640: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
5650: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 73 50     pNewItem->isP
5660: 6f 70 75 6c 61 74 65 64 20 3d 20 70 4f 6c 64 49  opulated = pOldI
5670: 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64  tem->isPopulated
5680: 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4e 65  ;.    pTab = pNe
5690: 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f  wItem->pTab = pO
56a0: 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  ldItem->pTab;.  
56b0: 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20    if( pTab ){.  
56c0: 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b      pTab->nRef++
56d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  ;.    }.    pNew
56e0: 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20  Item->pSelect = 
56f0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
5700: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  (db, pOldItem->p
5710: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 70 4e 65  Select);.    pNe
5720: 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c  wItem->pOn = sql
5730: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
5740: 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a  pOldItem->pOn);.
5750: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55      pNewItem->pU
5760: 73 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 49 64  sing = sqlite3Id
5770: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64  ListDup(db, pOld
5780: 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20  Item->pUsing);. 
5790: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c     pNewItem->col
57a0: 55 73 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  Used = pOldItem-
57b0: 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20  >colUsed;.  }.  
57c0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49  return pNew;.}.I
57d0: 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64  dList *sqlite3Id
57e0: 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20  ListDup(sqlite3 
57f0: 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 29 7b  *db, IdList *p){
5800: 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b  .  IdList *pNew;
5810: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
5820: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
5830: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
5840: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
5850: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
5860: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
5870: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
5880: 65 77 2d 3e 6e 49 64 20 3d 20 70 4e 65 77 2d 3e  ew->nId = pNew->
5890: 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 49 64 3b  nAlloc = p->nId;
58a0: 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c  .  pNew->a = sql
58b0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
58c0: 64 62 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f  db, p->nId*sizeo
58d0: 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20  f(p->a[0]) );.  
58e0: 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20 29  if( pNew->a==0 )
58f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
5900: 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 72 65  ee(pNew);.    re
5910: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f  turn 0;.  }.  fo
5920: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b  r(i=0; i<p->nId;
5930: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
5940: 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70  t IdList_item *p
5950: 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d  NewItem = &pNew-
5960: 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63  >a[i];.    struc
5970: 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70  t IdList_item *p
5980: 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b  OldItem = &p->a[
5990: 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  i];.    pNewItem
59a0: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
59b0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
59c0: 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ldItem->zName);.
59d0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64      pNewItem->id
59e0: 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64  x = pOldItem->id
59f0: 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  x;.  }.  return 
5a00: 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a  pNew;.}.Select *
5a10: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
5a20: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65  (sqlite3 *db, Se
5a30: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 65 6c 65  lect *p){.  Sele
5a40: 63 74 20 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20  ct *pNew;.  if( 
5a50: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
5a60: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
5a70: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
5a80: 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20   sizeof(*p) );. 
5a90: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
5aa0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
5ab0: 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d  >isDistinct = p-
5ac0: 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 70  >isDistinct;.  p
5ad0: 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71  New->pEList = sq
5ae0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
5af0: 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b  (db, p->pEList);
5b00: 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20  .  pNew->pSrc = 
5b10: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75  sqlite3SrcListDu
5b20: 70 28 64 62 2c 20 70 2d 3e 70 53 72 63 29 3b 0a  p(db, p->pSrc);.
5b30: 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d    pNew->pWhere =
5b40: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
5b50: 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a  db, p->pWhere);.
5b60: 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79    pNew->pGroupBy
5b70: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
5b80: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 47 72  stDup(db, p->pGr
5b90: 6f 75 70 42 79 29 3b 0a 20 20 70 4e 65 77 2d 3e  oupBy);.  pNew->
5ba0: 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
5bb0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
5bc0: 70 48 61 76 69 6e 67 29 3b 0a 20 20 70 4e 65 77  pHaving);.  pNew
5bd0: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c  ->pOrderBy = sql
5be0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
5bf0: 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29  db, p->pOrderBy)
5c00: 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70  ;.  pNew->op = p
5c10: 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 50  ->op;.  pNew->pP
5c20: 72 69 6f 72 20 3d 20 73 71 6c 69 74 65 33 53 65  rior = sqlite3Se
5c30: 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  lectDup(db, p->p
5c40: 50 72 69 6f 72 29 3b 0a 20 20 70 4e 65 77 2d 3e  Prior);.  pNew->
5c50: 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33  pLimit = sqlite3
5c60: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
5c70: 4c 69 6d 69 74 29 3b 0a 20 20 70 4e 65 77 2d 3e  Limit);.  pNew->
5c80: 70 4f 66 66 73 65 74 20 3d 20 73 71 6c 69 74 65  pOffset = sqlite
5c90: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
5ca0: 70 4f 66 66 73 65 74 29 3b 0a 20 20 70 4e 65 77  pOffset);.  pNew
5cb0: 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->iLimit = 0;.  
5cc0: 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20  pNew->iOffset = 
5cd0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 52 65 73  0;.  pNew->isRes
5ce0: 6f 6c 76 65 64 20 3d 20 70 2d 3e 69 73 52 65 73  olved = p->isRes
5cf0: 6f 6c 76 65 64 3b 0a 20 20 70 4e 65 77 2d 3e 69  olved;.  pNew->i
5d00: 73 41 67 67 20 3d 20 70 2d 3e 69 73 41 67 67 3b  sAgg = p->isAgg;
5d10: 0a 20 20 70 4e 65 77 2d 3e 75 73 65 73 45 70 68  .  pNew->usesEph
5d20: 6d 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 64  m = 0;.  pNew->d
5d30: 69 73 61 6c 6c 6f 77 4f 72 64 65 72 42 79 20 3d  isallowOrderBy =
5d40: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67   0;.  pNew->pRig
5d50: 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 70 4e  htmost = 0;.  pN
5d60: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
5d70: 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  [0] = -1;.  pNew
5d80: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
5d90: 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  ] = -1;.  pNew->
5da0: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20  addrOpenEphm[2] 
5db0: 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70  = -1;.  return p
5dc0: 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c  New;.}.#else.Sel
5dd0: 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65  ect *sqlite3Sele
5de0: 63 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  ctDup(sqlite3 *d
5df0: 62 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  b, Select *p){. 
5e00: 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b   assert( p==0 );
5e10: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
5e20: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64  endif.../*.** Ad
5e30: 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
5e40: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e  to the end of an
5e50: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
5e60: 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a  .  If pList is.*
5e70: 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c  * initially NULL
5e80: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
5e90: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  new expression l
5ea0: 69 73 74 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74  ist..*/.ExprList
5eb0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73   *sqlite3ExprLis
5ec0: 74 41 70 70 65 6e 64 28 0a 20 20 50 61 72 73 65  tAppend(.  Parse
5ed0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
5ee0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
5ef0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
5f00: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
5f10: 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68     /* List to wh
5f20: 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d  ich to append. M
5f30: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
5f40: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
5f50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
5f60: 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70  ression to be ap
5f70: 70 65 6e 64 65 64 20 2a 2f 0a 20 20 54 6f 6b 65  pended */.  Toke
5f80: 6e 20 2a 70 4e 61 6d 65 20 20 20 20 20 20 20 20  n *pName        
5f90: 20 20 20 20 2f 2a 20 41 53 20 6b 65 79 77 6f 72      /* AS keywor
5fa0: 64 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73  d for the expres
5fb0: 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  sion */.){.  sql
5fc0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
5fd0: 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 4c 69  e->db;.  if( pLi
5fe0: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
5ff0: 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  st = sqlite3DbMa
6000: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
6010: 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20 29 3b  eof(ExprList) );
6020: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
6030: 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
6040: 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20  no_mem;.    }.  
6050: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
6060: 3e 6e 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20  >nAlloc==0 );.  
6070: 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e  }.  if( pList->n
6080: 41 6c 6c 6f 63 3c 3d 70 4c 69 73 74 2d 3e 6e 45  Alloc<=pList->nE
6090: 78 70 72 20 29 7b 0a 20 20 20 20 73 74 72 75 63  xpr ){.    struc
60a0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
60b0: 2a 61 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20  *a;.    int n = 
60c0: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20  pList->nAlloc*2 
60d0: 2b 20 34 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c  + 4;.    a = sql
60e0: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
60f0: 2c 20 70 4c 69 73 74 2d 3e 61 2c 20 6e 2a 73 69  , pList->a, n*si
6100: 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
6110: 29 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30  ));.    if( a==0
6120: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e   ){.      goto n
6130: 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  o_mem;.    }.   
6140: 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20   pList->a = a;. 
6150: 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63     pList->nAlloc
6160: 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = n;.  }.  asse
6170: 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20  rt( pList->a!=0 
6180: 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20 7c  );.  if( pExpr |
6190: 7c 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73  | pName ){.    s
61a0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
61b0: 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c  tem *pItem = &pL
61c0: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45  ist->a[pList->nE
61d0: 78 70 72 2b 2b 5d 3b 0a 20 20 20 20 6d 65 6d 73  xpr++];.    mems
61e0: 65 74 28 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a  et(pItem, 0, siz
61f0: 65 6f 66 28 2a 70 49 74 65 6d 29 29 3b 0a 20 20  eof(*pItem));.  
6200: 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
6210: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
6220: 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29  Token(db, pName)
6230: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78  ;.    pItem->pEx
6240: 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 7d 0a  pr = pExpr;.  }.
6250: 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
6260: 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20  .no_mem:     .  
6270: 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67  /* Avoid leaking
6280: 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f   memory if mallo
6290: 63 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f  c has failed. */
62a0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
62b0: 6c 65 74 65 28 70 45 78 70 72 29 3b 0a 20 20 73  lete(pExpr);.  s
62c0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
62d0: 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 72  lete(pList);.  r
62e0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
62f0: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
6300: 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20  ion list pEList 
6310: 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68  contains more th
6320: 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e  an iLimit elemen
6330: 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20  ts,.** leave an 
6340: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
6350: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64   pParse..*/.void
6360: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
6370: 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50  CheckLength(.  P
6380: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20  arse *pParse,.  
6390: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
63a0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
63b0: 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74  zObject.){.  int
63c0: 20 6d 78 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   mx = pParse->db
63d0: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
63e0: 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20  LIMIT_COLUMN];. 
63f0: 20 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73   testcase( pELis
6400: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
6410: 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74  pr==mx );.  test
6420: 63 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20  case( pEList && 
6430: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d  pEList->nExpr==m
6440: 78 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 45 4c  x+1 );.  if( pEL
6450: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
6460: 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73  Expr>mx ){.    s
6470: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
6480: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
6490: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c   columns in %s",
64a0: 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d   zObject);.  }.}
64b0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
64c0: 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65 73 73  n entire express
64d0: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  ion list..*/.voi
64e0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
64f0: 74 44 65 6c 65 74 65 28 45 78 70 72 4c 69 73 74  tDelete(ExprList
6500: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
6510: 69 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  i;.  struct Expr
6520: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
6530: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
6540: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
6550: 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30  ert( pList->a!=0
6560: 20 7c 7c 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70   || (pList->nExp
6570: 72 3d 3d 30 20 26 26 20 70 4c 69 73 74 2d 3e 6e  r==0 && pList->n
6580: 41 6c 6c 6f 63 3d 3d 30 29 20 29 3b 0a 20 20 61  Alloc==0) );.  a
6590: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
65a0: 78 70 72 3c 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c  xpr<=pList->nAll
65b0: 6f 63 20 29 3b 0a 20 20 66 6f 72 28 70 49 74 65  oc );.  for(pIte
65c0: 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b  m=pList->a, i=0;
65d0: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
65e0: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
65f0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
6600: 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 45 78  elete(pItem->pEx
6610: 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pr);.    sqlite3
6620: 5f 66 72 65 65 28 70 49 74 65 6d 2d 3e 7a 4e 61  _free(pItem->zNa
6630: 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  me);.  }.  sqlit
6640: 65 33 5f 66 72 65 65 28 70 4c 69 73 74 2d 3e 61  e3_free(pList->a
6650: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
6660: 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  e(pList);.}../*.
6670: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
6680: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 43 61 6c  ssion tree.  Cal
6690: 6c 20 78 46 75 6e 63 20 66 6f 72 20 65 61 63 68  l xFunc for each
66a0: 20 6e 6f 64 65 20 76 69 73 69 74 65 64 2e 20 20   node visited.  
66b0: 78 46 75 6e 63 0a 2a 2a 20 69 73 20 63 61 6c 6c  xFunc.** is call
66c0: 65 64 20 6f 6e 20 74 68 65 20 6e 6f 64 65 20 62  ed on the node b
66d0: 65 66 6f 72 65 20 78 46 75 6e 63 20 69 73 20 63  efore xFunc is c
66e0: 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 6f 64  alled on the nod
66f0: 65 73 20 63 68 69 6c 64 72 65 6e 2e 0a 2a 2a 0a  es children..**.
6700: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
6710: 6c 75 65 20 66 72 6f 6d 20 78 46 75 6e 63 20 64  lue from xFunc d
6720: 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65  etermines whethe
6730: 72 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b 20  r the tree walk 
6740: 63 6f 6e 74 69 6e 75 65 73 2e 0a 2a 2a 20 30 20  continues..** 0 
6750: 6d 65 61 6e 73 20 63 6f 6e 74 69 6e 75 65 20 77  means continue w
6760: 61 6c 6b 69 6e 67 20 74 68 65 20 74 72 65 65 2e  alking the tree.
6770: 20 20 31 20 6d 65 61 6e 73 20 64 6f 20 6e 6f 74    1 means do not
6780: 20 77 61 6c 6b 20 63 68 69 6c 64 72 65 6e 0a 2a   walk children.*
6790: 2a 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  * of the current
67a0: 20 6e 6f 64 65 20 62 75 74 20 63 6f 6e 74 69 6e   node but contin
67b0: 75 65 20 77 69 74 68 20 73 69 62 6c 69 6e 67 73  ue with siblings
67c0: 2e 20 20 32 20 6d 65 61 6e 73 20 61 62 61 6e 64  .  2 means aband
67d0: 6f 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 77  on.** the tree w
67e0: 61 6c 6b 20 63 6f 6d 70 6c 65 74 65 6c 79 2e 0a  alk completely..
67f0: 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
6800: 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 69 73   value from this
6810: 20 72 6f 75 74 69 6e 65 20 69 73 20 31 20 74 6f   routine is 1 to
6820: 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 74 72 65   abandon the tre
6830: 65 20 77 61 6c 6b 0a 2a 2a 20 61 6e 64 20 30 20  e walk.** and 0 
6840: 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a  to continue..**.
6850: 2a 2a 20 4e 4f 54 49 43 45 3a 20 20 54 68 69 73  ** NOTICE:  This
6860: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 2a 6e   routine does *n
6870: 6f 74 2a 20 64 65 73 63 65 6e 64 20 69 6e 74 6f  ot* descend into
6880: 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2f 0a   subqueries..*/.
6890: 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c 6b 45  static int walkE
68a0: 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74  xprList(ExprList
68b0: 20 2a 2c 20 69 6e 74 20 28 2a 29 28 76 6f 69 64   *, int (*)(void
68c0: 20 2a 2c 20 45 78 70 72 2a 29 2c 20 76 6f 69 64   *, Expr*), void
68d0: 20 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20   *);.static int 
68e0: 77 61 6c 6b 45 78 70 72 54 72 65 65 28 45 78 70  walkExprTree(Exp
68f0: 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 28 2a  r *pExpr, int (*
6900: 78 46 75 6e 63 29 28 76 6f 69 64 2a 2c 45 78 70  xFunc)(void*,Exp
6910: 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29  r*), void *pArg)
6920: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  {.  int rc;.  if
6930: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
6940: 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20 28 2a  urn 0;.  rc = (*
6950: 78 46 75 6e 63 29 28 70 41 72 67 2c 20 70 45 78  xFunc)(pArg, pEx
6960: 70 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30  pr);.  if( rc==0
6970: 20 29 7b 0a 20 20 20 20 69 66 28 20 77 61 6c 6b   ){.    if( walk
6980: 45 78 70 72 54 72 65 65 28 70 45 78 70 72 2d 3e  ExprTree(pExpr->
6990: 70 4c 65 66 74 2c 20 78 46 75 6e 63 2c 20 70 41  pLeft, xFunc, pA
69a0: 72 67 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  rg) ) return 1;.
69b0: 20 20 20 20 69 66 28 20 77 61 6c 6b 45 78 70 72      if( walkExpr
69c0: 54 72 65 65 28 70 45 78 70 72 2d 3e 70 52 69 67  Tree(pExpr->pRig
69d0: 68 74 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29  ht, xFunc, pArg)
69e0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
69f0: 20 69 66 28 20 77 61 6c 6b 45 78 70 72 4c 69 73   if( walkExprLis
6a00: 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20  t(pExpr->pList, 
6a10: 78 46 75 6e 63 2c 20 70 41 72 67 29 20 29 20 72  xFunc, pArg) ) r
6a20: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
6a30: 65 74 75 72 6e 20 72 63 3e 31 3b 0a 7d 0a 0a 2f  eturn rc>1;.}../
6a40: 2a 0a 2a 2a 20 43 61 6c 6c 20 77 61 6c 6b 45 78  *.** Call walkEx
6a50: 70 72 54 72 65 65 28 29 20 66 6f 72 20 65 76 65  prTree() for eve
6a60: 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ry expression in
6a70: 20 6c 69 73 74 20 70 2e 0a 2a 2f 0a 73 74 61 74   list p..*/.stat
6a80: 69 63 20 69 6e 74 20 77 61 6c 6b 45 78 70 72 4c  ic int walkExprL
6a90: 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 2c  ist(ExprList *p,
6aa0: 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 76 6f   int (*xFunc)(vo
6ab0: 69 64 20 2a 2c 20 45 78 70 72 2a 29 2c 20 76 6f  id *, Expr*), vo
6ac0: 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74  id *pArg){.  int
6ad0: 20 69 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70   i;.  struct Exp
6ae0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
6af0: 6d 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65  m;.  if( !p ) re
6b00: 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d  turn 0;.  for(i=
6b10: 70 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d  p->nExpr, pItem=
6b20: 70 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  p->a; i>0; i--, 
6b30: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pItem++){.    if
6b40: 28 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70  ( walkExprTree(p
6b50: 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 78 46 75  Item->pExpr, xFu
6b60: 6e 63 2c 20 70 41 72 67 29 20 29 20 72 65 74 75  nc, pArg) ) retu
6b70: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
6b80: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
6b90: 61 6c 6c 20 77 61 6c 6b 45 78 70 72 54 72 65 65  all walkExprTree
6ba0: 28 29 20 66 6f 72 20 65 76 65 72 79 20 65 78 70  () for every exp
6bb0: 72 65 73 73 69 6f 6e 20 69 6e 20 53 65 6c 65 63  ression in Selec
6bc0: 74 20 70 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69  t p, not includi
6bd0: 6e 67 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  ng.** expression
6be0: 73 20 74 68 61 74 20 61 72 65 20 70 61 72 74 20  s that are part 
6bf0: 6f 66 20 73 75 62 2d 73 65 6c 65 63 74 73 20 69  of sub-selects i
6c00: 6e 20 61 6e 79 20 46 52 4f 4d 20 63 6c 61 75 73  n any FROM claus
6c10: 65 20 6f 72 20 74 68 65 20 4c 49 4d 49 54 0a 2a  e or the LIMIT.*
6c20: 2a 20 6f 72 20 4f 46 46 53 45 54 20 65 78 70 72  * or OFFSET expr
6c30: 65 73 73 69 6f 6e 73 2e 2e 0a 2a 2f 0a 73 74 61  essions...*/.sta
6c40: 74 69 63 20 69 6e 74 20 77 61 6c 6b 53 65 6c 65  tic int walkSele
6c50: 63 74 45 78 70 72 28 53 65 6c 65 63 74 20 2a 70  ctExpr(Select *p
6c60: 2c 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 76  , int (*xFunc)(v
6c70: 6f 69 64 20 2a 2c 20 45 78 70 72 2a 29 2c 20 76  oid *, Expr*), v
6c80: 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 77 61  oid *pArg){.  wa
6c90: 6c 6b 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45  lkExprList(p->pE
6ca0: 4c 69 73 74 2c 20 78 46 75 6e 63 2c 20 70 41 72  List, xFunc, pAr
6cb0: 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72  g);.  walkExprTr
6cc0: 65 65 28 70 2d 3e 70 57 68 65 72 65 2c 20 78 46  ee(p->pWhere, xF
6cd0: 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 77 61  unc, pArg);.  wa
6ce0: 6c 6b 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47  lkExprList(p->pG
6cf0: 72 6f 75 70 42 79 2c 20 78 46 75 6e 63 2c 20 70  roupBy, xFunc, p
6d00: 41 72 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72  Arg);.  walkExpr
6d10: 54 72 65 65 28 70 2d 3e 70 48 61 76 69 6e 67 2c  Tree(p->pHaving,
6d20: 20 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20   xFunc, pArg);. 
6d30: 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 2d   walkExprList(p-
6d40: 3e 70 4f 72 64 65 72 42 79 2c 20 78 46 75 6e 63  >pOrderBy, xFunc
6d50: 2c 20 70 41 72 67 29 3b 0a 20 20 69 66 28 20 70  , pArg);.  if( p
6d60: 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
6d70: 77 61 6c 6b 53 65 6c 65 63 74 45 78 70 72 28 70  walkSelectExpr(p
6d80: 2d 3e 70 50 72 69 6f 72 2c 20 78 46 75 6e 63 2c  ->pPrior, xFunc,
6d90: 20 70 41 72 67 29 3b 0a 20 20 7d 0a 20 20 72 65   pArg);.  }.  re
6da0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn 0;.}.../*.*
6db0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
6dc0: 73 20 64 65 73 69 67 6e 65 64 20 61 73 20 61 6e  s designed as an
6dd0: 20 78 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b 45   xFunc for walkE
6de0: 78 70 72 54 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a  xprTree()..**.**
6df0: 20 70 41 72 67 20 69 73 20 72 65 61 6c 6c 79 20   pArg is really 
6e00: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
6e10: 69 6e 74 65 67 65 72 2e 20 20 49 66 20 77 65 20  integer.  If we 
6e20: 63 61 6e 20 74 65 6c 6c 20 62 79 20 6c 6f 6f 6b  can tell by look
6e30: 69 6e 67 0a 2a 2a 20 61 74 20 70 45 78 70 72 20  ing.** at pExpr 
6e40: 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73  that the express
6e50: 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ion that contain
6e60: 73 20 70 45 78 70 72 20 69 73 20 6e 6f 74 20 61  s pExpr is not a
6e70: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 65 78 70   constant.** exp
6e80: 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20 73 65  ression, then se
6e90: 74 20 2a 70 41 72 67 20 74 6f 20 30 20 61 6e 64  t *pArg to 0 and
6ea0: 20 72 65 74 75 72 6e 20 32 20 74 6f 20 61 62 61   return 2 to aba
6eb0: 6e 64 6f 6e 20 74 68 65 20 74 72 65 65 20 77 61  ndon the tree wa
6ec0: 6c 6b 2e 0a 2a 2a 20 49 66 20 70 45 78 70 72 20  lk..** If pExpr 
6ed0: 64 6f 65 73 20 64 6f 65 73 20 6e 6f 74 20 64 69  does does not di
6ee0: 73 71 75 61 6c 69 66 79 20 74 68 65 20 65 78 70  squalify the exp
6ef0: 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 62 65 69  ression from bei
6f00: 6e 67 20 61 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  ng a constant.**
6f10: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67   then do nothing
6f20: 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 77 61  ..**.** After wa
6f30: 6c 6b 69 6e 67 20 74 68 65 20 77 68 6f 6c 65 20  lking the whole 
6f40: 74 72 65 65 2c 20 69 66 20 6e 6f 20 6e 6f 64 65  tree, if no node
6f50: 73 20 61 72 65 20 66 6f 75 6e 64 20 74 68 61 74  s are found that
6f60: 20 64 69 73 71 75 61 6c 69 66 79 0a 2a 2a 20 74   disqualify.** t
6f70: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73  he expression as
6f80: 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20   constant, then 
6f90: 77 65 20 61 73 73 75 6d 65 20 74 68 65 20 77 68  we assume the wh
6fa0: 6f 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  ole expression.*
6fb0: 2a 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20  * is constant.  
6fc0: 53 65 65 20 73 71 6c 69 74 65 33 45 78 70 72 49  See sqlite3ExprI
6fd0: 73 43 6f 6e 73 74 61 6e 74 28 29 20 66 6f 72 20  sConstant() for 
6fe0: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
6ff0: 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  mation..*/.stati
7000: 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73  c int exprNodeIs
7010: 43 6f 6e 73 74 61 6e 74 28 76 6f 69 64 20 2a 70  Constant(void *p
7020: 41 72 67 2c 20 45 78 70 72 20 2a 70 45 78 70 72  Arg, Expr *pExpr
7030: 29 7b 0a 20 20 69 6e 74 20 2a 70 4e 20 3d 20 28  ){.  int *pN = (
7040: 69 6e 74 2a 29 70 41 72 67 3b 0a 0a 20 20 2f 2a  int*)pArg;..  /*
7050: 20 49 66 20 2a 70 41 72 67 20 69 73 20 33 20 74   If *pArg is 3 t
7060: 68 65 6e 20 61 6e 79 20 74 65 72 6d 20 6f 66 20  hen any term of 
7070: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
7080: 68 61 74 20 63 6f 6d 65 73 20 66 72 6f 6d 0a 20  hat comes from. 
7090: 20 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   ** the ON or US
70a0: 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61  ING clauses of a
70b0: 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c 69 66 69   join disqualifi
70c0: 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  es the expressio
70d0: 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62 65 69 6e  n.  ** from bein
70e0: 67 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 6e  g considered con
70f0: 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20  stant. */.  if( 
7100: 28 2a 70 4e 29 3d 3d 33 20 26 26 20 45 78 70 72  (*pN)==3 && Expr
7110: 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
7120: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
7130: 6e 29 20 29 7b 0a 20 20 20 20 2a 70 4e 20 3d 20  n) ){.    *pN = 
7140: 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b  0;.    return 2;
7150: 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20  .  }..  switch( 
7160: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
7170: 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66 75 6e   /* Consider fun
7180: 63 74 69 6f 6e 73 20 74 6f 20 62 65 20 63 6f 6e  ctions to be con
7190: 73 74 61 6e 74 20 69 66 20 61 6c 6c 20 74 68 65  stant if all the
71a0: 69 72 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  ir arguments are
71b0: 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 2a 2a   constant.    **
71c0: 20 61 6e 64 20 2a 70 41 72 67 3d 3d 32 20 2a 2f   and *pArg==2 */
71d0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
71e0: 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28  CTION:.      if(
71f0: 20 28 2a 70 4e 29 3d 3d 32 20 29 20 72 65 74 75   (*pN)==2 ) retu
7200: 72 6e 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 46  rn 0;.      /* F
7210: 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20  all through */. 
7220: 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20     case TK_ID:. 
7230: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
7240: 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44  N:.    case TK_D
7250: 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OT:.    case TK_
7260: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20  AGG_FUNCTION:.  
7270: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
7280: 4c 55 4d 4e 3a 0a 23 69 66 6e 64 65 66 20 53 51  LUMN:.#ifndef SQ
7290: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
72a0: 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  RY.    case TK_S
72b0: 45 4c 45 43 54 3a 0a 20 20 20 20 63 61 73 65 20  ELECT:.    case 
72c0: 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20  TK_EXISTS:.     
72d0: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
72e0: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
72f0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
7300: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
7310: 5f 45 58 49 53 54 53 20 29 3b 0a 23 65 6e 64 69  _EXISTS );.#endi
7320: 66 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  f.      testcase
7330: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
7340: 49 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ID );.      test
7350: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
7360: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
7370: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
7380: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20  xpr->op==TK_DOT 
7390: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
73a0: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
73b0: 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b  _AGG_FUNCTION );
73c0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
73d0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
73e0: 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  GG_COLUMN );.   
73f0: 20 20 20 2a 70 4e 20 3d 20 30 3b 0a 20 20 20 20     *pN = 0;.    
7400: 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20    return 2;.    
7410: 63 61 73 65 20 54 4b 5f 49 4e 3a 0a 20 20 20 20  case TK_IN:.    
7420: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65    if( pExpr->pSe
7430: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
7440: 2a 70 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  *pN = 0;.       
7450: 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 20   return 2;.     
7460: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a   }.    default:.
7470: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
7480: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c    }.}../*.** Wal
7490: 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
74a0: 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20  tree.  Return 1 
74b0: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
74c0: 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  n is constant.**
74d0: 20 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76   and 0 if it inv
74e0: 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20  olves variables 
74f0: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  or function call
7500: 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  s..**.** For the
7510: 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
7520: 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f  s function, a do
7530: 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  uble-quoted stri
7540: 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a  ng (ex: "abc").*
7550: 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
7560: 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61  a variable but a
7570: 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73   single-quoted s
7580: 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27  tring (ex: 'abc'
7590: 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61  ) is.** a consta
75a0: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
75b0: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
75c0: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74  (Expr *p){.  int
75d0: 20 69 73 43 6f 6e 73 74 20 3d 20 31 3b 0a 20 20   isConst = 1;.  
75e0: 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70 2c 20  walkExprTree(p, 
75f0: 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61  exprNodeIsConsta
7600: 6e 74 2c 20 26 69 73 43 6f 6e 73 74 29 3b 0a 20  nt, &isConst);. 
7610: 20 72 65 74 75 72 6e 20 69 73 43 6f 6e 73 74 3b   return isConst;
7620: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  .}../*.** Walk a
7630: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
7640: 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  e.  Return 1 if 
7650: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
7660: 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68  s constant.** th
7670: 61 74 20 64 6f 65 73 20 6e 6f 20 6f 72 69 67 69  at does no origi
7680: 6e 61 74 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e  nate from the ON
7690: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
76a0: 73 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20  s of a join..** 
76b0: 52 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69  Return 0 if it i
76c0: 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65  nvolves variable
76d0: 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61  s or function ca
76e0: 6c 6c 73 20 6f 72 20 74 65 72 6d 73 20 66 72 6f  lls or terms fro
76f0: 6d 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72 20 55 53  m.** an ON or US
7700: 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69  ING clause..*/.i
7710: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
7720: 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
7730: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Expr *p){.  int 
7740: 69 73 43 6f 6e 73 74 20 3d 20 33 3b 0a 20 20 77  isConst = 3;.  w
7750: 61 6c 6b 45 78 70 72 54 72 65 65 28 70 2c 20 65  alkExprTree(p, e
7760: 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  xprNodeIsConstan
7770: 74 2c 20 26 69 73 43 6f 6e 73 74 29 3b 0a 20 20  t, &isConst);.  
7780: 72 65 74 75 72 6e 20 69 73 43 6f 6e 73 74 21 3d  return isConst!=
7790: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  0;.}../*.** Walk
77a0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
77b0: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69  ree.  Return 1 i
77c0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
77d0: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
77e0: 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61  or a function ca
77f0: 6c 6c 20 77 69 74 68 20 63 6f 6e 73 74 61 6e 74  ll with constant
7800: 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74   arguments.  Ret
7810: 75 72 6e 20 61 6e 64 20 30 20 69 66 20 74 68 65  urn and 0 if the
7820: 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79 20 76 61  re.** are any va
7830: 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46  riables..**.** F
7840: 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
7850: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
7860: 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65  , a double-quote
7870: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61  d string (ex: "a
7880: 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  bc").** is consi
7890: 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65  dered a variable
78a0: 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75   but a single-qu
78b0: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
78c0: 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20   'abc') is.** a 
78d0: 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74  constant..*/.int
78e0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
78f0: 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e  nstantOrFunction
7900: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74  (Expr *p){.  int
7910: 20 69 73 43 6f 6e 73 74 20 3d 20 32 3b 0a 20 20   isConst = 2;.  
7920: 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70 2c 20  walkExprTree(p, 
7930: 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61  exprNodeIsConsta
7940: 6e 74 2c 20 26 69 73 43 6f 6e 73 74 29 3b 0a 20  nt, &isConst);. 
7950: 20 72 65 74 75 72 6e 20 69 73 43 6f 6e 73 74 21   return isConst!
7960: 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  =0;.}../*.** If 
7970: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
7980: 20 63 6f 64 65 73 20 61 20 63 6f 6e 73 74 61 6e   codes a constan
7990: 74 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 69  t integer that i
79a0: 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a  s small enough.*
79b0: 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 33 32  * to fit in a 32
79c0: 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65  -bit integer, re
79d0: 74 75 72 6e 20 31 20 61 6e 64 20 70 75 74 20 74  turn 1 and put t
79e0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
79f0: 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70  integer.** in *p
7a00: 56 61 6c 75 65 2e 20 20 49 66 20 74 68 65 20 65  Value.  If the e
7a10: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74  xpression is not
7a20: 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 69   an integer or i
7a30: 66 20 69 74 20 69 73 20 74 6f 6f 20 62 69 67 0a  f it is too big.
7a40: 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 73  ** to fit in a s
7a50: 69 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74  igned 32-bit int
7a60: 65 67 65 72 2c 20 72 65 74 75 72 6e 20 30 20 61  eger, return 0 a
7a70: 6e 64 20 6c 65 61 76 65 20 2a 70 56 61 6c 75 65  nd leave *pValue
7a80: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69   unchanged..*/.i
7a90: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
7aa0: 49 6e 74 65 67 65 72 28 45 78 70 72 20 2a 70 2c  Integer(Expr *p,
7ab0: 20 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20   int *pValue){. 
7ac0: 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 69   int rc = 0;.  i
7ad0: 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50  f( p->flags & EP
7ae0: 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20  _IntValue ){.   
7af0: 20 2a 70 56 61 6c 75 65 20 3d 20 70 2d 3e 69 54   *pValue = p->iT
7b00: 61 62 6c 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  able;.    return
7b10: 20 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68   1;.  }.  switch
7b20: 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  ( p->op ){.    c
7b30: 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20  ase TK_INTEGER: 
7b40: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
7b50: 69 74 65 33 47 65 74 49 6e 74 33 32 28 28 63 68  ite3GetInt32((ch
7b60: 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  ar*)p->token.z, 
7b70: 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62  pValue);.      b
7b80: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
7b90: 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b  case TK_UPLUS: {
7ba0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
7bb0: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
7bc0: 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75  (p->pLeft, pValu
7bd0: 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
7be0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
7bf0: 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
7c00: 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20     int v;.      
7c10: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
7c20: 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66  sInteger(p->pLef
7c30: 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20  t, &v) ){.      
7c40: 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a    *pValue = -v;.
7c50: 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
7c60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
7c70: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
7c80: 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20  efault: break;. 
7c90: 20 7d 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20   }.  if( rc ){. 
7ca0: 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 49 4e     p->op = TK_IN
7cb0: 54 45 47 45 52 3b 0a 20 20 20 20 70 2d 3e 66 6c  TEGER;.    p->fl
7cc0: 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c  ags |= EP_IntVal
7cd0: 75 65 3b 0a 20 20 20 20 70 2d 3e 69 54 61 62 6c  ue;.    p->iTabl
7ce0: 65 20 3d 20 2a 70 56 61 6c 75 65 3b 0a 20 20 7d  e = *pValue;.  }
7cf0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
7d00: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
7d10: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
7d20: 73 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d  string is a row-
7d30: 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a  id column name..
7d40: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73  */.int sqlite3Is
7d50: 52 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72  Rowid(const char
7d60: 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69   *z){.  if( sqli
7d70: 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f  te3StrICmp(z, "_
7d80: 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65  ROWID_")==0 ) re
7d90: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
7da0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
7db0: 22 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65  "ROWID")==0 ) re
7dc0: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
7dd0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
7de0: 22 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75  "OID")==0 ) retu
7df0: 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 1;.  return 0
7e00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
7e10: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63   the name of a c
7e20: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66 6f 72  olumn of the for
7e30: 6d 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20 6f  m X.Y.Z or Y.Z o
7e40: 72 20 6a 75 73 74 20 5a 2c 20 6c 6f 6f 6b 20 75  r just Z, look u
7e50: 70 0a 2a 2a 20 74 68 61 74 20 6e 61 6d 65 20 69  p.** that name i
7e60: 6e 20 74 68 65 20 73 65 74 20 6f 66 20 73 6f 75  n the set of sou
7e70: 72 63 65 20 74 61 62 6c 65 73 20 69 6e 20 70 53  rce tables in pS
7e80: 72 63 4c 69 73 74 20 61 6e 64 20 6d 61 6b 65 20  rcList and make 
7e90: 74 68 65 20 70 45 78 70 72 20 0a 2a 2a 20 65 78  the pExpr .** ex
7ea0: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 72 65  pression node re
7eb0: 66 65 72 20 62 61 63 6b 20 74 6f 20 74 68 61 74  fer back to that
7ec0: 20 73 6f 75 72 63 65 20 63 6f 6c 75 6d 6e 2e 20   source column. 
7ed0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
7ee0: 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61  hanges.** are ma
7ef0: 64 65 20 74 6f 20 70 45 78 70 72 3a 0a 2a 2a 0a  de to pExpr:.**.
7f00: 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 69 44 62  **    pExpr->iDb
7f10: 20 20 20 20 20 20 20 20 20 20 20 53 65 74 20 74             Set t
7f20: 68 65 20 69 6e 64 65 78 20 69 6e 20 64 62 2d 3e  he index in db->
7f30: 61 44 62 5b 5d 20 6f 66 20 74 68 65 20 64 61 74  aDb[] of the dat
7f40: 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a  abase holding.**
7f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f60: 20 20 20 20 20 20 20 20 20 74 68 65 20 74 61 62           the tab
7f70: 6c 65 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d  le..**    pExpr-
7f80: 3e 69 54 61 62 6c 65 20 20 20 20 20 20 20 20 53  >iTable        S
7f90: 65 74 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72  et to the cursor
7fa0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
7fb0: 74 61 62 6c 65 20 6f 62 74 61 69 6e 65 64 0a 2a  table obtained.*
7fc0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
7fd0: 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d 20 70            from p
7fe0: 53 72 63 4c 69 73 74 2e 0a 2a 2a 20 20 20 20 70  SrcList..**    p
7ff0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 20 20  Expr->iColumn   
8000: 20 20 20 20 53 65 74 20 74 6f 20 74 68 65 20 63      Set to the c
8010: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74  olumn number wit
8020: 68 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  hin the table..*
8030: 2a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20  *    pExpr->op  
8040: 20 20 20 20 20 20 20 20 20 20 53 65 74 20 74 6f            Set to
8050: 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 0a 2a 2a 20 20   TK_COLUMN..**  
8060: 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 20    pExpr->pLeft  
8070: 20 20 20 20 20 20 20 41 6e 79 20 65 78 70 72 65         Any expre
8080: 73 73 69 6f 6e 20 74 68 69 73 20 70 6f 69 6e 74  ssion this point
8090: 73 20 74 6f 20 69 73 20 64 65 6c 65 74 65 64 0a  s to is deleted.
80a0: 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69  **    pExpr->pRi
80b0: 67 68 74 20 20 20 20 20 20 20 20 41 6e 79 20 65  ght        Any e
80c0: 78 70 72 65 73 73 69 6f 6e 20 74 68 69 73 20 70  xpression this p
80d0: 6f 69 6e 74 73 20 74 6f 20 69 73 20 64 65 6c 65  oints to is dele
80e0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ted..**.** The p
80f0: 44 62 54 6f 6b 65 6e 20 69 73 20 74 68 65 20 6e  DbToken is the n
8100: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
8110: 61 73 65 20 28 74 68 65 20 22 58 22 29 2e 20 20  ase (the "X").  
8120: 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62  This value may b
8130: 65 0a 2a 2a 20 4e 55 4c 4c 20 6d 65 61 6e 69 6e  e.** NULL meanin
8140: 67 20 74 68 61 74 20 6e 61 6d 65 20 69 73 20 6f  g that name is o
8150: 66 20 74 68 65 20 66 6f 72 6d 20 59 2e 5a 20 6f  f the form Y.Z o
8160: 72 20 5a 2e 20 20 41 6e 79 20 61 76 61 69 6c 61  r Z.  Any availa
8170: 62 6c 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ble database.** 
8180: 63 61 6e 20 62 65 20 75 73 65 64 2e 20 20 54 68  can be used.  Th
8190: 65 20 70 54 61 62 6c 65 54 6f 6b 65 6e 20 69 73  e pTableToken is
81a0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
81b0: 20 74 61 62 6c 65 20 28 74 68 65 20 22 59 22 29   table (the "Y")
81c0: 2e 20 20 54 68 69 73 0a 2a 2a 20 76 61 6c 75 65  .  This.** value
81d0: 20 63 61 6e 20 62 65 20 4e 55 4c 4c 20 69 66 20   can be NULL if 
81e0: 70 44 62 54 6f 6b 65 6e 20 69 73 20 61 6c 73 6f  pDbToken is also
81f0: 20 4e 55 4c 4c 2e 20 20 49 66 20 70 54 61 62 6c   NULL.  If pTabl
8200: 65 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20 69  eToken is NULL i
8210: 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20  t.** means that 
8220: 74 68 65 20 66 6f 72 6d 20 6f 66 20 74 68 65 20  the form of the 
8230: 6e 61 6d 65 20 69 73 20 5a 20 61 6e 64 20 74 68  name is Z and th
8240: 61 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20  at columns from 
8250: 61 6e 79 20 74 61 62 6c 65 0a 2a 2a 20 63 61 6e  any table.** can
8260: 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20   be used..**.** 
8270: 49 66 20 74 68 65 20 6e 61 6d 65 20 63 61 6e 6e  If the name cann
8280: 6f 74 20 62 65 20 72 65 73 6f 6c 76 65 64 20 75  ot be resolved u
8290: 6e 61 6d 62 69 67 75 6f 75 73 6c 79 2c 20 6c 65  nambiguously, le
82a0: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
82b0: 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73  sage.** in pPars
82c0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e  e and return non
82d0: 2d 7a 65 72 6f 2e 20 20 52 65 74 75 72 6e 20 7a  -zero.  Return z
82e0: 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a  ero on success..
82f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
8300: 6f 6b 75 70 4e 61 6d 65 28 0a 20 20 50 61 72 73  okupName(.  Pars
8310: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
8320: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
8330: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
8340: 65 6e 20 2a 70 44 62 54 6f 6b 65 6e 2c 20 20 20  en *pDbToken,   
8350: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
8360: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
8370: 6e 69 6e 67 20 74 61 62 6c 65 2c 20 6f 72 20 4e  ning table, or N
8380: 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ULL */.  Token *
8390: 70 54 61 62 6c 65 54 6f 6b 65 6e 2c 20 20 2f 2a  pTableToken,  /*
83a0: 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 63   Name of table c
83b0: 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e  ontaining column
83c0: 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54  , or NULL */.  T
83d0: 6f 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e 54 6f 6b  oken *pColumnTok
83e0: 65 6e 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  en, /* Name of t
83f0: 68 65 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20 20  he column. */.  
8400: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
8410: 2c 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65  ,    /* The name
8420: 20 63 6f 6e 74 65 78 74 20 75 73 65 64 20 74 6f   context used to
8430: 20 72 65 73 6f 6c 76 65 20 74 68 65 20 6e 61 6d   resolve the nam
8440: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  e */.  Expr *pEx
8450: 70 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  pr          /* M
8460: 61 6b 65 20 74 68 69 73 20 45 58 50 52 20 6e 6f  ake this EXPR no
8470: 64 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  de point to the 
8480: 73 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e 20  selected column 
8490: 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44  */.){.  char *zD
84a0: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  b = 0;       /* 
84b0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
84c0: 62 61 73 65 2e 20 20 54 68 65 20 22 58 22 20 69  base.  The "X" i
84d0: 6e 20 58 2e 59 2e 5a 20 2a 2f 0a 20 20 63 68 61  n X.Y.Z */.  cha
84e0: 72 20 2a 7a 54 61 62 20 3d 20 30 3b 20 20 20 20  r *zTab = 0;    
84f0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
8500: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 22 59 22   table.  The "Y"
8510: 20 69 6e 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a   in X.Y.Z or Y.Z
8520: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c   */.  char *zCol
8530: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61   = 0;      /* Na
8540: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
8550: 2e 20 20 54 68 65 20 22 5a 22 20 2a 2f 0a 20 20  .  The "Z" */.  
8560: 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
8570: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
8580: 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 63  nters */.  int c
8590: 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nt = 0;         
85a0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74  /* Number of mat
85b0: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ching column nam
85c0: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 54  es */.  int cntT
85d0: 61 62 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  ab = 0;      /* 
85e0: 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69  Number of matchi
85f0: 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 2a  ng table names *
8600: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
8610: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f  = pParse->db;  /
8620: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 2a  * The database *
8630: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
8640: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20  st_item *pItem; 
8650: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 66 6f 72        /* Use for
8660: 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 53   looping over pS
8670: 72 63 4c 69 73 74 20 69 74 65 6d 73 20 2a 2f 0a  rcList items */.
8680: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
8690: 5f 69 74 65 6d 20 2a 70 4d 61 74 63 68 20 3d 20  _item *pMatch = 
86a0: 30 3b 20 20 2f 2a 20 54 68 65 20 6d 61 74 63 68  0;  /* The match
86b0: 69 6e 67 20 70 53 72 63 4c 69 73 74 20 69 74 65  ing pSrcList ite
86c0: 6d 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  m */.  NameConte
86d0: 78 74 20 2a 70 54 6f 70 4e 43 20 3d 20 70 4e 43  xt *pTopNC = pNC
86e0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  ;        /* Firs
86f0: 74 20 6e 61 6d 65 63 6f 6e 74 65 78 74 20 69 6e  t namecontext in
8700: 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 53   the list */.  S
8710: 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d  chema *pSchema =
8720: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
8730: 20 2f 2a 20 53 63 68 65 6d 61 20 6f 66 20 74 68   /* Schema of th
8740: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  e expression */.
8750: 0a 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 75  .  assert( pColu
8760: 6d 6e 54 6f 6b 65 6e 20 26 26 20 70 43 6f 6c 75  mnToken && pColu
8770: 6d 6e 54 6f 6b 65 6e 2d 3e 7a 20 29 3b 20 2f 2a  mnToken->z ); /*
8780: 20 54 68 65 20 5a 20 69 6e 20 58 2e 59 2e 5a 20   The Z in X.Y.Z 
8790: 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 20 2a  cannot be NULL *
87a0: 2f 0a 20 20 7a 44 62 20 3d 20 73 71 6c 69 74 65  /.  zDb = sqlite
87b0: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
87c0: 62 2c 20 70 44 62 54 6f 6b 65 6e 29 3b 0a 20 20  b, pDbToken);.  
87d0: 7a 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4e 61  zTab = sqlite3Na
87e0: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
87f0: 70 54 61 62 6c 65 54 6f 6b 65 6e 29 3b 0a 20 20  pTableToken);.  
8800: 7a 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61  zCol = sqlite3Na
8810: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
8820: 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 29 3b 0a 20  pColumnToken);. 
8830: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
8840: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
8850: 6f 20 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64  o lookupname_end
8860: 3b 0a 20 20 7d 0a 0a 20 20 70 45 78 70 72 2d 3e  ;.  }..  pExpr->
8870: 69 54 61 62 6c 65 20 3d 20 2d 31 3b 0a 20 20 77  iTable = -1;.  w
8880: 68 69 6c 65 28 20 70 4e 43 20 26 26 20 63 6e 74  hile( pNC && cnt
8890: 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72 4c  ==0 ){.    ExprL
88a0: 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20  ist *pEList;.   
88b0: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69   SrcList *pSrcLi
88c0: 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69  st = pNC->pSrcLi
88d0: 73 74 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 72  st;..    if( pSr
88e0: 63 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 66  cList ){.      f
88f0: 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 53  or(i=0, pItem=pS
8900: 72 63 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 53 72  rcList->a; i<pSr
8910: 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  cList->nSrc; i++
8920: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
8930: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
8940: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62  .        int iDb
8950: 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e  ;.        Column
8960: 20 2a 70 43 6f 6c 3b 0a 20 20 0a 20 20 20 20 20   *pCol;.  .     
8970: 20 20 20 70 54 61 62 20 3d 20 70 49 74 65 6d 2d     pTab = pItem-
8980: 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 61  >pTab;.        a
8990: 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
89a0: 3b 0a 20 20 20 20 20 20 20 20 69 44 62 20 3d 20  ;.        iDb = 
89b0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
89c0: 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
89d0: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20  Schema);.       
89e0: 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e   assert( pTab->n
89f0: 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  Col>0 );.       
8a00: 20 69 66 28 20 7a 54 61 62 20 29 7b 0a 20 20 20   if( zTab ){.   
8a10: 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d         if( pItem
8a20: 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20  ->zAlias ){.    
8a30: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
8a40: 61 62 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e  abName = pItem->
8a50: 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20  zAlias;.        
8a60: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
8a70: 74 72 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65 2c  trICmp(zTabName,
8a80: 20 7a 54 61 62 29 21 3d 30 20 29 20 63 6f 6e 74   zTab)!=0 ) cont
8a90: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
8aa0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
8ab0: 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d     char *zTabNam
8ac0: 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  e = pTab->zName;
8ad0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
8ae0: 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20   zTabName==0 || 
8af0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
8b00: 54 61 62 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d  TabName, zTab)!=
8b10: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
8b20: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 44            if( zD
8b30: 62 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53  b!=0 && sqlite3S
8b40: 74 72 49 43 6d 70 28 64 62 2d 3e 61 44 62 5b 69  trICmp(db->aDb[i
8b50: 44 62 5d 2e 7a 4e 61 6d 65 2c 20 7a 44 62 29 21  Db].zName, zDb)!
8b60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
8b70: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
8b80: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8b90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8ba0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d  }.        if( 0=
8bb0: 3d 28 63 6e 74 54 61 62 2b 2b 29 20 29 7b 0a 20  =(cntTab++) ){. 
8bc0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
8bd0: 69 54 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e  iTable = pItem->
8be0: 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20  iCursor;.       
8bf0: 20 20 20 70 53 63 68 65 6d 61 20 3d 20 70 54 61     pSchema = pTa
8c00: 62 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20  b->pSchema;.    
8c10: 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70        pMatch = p
8c20: 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Item;.        }.
8c30: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c          for(j=0,
8c40: 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c   pCol=pTab->aCol
8c50: 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
8c60: 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  j++, pCol++){.  
8c70: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
8c80: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d  te3StrICmp(pCol-
8c90: 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30  >zName, zCol)==0
8ca0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8cb0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
8cc0: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  l = pTab->aCol[j
8cd0: 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  ].zColl;.       
8ce0: 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70 55 73       IdList *pUs
8cf0: 69 6e 67 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ing;.           
8d00: 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20   cnt++;.        
8d10: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
8d20: 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  e = pItem->iCurs
8d30: 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  or;.            
8d40: 70 4d 61 74 63 68 20 3d 20 70 49 74 65 6d 3b 0a  pMatch = pItem;.
8d50: 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63 68              pSch
8d60: 65 6d 61 20 3d 20 70 54 61 62 2d 3e 70 53 63 68  ema = pTab->pSch
8d70: 65 6d 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ema;.           
8d80: 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 74   /* Substitute t
8d90: 68 65 20 72 6f 77 69 64 20 28 63 6f 6c 75 6d 6e  he rowid (column
8da0: 20 2d 31 29 20 66 6f 72 20 74 68 65 20 49 4e 54   -1) for the INT
8db0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
8dc0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
8dd0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
8de0: 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20   j==pTab->iPKey 
8df0: 3f 20 2d 31 20 3a 20 6a 3b 0a 20 20 20 20 20 20  ? -1 : j;.      
8e00: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66        pExpr->aff
8e10: 69 6e 69 74 79 20 3d 20 70 54 61 62 2d 3e 61 43  inity = pTab->aC
8e20: 6f 6c 5b 6a 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  ol[j].affinity;.
8e30: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
8e40: 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20  (pExpr->flags & 
8e50: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3d 3d  EP_ExpCollate)==
8e60: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
8e70: 20 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20     pExpr->pColl 
8e80: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
8e90: 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29  lSeq(db, ENC(db)
8ea0: 2c 20 7a 43 6f 6c 6c 2c 2d 31 2c 20 30 29 3b 0a  , zColl,-1, 0);.
8eb0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
8ec0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c            if( i<
8ed0: 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 2d 31  pSrcList->nSrc-1
8ee0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8ef0: 20 20 69 66 28 20 70 49 74 65 6d 5b 31 5d 2e 6a    if( pItem[1].j
8f00: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54  ointype & JT_NAT
8f10: 55 52 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  URAL ){.        
8f20: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
8f30: 69 73 20 6d 61 74 63 68 20 6f 63 63 75 72 72 65  is match occurre
8f40: 64 20 69 6e 20 74 68 65 20 6c 65 66 74 20 74 61  d in the left ta
8f50: 62 6c 65 20 6f 66 20 61 20 6e 61 74 75 72 61 6c  ble of a natural
8f60: 20 6a 6f 69 6e 2c 0a 20 20 20 20 20 20 20 20 20   join,.         
8f70: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 73         ** then s
8f80: 6b 69 70 20 74 68 65 20 72 69 67 68 74 20 74 61  kip the right ta
8f90: 62 6c 65 20 74 6f 20 61 76 6f 69 64 20 61 20 64  ble to avoid a d
8fa0: 75 70 6c 69 63 61 74 65 20 6d 61 74 63 68 20 2a  uplicate match *
8fb0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
8fc0: 20 20 70 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20    pItem++;.     
8fd0: 20 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a             i++;.
8fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65                }e
8ff0: 6c 73 65 20 69 66 28 20 28 70 55 73 69 6e 67 20  lse if( (pUsing 
9000: 3d 20 70 49 74 65 6d 5b 31 5d 2e 70 55 73 69 6e  = pItem[1].pUsin
9010: 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  g)!=0 ){.       
9020: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
9030: 68 69 73 20 6d 61 74 63 68 20 6f 63 63 75 72 73  his match occurs
9040: 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 74 68 61   on a column tha
9050: 74 20 69 73 20 69 6e 20 74 68 65 20 55 53 49 4e  t is in the USIN
9060: 47 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20  G clause.       
9070: 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61           ** of a
9080: 20 6a 6f 69 6e 2c 20 73 6b 69 70 20 74 68 65 20   join, skip the 
9090: 73 65 61 72 63 68 20 6f 66 20 74 68 65 20 72 69  search of the ri
90a0: 67 68 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65  ght table of the
90b0: 20 6a 6f 69 6e 0a 20 20 20 20 20 20 20 20 20 20   join.          
90c0: 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69        ** to avoi
90d0: 64 20 61 20 64 75 70 6c 69 63 61 74 65 20 6d 61  d a duplicate ma
90e0: 74 63 68 20 74 68 65 72 65 2e 20 2a 2f 0a 20 20  tch there. */.  
90f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
9100: 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t k;.           
9110: 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c       for(k=0; k<
9120: 70 55 73 69 6e 67 2d 3e 6e 49 64 3b 20 6b 2b 2b  pUsing->nId; k++
9130: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
9140: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
9150: 53 74 72 49 43 6d 70 28 70 55 73 69 6e 67 2d 3e  StrICmp(pUsing->
9160: 61 5b 6b 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  a[k].zName, zCol
9170: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
9180: 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
9190: 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  m++;.           
91a0: 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20           i++;.  
91b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
91d0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
91e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
91f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
9200: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
9210: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
9220: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
9230: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
9240: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
9250: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
9260: 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 68 61  .    /* If we ha
9270: 76 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 72  ve not already r
9280: 65 73 6f 6c 76 65 64 20 74 68 65 20 6e 61 6d 65  esolved the name
9290: 2c 20 74 68 65 6e 20 6d 61 79 62 65 20 0a 20 20  , then maybe .  
92a0: 20 20 2a 2a 20 69 74 20 69 73 20 61 20 6e 65 77    ** it is a new
92b0: 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 74 72 69 67  .* or old.* trig
92c0: 67 65 72 20 61 72 67 75 6d 65 6e 74 20 72 65 66  ger argument ref
92d0: 65 72 65 6e 63 65 0a 20 20 20 20 2a 2f 0a 20 20  erence.    */.  
92e0: 20 20 69 66 28 20 7a 44 62 3d 3d 30 20 26 26 20    if( zDb==0 && 
92f0: 7a 54 61 62 21 3d 30 20 26 26 20 63 6e 74 3d 3d  zTab!=0 && cnt==
9300: 30 20 26 26 20 70 50 61 72 73 65 2d 3e 74 72 69  0 && pParse->tri
9310: 67 53 74 61 63 6b 21 3d 30 20 29 7b 0a 20 20 20  gStack!=0 ){.   
9320: 20 20 20 54 72 69 67 67 65 72 53 74 61 63 6b 20     TriggerStack 
9330: 2a 70 54 72 69 67 67 65 72 53 74 61 63 6b 20 3d  *pTriggerStack =
9340: 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61   pParse->trigSta
9350: 63 6b 3b 0a 20 20 20 20 20 20 54 61 62 6c 65 20  ck;.      Table 
9360: 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20  *pTab = 0;.     
9370: 20 75 33 32 20 2a 70 69 43 6f 6c 4d 61 73 6b 3b   u32 *piColMask;
9380: 0a 20 20 20 20 20 20 69 66 28 20 70 54 72 69 67  .      if( pTrig
9390: 67 65 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64 78  gerStack->newIdx
93a0: 20 21 3d 20 2d 31 20 26 26 20 73 71 6c 69 74 65   != -1 && sqlite
93b0: 33 53 74 72 49 43 6d 70 28 22 6e 65 77 22 2c 20  3StrICmp("new", 
93c0: 7a 54 61 62 29 20 3d 3d 20 30 20 29 7b 0a 20 20  zTab) == 0 ){.  
93d0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
93e0: 62 6c 65 20 3d 20 70 54 72 69 67 67 65 72 53 74  ble = pTriggerSt
93f0: 61 63 6b 2d 3e 6e 65 77 49 64 78 3b 0a 20 20 20  ack->newIdx;.   
9400: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72       assert( pTr
9410: 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62  iggerStack->pTab
9420: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62   );.        pTab
9430: 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63 6b   = pTriggerStack
9440: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
9450: 70 69 43 6f 6c 4d 61 73 6b 20 3d 20 26 28 70 54  piColMask = &(pT
9460: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6e 65 77  riggerStack->new
9470: 43 6f 6c 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20  ColMask);.      
9480: 7d 65 6c 73 65 20 69 66 28 20 70 54 72 69 67 67  }else if( pTrigg
9490: 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 49 64 78 20  erStack->oldIdx 
94a0: 21 3d 20 2d 31 20 26 26 20 73 71 6c 69 74 65 33  != -1 && sqlite3
94b0: 53 74 72 49 43 6d 70 28 22 6f 6c 64 22 2c 20 7a  StrICmp("old", z
94c0: 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Tab)==0 ){.     
94d0: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
94e0: 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63 6b   = pTriggerStack
94f0: 2d 3e 6f 6c 64 49 64 78 3b 0a 20 20 20 20 20 20  ->oldIdx;.      
9500: 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67    assert( pTrigg
9510: 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 20 29 3b  erStack->pTab );
9520: 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20  .        pTab = 
9530: 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70  pTriggerStack->p
9540: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 70 69 43  Tab;.        piC
9550: 6f 6c 4d 61 73 6b 20 3d 20 26 28 70 54 72 69 67  olMask = &(pTrig
9560: 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 43 6f 6c  gerStack->oldCol
9570: 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  Mask);.      }..
9580: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 20 29        if( pTab )
9590: 7b 20 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  { .        int i
95a0: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c  Col;.        Col
95b0: 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 70 54 61 62  umn *pCol = pTab
95c0: 2d 3e 61 43 6f 6c 3b 0a 0a 20 20 20 20 20 20 20  ->aCol;..       
95d0: 20 70 53 63 68 65 6d 61 20 3d 20 70 54 61 62 2d   pSchema = pTab-
95e0: 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20  >pSchema;.      
95f0: 20 20 63 6e 74 54 61 62 2b 2b 3b 0a 20 20 20 20    cntTab++;.    
9600: 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
9610: 69 43 6f 6c 20 3c 20 70 54 61 62 2d 3e 6e 43 6f  iCol < pTab->nCo
9620: 6c 3b 20 69 43 6f 6c 2b 2b 2c 20 70 43 6f 6c 2b  l; iCol++, pCol+
9630: 2b 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69  +) {.          i
9640: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
9650: 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a  p(pCol->zName, z
9660: 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Col)==0 ){.     
9670: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
9680: 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d  r *zColl = pTab-
9690: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 43 6f 6c  >aCol[iCol].zCol
96a0: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  l;.            c
96b0: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt++;.          
96c0: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
96d0: 20 3d 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69   = iCol==pTab->i
96e0: 50 4b 65 79 20 3f 20 2d 31 20 3a 20 69 43 6f 6c  PKey ? -1 : iCol
96f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
9700: 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  xpr->affinity = 
9710: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
9720: 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20  .affinity;.     
9730: 20 20 20 20 20 20 20 69 66 28 20 28 70 45 78 70         if( (pExp
9740: 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78  r->flags & EP_Ex
9750: 70 43 6f 6c 6c 61 74 65 29 3d 3d 30 20 29 7b 0a  pCollate)==0 ){.
9760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
9770: 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c  xpr->pColl = sql
9780: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
9790: 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f  db, ENC(db), zCo
97a0: 6c 6c 2c 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20  ll,-1, 0);.     
97b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
97c0: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62       pExpr->pTab
97d0: 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20   = pTab;.       
97e0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30       if( iCol>=0
97f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
9800: 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
9810: 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20  ==31 );.        
9820: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
9830: 69 43 6f 6c 3d 3d 33 32 20 29 3b 0a 20 20 20 20  iCol==32 );.    
9840: 20 20 20 20 20 20 20 20 20 20 2a 70 69 43 6f 6c            *piCol
9850: 4d 61 73 6b 20 7c 3d 20 28 28 75 33 32 29 31 3c  Mask |= ((u32)1<
9860: 3c 69 43 6f 6c 29 20 7c 20 28 69 43 6f 6c 3e 3d  <iCol) | (iCol>=
9870: 33 32 3f 30 78 66 66 66 66 66 66 66 66 3a 30 29  32?0xffffffff:0)
9880: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
9890: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
98a0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
98b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
98c0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
98d0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
98e0: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 2a  _OMIT_TRIGGER) *
98f0: 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  /..    /*.    **
9900: 20 50 65 72 68 61 70 73 20 74 68 65 20 6e 61 6d   Perhaps the nam
9910: 65 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  e is a reference
9920: 20 74 6f 20 74 68 65 20 52 4f 57 49 44 0a 20 20   to the ROWID.  
9930: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e 74    */.    if( cnt
9940: 3d 3d 30 20 26 26 20 63 6e 74 54 61 62 3d 3d 31  ==0 && cntTab==1
9950: 20 26 26 20 73 71 6c 69 74 65 33 49 73 52 6f 77   && sqlite3IsRow
9960: 69 64 28 7a 43 6f 6c 29 20 29 7b 0a 20 20 20 20  id(zCol) ){.    
9970: 20 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20    cnt = 1;.     
9980: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
9990: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 45 78 70  = -1;.      pExp
99a0: 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51  r->affinity = SQ
99b0: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
99c0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
99d0: 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 69 6e      ** If the in
99e0: 70 75 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f  put is of the fo
99f0: 72 6d 20 5a 20 28 6e 6f 74 20 59 2e 5a 20 6f 72  rm Z (not Y.Z or
9a00: 20 58 2e 59 2e 5a 29 20 74 68 65 6e 20 74 68 65   X.Y.Z) then the
9a10: 20 6e 61 6d 65 20 5a 0a 20 20 20 20 2a 2a 20 6d   name Z.    ** m
9a20: 69 67 68 74 20 72 65 66 65 72 20 74 6f 20 61 6e  ight refer to an
9a30: 20 72 65 73 75 6c 74 2d 73 65 74 20 61 6c 69 61   result-set alia
9a40: 73 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e 73  s.  This happens
9a50: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77  , for example, w
9a60: 68 65 6e 0a 20 20 20 20 2a 2a 20 77 65 20 61 72  hen.    ** we ar
9a70: 65 20 72 65 73 6f 6c 76 69 6e 67 20 6e 61 6d 65  e resolving name
9a80: 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
9a90: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 6c  lause of the fol
9aa0: 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 3a 0a  lowing command:.
9ab0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
9ac0: 20 20 53 45 4c 45 43 54 20 61 2b 62 20 41 53 20    SELECT a+b AS 
9ad0: 78 20 46 52 4f 4d 20 74 61 62 6c 65 20 57 48 45  x FROM table WHE
9ae0: 52 45 20 78 3c 31 30 3b 0a 20 20 20 20 2a 2a 0a  RE x<10;.    **.
9af0: 20 20 20 20 2a 2a 20 49 6e 20 63 61 73 65 73 20      ** In cases 
9b00: 6c 69 6b 65 20 74 68 69 73 2c 20 72 65 70 6c 61  like this, repla
9b10: 63 65 20 70 45 78 70 72 20 77 69 74 68 20 61 20  ce pExpr with a 
9b20: 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70 72  copy of the expr
9b30: 65 73 73 69 6f 6e 20 74 68 61 74 0a 20 20 20 20  ession that.    
9b40: 2a 2a 20 66 6f 72 6d 73 20 74 68 65 20 72 65 73  ** forms the res
9b50: 75 6c 74 20 73 65 74 20 65 6e 74 72 79 20 28 22  ult set entry ("
9b60: 61 2b 62 22 20 69 6e 20 74 68 65 20 65 78 61 6d  a+b" in the exam
9b70: 70 6c 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20  ple) and return 
9b80: 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20  immediately..   
9b90: 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
9ba0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  e expression in 
9bb0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 73  the result set s
9bc0: 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61  hould have alrea
9bd0: 64 79 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 72  dy been.    ** r
9be0: 65 73 6f 6c 76 65 64 20 62 79 20 74 68 65 20 74  esolved by the t
9bf0: 69 6d 65 20 74 68 65 20 57 48 45 52 45 20 63 6c  ime the WHERE cl
9c00: 61 75 73 65 20 69 73 20 72 65 73 6f 6c 76 65 64  ause is resolved
9c10: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
9c20: 20 63 6e 74 3d 3d 30 20 26 26 20 28 70 45 4c 69   cnt==0 && (pELi
9c30: 73 74 20 3d 20 70 4e 43 2d 3e 70 45 4c 69 73 74  st = pNC->pEList
9c40: 29 21 3d 30 20 26 26 20 7a 54 61 62 3d 3d 30 20  )!=0 && zTab==0 
9c50: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  ){.      for(j=0
9c60: 3b 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; j<pEList->nExp
9c70: 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; j++){.       
9c80: 20 63 68 61 72 20 2a 7a 41 73 20 3d 20 70 45 4c   char *zAs = pEL
9c90: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ist->a[j].zName;
9ca0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 41 73  .        if( zAs
9cb0: 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74  !=0 && sqlite3St
9cc0: 72 49 43 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c 29  rICmp(zAs, zCol)
9cd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
9ce0: 20 45 78 70 72 20 2a 70 44 75 70 2c 20 2a 70 4f   Expr *pDup, *pO
9cf0: 72 69 67 3b 0a 20 20 20 20 20 20 20 20 20 20 61  rig;.          a
9d00: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
9d10: 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d  eft==0 && pExpr-
9d20: 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
9d30: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9d40: 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20  pExpr->pList==0 
9d50: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
9d60: 65 72 74 28 20 70 45 78 70 72 2d 3e 70 53 65 6c  ert( pExpr->pSel
9d70: 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ect==0 );.      
9d80: 20 20 20 20 70 4f 72 69 67 20 3d 20 70 45 4c 69      pOrig = pELi
9d90: 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 3b 0a  st->a[j].pExpr;.
9da0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
9db0: 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 26 26 20  NC->allowAgg && 
9dc0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9dd0: 70 4f 72 69 67 2c 20 45 50 5f 41 67 67 29 20 29  pOrig, EP_Agg) )
9de0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
9df0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
9e00: 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66  arse, "misuse of
9e10: 20 61 6c 69 61 73 65 64 20 61 67 67 72 65 67 61   aliased aggrega
9e20: 74 65 20 25 73 22 2c 20 7a 41 73 29 3b 0a 20 20  te %s", zAs);.  
9e30: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
9e40: 33 5f 66 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20  3_free(zCol);.  
9e50: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
9e60: 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   2;.          }.
9e70: 20 20 20 20 20 20 20 20 20 20 70 44 75 70 20 3d            pDup =
9e80: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
9e90: 64 62 2c 20 70 4f 72 69 67 29 3b 0a 20 20 20 20  db, pOrig);.    
9ea0: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
9eb0: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
9ec0: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20  ollate ){.      
9ed0: 20 20 20 20 20 20 70 44 75 70 2d 3e 70 43 6f 6c        pDup->pCol
9ee0: 6c 20 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c  l = pExpr->pColl
9ef0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 44  ;.            pD
9f00: 75 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  up->flags |= EP_
9f10: 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20  ExpCollate;.    
9f20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9f30: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 73 70 61    if( pExpr->spa
9f40: 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74 65 33 5f  n.dyn ) sqlite3_
9f50: 66 72 65 65 28 28 63 68 61 72 2a 29 70 45 78 70  free((char*)pExp
9f60: 72 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20 20 20  r->span.z);.    
9f70: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
9f80: 3e 74 6f 6b 65 6e 2e 64 79 6e 20 29 20 73 71 6c  >token.dyn ) sql
9f90: 69 74 65 33 5f 66 72 65 65 28 28 63 68 61 72 2a  ite3_free((char*
9fa0: 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 29  )pExpr->token.z)
9fb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  ;.          memc
9fc0: 70 79 28 70 45 78 70 72 2c 20 70 44 75 70 2c 20  py(pExpr, pDup, 
9fd0: 73 69 7a 65 6f 66 28 2a 70 45 78 70 72 29 29 3b  sizeof(*pExpr));
9fe0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
9ff0: 65 33 5f 66 72 65 65 28 70 44 75 70 29 3b 0a 20  e3_free(pDup);. 
a000: 20 20 20 20 20 20 20 20 20 63 6e 74 20 3d 20 31           cnt = 1
a010: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 61 74  ;.          pMat
a020: 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ch = 0;.        
a030: 20 20 61 73 73 65 72 74 28 20 7a 54 61 62 3d 3d    assert( zTab==
a040: 30 20 26 26 20 7a 44 62 3d 3d 30 20 29 3b 0a 20  0 && zDb==0 );. 
a050: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6c 6f           goto lo
a060: 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 5f 32 3b 0a  okupname_end_2;.
a070: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a080: 7d 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  } .    }..    /*
a090: 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20   Advance to the 
a0a0: 6e 65 78 74 20 6e 61 6d 65 20 63 6f 6e 74 65 78  next name contex
a0b0: 74 2e 20 20 54 68 65 20 6c 6f 6f 70 20 77 69 6c  t.  The loop wil
a0c0: 6c 20 65 78 69 74 20 77 68 65 6e 20 65 69 74 68  l exit when eith
a0d0: 65 72 0a 20 20 20 20 2a 2a 20 77 65 20 68 61 76  er.    ** we hav
a0e0: 65 20 61 20 6d 61 74 63 68 20 28 63 6e 74 3e 30  e a match (cnt>0
a0f0: 29 20 6f 72 20 77 68 65 6e 20 77 65 20 72 75 6e  ) or when we run
a100: 20 6f 75 74 20 6f 66 20 6e 61 6d 65 20 63 6f 6e   out of name con
a110: 74 65 78 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  texts..    */.  
a120: 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 29 7b 0a    if( cnt==0 ){.
a130: 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d        pNC = pNC-
a140: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
a150: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  }..  /*.  ** If 
a160: 58 20 61 6e 64 20 59 20 61 72 65 20 4e 55 4c 4c  X and Y are NULL
a170: 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (in other words
a180: 20 69 66 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c   if only the col
a190: 75 6d 6e 20 6e 61 6d 65 20 5a 20 69 73 0a 20 20  umn name Z is.  
a1a0: 2a 2a 20 73 75 70 70 6c 69 65 64 29 20 61 6e 64  ** supplied) and
a1b0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 5a 20   the value of Z 
a1c0: 69 73 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 64  is enclosed in d
a1d0: 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2c 20 74 68  ouble-quotes, th
a1e0: 65 6e 0a 20 20 2a 2a 20 5a 20 69 73 20 61 20 73  en.  ** Z is a s
a1f0: 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 20 69 66  tring literal if
a200: 20 69 74 20 64 6f 65 73 6e 27 74 20 6d 61 74 63   it doesn't matc
a210: 68 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d  h any column nam
a220: 65 73 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 2a  es.  In that.  *
a230: 2a 20 63 61 73 65 2c 20 77 65 20 6e 65 65 64 20  * case, we need 
a240: 74 6f 20 72 65 74 75 72 6e 20 72 69 67 68 74 20  to return right 
a250: 61 77 61 79 20 61 6e 64 20 6e 6f 74 20 6d 61 6b  away and not mak
a260: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 74 6f  e any changes to
a270: 0a 20 20 2a 2a 20 70 45 78 70 72 2e 0a 20 20 2a  .  ** pExpr..  *
a280: 2a 0a 20 20 2a 2a 20 42 65 63 61 75 73 65 20 6e  *.  ** Because n
a290: 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73 20  o reference was 
a2a0: 6d 61 64 65 20 74 6f 20 6f 75 74 65 72 20 63 6f  made to outer co
a2b0: 6e 74 65 78 74 73 2c 20 74 68 65 20 70 4e 43 2d  ntexts, the pNC-
a2c0: 3e 6e 52 65 66 0a 20 20 2a 2a 20 66 69 65 6c 64  >nRef.  ** field
a2d0: 73 20 61 72 65 20 6e 6f 74 20 63 68 61 6e 67 65  s are not change
a2e0: 64 20 69 6e 20 61 6e 79 20 63 6f 6e 74 65 78 74  d in any context
a2f0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74  ..  */.  if( cnt
a300: 3d 3d 30 20 26 26 20 7a 54 61 62 3d 3d 30 20 26  ==0 && zTab==0 &
a310: 26 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e  & pColumnToken->
a320: 7a 5b 30 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20  z[0]=='"' ){.   
a330: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
a340: 6f 6c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ol);.    return 
a350: 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  0;.  }..  /*.  *
a360: 2a 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74  * cnt==0 means t
a370: 68 65 72 65 20 77 61 73 20 6e 6f 74 20 6d 61 74  here was not mat
a380: 63 68 2e 20 20 63 6e 74 3e 31 20 6d 65 61 6e 73  ch.  cnt>1 means
a390: 20 74 68 65 72 65 20 77 65 72 65 20 74 77 6f 20   there were two 
a3a0: 6f 72 0a 20 20 2a 2a 20 6d 6f 72 65 20 6d 61 74  or.  ** more mat
a3b0: 63 68 65 73 2e 20 20 45 69 74 68 65 72 20 77 61  ches.  Either wa
a3c0: 79 2c 20 77 65 20 68 61 76 65 20 61 6e 20 65 72  y, we have an er
a3d0: 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ror..  */.  if( 
a3e0: 63 6e 74 21 3d 31 20 29 7b 0a 20 20 20 20 63 6f  cnt!=1 ){.    co
a3f0: 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a  nst char *zErr;.
a400: 20 20 20 20 7a 45 72 72 20 3d 20 63 6e 74 3d 3d      zErr = cnt==
a410: 30 20 3f 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c  0 ? "no such col
a420: 75 6d 6e 22 20 3a 20 22 61 6d 62 69 67 75 6f 75  umn" : "ambiguou
a430: 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 22 3b 0a  s column name";.
a440: 20 20 20 20 69 66 28 20 7a 44 62 20 29 7b 0a 20      if( zDb ){. 
a450: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
a460: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
a470: 3a 20 25 73 2e 25 73 2e 25 73 22 2c 20 7a 45 72  : %s.%s.%s", zEr
a480: 72 2c 20 7a 44 62 2c 20 7a 54 61 62 2c 20 7a 43  r, zDb, zTab, zC
a490: 6f 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ol);.    }else i
a4a0: 66 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20 20  f( zTab ){.     
a4b0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
a4c0: 28 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73  (pParse, "%s: %s
a4d0: 2e 25 73 22 2c 20 7a 45 72 72 2c 20 7a 54 61 62  .%s", zErr, zTab
a4e0: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 65 6c  , zCol);.    }el
a4f0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
a500: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
a510: 2c 20 22 25 73 3a 20 25 73 22 2c 20 7a 45 72 72  , "%s: %s", zErr
a520: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20  , zCol);.    }. 
a530: 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 45 72 72 2b     pTopNC->nErr+
a540: 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  +;.  }..  /* If 
a550: 61 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 20  a column from a 
a560: 74 61 62 6c 65 20 69 6e 20 70 53 72 63 4c 69 73  table in pSrcLis
a570: 74 20 69 73 20 72 65 66 65 72 65 6e 63 65 64 2c  t is referenced,
a580: 20 74 68 65 6e 20 72 65 63 6f 72 64 0a 20 20 2a   then record.  *
a590: 2a 20 74 68 69 73 20 66 61 63 74 20 69 6e 20 74  * this fact in t
a5a0: 68 65 20 70 53 72 63 4c 69 73 74 2e 61 5b 5d 2e  he pSrcList.a[].
a5b0: 63 6f 6c 55 73 65 64 20 62 69 74 6d 61 73 6b 2e  colUsed bitmask.
a5c0: 20 20 43 6f 6c 75 6d 6e 20 30 20 63 61 75 73 65    Column 0 cause
a5d0: 73 0a 20 20 2a 2a 20 62 69 74 20 30 20 74 6f 20  s.  ** bit 0 to 
a5e0: 62 65 20 73 65 74 2e 20 20 43 6f 6c 75 6d 6e 20  be set.  Column 
a5f0: 31 20 73 65 74 73 20 62 69 74 20 31 2e 20 20 41  1 sets bit 1.  A
a600: 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 66  nd so forth.  If
a610: 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e   the.  ** column
a620: 20 6e 75 6d 62 65 72 20 69 73 20 67 72 65 61 74   number is great
a630: 65 72 20 74 68 61 6e 20 74 68 65 20 6e 75 6d 62  er than the numb
a640: 65 72 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68  er of bits in th
a650: 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 74  e bitmask.  ** t
a660: 68 65 6e 20 73 65 74 20 74 68 65 20 68 69 67 68  hen set the high
a670: 2d 6f 72 64 65 72 20 62 69 74 20 6f 66 20 74 68  -order bit of th
a680: 65 20 62 69 74 6d 61 73 6b 2e 0a 20 20 2a 2f 0a  e bitmask..  */.
a690: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
a6a0: 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 4d 61 74 63  lumn>=0 && pMatc
a6b0: 68 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  h!=0 ){.    int 
a6c0: 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  n = pExpr->iColu
a6d0: 6d 6e 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  mn;.    testcase
a6e0: 28 20 6e 3d 3d 73 69 7a 65 6f 66 28 42 69 74 6d  ( n==sizeof(Bitm
a6f0: 61 73 6b 29 2a 38 2d 31 20 29 3b 0a 20 20 20 20  ask)*8-1 );.    
a700: 69 66 28 20 6e 3e 3d 73 69 7a 65 6f 66 28 42 69  if( n>=sizeof(Bi
a710: 74 6d 61 73 6b 29 2a 38 20 29 7b 0a 20 20 20 20  tmask)*8 ){.    
a720: 20 20 6e 20 3d 20 73 69 7a 65 6f 66 28 42 69 74    n = sizeof(Bit
a730: 6d 61 73 6b 29 2a 38 2d 31 3b 0a 20 20 20 20 7d  mask)*8-1;.    }
a740: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 61  .    assert( pMa
a750: 74 63 68 2d 3e 69 43 75 72 73 6f 72 3d 3d 70 45  tch->iCursor==pE
a760: 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20  xpr->iTable );. 
a770: 20 20 20 70 4d 61 74 63 68 2d 3e 63 6f 6c 55 73     pMatch->colUs
a780: 65 64 20 7c 3d 20 28 28 42 69 74 6d 61 73 6b 29  ed |= ((Bitmask)
a790: 31 29 3c 3c 6e 3b 0a 20 20 7d 0a 0a 6c 6f 6f 6b  1)<<n;.  }..look
a7a0: 75 70 6e 61 6d 65 5f 65 6e 64 3a 0a 20 20 2f 2a  upname_end:.  /*
a7b0: 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 72 65   Clean up and re
a7c0: 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  turn.  */.  sqli
a7d0: 74 65 33 5f 66 72 65 65 28 7a 44 62 29 3b 0a 20  te3_free(zDb);. 
a7e0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
a7f0: 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ab);.  sqlite3Ex
a800: 70 72 44 65 6c 65 74 65 28 70 45 78 70 72 2d 3e  prDelete(pExpr->
a810: 70 4c 65 66 74 29 3b 0a 20 20 70 45 78 70 72 2d  pLeft);.  pExpr-
a820: 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 73 71  >pLeft = 0;.  sq
a830: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
a840: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
a850: 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20    pExpr->pRight 
a860: 3d 20 30 3b 0a 20 20 70 45 78 70 72 2d 3e 6f 70  = 0;.  pExpr->op
a870: 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 6c 6f   = TK_COLUMN;.lo
a880: 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 5f 32 3a 0a  okupname_end_2:.
a890: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
a8a0: 43 6f 6c 29 3b 0a 20 20 69 66 28 20 63 6e 74 3d  Col);.  if( cnt=
a8b0: 3d 31 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =1 ){.    assert
a8c0: 28 20 70 4e 43 21 3d 30 20 29 3b 0a 20 20 20 20  ( pNC!=0 );.    
a8d0: 73 71 6c 69 74 65 33 41 75 74 68 52 65 61 64 28  sqlite3AuthRead(
a8e0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 70  pParse, pExpr, p
a8f0: 53 63 68 65 6d 61 2c 20 70 4e 43 2d 3e 70 53 72  Schema, pNC->pSr
a900: 63 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20  cList);.    if( 
a910: 70 4d 61 74 63 68 20 26 26 20 21 70 4d 61 74 63  pMatch && !pMatc
a920: 68 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  h->pSelect ){.  
a930: 20 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20      pExpr->pTab 
a940: 3d 20 70 4d 61 74 63 68 2d 3e 70 54 61 62 3b 0a  = pMatch->pTab;.
a950: 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 63      }.    /* Inc
a960: 72 65 6d 65 6e 74 20 74 68 65 20 6e 52 65 66 20  rement the nRef 
a970: 76 61 6c 75 65 20 6f 6e 20 61 6c 6c 20 6e 61 6d  value on all nam
a980: 65 20 63 6f 6e 74 65 78 74 73 20 66 72 6f 6d 20  e contexts from 
a990: 54 6f 70 4e 43 20 75 70 20 74 6f 0a 20 20 20 20  TopNC up to.    
a9a0: 2a 2a 20 74 68 65 20 70 6f 69 6e 74 20 77 68 65  ** the point whe
a9b0: 72 65 20 74 68 65 20 6e 61 6d 65 20 6d 61 74 63  re the name matc
a9c0: 68 65 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28  hed. */.    for(
a9d0: 3b 3b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ;;){.      asser
a9e0: 74 28 20 70 54 6f 70 4e 43 21 3d 30 20 29 3b 0a  t( pTopNC!=0 );.
a9f0: 20 20 20 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 52        pTopNC->nR
aa00: 65 66 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ef++;.      if( 
aa10: 70 54 6f 70 4e 43 3d 3d 70 4e 43 20 29 20 62 72  pTopNC==pNC ) br
aa20: 65 61 6b 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e  eak;.      pTopN
aa30: 43 20 3d 20 70 54 6f 70 4e 43 2d 3e 70 4e 65 78  C = pTopNC->pNex
aa40: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  t;.    }.    ret
aa50: 75 72 6e 20 30 3b 0a 20 20 7d 20 65 6c 73 65 20  urn 0;.  } else 
aa60: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
aa70: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
aa80: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 64 65 73  s routine is des
aa90: 69 67 6e 65 64 20 61 73 20 61 6e 20 78 46 75 6e  igned as an xFun
aaa0: 63 20 66 6f 72 20 77 61 6c 6b 45 78 70 72 54 72  c for walkExprTr
aab0: 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 73 6f  ee()..**.** Reso
aac0: 6c 76 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d  lve symbolic nam
aad0: 65 73 20 69 6e 74 6f 20 54 4b 5f 43 4f 4c 55 4d  es into TK_COLUM
aae0: 4e 20 6f 70 65 72 61 74 6f 72 73 20 66 6f 72 20  N operators for 
aaf0: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 6e  the current.** n
ab00: 6f 64 65 20 69 6e 20 74 68 65 20 65 78 70 72 65  ode in the expre
ab10: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
ab20: 75 72 6e 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75  urn 0 to continu
ab30: 65 20 74 68 65 20 73 65 61 72 63 68 20 64 6f 77  e the search dow
ab40: 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 6f 72  n.** the tree or
ab50: 20 32 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20   2 to abort the 
ab60: 74 72 65 65 20 77 61 6c 6b 2e 0a 2a 2a 0a 2a 2a  tree walk..**.**
ab70: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   This routine al
ab80: 73 6f 20 64 6f 65 73 20 65 72 72 6f 72 20 63 68  so does error ch
ab90: 65 63 6b 69 6e 67 20 61 6e 64 20 6e 61 6d 65 20  ecking and name 
aba0: 72 65 73 6f 6c 75 74 69 6f 6e 20 66 6f 72 0a 2a  resolution for.*
abb0: 2a 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73  * function names
abc0: 2e 20 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20  .  The operator 
abd0: 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75  for aggregate fu
abe0: 6e 63 74 69 6f 6e 73 20 69 73 20 63 68 61 6e 67  nctions is chang
abf0: 65 64 0a 2a 2a 20 74 6f 20 54 4b 5f 41 47 47 5f  ed.** to TK_AGG_
ac00: 46 55 4e 43 54 49 4f 4e 2e 0a 2a 2f 0a 73 74 61  FUNCTION..*/.sta
ac10: 74 69 63 20 69 6e 74 20 6e 61 6d 65 52 65 73 6f  tic int nameReso
ac20: 6c 76 65 72 53 74 65 70 28 76 6f 69 64 20 2a 70  lverStep(void *p
ac30: 41 72 67 2c 20 45 78 70 72 20 2a 70 45 78 70 72  Arg, Expr *pExpr
ac40: 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  ){.  NameContext
ac50: 20 2a 70 4e 43 20 3d 20 28 4e 61 6d 65 43 6f 6e   *pNC = (NameCon
ac60: 74 65 78 74 2a 29 70 41 72 67 3b 0a 20 20 50 61  text*)pArg;.  Pa
ac70: 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 0a 20 20  rse *pParse;..  
ac80: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
ac90: 65 74 75 72 6e 20 31 3b 0a 20 20 61 73 73 65 72  eturn 1;.  asser
aca0: 74 28 20 70 4e 43 21 3d 30 20 29 3b 0a 20 20 70  t( pNC!=0 );.  p
acb0: 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61  Parse = pNC->pPa
acc0: 72 73 65 3b 0a 0a 20 20 69 66 28 20 45 78 70 72  rse;..  if( Expr
acd0: 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
ace0: 45 78 70 72 2c 20 45 50 5f 52 65 73 6f 6c 76 65  Expr, EP_Resolve
acf0: 64 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  d) ) return 1;. 
ad00: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
ad10: 28 70 45 78 70 72 2c 20 45 50 5f 52 65 73 6f 6c  (pExpr, EP_Resol
ad20: 76 65 64 29 3b 0a 23 69 66 6e 64 65 66 20 4e 44  ved);.#ifndef ND
ad30: 45 42 55 47 0a 20 20 69 66 28 20 70 4e 43 2d 3e  EBUG.  if( pNC->
ad40: 70 53 72 63 4c 69 73 74 20 26 26 20 70 4e 43 2d  pSrcList && pNC-
ad50: 3e 70 53 72 63 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  >pSrcList->nAllo
ad60: 63 3e 30 20 29 7b 0a 20 20 20 20 53 72 63 4c 69  c>0 ){.    SrcLi
ad70: 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70  st *pSrcList = p
ad80: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20  NC->pSrcList;.  
ad90: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
ada0: 28 69 3d 30 3b 20 69 3c 70 4e 43 2d 3e 70 53 72  (i=0; i<pNC->pSr
adb0: 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  cList->nSrc; i++
adc0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
add0: 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pSrcList->a[i].
ade0: 69 43 75 72 73 6f 72 3e 3d 30 20 26 26 20 70 53  iCursor>=0 && pS
adf0: 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75  rcList->a[i].iCu
ae00: 72 73 6f 72 3c 70 50 61 72 73 65 2d 3e 6e 54 61  rsor<pParse->nTa
ae10: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  b);.    }.  }.#e
ae20: 6e 64 69 66 0a 20 20 73 77 69 74 63 68 28 20 70  ndif.  switch( p
ae30: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
ae40: 2f 2a 20 44 6f 75 62 6c 65 2d 71 75 6f 74 65 64  /* Double-quoted
ae50: 20 73 74 72 69 6e 67 73 20 28 65 78 3a 20 22 61   strings (ex: "a
ae60: 62 63 22 29 20 61 72 65 20 75 73 65 64 20 61 73  bc") are used as
ae70: 20 69 64 65 6e 74 69 66 69 65 72 73 20 69 66 0a   identifiers if.
ae80: 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e      ** possible.
ae90: 20 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 79    Otherwise they
aea0: 20 72 65 6d 61 69 6e 20 61 73 20 73 74 72 69 6e   remain as strin
aeb0: 67 73 2e 20 20 53 69 6e 67 6c 65 2d 71 75 6f 74  gs.  Single-quot
aec0: 65 64 0a 20 20 20 20 2a 2a 20 73 74 72 69 6e 67  ed.    ** string
aed0: 73 20 28 65 78 3a 20 27 61 62 63 27 29 20 61 72  s (ex: 'abc') ar
aee0: 65 20 61 6c 77 61 79 73 20 73 74 72 69 6e 67 20  e always string 
aef0: 6c 69 74 65 72 61 6c 73 2e 0a 20 20 20 20 2a 2f  literals..    */
af00: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
af10: 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ING: {.      if(
af20: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b   pExpr->token.z[
af30: 30 5d 3d 3d 27 5c 27 27 20 29 20 62 72 65 61 6b  0]=='\'' ) break
af40: 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20  ;.      /* Fall 
af50: 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b  thru into the TK
af60: 5f 49 44 20 63 61 73 65 20 69 66 20 74 68 69 73  _ID case if this
af70: 20 69 73 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f   is a double-quo
af80: 74 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  ted string */.  
af90: 20 20 7d 0a 20 20 20 20 2f 2a 20 41 20 6c 6f 6e    }.    /* A lon
afa0: 65 20 69 64 65 6e 74 69 66 69 65 72 20 69 73 20  e identifier is 
afb0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f  the name of a co
afc0: 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lumn..    */.   
afd0: 20 63 61 73 65 20 54 4b 5f 49 44 3a 20 7b 0a 20   case TK_ID: {. 
afe0: 20 20 20 20 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28       lookupName(
aff0: 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 26 70  pParse, 0, 0, &p
b000: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 70 4e 43  Expr->token, pNC
b010: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
b020: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
b030: 20 20 0a 20 20 20 20 2f 2a 20 41 20 74 61 62 6c    .    /* A tabl
b040: 65 20 6e 61 6d 65 20 61 6e 64 20 63 6f 6c 75 6d  e name and colum
b050: 6e 20 6e 61 6d 65 3a 20 20 20 20 20 49 44 2e 49  n name:     ID.I
b060: 44 0a 20 20 20 20 2a 2a 20 4f 72 20 61 20 64 61  D.    ** Or a da
b070: 74 61 62 61 73 65 2c 20 74 61 62 6c 65 20 61 6e  tabase, table an
b080: 64 20 63 6f 6c 75 6d 6e 3a 20 20 49 44 2e 49 44  d column:  ID.ID
b090: 2e 49 44 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  .ID.    */.    c
b0a0: 61 73 65 20 54 4b 5f 44 4f 54 3a 20 7b 0a 20 20  ase TK_DOT: {.  
b0b0: 20 20 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75      Token *pColu
b0c0: 6d 6e 3b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20  mn;.      Token 
b0d0: 2a 70 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 54  *pTable;.      T
b0e0: 6f 6b 65 6e 20 2a 70 44 62 3b 0a 20 20 20 20 20  oken *pDb;.     
b0f0: 20 45 78 70 72 20 2a 70 52 69 67 68 74 3b 0a 0a   Expr *pRight;..
b100: 20 20 20 20 20 20 2f 2a 20 69 66 28 20 70 53 72        /* if( pSr
b110: 63 4c 69 73 74 3d 3d 30 20 29 20 62 72 65 61 6b  cList==0 ) break
b120: 3b 20 2a 2f 0a 20 20 20 20 20 20 70 52 69 67 68  ; */.      pRigh
b130: 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68  t = pExpr->pRigh
b140: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 69  t;.      if( pRi
b150: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29  ght->op==TK_ID )
b160: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 20 3d 20  {.        pDb = 
b170: 30 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 6c  0;.        pTabl
b180: 65 20 3d 20 26 70 45 78 70 72 2d 3e 70 4c 65 66  e = &pExpr->pLef
b190: 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  t->token;.      
b1a0: 20 20 70 43 6f 6c 75 6d 6e 20 3d 20 26 70 52 69    pColumn = &pRi
b1b0: 67 68 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20  ght->token;.    
b1c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b1d0: 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74 2d   assert( pRight-
b1e0: 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 3b 0a 20  >op==TK_DOT );. 
b1f0: 20 20 20 20 20 20 20 70 44 62 20 3d 20 26 70 45         pDb = &pE
b200: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65  xpr->pLeft->toke
b210: 6e 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 6c  n;.        pTabl
b220: 65 20 3d 20 26 70 52 69 67 68 74 2d 3e 70 4c 65  e = &pRight->pLe
b230: 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20  ft->token;.     
b240: 20 20 20 70 43 6f 6c 75 6d 6e 20 3d 20 26 70 52     pColumn = &pR
b250: 69 67 68 74 2d 3e 70 52 69 67 68 74 2d 3e 74 6f  ight->pRight->to
b260: 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ken;.      }.   
b270: 20 20 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70 50     lookupName(pP
b280: 61 72 73 65 2c 20 70 44 62 2c 20 70 54 61 62 6c  arse, pDb, pTabl
b290: 65 2c 20 70 43 6f 6c 75 6d 6e 2c 20 70 4e 43 2c  e, pColumn, pNC,
b2a0: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 72   pExpr);.      r
b2b0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a  eturn 1;.    }..
b2c0: 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 66      /* Resolve f
b2d0: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 0a 20 20  unction names.  
b2e0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b    */.    case TK
b2f0: 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20  _CONST_FUNC:.   
b300: 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
b310: 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c  N: {.      ExprL
b320: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
b330: 70 72 2d 3e 70 4c 69 73 74 3b 20 20 20 20 2f 2a  pr->pList;    /*
b340: 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6c 69   The argument li
b350: 73 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  st */.      int 
b360: 6e 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73  n = pList ? pLis
b370: 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 20 20 2f  t->nExpr : 0;  /
b380: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
b390: 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69  ments */.      i
b3a0: 6e 74 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20  nt no_such_func 
b3b0: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 72  = 0;       /* Tr
b3c0: 75 65 20 69 66 20 6e 6f 20 73 75 63 68 20 66 75  ue if no such fu
b3d0: 6e 63 74 69 6f 6e 20 65 78 69 73 74 73 20 2a 2f  nction exists */
b3e0: 0a 20 20 20 20 20 20 69 6e 74 20 77 72 6f 6e 67  .      int wrong
b3f0: 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 30 3b 20 20  _num_args = 0;  
b400: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 72     /* True if wr
b410: 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  ong number of ar
b420: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  guments */.     
b430: 20 69 6e 74 20 69 73 5f 61 67 67 20 3d 20 30 3b   int is_agg = 0;
b440: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b450: 54 72 75 65 20 69 66 20 69 73 20 61 6e 20 61 67  True if is an ag
b460: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
b470: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   */.      int i;
b480: 0a 20 20 20 20 20 20 69 6e 74 20 61 75 74 68 3b  .      int auth;
b490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4a0: 20 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 61 74     /* Authorizat
b4b0: 69 6f 6e 20 74 6f 20 75 73 65 20 74 68 65 20 66  ion to use the f
b4c0: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  unction */.     
b4d0: 20 69 6e 74 20 6e 49 64 3b 20 20 20 20 20 20 20   int nId;       
b4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b4f0: 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  Number of charac
b500: 74 65 72 73 20 69 6e 20 66 75 6e 63 74 69 6f 6e  ters in function
b510: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 63   name */.      c
b520: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 20  onst char *zId; 
b530: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
b540: 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 2e  e function name.
b550: 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63 44 65   */.      FuncDe
b560: 66 20 2a 70 44 65 66 3b 20 20 20 20 20 20 20 20  f *pDef;        
b570: 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61        /* Informa
b580: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66  tion about the f
b590: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  unction */.     
b5a0: 20 69 6e 74 20 65 6e 63 20 3d 20 45 4e 43 28 70   int enc = ENC(p
b5b0: 50 61 72 73 65 2d 3e 64 62 29 3b 20 20 2f 2a 20  Parse->db);  /* 
b5c0: 54 68 65 20 64 61 74 61 62 61 73 65 20 65 6e 63  The database enc
b5d0: 6f 64 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 20 20  oding */..      
b5e0: 7a 49 64 20 3d 20 28 63 68 61 72 2a 29 70 45 78  zId = (char*)pEx
b5f0: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20  pr->token.z;.   
b600: 20 20 20 6e 49 64 20 3d 20 70 45 78 70 72 2d 3e     nId = pExpr->
b610: 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 70  token.n;.      p
b620: 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Def = sqlite3Fin
b630: 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  dFunction(pParse
b640: 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20  ->db, zId, nId, 
b650: 6e 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20  n, enc, 0);.    
b660: 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29 7b    if( pDef==0 ){
b670: 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20  .        pDef = 
b680: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
b690: 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ion(pParse->db, 
b6a0: 7a 49 64 2c 20 6e 49 64 2c 20 2d 31 2c 20 65 6e  zId, nId, -1, en
b6b0: 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  c, 0);.        i
b6c0: 66 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20  f( pDef==0 ){.  
b6d0: 20 20 20 20 20 20 20 20 6e 6f 5f 73 75 63 68 5f          no_such_
b6e0: 66 75 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  func = 1;.      
b6f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b700: 20 20 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67     wrong_num_arg
b710: 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  s = 1;.        }
b720: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
b730: 20 20 20 20 20 20 69 73 5f 61 67 67 20 3d 20 70        is_agg = p
b740: 44 65 66 2d 3e 78 46 75 6e 63 3d 3d 30 3b 0a 20  Def->xFunc==0;. 
b750: 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53       }.#ifndef S
b760: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
b770: 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 20 20 69  RIZATION.      i
b780: 66 28 20 70 44 65 66 20 29 7b 0a 20 20 20 20 20  f( pDef ){.     
b790: 20 20 20 61 75 74 68 20 3d 20 73 71 6c 69 74 65     auth = sqlite
b7a0: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
b7b0: 65 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 54 49  e, SQLITE_FUNCTI
b7c0: 4f 4e 2c 20 30 2c 20 70 44 65 66 2d 3e 7a 4e 61  ON, 0, pDef->zNa
b7d0: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  me, 0);.        
b7e0: 69 66 28 20 61 75 74 68 21 3d 53 51 4c 49 54 45  if( auth!=SQLITE
b7f0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
b800: 20 69 66 28 20 61 75 74 68 3d 3d 53 51 4c 49 54   if( auth==SQLIT
b810: 45 5f 44 45 4e 59 20 29 7b 0a 20 20 20 20 20 20  E_DENY ){.      
b820: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
b830: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
b840: 6f 74 20 61 75 74 68 6f 72 69 7a 65 64 20 74 6f  ot authorized to
b850: 20 75 73 65 20 66 75 6e 63 74 69 6f 6e 3a 20 25   use function: %
b860: 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
b870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b880: 20 20 20 20 20 20 20 20 70 44 65 66 2d 3e 7a 4e          pDef->zN
b890: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
b8a0: 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20    pNC->nErr++;. 
b8b0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
b8c0: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
b8d0: 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20   TK_NULL;.      
b8e0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
b8f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
b900: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
b910: 20 69 73 5f 61 67 67 20 26 26 20 21 70 4e 43 2d   is_agg && !pNC-
b920: 3e 61 6c 6c 6f 77 41 67 67 20 29 7b 0a 20 20 20  >allowAgg ){.   
b930: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
b940: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69  rMsg(pParse, "mi
b950: 73 75 73 65 20 6f 66 20 61 67 67 72 65 67 61 74  suse of aggregat
b960: 65 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28  e function %.*s(
b970: 29 22 2c 20 6e 49 64 2c 7a 49 64 29 3b 0a 20 20  )", nId,zId);.  
b980: 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b        pNC->nErr+
b990: 2b 3b 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67  +;.        is_ag
b9a0: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  g = 0;.      }el
b9b0: 73 65 20 69 66 28 20 6e 6f 5f 73 75 63 68 5f 66  se if( no_such_f
b9c0: 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73  unc ){.        s
b9d0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
b9e0: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
b9f0: 66 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73 22 2c  function: %.*s",
ba00: 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20   nId, zId);.    
ba10: 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b      pNC->nErr++;
ba20: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
ba30: 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20   wrong_num_args 
ba40: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
ba50: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
ba60: 65 2c 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20  e,"wrong number 
ba70: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  of arguments to 
ba80: 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22  function %.*s()"
ba90: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  ,.             n
baa0: 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20  Id, zId);.      
bab0: 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20    pNC->nErr++;. 
bac0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
bad0: 20 69 73 5f 61 67 67 20 29 7b 0a 20 20 20 20 20   is_agg ){.     
bae0: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
baf0: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3b 0a  K_AGG_FUNCTION;.
bb00: 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 68 61 73          pNC->has
bb10: 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Agg = 1;.      }
bb20: 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f 61 67  .      if( is_ag
bb30: 67 20 29 20 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67  g ) pNC->allowAg
bb40: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72  g = 0;.      for
bb50: 28 69 3d 30 3b 20 70 4e 43 2d 3e 6e 45 72 72 3d  (i=0; pNC->nErr=
bb60: 3d 30 20 26 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b  =0 && i<n; i++){
bb70: 0a 20 20 20 20 20 20 20 20 77 61 6c 6b 45 78 70  .        walkExp
bb80: 72 54 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69  rTree(pList->a[i
bb90: 5d 2e 70 45 78 70 72 2c 20 6e 61 6d 65 52 65 73  ].pExpr, nameRes
bba0: 6f 6c 76 65 72 53 74 65 70 2c 20 70 4e 43 29 3b  olverStep, pNC);
bbb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
bbc0: 66 28 20 69 73 5f 61 67 67 20 29 20 70 4e 43 2d  f( is_agg ) pNC-
bbd0: 3e 61 6c 6c 6f 77 41 67 67 20 3d 20 31 3b 0a 20  >allowAgg = 1;. 
bbe0: 20 20 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20       /* FIX ME: 
bbf0: 20 43 6f 6d 70 75 74 65 20 70 45 78 70 72 2d 3e   Compute pExpr->
bc00: 61 66 66 69 6e 69 74 79 20 62 61 73 65 64 20 6f  affinity based o
bc10: 6e 20 74 68 65 20 65 78 70 65 63 74 65 64 20 72  n the expected r
bc20: 65 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 74  eturn.      ** t
bc30: 79 70 65 20 6f 66 20 74 68 65 20 66 75 6e 63 74  ype of the funct
bc40: 69 6f 6e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion .      */.  
bc50: 20 20 20 20 72 65 74 75 72 6e 20 69 73 5f 61 67      return is_ag
bc60: 67 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  g;.    }.#ifndef
bc70: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
bc80: 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
bc90: 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 63 61  K_SELECT:.    ca
bca0: 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 23 65  se TK_EXISTS:.#e
bcb0: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b  ndif.    case TK
bcc0: 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  _IN: {.      if(
bcd0: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20   pExpr->pSelect 
bce0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
bcf0: 52 65 66 20 3d 20 70 4e 43 2d 3e 6e 52 65 66 3b  Ref = pNC->nRef;
bd00: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
bd10: 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 20 20 20  OMIT_CHECK.     
bd20: 20 20 20 69 66 28 20 70 4e 43 2d 3e 69 73 43 68     if( pNC->isCh
bd30: 65 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eck ){.         
bd40: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
bd50: 28 70 50 61 72 73 65 2c 22 73 75 62 71 75 65 72  (pParse,"subquer
bd60: 69 65 73 20 70 72 6f 68 69 62 69 74 65 64 20 69  ies prohibited i
bd70: 6e 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  n CHECK constrai
bd80: 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 20 20 7d  nts");.        }
bd90: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
bda0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73  sqlite3SelectRes
bdb0: 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70 45 78  olve(pParse, pEx
bdc0: 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 70 4e 43  pr->pSelect, pNC
bdd0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
bde0: 74 28 20 70 4e 43 2d 3e 6e 52 65 66 3e 3d 6e 52  t( pNC->nRef>=nR
bdf0: 65 66 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ef );.        if
be00: 28 20 6e 52 65 66 21 3d 70 4e 43 2d 3e 6e 52 65  ( nRef!=pNC->nRe
be10: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  f ){.          E
be20: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
be30: 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65  Expr, EP_VarSele
be40: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ct);.        }. 
be50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
be60: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
be70: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
be80: 45 43 4b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ECK.    case TK_
be90: 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20  VARIABLE: {.    
bea0: 20 20 69 66 28 20 70 4e 43 2d 3e 69 73 43 68 65    if( pNC->isChe
beb0: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ck ){.        sq
bec0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
bed0: 61 72 73 65 2c 22 70 61 72 61 6d 65 74 65 72 73  arse,"parameters
bee0: 20 70 72 6f 68 69 62 69 74 65 64 20 69 6e 20 43   prohibited in C
bef0: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73  HECK constraints
bf00: 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
bf10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
bf20: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75  endif.  }.  retu
bf30: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 0;.}../*.** T
bf40: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b  his routine walk
bf50: 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  s an expression 
bf60: 74 72 65 65 20 61 6e 64 20 72 65 73 6f 6c 76 65  tree and resolve
bf70: 73 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 0a  s references to.
bf80: 2a 2a 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73  ** table columns
bf90: 2e 20 20 4e 6f 64 65 73 20 6f 66 20 74 68 65 20  .  Nodes of the 
bfa0: 66 6f 72 6d 20 49 44 2e 49 44 20 6f 72 20 49 44  form ID.ID or ID
bfb0: 20 72 65 73 6f 6c 76 65 20 69 6e 74 6f 20 61 6e   resolve into an
bfc0: 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 74 68 65  .** index to the
bfd0: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 74 61   table in the ta
bfe0: 62 6c 65 20 6c 69 73 74 20 61 6e 64 20 61 20 63  ble list and a c
bff0: 6f 6c 75 6d 6e 20 6f 66 66 73 65 74 2e 20 20 54  olumn offset.  T
c000: 68 65 20 0a 2a 2a 20 45 78 70 72 2e 6f 70 63 6f  he .** Expr.opco
c010: 64 65 20 66 6f 72 20 73 75 63 68 20 6e 6f 64 65  de for such node
c020: 73 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20  s is changed to 
c030: 54 4b 5f 43 4f 4c 55 4d 4e 2e 20 20 54 68 65 20  TK_COLUMN.  The 
c040: 45 78 70 72 2e 69 54 61 62 6c 65 0a 2a 2a 20 76  Expr.iTable.** v
c050: 61 6c 75 65 20 69 73 20 63 68 61 6e 67 65 64 20  alue is changed 
c060: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
c070: 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74  the referenced t
c080: 61 62 6c 65 20 69 6e 20 70 54 61 62 4c 69 73 74  able in pTabList
c090: 0a 2a 2a 20 70 6c 75 73 20 74 68 65 20 22 62 61  .** plus the "ba
c0a0: 73 65 22 20 76 61 6c 75 65 2e 20 20 54 68 65 20  se" value.  The 
c0b0: 62 61 73 65 20 76 61 6c 75 65 20 77 69 6c 6c 20  base value will 
c0c0: 75 6c 74 69 6d 61 74 65 6c 79 20 62 65 63 6f 6d  ultimately becom
c0d0: 65 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 63 75  e the.** VDBE cu
c0e0: 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
c0f0: 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 69 73  a cursor that is
c100: 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74 6f 20 74   pointing into t
c110: 68 65 20 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a  he referenced.**
c120: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 45 78 70   table.  The Exp
c130: 72 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  r.iColumn value 
c140: 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 74 68  is changed to th
c150: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63  e index of the c
c160: 6f 6c 75 6d 6e 20 0a 2a 2a 20 6f 66 20 74 68 65  olumn .** of the
c170: 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c   referenced tabl
c180: 65 2e 20 20 54 68 65 20 45 78 70 72 2e 69 43 6f  e.  The Expr.iCo
c190: 6c 75 6d 6e 20 76 61 6c 75 65 20 66 6f 72 20 74  lumn value for t
c1a0: 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20 52 4f  he special.** RO
c1b0: 57 49 44 20 63 6f 6c 75 6d 6e 20 69 73 20 2d 31  WID column is -1
c1c0: 2e 20 20 41 6e 79 20 49 4e 54 45 47 45 52 20 50  .  Any INTEGER P
c1d0: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
c1e0: 6e 20 69 73 20 74 72 69 65 64 20 61 73 20 61 6e  n is tried as an
c1f0: 0a 2a 2a 20 61 6c 69 61 73 20 66 6f 72 20 52 4f  .** alias for RO
c200: 57 49 44 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20  WID..**.** Also 
c210: 72 65 73 6f 6c 76 65 20 66 75 6e 63 74 69 6f 6e  resolve function
c220: 20 6e 61 6d 65 73 20 61 6e 64 20 63 68 65 63 6b   names and check
c230: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 66   the functions f
c240: 6f 72 20 70 72 6f 70 65 72 0a 2a 2a 20 75 73 61  or proper.** usa
c250: 67 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 61  ge.  Make sure a
c260: 6c 6c 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  ll function name
c270: 73 20 61 72 65 20 72 65 63 6f 67 6e 69 7a 65 64  s are recognized
c280: 20 61 6e 64 20 61 6c 6c 20 66 75 6e 63 74 69 6f   and all functio
c290: 6e 73 0a 2a 2a 20 68 61 76 65 20 74 68 65 20 63  ns.** have the c
c2a0: 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66  orrect number of
c2b0: 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 4c 65 61   arguments.  Lea
c2c0: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
c2d0: 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65  age.** in pParse
c2e0: 2d 3e 7a 45 72 72 4d 73 67 20 69 66 20 61 6e 79  ->zErrMsg if any
c2f0: 74 68 69 6e 67 20 69 73 20 61 6d 69 73 73 2e 20  thing is amiss. 
c300: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
c310: 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a  er of errors..**
c320: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
c330: 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61  ssion contains a
c340: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
c350: 6e 73 20 74 68 65 6e 20 73 65 74 20 74 68 65 20  ns then set the 
c360: 45 50 5f 41 67 67 0a 2a 2a 20 70 72 6f 70 65 72  EP_Agg.** proper
c370: 74 79 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ty on the expres
c380: 73 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sion..*/.int sql
c390: 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e  ite3ExprResolveN
c3a0: 61 6d 65 73 28 20 0a 20 20 4e 61 6d 65 43 6f 6e  ames( .  NameCon
c3b0: 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 20 20  text *pNC,      
c3c0: 20 2f 2a 20 4e 61 6d 65 73 70 61 63 65 20 74 6f   /* Namespace to
c3d0: 20 72 65 73 6f 6c 76 65 20 65 78 70 72 65 73 73   resolve express
c3e0: 69 6f 6e 73 20 69 6e 2e 20 2a 2f 0a 20 20 45 78  ions in. */.  Ex
c3f0: 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20  pr *pExpr       
c400: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
c410: 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e  ression to be an
c420: 61 6c 79 7a 65 64 2e 20 2a 2f 0a 29 7b 0a 20 20  alyzed. */.){.  
c430: 69 6e 74 20 73 61 76 65 64 48 61 73 41 67 67 3b  int savedHasAgg;
c440: 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ..  if( pExpr==0
c450: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 69 66   ) return 0;.#if
c460: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
c470: 5f 44 45 50 54 48 3e 30 0a 20 20 7b 0a 20 20 20  _DEPTH>0.  {.   
c480: 20 69 66 28 20 63 68 65 63 6b 45 78 70 72 48 65   if( checkExprHe
c490: 69 67 68 74 28 70 4e 43 2d 3e 70 50 61 72 73 65  ight(pNC->pParse
c4a0: 2c 20 70 45 78 70 72 2d 3e 6e 48 65 69 67 68 74  , pExpr->nHeight
c4b0: 20 2b 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e   + pNC->pParse->
c4c0: 6e 48 65 69 67 68 74 29 20 29 7b 0a 20 20 20 20  nHeight) ){.    
c4d0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
c4e0: 7d 0a 20 20 20 20 70 4e 43 2d 3e 70 50 61 72 73  }.    pNC->pPars
c4f0: 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 70 45  e->nHeight += pE
c500: 78 70 72 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20  xpr->nHeight;.  
c510: 7d 0a 23 65 6e 64 69 66 0a 20 20 73 61 76 65 64  }.#endif.  saved
c520: 48 61 73 41 67 67 20 3d 20 70 4e 43 2d 3e 68 61  HasAgg = pNC->ha
c530: 73 41 67 67 3b 0a 20 20 70 4e 43 2d 3e 68 61 73  sAgg;.  pNC->has
c540: 41 67 67 20 3d 20 30 3b 0a 20 20 77 61 6c 6b 45  Agg = 0;.  walkE
c550: 78 70 72 54 72 65 65 28 70 45 78 70 72 2c 20 6e  xprTree(pExpr, n
c560: 61 6d 65 52 65 73 6f 6c 76 65 72 53 74 65 70 2c  ameResolverStep,
c570: 20 70 4e 43 29 3b 0a 23 69 66 20 53 51 4c 49 54   pNC);.#if SQLIT
c580: 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
c590: 3e 30 0a 20 20 70 4e 43 2d 3e 70 50 61 72 73 65  >0.  pNC->pParse
c5a0: 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 70 45 78  ->nHeight -= pEx
c5b0: 70 72 2d 3e 6e 48 65 69 67 68 74 3b 0a 23 65 6e  pr->nHeight;.#en
c5c0: 64 69 66 0a 20 20 69 66 28 20 70 4e 43 2d 3e 6e  dif.  if( pNC->n
c5d0: 45 72 72 3e 30 20 29 7b 0a 20 20 20 20 45 78 70  Err>0 ){.    Exp
c5e0: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78  rSetProperty(pEx
c5f0: 70 72 2c 20 45 50 5f 45 72 72 6f 72 29 3b 0a 20  pr, EP_Error);. 
c600: 20 7d 0a 20 20 69 66 28 20 70 4e 43 2d 3e 68 61   }.  if( pNC->ha
c610: 73 41 67 67 20 29 7b 0a 20 20 20 20 45 78 70 72  sAgg ){.    Expr
c620: 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70  SetProperty(pExp
c630: 72 2c 20 45 50 5f 41 67 67 29 3b 0a 20 20 7d 65  r, EP_Agg);.  }e
c640: 6c 73 65 20 69 66 28 20 73 61 76 65 64 48 61 73  lse if( savedHas
c650: 41 67 67 20 29 7b 0a 20 20 20 20 70 4e 43 2d 3e  Agg ){.    pNC->
c660: 68 61 73 41 67 67 20 3d 20 31 3b 0a 20 20 7d 0a  hasAgg = 1;.  }.
c670: 20 20 72 65 74 75 72 6e 20 45 78 70 72 48 61 73    return ExprHas
c680: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
c690: 45 50 5f 45 72 72 6f 72 29 3b 0a 7d 0a 0a 2f 2a  EP_Error);.}../*
c6a0: 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 69 6e  .** A pointer in
c6b0: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
c6c0: 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64  tructure is used
c6d0: 20 74 6f 20 70 61 73 73 20 69 6e 66 6f 72 6d 61   to pass informa
c6e0: 74 69 6f 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20  tion.** through 
c6f0: 77 61 6c 6b 45 78 70 72 54 72 65 65 20 69 6e 74  walkExprTree int
c700: 6f 20 63 6f 64 65 53 75 62 71 75 65 72 79 53 74  o codeSubquerySt
c710: 65 70 28 29 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  ep()..*/.typedef
c720: 20 73 74 72 75 63 74 20 51 75 65 72 79 43 6f 64   struct QueryCod
c730: 65 72 20 51 75 65 72 79 43 6f 64 65 72 3b 0a 73  er QueryCoder;.s
c740: 74 72 75 63 74 20 51 75 65 72 79 43 6f 64 65 72  truct QueryCoder
c750: 20 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72   {.  Parse *pPar
c760: 73 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  se;       /* The
c770: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
c780: 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   */.  NameContex
c790: 74 20 2a 70 4e 43 3b 20 20 20 20 2f 2a 20 4e 61  t *pNC;    /* Na
c7a0: 6d 65 73 70 61 63 65 20 6f 66 20 66 69 72 73 74  mespace of first
c7b0: 20 65 6e 63 6c 6f 73 69 6e 67 20 71 75 65 72 79   enclosing query
c7c0: 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 64 65 66 20 53   */.};..#ifdef S
c7d0: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74  QLITE_TEST.  int
c7e0: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
c7f0: 69 6e 5f 6f 70 74 20 3d 20 31 3b 0a 23 65 6c 73  in_opt = 1;.#els
c800: 65 0a 20 20 23 64 65 66 69 6e 65 20 73 71 6c 69  e.  #define sqli
c810: 74 65 33 5f 65 6e 61 62 6c 65 5f 69 6e 5f 6f 70  te3_enable_in_op
c820: 74 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  t 1.#endif../*.*
c830: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
c840: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
c850: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
c860: 20 65 6e 61 62 6c 65 64 20 61 6e 64 0a 2a 2a 20   enabled and.** 
c870: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
c880: 6d 65 6e 74 20 70 20 65 78 69 73 74 73 20 61 6e  ment p exists an
c890: 64 20 69 73 20 6f 66 20 74 68 65 0a 2a 2a 20 73  d is of the.** s
c8a0: 69 6d 70 6c 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  imple form:.**.*
c8b0: 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c 63 6f  *     SELECT <co
c8c0: 6c 75 6d 6e 3e 20 46 52 4f 4d 20 3c 74 61 62 6c  lumn> FROM <tabl
c8d0: 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  e>.**.** If this
c8e0: 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 69 74   is the case, it
c8f0: 20 6d 61 79 20 62 65 20 70 6f 73 73 69 62 6c 65   may be possible
c900: 20 74 6f 20 75 73 65 20 61 6e 20 65 78 69 73 74   to use an exist
c910: 69 6e 67 20 74 61 62 6c 65 0a 2a 2a 20 6f 72 20  ing table.** or 
c920: 69 6e 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66  index instead of
c930: 20 67 65 6e 65 72 61 74 69 6e 67 20 61 6e 20 65   generating an e
c940: 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a  pheremal table..
c950: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
c960: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
c970: 73 74 61 74 69 63 20 69 6e 74 20 69 73 43 61 6e  static int isCan
c980: 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 53  didateForInOpt(S
c990: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63  elect *p){.  Src
c9a0: 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 45 78  List *pSrc;.  Ex
c9b0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
c9c0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
c9d0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 5f 65 6e   if( !sqlite3_en
c9e0: 61 62 6c 65 5f 69 6e 5f 6f 70 74 20 29 20 72 65  able_in_opt ) re
c9f0: 74 75 72 6e 20 30 3b 20 2f 2a 20 49 4e 20 6f 70  turn 0; /* IN op
ca00: 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 75 73 74 20  timization must 
ca10: 62 65 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20  be enabled */.  
ca20: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
ca30: 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
ca40: 20 20 20 20 20 20 20 2f 2a 20 72 69 67 68 74 2d         /* right-
ca50: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 49 4e 20  hand side of IN 
ca60: 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69  is SELECT */.  i
ca70: 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 20 72  f( p->pPrior ) r
ca80: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
ca90: 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20 63        /* Not a c
caa0: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a  ompound SELECT *
cab0: 2f 0a 20 20 69 66 28 20 70 2d 3e 69 73 44 69 73  /.  if( p->isDis
cac0: 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30  tinct ) return 0
cad0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  ;          /* No
cae0: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
caf0: 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 73  d */.  if( p->is
cb00: 41 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b 20  Agg ) return 0; 
cb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cb20: 20 43 6f 6e 74 61 69 6e 73 20 6e 6f 20 61 67 67   Contains no agg
cb30: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
cb40: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 47 72   */.  if( p->pGr
cb50: 6f 75 70 42 79 20 29 20 72 65 74 75 72 6e 20 30  oupBy ) return 0
cb60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
cb70: 48 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  Has no GROUP BY 
cb80: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20  clause */.  if( 
cb90: 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
cba0: 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
cbb0: 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d     /* Has no LIM
cbc0: 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  IT clause */.  i
cbd0: 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29 20  f( p->pOffset ) 
cbe0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
cbf0: 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75  p->pWhere ) retu
cc00: 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
cc10: 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 57 48 45     /* Has no WHE
cc20: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 70  RE clause */.  p
cc30: 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
cc40: 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29 20 72   if( pSrc==0 ) r
cc50: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
cc60: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
cc70: 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65  gle table in the
cc80: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
cc90: 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63    if( pSrc->nSrc
cca0: 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=1 ) return 0;.
ccb0: 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d    if( pSrc->a[0]
ccc0: 2e 70 53 65 6c 65 63 74 20 29 20 72 65 74 75 72  .pSelect ) retur
ccd0: 6e 20 30 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d  n 0;     /* FROM
cce0: 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61   clause is not a
ccf0: 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 70   subquery */.  p
cd00: 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d  Tab = pSrc->a[0]
cd10: 2e 70 54 61 62 3b 0a 20 20 69 66 28 20 70 54 61  .pTab;.  if( pTa
cd20: 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  b==0 ) return 0;
cd30: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65  .  if( pTab->pSe
cd40: 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b  lect ) return 0;
cd50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f            /* FRO
cd60: 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20  M clause is not 
cd70: 61 20 76 69 65 77 20 2a 2f 0a 20 20 69 66 28 20  a view */.  if( 
cd80: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
cd90: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
cda0: 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
cdb0: 65 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20  e not a virtual 
cdc0: 74 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73  table */.  pELis
cdd0: 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
cde0: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78   if( pEList->nEx
cdf0: 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  pr!=1 ) return 0
ce00: 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63  ;       /* One c
ce10: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73  olumn in the res
ce20: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 66 28  ult set */.  if(
ce30: 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
ce40: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
ce50: 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f  MN ) return 0; /
ce60: 2a 20 52 65 73 75 6c 74 20 69 73 20 61 20 63 6f  * Result is a co
ce70: 6c 75 6d 6e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  lumn */.  return
ce80: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
ce90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
cea0: 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  UERY */../*.** T
ceb0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
cec0: 75 73 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c  used by the impl
ced0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
cee0: 65 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61  e IN (...) opera
cef0: 74 6f 72 2e 0a 2a 2a 20 49 74 27 73 20 6a 6f 62  tor..** It's job
cf00: 20 69 73 20 74 6f 20 66 69 6e 64 20 6f 72 20 63   is to find or c
cf10: 72 65 61 74 65 20 61 20 62 2d 74 72 65 65 20 73  reate a b-tree s
cf20: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 6d 61  tructure that ma
cf30: 79 20 62 65 20 75 73 65 64 0a 2a 2a 20 65 69 74  y be used.** eit
cf40: 68 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20  her to test for 
cf50: 6d 65 6d 62 65 72 73 68 69 70 20 6f 66 20 74 68  membership of th
cf60: 65 20 28 2e 2e 2e 29 20 73 65 74 20 6f 72 20 74  e (...) set or t
cf70: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
cf80: 68 0a 2a 2a 20 69 74 73 20 6d 65 6d 62 65 72 73  h.** its members
cf90: 2c 20 73 6b 69 70 70 69 6e 67 20 64 75 70 6c 69  , skipping dupli
cfa0: 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  cates..**.** The
cfb0: 20 63 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 6f   cursor opened o
cfc0: 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  n the structure 
cfd0: 28 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c  (database table,
cfe0: 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20   database index 
cff0: 0a 2a 2a 20 6f 72 20 65 70 68 65 72 6d 61 6c 20  .** or ephermal 
d000: 74 61 62 6c 65 29 20 69 73 20 73 74 6f 72 65 64  table) is stored
d010: 20 69 6e 20 70 58 2d 3e 69 54 61 62 6c 65 20 62   in pX->iTable b
d020: 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74  efore this funct
d030: 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 20  ion returns..** 
d040: 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
d050: 75 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 65  ue indicates the
d060: 20 73 74 72 75 63 74 75 72 65 20 74 79 70 65 2c   structure type,
d070: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
d080: 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f  **   IN_INDEX_RO
d090: 57 49 44 20 2d 20 54 68 65 20 63 75 72 73 6f 72  WID - The cursor
d0a0: 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
d0b0: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e   database table.
d0c0: 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49  .**   IN_INDEX_I
d0d0: 4e 44 45 58 20 2d 20 54 68 65 20 63 75 72 73 6f  NDEX - The curso
d0e0: 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
d0f0: 61 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78  a database index
d100: 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f  ..**   IN_INDEX_
d110: 45 50 48 20 2d 20 20 20 54 68 65 20 63 75 72 73  EPH -   The curs
d120: 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  or was opened on
d130: 20 61 20 73 70 65 63 69 61 6c 6c 79 20 63 72 65   a specially cre
d140: 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20  ated and.**     
d150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
d160: 6f 70 75 6c 61 74 65 64 20 65 70 68 65 72 65 6d  opulated epherem
d170: 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  al table..**.** 
d180: 41 6e 20 65 78 69 73 74 69 6e 67 20 73 74 72 75  An existing stru
d190: 63 74 75 72 65 20 6d 61 79 20 6f 6e 6c 79 20 62  cture may only b
d1a0: 65 20 75 73 65 64 20 69 66 20 74 68 65 20 53 45  e used if the SE
d1b0: 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65 20 73  LECT is of the s
d1c0: 69 6d 70 6c 65 0a 2a 2a 20 66 6f 72 6d 3a 0a 2a  imple.** form:.*
d1d0: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
d1e0: 3c 63 6f 6c 75 6d 6e 3e 20 46 52 4f 4d 20 3c 74  <column> FROM <t
d1f0: 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  able>.**.** If p
d200: 72 4e 6f 74 46 6f 75 6e 64 20 70 61 72 61 6d 65  rNotFound parame
d210: 74 65 72 20 69 73 20 30 2c 20 74 68 65 6e 20 74  ter is 0, then t
d220: 68 65 20 73 74 72 75 63 74 75 72 65 20 77 69 6c  he structure wil
d230: 6c 20 62 65 20 75 73 65 64 20 74 6f 20 69 74 65  l be used to ite
d240: 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20  rate.** through 
d250: 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73 2c  the set members,
d260: 20 73 6b 69 70 70 69 6e 67 20 61 6e 79 20 64 75   skipping any du
d270: 70 6c 69 63 61 74 65 73 2e 20 49 6e 20 74 68 69  plicates. In thi
d280: 73 20 63 61 73 65 20 61 6e 0a 2a 2a 20 65 70 68  s case an.** eph
d290: 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73  eremal table mus
d2a0: 74 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73  t be used unless
d2b0: 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 3c 63   the selected <c
d2c0: 6f 6c 75 6d 6e 3e 20 69 73 20 67 75 61 72 61 6e  olumn> is guaran
d2d0: 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 75 6e  teed.** to be un
d2e0: 69 71 75 65 20 2d 20 65 69 74 68 65 72 20 62 65  ique - either be
d2f0: 63 61 75 73 65 20 69 74 20 69 73 20 61 6e 20 49  cause it is an I
d300: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
d310: 45 59 20 6f 72 20 69 74 0a 2a 2a 20 69 73 20 75  EY or it.** is u
d320: 6e 69 71 75 65 20 62 79 20 76 69 72 74 75 65 20  nique by virtue 
d330: 6f 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20  of a constraint 
d340: 6f 72 20 69 6d 70 6c 69 63 69 74 20 69 6e 64 65  or implicit inde
d350: 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  x..**.** If the 
d360: 70 72 4e 6f 74 46 6f 75 6e 64 20 70 61 72 61 6d  prNotFound param
d370: 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74  eter is not 0, t
d380: 68 65 6e 20 74 68 65 20 73 74 72 75 63 74 75 72  hen the structur
d390: 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a  e will be used .
d3a0: 2a 2a 20 66 6f 72 20 66 61 73 74 20 73 65 74 20  ** for fast set 
d3b0: 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 73  membership tests
d3c0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
d3d0: 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c  n epheremal tabl
d3e0: 65 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75 73  e must .** be us
d3f0: 65 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d  ed unless <colum
d400: 6e 3e 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52  n> is an INTEGER
d410: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
d420: 61 6e 20 69 6e 64 65 78 20 63 61 6e 20 0a 2a 2a  an index can .**
d430: 20 62 65 20 66 6f 75 6e 64 20 77 69 74 68 20 3c   be found with <
d440: 63 6f 6c 75 6d 6e 3e 20 61 73 20 69 74 73 20 6c  column> as its l
d450: 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 2e  eft-most column.
d460: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20  .**.** When the 
d470: 73 74 72 75 63 74 75 72 65 20 69 73 20 62 65 69  structure is bei
d480: 6e 67 20 75 73 65 64 20 66 6f 72 20 73 65 74 20  ng used for set 
d490: 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 73  membership tests
d4a0: 2c 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 6e 65  , the user.** ne
d4b0: 65 64 73 20 74 6f 20 6b 6e 6f 77 20 77 68 65 74  eds to know whet
d4c0: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 73  her or not the s
d4d0: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
d4e0: 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 20 0a 2a  s an SQL NULL .*
d4f0: 2a 20 76 61 6c 75 65 20 69 6e 20 6f 72 64 65 72  * value in order
d500: 20 74 6f 20 63 6f 72 72 65 63 74 6c 79 20 65 76   to correctly ev
d510: 61 6c 75 61 74 65 20 65 78 70 72 65 73 73 69 6f  aluate expressio
d520: 6e 73 20 6c 69 6b 65 20 22 58 20 49 4e 20 28 59  ns like "X IN (Y
d530: 2c 20 5a 29 22 2e 0a 2a 2a 20 49 66 20 74 68 65  , Z)"..** If the
d540: 72 65 20 69 73 20 61 20 63 68 61 6e 63 65 20 74  re is a chance t
d550: 68 61 74 20 74 68 65 20 73 74 72 75 63 74 75 72  hat the structur
d560: 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20  e may contain a 
d570: 4e 55 4c 4c 20 76 61 6c 75 65 20 61 74 0a 2a 2a  NULL value at.**
d580: 20 72 75 6e 74 69 6d 65 2c 20 74 68 65 6e 20 61   runtime, then a
d590: 20 72 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c   register is all
d5a0: 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 72  ocated and the r
d5b0: 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77  egister number w
d5c0: 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72  ritten.** to *pr
d5d0: 4e 6f 74 46 6f 75 6e 64 2e 20 49 66 20 74 68 65  NotFound. If the
d5e0: 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
d5f0: 74 68 61 74 20 74 68 65 20 73 74 72 75 63 74 75  that the structu
d600: 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a  re contains a.**
d610: 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 74 68 65   NULL value, the
d620: 6e 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 20 69 73  n *prNotFound is
d630: 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e   left unchanged.
d640: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69  .**.** If a regi
d650: 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65  ster is allocate
d660: 64 20 61 6e 64 20 69 74 73 20 6c 6f 63 61 74 69  d and its locati
d670: 6f 6e 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 72  on stored in *pr
d680: 4e 6f 74 46 6f 75 6e 64 2c 20 74 68 65 6e 0a 2a  NotFound, then.*
d690: 2a 20 69 74 73 20 69 6e 69 74 69 61 6c 20 76 61  * its initial va
d6a0: 6c 75 65 20 69 73 20 4e 55 4c 4c 2e 20 49 66 20  lue is NULL. If 
d6b0: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 64 6f  the structure do
d6c0: 65 73 20 6e 6f 74 20 72 65 6d 61 69 6e 20 63 6f  es not remain co
d6d0: 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20 74 68  nstant.** for th
d6e0: 65 20 64 75 72 61 74 69 6f 6e 20 6f 66 20 74 68  e duration of th
d6f0: 65 20 71 75 65 72 79 20 28 69 2e 65 2e 20 74 68  e query (i.e. th
d700: 65 20 73 65 74 20 69 73 20 61 20 63 6f 72 72 65  e set is a corre
d710: 6c 61 74 65 64 20 73 75 62 2d 73 65 6c 65 63 74  lated sub-select
d720: 29 2c 20 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  ), .** the value
d730: 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65   of the allocate
d740: 64 20 72 65 67 69 73 74 65 72 20 69 73 20 72 65  d register is re
d750: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 65 61 63 68  set to NULL each
d760: 20 74 69 6d 65 20 74 68 65 20 0a 2a 2a 20 73 74   time the .** st
d770: 72 75 63 74 75 72 65 20 69 73 20 72 65 70 6f 70  ructure is repop
d780: 75 6c 61 74 65 64 2e 20 54 68 69 73 20 61 6c 6c  ulated. This all
d790: 6f 77 73 20 74 68 65 20 63 61 6c 6c 65 72 20 74  ows the caller t
d7a0: 6f 20 75 73 65 20 76 64 62 65 20 63 6f 64 65 20  o use vdbe code 
d7b0: 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74  .** equivalent t
d7c0: 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  o the following:
d7d0: 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 72 65 67  .**.**   if( reg
d7e0: 69 73 74 65 72 3d 3d 4e 55 4c 4c 20 29 7b 0a 2a  ister==NULL ){.*
d7f0: 2a 20 20 20 20 20 68 61 73 5f 6e 75 6c 6c 20 3d  *     has_null =
d800: 20 3c 74 65 73 74 20 69 66 20 64 61 74 61 20 73   <test if data s
d810: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
d820: 73 20 6e 75 6c 6c 3e 0a 2a 2a 20 20 20 20 20 72  s null>.**     r
d830: 65 67 69 73 74 65 72 20 3d 20 31 0a 2a 2a 20 20  egister = 1.**  
d840: 20 7d 0a 2a 2a 0a 2a 2a 20 69 6e 20 6f 72 64 65   }.**.** in orde
d850: 72 20 74 6f 20 61 76 6f 69 64 20 72 75 6e 6e 69  r to avoid runni
d860: 6e 67 20 74 68 65 20 3c 74 65 73 74 20 69 66 20  ng the <test if 
d870: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20 63  data structure c
d880: 6f 6e 74 61 69 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a  ontains null>.**
d890: 20 74 65 73 74 20 6d 6f 72 65 20 6f 66 74 65 6e   test more often
d8a0: 20 74 68 61 6e 20 69 73 20 6e 65 63 65 73 73 61   than is necessa
d8b0: 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ry..*/.#ifndef S
d8c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
d8d0: 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  ERY.int sqlite3F
d8e0: 69 6e 64 49 6e 49 6e 64 65 78 28 50 61 72 73 65  indInIndex(Parse
d8f0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
d900: 70 58 2c 20 69 6e 74 20 2a 70 72 4e 6f 74 46 6f  pX, int *prNotFo
d910: 75 6e 64 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a  und){.  Select *
d920: 70 3b 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d  p;.  int eType =
d930: 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 20 3d   0;.  int iTab =
d940: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
d950: 0a 20 20 69 6e 74 20 6d 75 73 74 42 65 55 6e 69  .  int mustBeUni
d960: 71 75 65 20 3d 20 21 70 72 4e 6f 74 46 6f 75 6e  que = !prNotFoun
d970: 64 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  d;..  /* The fol
d980: 6c 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 65 78  lwing if(...) ex
d990: 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65  pression is true
d9a0: 20 69 66 20 74 68 65 20 53 45 4c 45 43 54 20 69   if the SELECT i
d9b0: 73 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 73  s of the .  ** s
d9c0: 69 6d 70 6c 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a  imple form:.  **
d9d0: 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
d9e0: 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52 4f 4d 20 3c   <column> FROM <
d9f0: 74 61 62 6c 65 3e 0a 20 20 2a 2a 0a 20 20 2a 2a  table>.  **.  **
da00: 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
da10: 63 61 73 65 2c 20 69 74 20 6d 61 79 20 62 65 20  case, it may be 
da20: 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20  possible to use 
da30: 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c  an existing tabl
da40: 65 0a 20 20 2a 2a 20 6f 72 20 69 6e 64 65 78 20  e.  ** or index 
da50: 69 6e 73 74 65 61 64 20 6f 66 20 67 65 6e 65 72  instead of gener
da60: 61 74 69 6e 67 20 61 6e 20 65 70 68 65 72 65 6d  ating an epherem
da70: 61 6c 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  al table..  */. 
da80: 20 70 20 3d 20 70 58 2d 3e 70 53 65 6c 65 63 74   p = pX->pSelect
da90: 3b 0a 20 20 69 66 28 20 69 73 43 61 6e 64 69 64  ;.  if( isCandid
daa0: 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 29  ateForInOpt(p) )
dab0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
dac0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
dad0: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
dae0: 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
daf0: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b   = p->pEList->a[
db00: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 6e  0].pExpr;.    in
db10: 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e  t iCol = pExpr->
db20: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 56 64 62  iColumn;.    Vdb
db30: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
db40: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 0a  tVdbe(pParse);..
db50: 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63      /* This func
db60: 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tion is only cal
db70: 6c 65 64 20 66 72 6f 6d 20 74 77 6f 20 70 6c 61  led from two pla
db80: 63 65 73 2e 20 49 6e 20 62 6f 74 68 20 63 61 73  ces. In both cas
db90: 65 73 20 74 68 65 20 76 64 62 65 0a 20 20 20 20  es the vdbe.    
dba0: 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ** has already b
dbb0: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 20 53  een allocated. S
dbc0: 6f 20 61 73 73 75 6d 65 20 73 71 6c 69 74 65 33  o assume sqlite3
dbd0: 47 65 74 56 64 62 65 28 29 20 69 73 20 61 6c 77  GetVdbe() is alw
dbe0: 61 79 73 0a 20 20 20 20 2a 2a 20 73 75 63 63 65  ays.    ** succe
dbf0: 73 73 66 75 6c 20 68 65 72 65 2e 0a 20 20 20 20  ssful here..    
dc00: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 76 29  */.    assert(v)
dc10: 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30  ;.    if( iCol<0
dc20: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4d   ){.      int iM
dc30: 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
dc40: 4d 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Mem;.      int i
dc50: 41 64 64 72 3b 0a 20 20 20 20 20 20 54 61 62 6c  Addr;.      Tabl
dc60: 65 20 2a 70 54 61 62 20 3d 20 70 2d 3e 70 53 72  e *pTab = p->pSr
dc70: 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20  c->a[0].pTab;.  
dc80: 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
dc90: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
dca0: 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
dcb0: 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c  hema);.      sql
dcc0: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
dcd0: 65 28 76 2c 20 69 44 62 29 3b 0a 0a 20 20 20 20  e(v, iDb);..    
dce0: 20 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65    iAddr = sqlite
dcf0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
dd00: 50 5f 49 66 2c 20 69 4d 65 6d 29 3b 0a 20 20 20  P_If, iMem);.   
dd10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
dd20: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
dd30: 65 72 2c 20 31 2c 20 69 4d 65 6d 29 3b 0a 0a 20  er, 1, iMem);.. 
dd40: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
dd50: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54  Table(pParse, iT
dd60: 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f  ab, iDb, pTab, O
dd70: 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20  P_OpenRead);.   
dd80: 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
dd90: 44 45 58 5f 52 4f 57 49 44 3b 0a 0a 20 20 20 20  DEX_ROWID;..    
dda0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
ddb0: 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b  pHere(v, iAddr);
ddc0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ddd0: 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69    /* The collati
dde0: 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73 65 64  on sequence used
ddf0: 20 62 79 20 74 68 65 20 63 6f 6d 70 61 72 69 73   by the comparis
de00: 6f 6e 2e 20 49 66 20 61 6e 20 69 6e 64 65 78 20  on. If an index 
de10: 69 73 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  is to .      ** 
de20: 62 65 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65  be used in place
de30: 20 6f 66 20 61 20 74 65 6d 70 2d 74 61 62 6c 65   of a temp-table
de40: 2c 20 69 74 20 6d 75 73 74 20 62 65 20 6f 72 64  , it must be ord
de50: 65 72 65 64 20 61 63 63 6f 72 64 69 6e 67 0a 20  ered according. 
de60: 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 69 73 20       ** to this 
de70: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
de80: 63 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ce..      */.   
de90: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 71     CollSeq *pReq
dea0: 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
deb0: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
dec0: 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74  Parse, pX->pLeft
ded0: 2c 20 70 45 78 70 72 29 3b 0a 0a 20 20 20 20 20  , pExpr);..     
dee0: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
def0: 68 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74  he affinity that
df00: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
df10: 20 70 65 72 66 6f 72 6d 20 74 68 65 20 0a 20 20   perform the .  
df20: 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f      ** compariso
df30: 6e 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  n is the same as
df40: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66   the affinity of
df50: 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 49 66 0a   the column. If.
df60: 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 6e        ** it is n
df70: 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  ot, it is not po
df80: 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 61 6e  ssible to use an
df90: 79 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 2a  y index..      *
dfa0: 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
dfb0: 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  Tab = p->pSrc->a
dfc0: 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20  [0].pTab;.      
dfd0: 63 68 61 72 20 61 66 66 20 3d 20 63 6f 6d 70 61  char aff = compa
dfe0: 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 58  risonAffinity(pX
dff0: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66  );.      int aff
e000: 69 6e 69 74 79 5f 6f 6b 20 3d 20 28 70 54 61 62  inity_ok = (pTab
e010: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66  ->aCol[iCol].aff
e020: 69 6e 69 74 79 3d 3d 61 66 66 7c 7c 61 66 66 3d  inity==aff||aff=
e030: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
e040: 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 49  );..      for(pI
e050: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
e060: 20 70 49 64 78 20 26 26 20 65 54 79 70 65 3d 3d   pIdx && eType==
e070: 30 20 26 26 20 61 66 66 69 6e 69 74 79 5f 6f 6b  0 && affinity_ok
e080: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
e090: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  xt){.        if(
e0a0: 20 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e   (pIdx->aiColumn
e0b0: 5b 30 5d 3d 3d 69 43 6f 6c 29 0a 20 20 20 20 20  [0]==iCol).     
e0c0: 20 20 20 20 26 26 20 28 70 52 65 71 3d 3d 73 71      && (pReq==sq
e0d0: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
e0e0: 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 70 49  (db, ENC(db), pI
e0f0: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 2c 20 2d  dx->azColl[0], -
e100: 31 2c 20 30 29 29 0a 20 20 20 20 20 20 20 20 20  1, 0)).         
e110: 26 26 20 28 21 6d 75 73 74 42 65 55 6e 69 71 75  && (!mustBeUniqu
e120: 65 20 7c 7c 20 28 70 49 64 78 2d 3e 6e 43 6f 6c  e || (pIdx->nCol
e130: 75 6d 6e 3d 3d 31 20 26 26 20 70 49 64 78 2d 3e  umn==1 && pIdx->
e140: 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
e150: 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  )).        ){.  
e160: 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b          int iDb;
e170: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
e180: 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
e190: 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  nMem;.          
e1a0: 69 6e 74 20 69 41 64 64 72 3b 0a 20 20 20 20 20  int iAddr;.     
e1b0: 20 20 20 20 20 63 68 61 72 20 2a 70 4b 65 79 3b       char *pKey;
e1c0: 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 70 4b  .  .          pK
e1d0: 65 79 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  ey = (char *)sql
e1e0: 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f  ite3IndexKeyinfo
e1f0: 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a  (pParse, pIdx);.
e200: 20 20 20 20 20 20 20 20 20 20 69 44 62 20 3d 20            iDb = 
e210: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
e220: 6e 64 65 78 28 64 62 2c 20 70 49 64 78 2d 3e 70  ndex(db, pIdx->p
e230: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20  Schema);.       
e240: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73     sqlite3VdbeUs
e250: 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b  esBtree(v, iDb);
e260: 0a 0a 20 20 20 20 20 20 20 20 20 20 69 41 64 64  ..          iAdd
e270: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
e280: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp1(v, OP_If, 
e290: 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 20  iMem);.         
e2a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e2b0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
e2c0: 2c 20 31 2c 20 69 4d 65 6d 29 3b 0a 20 20 0a 20  , 1, iMem);.  . 
e2d0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e2e0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
e2f0: 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20  _SetNumColumns, 
e300: 30 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  0, pIdx->nColumn
e310: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
e320: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
e330: 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
e340: 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c  Tab, pIdx->tnum,
e350: 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20   iDb,.          
e360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e370: 20 20 20 20 20 70 4b 65 79 2c 50 34 5f 4b 45 59       pKey,P4_KEY
e380: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
e390: 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d           VdbeCom
e3a0: 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
e3b0: 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Idx->zName));.  
e3c0: 20 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20          eType = 
e3d0: 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 3b 0a  IN_INDEX_INDEX;.
e3e0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
e3f0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
e400: 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20  , iAddr);.      
e410: 20 20 20 20 69 66 28 20 70 72 4e 6f 74 46 6f 75      if( prNotFou
e420: 6e 64 20 26 26 20 21 70 54 61 62 2d 3e 61 43 6f  nd && !pTab->aCo
e430: 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20  l[iCol].notNull 
e440: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ){.            *
e450: 70 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 2b 2b 70  prNotFound = ++p
e460: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
e470: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e480: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
e490: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 54 79 70  .  }..  if( eTyp
e4a0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  e==0 ){.    int 
e4b0: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30  rMayHaveNull = 0
e4c0: 3b 0a 20 20 20 20 69 66 28 20 70 72 4e 6f 74 46  ;.    if( prNotF
e4d0: 6f 75 6e 64 20 29 7b 0a 20 20 20 20 20 20 2a 70  ound ){.      *p
e4e0: 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 72 4d 61 79  rNotFound = rMay
e4f0: 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61  HaveNull = ++pPa
e500: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d  rse->nMem;.    }
e510: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65  .    sqlite3Code
e520: 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
e530: 2c 20 70 58 2c 20 72 4d 61 79 48 61 76 65 4e 75  , pX, rMayHaveNu
e540: 6c 6c 29 3b 0a 20 20 20 20 65 54 79 70 65 20 3d  ll);.    eType =
e550: 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20   IN_INDEX_EPH;. 
e560: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 58 2d 3e   }else{.    pX->
e570: 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20  iTable = iTab;. 
e580: 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70   }.  return eTyp
e590: 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e;.}.#endif../*.
e5a0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
e5b0: 20 66 6f 72 20 73 63 61 6c 61 72 20 73 75 62 71   for scalar subq
e5c0: 75 65 72 69 65 73 20 75 73 65 64 20 61 73 20 61  ueries used as a
e5d0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  n expression.** 
e5e0: 61 6e 64 20 49 4e 20 6f 70 65 72 61 74 6f 72 73  and IN operators
e5f0: 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a  .  Examples:.**.
e600: 2a 2a 20 20 20 20 20 28 53 45 4c 45 43 54 20 61  **     (SELECT a
e610: 20 46 52 4f 4d 20 62 29 20 20 20 20 20 20 20 20   FROM b)        
e620: 20 20 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a    -- subquery.**
e630: 20 20 20 20 20 45 58 49 53 54 53 20 28 53 45 4c       EXISTS (SEL
e640: 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20  ECT a FROM b)   
e650: 2d 2d 20 45 58 49 53 54 53 20 73 75 62 71 75 65  -- EXISTS subque
e660: 72 79 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28  ry.**     x IN (
e670: 34 2c 35 2c 31 31 29 20 20 20 20 20 20 20 20 20  4,5,11)         
e680: 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61       -- IN opera
e690: 74 6f 72 20 77 69 74 68 20 6c 69 73 74 20 6f 6e  tor with list on
e6a0: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
e6b0: 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 53 45  .**     x IN (SE
e6c0: 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20  LECT a FROM b)  
e6d0: 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f     -- IN operato
e6e0: 72 20 77 69 74 68 20 73 75 62 71 75 65 72 79 20  r with subquery 
e6f0: 6f 6e 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a  on the right.**.
e700: 2a 2a 20 54 68 65 20 70 45 78 70 72 20 70 61 72  ** The pExpr par
e710: 61 6d 65 74 65 72 20 64 65 73 63 72 69 62 65 73  ameter describes
e720: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
e730: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
e740: 65 20 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72  e IN.** operator
e750: 20 6f 72 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f   or subquery..*/
e760: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e770: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 76 6f  OMIT_SUBQUERY.vo
e780: 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75  id sqlite3CodeSu
e790: 62 73 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70  bselect(Parse *p
e7a0: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
e7b0: 70 72 2c 20 69 6e 74 20 72 4d 61 79 48 61 76 65  pr, int rMayHave
e7c0: 4e 75 6c 6c 29 7b 0a 20 20 69 6e 74 20 74 65 73  Null){.  int tes
e7d0: 74 41 64 64 72 20 3d 20 30 3b 20 20 20 20 20 20  tAddr = 0;      
e7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7f0: 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65 73   /* One-time tes
e800: 74 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 56  t address */.  V
e810: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
e820: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
e830: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
e840: 74 75 72 6e 3b 0a 0a 0a 20 20 2f 2a 20 54 68 69  turn;...  /* Thi
e850: 73 20 63 6f 64 65 20 6d 75 73 74 20 62 65 20 72  s code must be r
e860: 75 6e 20 69 6e 20 69 74 73 20 65 6e 74 69 72 65  un in its entire
e870: 74 79 20 65 76 65 72 79 20 74 69 6d 65 20 69 74  ty every time it
e880: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a   is encountered.
e890: 20 20 2a 2a 20 69 66 20 61 6e 79 20 6f 66 20 74    ** if any of t
e8a0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  he following is 
e8b0: 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  true:.  **.  ** 
e8c0: 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d     *  The right-
e8d0: 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 20 63  hand side is a c
e8e0: 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65  orrelated subque
e8f0: 72 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68  ry.  **    *  Th
e900: 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
e910: 65 20 69 73 20 61 6e 20 65 78 70 72 65 73 73 69  e is an expressi
e920: 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69  on list containi
e930: 6e 67 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a  ng variables.  *
e940: 2a 20 20 20 20 2a 20 20 57 65 20 61 72 65 20 69  *    *  We are i
e950: 6e 73 69 64 65 20 61 20 74 72 69 67 67 65 72 0a  nside a trigger.
e960: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c    **.  ** If all
e970: 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61 72   of the above ar
e980: 65 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65  e false, then we
e990: 20 63 61 6e 20 72 75 6e 20 74 68 69 73 20 63 6f   can run this co
e9a0: 64 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a  de just once.  *
e9b0: 2a 20 73 61 76 65 20 74 68 65 20 72 65 73 75 6c  * save the resul
e9c0: 74 73 2c 20 61 6e 64 20 72 65 75 73 65 20 74 68  ts, and reuse th
e9d0: 65 20 73 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e  e same result on
e9e0: 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f   subsequent invo
e9f0: 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  cations..  */.  
ea00: 69 66 28 20 21 45 78 70 72 48 61 73 41 6e 79 50  if( !ExprHasAnyP
ea10: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
ea20: 50 5f 56 61 72 53 65 6c 65 63 74 29 20 26 26 20  P_VarSelect) && 
ea30: 21 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61  !pParse->trigSta
ea40: 63 6b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 65  ck ){.    int me
ea50: 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  m = ++pParse->nM
ea60: 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  em;.    sqlite3V
ea70: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
ea80: 49 66 2c 20 6d 65 6d 29 3b 0a 20 20 20 20 74 65  If, mem);.    te
ea90: 73 74 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33  stAddr = sqlite3
eaa0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
eab0: 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 6d 65 6d  _Integer, 1, mem
eac0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 74  );.    assert( t
ead0: 65 73 74 41 64 64 72 3e 30 20 7c 7c 20 70 50 61  estAddr>0 || pPa
eae0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
eaf0: 61 69 6c 65 64 20 29 3b 0a 20 20 7d 0a 0a 20 20  ailed );.  }..  
eb00: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
eb10: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
eb20: 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 63 68 61  _IN: {.      cha
eb30: 72 20 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20  r affinity;.    
eb40: 20 20 4b 65 79 49 6e 66 6f 20 6b 65 79 49 6e 66    KeyInfo keyInf
eb50: 6f 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  o;.      int add
eb60: 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  r;        /* Add
eb70: 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45  ress of OP_OpenE
eb80: 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63  phemeral instruc
eb90: 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 69  tion */..      i
eba0: 66 28 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20  f( rMayHaveNull 
ebb0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
ebc0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
ebd0: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 4d 61 79  OP_Null, 0, rMay
ebe0: 48 61 76 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  HaveNull);.     
ebf0: 20 7d 0a 0a 20 20 20 20 20 20 61 66 66 69 6e 69   }..      affini
ec00: 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ty = sqlite3Expr
ec10: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
ec20: 70 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20 20 2f  pLeft);..      /
ec30: 2a 20 57 68 65 74 68 65 72 20 74 68 69 73 20 69  * Whether this i
ec40: 73 20 61 6e 20 27 78 20 49 4e 28 53 45 4c 45 43  s an 'x IN(SELEC
ec50: 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78 20  T...)' or an 'x 
ec60: 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a  IN(<exprlist>)'.
ec70: 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73        ** express
ec80: 69 6f 6e 20 69 74 20 69 73 20 68 61 6e 64 6c 65  ion it is handle
ec90: 64 20 74 68 65 20 73 61 6d 65 20 77 61 79 2e 20  d the same way. 
eca0: 41 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  A virtual table 
ecb0: 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  is .      ** fil
ecc0: 6c 65 64 20 77 69 74 68 20 73 69 6e 67 6c 65 2d  led with single-
ecd0: 66 69 65 6c 64 20 69 6e 64 65 78 20 6b 65 79 73  field index keys
ece0: 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68   representing th
ecf0: 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20  e results.      
ed00: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 53 45 4c 45  ** from the SELE
ed10: 43 54 20 6f 72 20 74 68 65 20 3c 65 78 70 72 6c  CT or the <exprl
ed20: 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ist>..      **. 
ed30: 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 27       ** If the '
ed40: 78 27 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  x' expression is
ed50: 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c   a column value,
ed60: 20 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e   or the SELECT..
ed70: 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65  ..      ** state
ed80: 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 61 20 63  ment returns a c
ed90: 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65  olumn value, the
eda0: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f  n the affinity o
edb0: 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  f that.      ** 
edc0: 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 74  column is used t
edd0: 6f 20 62 75 69 6c 64 20 74 68 65 20 69 6e 64 65  o build the inde
ede0: 78 20 6b 65 79 73 2e 20 49 66 20 62 6f 74 68 20  x keys. If both 
edf0: 27 78 27 20 61 6e 64 20 74 68 65 0a 20 20 20 20  'x' and the.    
ee00: 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73    ** SELECT... s
ee10: 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c  tatement are col
ee20: 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72  umns, then numer
ee30: 69 63 20 61 66 66 69 6e 69 74 79 20 69 73 20 75  ic affinity is u
ee40: 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 69 66 20  sed.      ** if 
ee50: 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61  either column ha
ee60: 73 20 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e 54  s NUMERIC or INT
ee70: 45 47 45 52 20 61 66 66 69 6e 69 74 79 2e 20 49  EGER affinity. I
ee80: 66 20 6e 65 69 74 68 65 72 0a 20 20 20 20 20 20  f neither.      
ee90: 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68 65 20 53  ** 'x' nor the S
eea0: 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65  ELECT... stateme
eeb0: 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20  nt are columns, 
eec0: 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66  then numeric aff
eed0: 69 6e 69 74 79 0a 20 20 20 20 20 20 2a 2a 20 69  inity.      ** i
eee0: 73 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f  s used..      */
eef0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54  .      pExpr->iT
ef00: 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  able = pParse->n
ef10: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64  Tab++;.      add
ef20: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
ef30: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
ef40: 45 70 68 65 6d 65 72 61 6c 2c 20 70 45 78 70 72  Ephemeral, pExpr
ef50: 2d 3e 69 54 61 62 6c 65 2c 20 31 29 3b 0a 20 20  ->iTable, 1);.  
ef60: 20 20 20 20 6d 65 6d 73 65 74 28 26 6b 65 79 49      memset(&keyI
ef70: 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6b  nfo, 0, sizeof(k
ef80: 65 79 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20  eyInfo));.      
ef90: 6b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d  keyInfo.nField =
efa0: 20 31 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70   1;..      if( p
efb0: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b  Expr->pSelect ){
efc0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65  .        /* Case
efd0: 20 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20   1:     expr IN 
efe0: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20  (SELECT ...).   
eff0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
f000: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
f010: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 72 65   to write the re
f020: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c  sults of the sel
f030: 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d  ect into the tem
f040: 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a  porary.        *
f050: 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65  * table allocate
f060: 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f  d and opened abo
f070: 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ve..        */. 
f080: 20 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73         SelectDes
f090: 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20  t dest;.        
f0a0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
f0b0: 3b 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ;..        sqlit
f0c0: 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
f0d0: 28 26 64 65 73 74 2c 20 53 52 54 5f 53 65 74 2c  (&dest, SRT_Set,
f0e0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b   pExpr->iTable);
f0f0: 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 61 66  .        dest.af
f100: 66 69 6e 69 74 79 20 3d 20 28 69 6e 74 29 61 66  finity = (int)af
f110: 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20  finity;.        
f120: 61 73 73 65 72 74 28 20 28 70 45 78 70 72 2d 3e  assert( (pExpr->
f130: 69 54 61 62 6c 65 26 30 78 30 30 30 30 46 46 46  iTable&0x0000FFF
f140: 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  F)==pExpr->iTabl
f150: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
f160: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
f170: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 53  Parse, pExpr->pS
f180: 65 6c 65 63 74 2c 20 26 64 65 73 74 2c 20 30 2c  elect, &dest, 0,
f190: 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20   0, 0) ){.      
f1a0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
f1b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 45      }.        pE
f1c0: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 53  List = pExpr->pS
f1d0: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  elect->pEList;. 
f1e0: 20 20 20 20 20 20 20 69 66 28 20 70 45 4c 69 73         if( pELis
f1f0: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
f200: 70 72 3e 30 20 29 7b 20 0a 20 20 20 20 20 20 20  pr>0 ){ .       
f210: 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c     keyInfo.aColl
f220: 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  [0] = sqlite3Bin
f230: 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
f240: 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  q(pParse, pExpr-
f250: 3e 70 4c 65 66 74 2c 0a 20 20 20 20 20 20 20 20  >pLeft,.        
f260: 20 20 20 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b        pEList->a[
f270: 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  0].pExpr);.     
f280: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
f290: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 69 73   if( pExpr->pLis
f2a0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
f2b0: 43 61 73 65 20 32 3a 20 20 20 20 20 65 78 70 72  Case 2:     expr
f2c0: 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20   IN (exprlist). 
f2d0: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
f2e0: 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78    ** For each ex
f2f0: 70 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20  pression, build 
f300: 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f  an index key fro
f310: 6d 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e  m the evaluation
f320: 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
f330: 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20  store it in the 
f340: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e  temporary table.
f350: 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 61 20   If <expr> is a 
f360: 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65  column, then use
f370: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
f380: 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74   columns affinit
f390: 79 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20  y when building 
f3a0: 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c  index keys. If <
f3b0: 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20  expr> is not.   
f3c0: 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e       ** a column
f3d0: 2c 20 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66  , use numeric af
f3e0: 66 69 6e 69 74 79 2e 0a 20 20 20 20 20 20 20 20  finity..        
f3f0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
f400: 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69  ;.        ExprLi
f410: 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70  st *pList = pExp
f420: 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  r->pList;.      
f430: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
f440: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
f450: 20 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72         int r1, r
f460: 32 2c 20 72 33 3b 0a 0a 20 20 20 20 20 20 20 20  2, r3;..        
f470: 69 66 28 20 21 61 66 66 69 6e 69 74 79 20 29 7b  if( !affinity ){
f480: 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 69 6e  .          affin
f490: 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  ity = SQLITE_AFF
f4a0: 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d  _NONE;.        }
f4b0: 0a 20 20 20 20 20 20 20 20 6b 65 79 49 6e 66 6f  .        keyInfo
f4c0: 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 70 45 78 70  .aColl[0] = pExp
f4d0: 72 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b  r->pLeft->pColl;
f4e0: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f  ..        /* Loo
f4f0: 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65  p through each e
f500: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78  xpression in <ex
f510: 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20  prlist>. */.    
f520: 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
f530: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
f540: 65 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d  e);.        r2 =
f550: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
f560: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
f570: 20 20 20 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d      for(i=pList-
f580: 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c  >nExpr, pItem=pL
f590: 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d  ist->a; i>0; i--
f5a0: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
f5b0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 32 20        Expr *pE2 
f5c0: 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a  = pItem->pExpr;.
f5d0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
f5e0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
f5f0: 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20  is not constant 
f600: 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65  then we will nee
f610: 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a  d to.          *
f620: 2a 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65  * disable the te
f630: 73 74 20 74 68 61 74 20 77 61 73 20 67 65 6e 65  st that was gene
f640: 72 61 74 65 64 20 61 62 6f 76 65 20 74 68 61 74  rated above that
f650: 20 6d 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20   makes sure.    
f660: 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f        ** this co
f670: 64 65 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73  de only executes
f680: 20 6f 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20   once.  Because 
f690: 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61  for a non-consta
f6a0: 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nt.          ** 
f6b0: 65 78 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65  expression we ne
f6c0: 65 64 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73  ed to rerun this
f6d0: 20 63 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e   code each time.
f6e0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
f6f0: 20 20 20 20 20 20 20 20 69 66 28 20 74 65 73 74          if( test
f700: 41 64 64 72 20 26 26 20 21 73 71 6c 69 74 65 33  Addr && !sqlite3
f710: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
f720: 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  E2) ){.         
f730: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
f740: 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 74 65  angeToNoop(v, te
f750: 73 74 41 64 64 72 2d 31 2c 20 32 29 3b 0a 20 20  stAddr-1, 2);.  
f760: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 41 64            testAd
f770: 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  dr = 0;.        
f780: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f    }..          /
f790: 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65  * Evaluate the e
f7a0: 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e  xpression and in
f7b0: 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65  sert it into the
f7c0: 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
f7d0: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
f7e0: 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65  >disableColCache
f7f0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 72 33  ++;.          r3
f800: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
f810: 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
f820: 20 70 45 32 2c 20 72 31 29 3b 0a 20 20 20 20 20   pE2, r1);.     
f830: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
f840: 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43  rse->disableColC
f850: 61 63 68 65 3e 30 20 29 3b 0a 20 20 20 20 20 20  ache>0 );.      
f860: 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61      pParse->disa
f870: 62 6c 65 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20  bleColCache--;. 
f880: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
f890: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
f8a0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c  _MakeRecord, r3,
f8b0: 20 31 2c 20 72 32 2c 20 26 61 66 66 69 6e 69 74   1, r2, &affinit
f8c0: 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  y, 1);.         
f8d0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
f8e0: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
f8f0: 70 50 61 72 73 65 2c 20 72 33 2c 20 31 29 3b 0a  pParse, r3, 1);.
f900: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f910: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
f920: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 45 78  P_IdxInsert, pEx
f930: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 29 3b  pr->iTable, r2);
f940: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f950: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
f960: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
f970: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r1);.        sq
f980: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
f990: 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
f9a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
f9b0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
f9c0: 50 34 28 76 2c 20 61 64 64 72 2c 20 28 76 6f 69  P4(v, addr, (voi
f9d0: 64 20 2a 29 26 6b 65 79 49 6e 66 6f 2c 20 50 34  d *)&keyInfo, P4
f9e0: 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
f9f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
fa00: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54     case TK_EXIST
fa10: 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
fa20: 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f  ELECT: {.      /
fa30: 2a 20 54 68 69 73 20 68 61 73 20 74 6f 20 62 65  * This has to be
fa40: 20 61 20 73 63 61 6c 61 72 20 53 45 4c 45 43 54   a scalar SELECT
fa50: 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  .  Generate code
fa60: 20 74 6f 20 70 75 74 20 74 68 65 0a 20 20 20 20   to put the.    
fa70: 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68    ** value of th
fa80: 69 73 20 73 65 6c 65 63 74 20 69 6e 20 61 20 6d  is select in a m
fa90: 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72  emory cell and r
faa0: 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72  ecord the number
fab0: 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
fac0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20   memory cell in 
fad0: 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a  iColumn..      *
fae0: 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  /.      static c
faf0: 6f 6e 73 74 20 54 6f 6b 65 6e 20 6f 6e 65 20 3d  onst Token one =
fb00: 20 7b 20 28 75 38 2a 29 22 31 22 2c 20 30 2c 20   { (u8*)"1", 0, 
fb10: 31 20 7d 3b 0a 20 20 20 20 20 20 53 65 6c 65 63  1 };.      Selec
fb20: 74 20 2a 70 53 65 6c 3b 0a 20 20 20 20 20 20 53  t *pSel;.      S
fb30: 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a  electDest dest;.
fb40: 0a 20 20 20 20 20 20 70 53 65 6c 20 3d 20 70 45  .      pSel = pE
fb50: 78 70 72 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  xpr->pSelect;.  
fb60: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
fb70: 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
fb80: 20 30 2c 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d   0, ++pParse->nM
fb90: 65 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  em);.      if( p
fba0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
fbb0: 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20 64  ECT ){.        d
fbc0: 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f  est.eDest = SRT_
fbd0: 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Mem;.        sql
fbe0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
fbf0: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65  , OP_Null, 0, de
fc00: 73 74 2e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  st.iParm);.     
fc10: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
fc20: 76 2c 20 22 49 6e 69 74 20 73 75 62 71 75 65 72  v, "Init subquer
fc30: 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20  y result"));.   
fc40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fc50: 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53    dest.eDest = S
fc60: 52 54 5f 45 78 69 73 74 73 3b 0a 20 20 20 20 20  RT_Exists;.     
fc70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fc80: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
fc90: 65 72 2c 20 30 2c 20 64 65 73 74 2e 69 50 61 72  er, 0, dest.iPar
fca0: 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  m);.        Vdbe
fcb0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69  Comment((v, "Ini
fcc0: 74 20 45 58 49 53 54 53 20 72 65 73 75 6c 74 22  t EXISTS result"
fcd0: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
fce0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
fcf0: 65 74 65 28 70 53 65 6c 2d 3e 70 4c 69 6d 69 74  ete(pSel->pLimit
fd00: 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 70  );.      pSel->p
fd10: 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 50  Limit = sqlite3P
fd20: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
fd30: 49 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c 20 26  INTEGER, 0, 0, &
fd40: 6f 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  one);.      if( 
fd50: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
fd60: 61 72 73 65 2c 20 70 53 65 6c 2c 20 26 64 65 73  arse, pSel, &des
fd70: 74 2c 20 30 2c 20 30 2c 20 30 29 20 29 7b 0a 20  t, 0, 0, 0) ){. 
fd80: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
fd90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 45 78       }.      pEx
fda0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 64 65  pr->iColumn = de
fdb0: 73 74 2e 69 50 61 72 6d 3b 0a 20 20 20 20 20 20  st.iParm;.      
fdc0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
fdd0: 0a 0a 20 20 69 66 28 20 74 65 73 74 41 64 64 72  ..  if( testAddr
fde0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
fdf0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 74  dbeJumpHere(v, t
fe00: 65 73 74 41 64 64 72 2d 31 29 3b 0a 20 20 7d 0a  estAddr-1);.  }.
fe10: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e  .  return;.}.#en
fe20: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
fe30: 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
fe40: 2f 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20  /*.** Duplicate 
fe50: 61 6e 20 38 2d 62 79 74 65 20 76 61 6c 75 65 0a  an 8-byte value.
fe60: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
fe70: 64 75 70 38 62 79 74 65 73 28 56 64 62 65 20 2a  dup8bytes(Vdbe *
fe80: 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69  v, const char *i
fe90: 6e 29 7b 0a 20 20 63 68 61 72 20 2a 6f 75 74 20  n){.  char *out 
fea0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
feb0: 63 52 61 77 28 73 71 6c 69 74 65 33 56 64 62 65  cRaw(sqlite3Vdbe
fec0: 44 62 28 76 29 2c 20 38 29 3b 0a 20 20 69 66 28  Db(v), 8);.  if(
fed0: 20 6f 75 74 20 29 7b 0a 20 20 20 20 6d 65 6d 63   out ){.    memc
fee0: 70 79 28 6f 75 74 2c 20 69 6e 2c 20 38 29 3b 0a  py(out, in, 8);.
fef0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f 75 74    }.  return out
ff00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
ff10: 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69  ate an instructi
ff20: 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74  on that will put
ff30: 20 74 68 65 20 66 6c 6f 61 74 69 6e 67 20 70 6f   the floating po
ff40: 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 20 64 65 73  int.** value des
ff50: 63 72 69 62 65 64 20 62 79 20 7a 5b 30 2e 2e 6e  cribed by z[0..n
ff60: 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65  -1] into registe
ff70: 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68  r iMem..**.** Th
ff80: 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c  e z[] string wil
ff90: 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62  l probably not b
ffa0: 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  e zero-terminate
ffb0: 64 2e 20 20 42 75 74 20 74 68 65 20 0a 2a 2a 20  d.  But the .** 
ffc0: 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65 72 20 69  z[n] character i
ffd0: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
ffe0: 62 65 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61  be something tha
fff0: 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a  t does not look.
10000 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74  ** like the cont
10010 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  inuation of the 
10020 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  number..*/.stati
10030 63 20 76 6f 69 64 20 63 6f 64 65 52 65 61 6c 28  c void codeReal(
10040 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63  Vdbe *v, const c
10050 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69  har *z, int n, i
10060 6e 74 20 6e 65 67 61 74 65 46 6c 61 67 2c 20 69  nt negateFlag, i
10070 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 61 73 73 65  nt iMem){.  asse
10080 72 74 28 20 7a 20 7c 7c 20 76 3d 3d 30 20 7c 7c  rt( z || v==0 ||
10090 20 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 76   sqlite3VdbeDb(v
100a0 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  )->mallocFailed 
100b0 29 3b 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20  );.  if( z ){.  
100c0 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b 0a    double value;.
100d0 20 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20 20      char *zV;.  
100e0 20 20 61 73 73 65 72 74 28 20 21 69 73 64 69 67    assert( !isdig
100f0 69 74 28 7a 5b 6e 5d 29 20 29 3b 0a 20 20 20 20  it(z[n]) );.    
10100 73 71 6c 69 74 65 33 41 74 6f 46 28 7a 2c 20 26  sqlite3AtoF(z, &
10110 76 61 6c 75 65 29 3b 0a 20 20 20 20 69 66 28 20  value);.    if( 
10120 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 76 61 6c  sqlite3IsNaN(val
10130 75 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ue) ){.      sql
10140 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
10150 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 4d  , OP_Null, 0, iM
10160 65 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  em);.    }else{.
10170 20 20 20 20 20 20 69 66 28 20 6e 65 67 61 74 65        if( negate
10180 46 6c 61 67 20 29 20 76 61 6c 75 65 20 3d 20 2d  Flag ) value = -
10190 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 7a 56 20  value;.      zV 
101a0 3d 20 64 75 70 38 62 79 74 65 73 28 76 2c 20 28  = dup8bytes(v, (
101b0 63 68 61 72 2a 29 26 76 61 6c 75 65 29 3b 0a 20  char*)&value);. 
101c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
101d0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 52 65 61  AddOp4(v, OP_Rea
101e0 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a  l, 0, iMem, 0, z
101f0 56 2c 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20 20  V, P4_REAL);.   
10200 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   }.  }.}.../*.**
10210 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73   Generate an ins
10220 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69  truction that wi
10230 6c 6c 20 70 75 74 20 74 68 65 20 69 6e 74 65 67  ll put the integ
10240 65 72 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a  er describe by.*
10250 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d  * text z[0..n-1]
10260 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69   into register i
10270 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  Mem..**.** The z
10280 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70  [] string will p
10290 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a  robably not be z
102a0 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20  ero-terminated. 
102b0 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e   But the .** z[n
102c0 5d 20 63 68 61 72 61 63 74 65 72 20 69 73 20 67  ] character is g
102d0 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
102e0 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64  something that d
102f0 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20  oes not look.** 
10300 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75  like the continu
10310 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d  ation of the num
10320 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ber..*/.static v
10330 6f 69 64 20 63 6f 64 65 49 6e 74 65 67 65 72 28  oid codeInteger(
10340 56 64 62 65 20 2a 76 2c 20 45 78 70 72 20 2a 70  Vdbe *v, Expr *p
10350 45 78 70 72 2c 20 69 6e 74 20 6e 65 67 46 6c 61  Expr, int negFla
10360 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20  g, int iMem){.  
10370 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
10380 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67   if( pExpr->flag
10390 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20  s & EP_IntValue 
103a0 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 70  ){.    int i = p
103b0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Expr->iTable;.  
103c0 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 20    if( negFlag ) 
103d0 69 20 3d 20 2d 69 3b 0a 20 20 20 20 73 71 6c 69  i = -i;.    sqli
103e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
103f0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20   OP_Integer, i, 
10400 69 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 20 69  iMem);.  }else i
10410 66 28 20 28 7a 20 3d 20 28 63 68 61 72 2a 29 70  f( (z = (char*)p
10420 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 29 21 3d  Expr->token.z)!=
10430 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  0 ){.    int i;.
10440 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 45 78 70      int n = pExp
10450 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20  r->token.n;.    
10460 61 73 73 65 72 74 28 20 21 69 73 64 69 67 69 74  assert( !isdigit
10470 28 7a 5b 6e 5d 29 20 29 3b 0a 20 20 20 20 69 66  (z[n]) );.    if
10480 28 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33  ( sqlite3GetInt3
10490 32 28 7a 2c 20 26 69 29 20 29 7b 0a 20 20 20 20  2(z, &i) ){.    
104a0 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 20    if( negFlag ) 
104b0 69 20 3d 20 2d 69 3b 0a 20 20 20 20 20 20 73 71  i = -i;.      sq
104c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
104d0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69  v, OP_Integer, i
104e0 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 7d 65 6c  , iMem);.    }el
104f0 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 46 69  se if( sqlite3Fi
10500 74 73 49 6e 36 34 42 69 74 73 28 7a 2c 20 6e 65  tsIn64Bits(z, ne
10510 67 46 6c 61 67 29 20 29 7b 0a 20 20 20 20 20 20  gFlag) ){.      
10520 69 36 34 20 76 61 6c 75 65 3b 0a 20 20 20 20 20  i64 value;.     
10530 20 63 68 61 72 20 2a 7a 56 3b 0a 20 20 20 20 20   char *zV;.     
10540 20 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 7a   sqlite3Atoi64(z
10550 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 20  , &value);.     
10560 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 20 76   if( negFlag ) v
10570 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20  alue = -value;. 
10580 20 20 20 20 20 7a 56 20 3d 20 64 75 70 38 62 79       zV = dup8by
10590 74 65 73 28 76 2c 20 28 63 68 61 72 2a 29 26 76  tes(v, (char*)&v
105a0 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  alue);.      sql
105b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
105c0 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69  , OP_Int64, 0, i
105d0 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 49  Mem, 0, zV, P4_I
105e0 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65 6c 73 65  NT64);.    }else
105f0 7b 0a 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c  {.      codeReal
10600 28 76 2c 20 7a 2c 20 6e 2c 20 6e 65 67 46 6c 61  (v, z, n, negFla
10610 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a  g, iMem);.    }.
10620 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65    }.}.../*.** Ge
10630 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
10640 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20 74 68   will extract th
10650 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c  e iColumn-th col
10660 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c  umn from.** tabl
10670 65 20 70 54 61 62 20 61 6e 64 20 73 74 6f 72 65  e pTab and store
10680 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75   the column valu
10690 65 20 69 6e 20 61 20 72 65 67 69 73 74 65 72 2e  e in a register.
106a0 20 20 41 6e 20 65 66 66 6f 72 74 0a 2a 2a 20 69    An effort.** i
106b0 73 20 6d 61 64 65 20 74 6f 20 73 74 6f 72 65 20  s made to store 
106c0 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  the column value
106d0 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65   in register iRe
106e0 67 2c 20 62 75 74 20 74 68 69 73 20 69 73 0a 2a  g, but this is.*
106f0 2a 20 6e 6f 74 20 67 75 61 72 61 6e 74 65 65 64  * not guaranteed
10700 2e 20 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  .  The location 
10710 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61  of the column va
10720 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  lue is returned.
10730 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  .**.** There mus
10740 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63 75 72  t be an open cur
10750 73 6f 72 20 74 6f 20 70 54 61 62 20 69 6e 20 69  sor to pTab in i
10760 54 61 62 6c 65 20 77 68 65 6e 20 74 68 69 73 20  Table when this 
10770 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
10780 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c 75 6d  lled.  If iColum
10790 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73  n<0 then code is
107a0 20 67 65 6e 65 72 61 74 65 64 20 74 68 61 74 20   generated that 
107b0 65 78 74 72 61 63 74 73 20 74 68 65 20 72 6f 77  extracts the row
107c0 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  id..**.** This r
107d0 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 61 74 74  outine might att
107e0 65 6d 70 74 20 74 6f 20 72 65 75 73 65 20 74 68  empt to reuse th
107f0 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63  e value of the c
10800 6f 6c 75 6d 6e 20 74 68 61 74 0a 2a 2a 20 68 61  olumn that.** ha
10810 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6c  s already been l
10820 6f 61 64 65 64 20 69 6e 74 6f 20 61 20 72 65 67  oaded into a reg
10830 69 73 74 65 72 2e 20 20 54 68 65 20 76 61 6c 75  ister.  The valu
10840 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 0a 2a 2a  e will always.**
10850 20 62 65 20 75 73 65 64 20 69 66 20 69 74 20 68   be used if it h
10860 61 73 20 6e 6f 74 20 75 6e 64 65 72 67 6f 6e 65  as not undergone
10870 20 61 6e 79 20 61 66 66 69 6e 69 74 79 20 63 68   any affinity ch
10880 61 6e 67 65 73 2e 20 20 42 75 74 20 69 66 0a 2a  anges.  But if.*
10890 2a 20 61 6e 20 61 66 66 69 6e 69 74 79 20 63 68  * an affinity ch
108a0 61 6e 67 65 20 68 61 73 20 6f 63 63 75 72 72 65  ange has occurre
108b0 64 2c 20 74 68 65 6e 20 74 68 65 20 63 61 63 68  d, then the cach
108c0 65 64 20 76 61 6c 75 65 20 77 69 6c 6c 20 6f 6e  ed value will on
108d0 6c 79 20 62 65 0a 2a 2a 20 75 73 65 64 20 69 66  ly be.** used if
108e0 20 61 6c 6c 6f 77 41 66 66 43 68 6e 67 20 69 73   allowAffChng is
108f0 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   true..*/.int sq
10900 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
10910 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20  Column(.  Parse 
10920 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61  *pParse,   /* Pa
10930 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
10940 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
10950 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  t */.  Table *pT
10960 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72  ab,     /* Descr
10970 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61  iption of the ta
10980 62 6c 65 20 77 65 20 61 72 65 20 72 65 61 64 69  ble we are readi
10990 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ng from */.  int
109a0 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a   iColumn,     /*
109b0 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61   Index of the ta
109c0 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  ble column */.  
109d0 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
109e0 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70   /* The cursor p
109f0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74  ointing to the t
10a00 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  able */.  int iR
10a10 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 74  eg,        /* St
10a20 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65 72 65  ore results here
10a30 20 2a 2f 0a 20 20 69 6e 74 20 61 6c 6c 6f 77 41   */.  int allowA
10a40 66 66 43 68 6e 67 20 2f 2a 20 54 72 75 65 20 69  ffChng /* True i
10a50 66 20 70 72 69 6f 72 20 61 66 66 69 6e 69 74 79  f prior affinity
10a60 20 63 68 61 6e 67 65 73 20 61 72 65 20 4f 4b 20   changes are OK 
10a70 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
10a80 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
10a90 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
10aa0 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
10ab0 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  ..  for(i=0, p=p
10ac0 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
10ad0 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c  ; i<pParse->nCol
10ae0 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29  Cache; i++, p++)
10af0 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61  {.    if( p->iTa
10b00 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70  ble==iTable && p
10b10 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75  ->iColumn==iColu
10b20 6d 6e 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  mn.           &&
10b30 20 28 21 70 2d 3e 61 66 66 43 68 61 6e 67 65 20   (!p->affChange 
10b40 7c 7c 20 61 6c 6c 6f 77 41 66 66 43 68 6e 67 29  || allowAffChng)
10b50 20 29 7b 0a 23 69 66 20 30 0a 20 20 20 20 20 20   ){.#if 0.      
10b60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10b70 30 28 76 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20  0(v, OP_Noop);. 
10b80 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
10b90 28 28 76 2c 20 22 4f 50 54 3a 20 74 61 62 25 64  ((v, "OPT: tab%d
10ba0 2e 63 6f 6c 25 64 20 2d 3e 20 72 25 64 22 2c 20  .col%d -> r%d", 
10bb0 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c  iTable, iColumn,
10bc0 20 70 2d 3e 69 52 65 67 29 29 3b 0a 23 65 6e 64   p->iReg));.#end
10bd0 69 66 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  if.      return 
10be0 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20  p->iReg;.    }. 
10bf0 20 7d 20 20 0a 20 20 61 73 73 65 72 74 28 20 76   }  .  assert( v
10c00 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 43 6f  !=0 );.  if( iCo
10c10 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 69 6e  lumn<0 ){.    in
10c20 74 20 6f 70 20 3d 20 28 70 54 61 62 20 26 26 20  t op = (pTab && 
10c30 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 29  IsVirtual(pTab))
10c40 20 3f 20 4f 50 5f 56 52 6f 77 69 64 20 3a 20 4f   ? OP_VRowid : O
10c50 50 5f 52 6f 77 69 64 3b 0a 20 20 20 20 73 71 6c  P_Rowid;.    sql
10c60 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
10c70 2c 20 6f 70 2c 20 69 54 61 62 6c 65 2c 20 69 52  , op, iTable, iR
10c80 65 67 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  eg);.  }else if(
10c90 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
10ca0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10cb0 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
10cc0 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c  iTable, iColumn,
10cd0 20 69 52 65 67 29 3b 0a 20 20 7d 65 6c 73 65 7b   iReg);.  }else{
10ce0 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 49 73  .    int op = Is
10cf0 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 3f 20  Virtual(pTab) ? 
10d00 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f  OP_VColumn : OP_
10d10 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69  Column;.    sqli
10d20 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
10d30 20 6f 70 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f   op, iTable, iCo
10d40 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 20  lumn, iReg);.   
10d50 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65   sqlite3ColumnDe
10d60 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69  fault(v, pTab, i
10d70 43 6f 6c 75 6d 6e 29 3b 0a 23 69 66 6e 64 65 66  Column);.#ifndef
10d80 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
10d90 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
10da0 69 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  if( pTab->aCol[i
10db0 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79  Column].affinity
10dc0 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  ==SQLITE_AFF_REA
10dd0 4c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L ){.      sqlit
10de0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
10df0 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 2c  OP_RealAffinity,
10e00 20 69 52 65 67 29 3b 0a 20 20 20 20 7d 0a 23 65   iReg);.    }.#e
10e10 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66 28 20 70  ndif.  }.  if( p
10e20 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f  Parse->disableCo
10e30 6c 43 61 63 68 65 3d 3d 30 20 29 7b 0a 20 20 20  lCache==0 ){.   
10e40 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 6f   i = pParse->iCo
10e50 6c 43 61 63 68 65 3b 0a 20 20 20 20 70 20 3d 20  lCache;.    p = 
10e60 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  &pParse->aColCac
10e70 68 65 5b 69 5d 3b 0a 20 20 20 20 70 2d 3e 69 54  he[i];.    p->iT
10e80 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20  able = iTable;. 
10e90 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20     p->iColumn = 
10ea0 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 2d 3e  iColumn;.    p->
10eb0 69 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 20  iReg = iReg;.   
10ec0 20 70 2d 3e 61 66 66 43 68 61 6e 67 65 20 3d 20   p->affChange = 
10ed0 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20  0;.    i++;.    
10ee0 69 66 28 20 69 3e 3d 41 72 72 61 79 53 69 7a 65  if( i>=ArraySize
10ef0 28 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  (pParse->aColCac
10f00 68 65 29 20 29 20 69 20 3d 20 30 3b 0a 20 20 20  he) ) i = 0;.   
10f10 20 69 66 28 20 69 3e 70 50 61 72 73 65 2d 3e 6e   if( i>pParse->n
10f20 43 6f 6c 43 61 63 68 65 20 29 20 70 50 61 72 73  ColCache ) pPars
10f30 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 3d 20 69  e->nColCache = i
10f40 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 43  ;.    pParse->iC
10f50 6f 6c 43 61 63 68 65 20 3d 20 69 3b 0a 20 20 7d  olCache = i;.  }
10f60 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a  .  return iReg;.
10f70 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61  }../*.** Clear a
10f80 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  ll column cache 
10f90 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61 74  entries associat
10fa0 65 64 20 77 69 74 68 20 74 68 65 20 76 64 62 65  ed with the vdbe
10fb0 0a 2a 2a 20 63 75 72 73 6f 72 20 77 69 74 68 20  .** cursor with 
10fc0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 69 54  cursor number iT
10fd0 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  able..*/.void sq
10fe0 6c 69 74 65 33 45 78 70 72 43 6c 65 61 72 43 6f  lite3ExprClearCo
10ff0 6c 75 6d 6e 43 61 63 68 65 28 50 61 72 73 65 20  lumnCache(Parse 
11000 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61  *pParse, int iTa
11010 62 6c 65 29 7b 0a 20 20 69 66 28 20 69 54 61 62  ble){.  if( iTab
11020 6c 65 3c 30 20 29 7b 0a 20 20 20 20 70 50 61 72  le<0 ){.    pPar
11030 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 3d 20  se->nColCache = 
11040 30 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69  0;.    pParse->i
11050 43 6f 6c 43 61 63 68 65 20 3d 20 30 3b 0a 20 20  ColCache = 0;.  
11060 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69  }else{.    int i
11070 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
11080 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63  <pParse->nColCac
11090 68 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  he; i++){.      
110a0 69 66 28 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c  if( pParse->aCol
110b0 43 61 63 68 65 5b 69 5d 2e 69 54 61 62 6c 65 3d  Cache[i].iTable=
110c0 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  =iTable ){.     
110d0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d     testcase( i==
110e0 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
110f0 65 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70  e-1 );.        p
11100 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
11110 5b 69 5d 20 3d 20 70 50 61 72 73 65 2d 3e 61 43  [i] = pParse->aC
11120 6f 6c 43 61 63 68 65 5b 2d 2d 70 50 61 72 73 65  olCache[--pParse
11130 2d 3e 6e 43 6f 6c 43 61 63 68 65 5d 3b 0a 20 20  ->nColCache];.  
11140 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69 43        pParse->iC
11150 6f 6c 43 61 63 68 65 20 3d 20 70 50 61 72 73 65  olCache = pParse
11160 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 0a 20 20 20  ->nColCache;.   
11170 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
11180 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74  ../*.** Record t
11190 68 65 20 66 61 63 74 20 74 68 61 74 20 61 6e 20  he fact that an 
111a0 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65 20  affinity change 
111b0 68 61 73 20 6f 63 63 75 72 72 65 64 20 6f 6e 20  has occurred on 
111c0 69 43 6f 75 6e 74 0a 2a 2a 20 72 65 67 69 73 74  iCount.** regist
111d0 65 72 73 20 73 74 61 72 74 69 6e 67 20 77 69 74  ers starting wit
111e0 68 20 69 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69  h iStart..*/.voi
111f0 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
11200 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
11210 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
11220 69 6e 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20  int iStart, int 
11230 69 43 6f 75 6e 74 29 7b 0a 20 20 69 6e 74 20 69  iCount){.  int i
11240 45 6e 64 20 3d 20 69 53 74 61 72 74 20 2b 20 69  End = iStart + i
11250 43 6f 75 6e 74 20 2d 20 31 3b 0a 20 20 69 6e 74  Count - 1;.  int
11260 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
11270 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63  <pParse->nColCac
11280 68 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  he; i++){.    in
11290 74 20 72 20 3d 20 70 50 61 72 73 65 2d 3e 61 43  t r = pParse->aC
112a0 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65 67 3b  olCache[i].iReg;
112b0 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 53 74 61  .    if( r>=iSta
112c0 72 74 20 26 26 20 72 3c 3d 69 45 6e 64 20 29 7b  rt && r<=iEnd ){
112d0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61  .      pParse->a
112e0 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 61 66 66 43  ColCache[i].affC
112f0 68 61 6e 67 65 20 3d 20 31 3b 0a 20 20 20 20 7d  hange = 1;.    }
11300 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
11310 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d  nerate code to m
11320 6f 76 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ove content from
11330 20 72 65 67 69 73 74 65 72 73 20 69 46 72 6f 6d   registers iFrom
11340 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a  ...iFrom+nReg-1.
11350 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e  ** over to iTo..
11360 69 54 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65 65 70  iTo+nReg-1. Keep
11370 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
11380 65 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f  e up-to-date..*/
11390 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
113a0 72 43 6f 64 65 4d 6f 76 65 28 50 61 72 73 65 20  rCodeMove(Parse 
113b0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72  *pParse, int iFr
113c0 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74  om, int iTo, int
113d0 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b   nReg){.  int i;
113e0 0a 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 69 54  .  if( iFrom==iT
113f0 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  o ) return;.  sq
11400 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
11410 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
11420 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c 20 69  P_Move, iFrom, i
11430 54 6f 2c 20 6e 52 65 67 29 3b 0a 20 20 66 6f 72  To, nReg);.  for
11440 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e  (i=0; i<pParse->
11450 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 29 7b  nColCache; i++){
11460 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 70 50 61  .    int x = pPa
11470 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69  rse->aColCache[i
11480 5d 2e 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20  ].iReg;.    if( 
11490 78 3e 3d 69 46 72 6f 6d 20 26 26 20 78 3c 69 46  x>=iFrom && x<iF
114a0 72 6f 6d 2b 6e 52 65 67 20 29 7b 0a 20 20 20 20  rom+nReg ){.    
114b0 20 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61    pParse->aColCa
114c0 63 68 65 5b 69 5d 2e 69 52 65 67 20 2b 3d 20 69  che[i].iReg += i
114d0 54 6f 2d 69 46 72 6f 6d 3b 0a 20 20 20 20 7d 0a  To-iFrom;.    }.
114e0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
114f0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63 6f  erate code to co
11500 70 79 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  py content from 
11510 72 65 67 69 73 74 65 72 73 20 69 46 72 6f 6d 2e  registers iFrom.
11520 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a  ..iFrom+nReg-1.*
11530 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69  * over to iTo..i
11540 54 6f 2b 6e 52 65 67 2d 31 2e 0a 2a 2f 0a 76 6f  To+nReg-1..*/.vo
11550 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
11560 64 65 43 6f 70 79 28 50 61 72 73 65 20 2a 70 50  deCopy(Parse *pP
11570 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c  arse, int iFrom,
11580 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e 52   int iTo, int nR
11590 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  eg){.  int i;.  
115a0 69 66 28 20 69 46 72 6f 6d 3d 3d 69 54 6f 20 29  if( iFrom==iTo )
115b0 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
115c0 3d 30 3b 20 69 3c 6e 52 65 67 3b 20 69 2b 2b 29  =0; i<nReg; i++)
115d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
115e0 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e  eAddOp2(pParse->
115f0 70 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c 20  pVdbe, OP_Copy, 
11600 69 46 72 6f 6d 2b 69 2c 20 69 54 6f 2b 69 29 3b  iFrom+i, iTo+i);
11610 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
11620 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 79  turn true if any
11630 20 72 65 67 69 73 74 65 72 20 69 6e 20 74 68 65   register in the
11640 20 72 61 6e 67 65 20 69 46 72 6f 6d 2e 2e 69 54   range iFrom..iT
11650 6f 20 28 69 6e 63 6c 75 73 69 76 65 29 0a 2a 2a  o (inclusive).**
11660 20 69 73 20 75 73 65 64 20 61 73 20 70 61 72 74   is used as part
11670 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63   of the column c
11680 61 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ache..*/.static 
11690 69 6e 74 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e  int usedAsColumn
116a0 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61  Cache(Parse *pPa
116b0 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20  rse, int iFrom, 
116c0 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69 6e 74 20  int iTo){.  int 
116d0 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
116e0 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
116f0 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  e; i++){.    int
11700 20 72 20 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f   r = pParse->aCo
11710 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65 67 3b 0a  lCache[i].iReg;.
11720 20 20 20 20 69 66 28 20 72 3e 3d 69 46 72 6f 6d      if( r>=iFrom
11730 20 26 26 20 72 3c 3d 69 54 6f 20 29 20 72 65 74   && r<=iTo ) ret
11740 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
11750 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
11760 54 68 65 72 65 73 20 69 73 20 61 20 76 61 6c 75  Theres is a valu
11770 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 43  e in register iC
11780 75 72 72 65 6e 74 2e 20 20 57 65 20 75 6c 74 69  urrent.  We ulti
11790 6d 61 74 65 6c 79 20 77 61 6e 74 0a 2a 2a 20 74  mately want.** t
117a0 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20 69  he value to be i
117b0 6e 20 72 65 67 69 73 74 65 72 20 69 54 61 72 67  n register iTarg
117c0 65 74 2e 20 20 49 74 20 6d 69 67 68 74 20 62 65  et.  It might be
117d0 20 74 68 61 74 0a 2a 2a 20 69 43 75 72 72 65 6e   that.** iCurren
117e0 74 20 61 6e 64 20 69 54 61 72 67 65 74 20 61 72  t and iTarget ar
117f0 65 20 74 68 65 20 73 61 6d 65 20 72 65 67 69 73  e the same regis
11800 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 72  ter..**.** We ar
11810 65 20 67 6f 69 6e 67 20 74 6f 20 6d 6f 64 69 66  e going to modif
11820 79 20 74 68 65 20 76 61 6c 75 65 2c 20 73 6f 20  y the value, so 
11830 77 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20  we need to make 
11840 73 75 72 65 20 69 74 0a 2a 2a 20 69 73 20 6e 6f  sure it.** is no
11850 74 20 61 20 63 61 63 68 65 64 20 72 65 67 69 73  t a cached regis
11860 74 65 72 2e 20 20 49 66 20 69 43 75 72 72 65 6e  ter.  If iCurren
11870 74 20 69 73 20 61 20 63 61 63 68 65 64 20 72 65  t is a cached re
11880 67 69 73 74 65 72 2c 0a 2a 2a 20 74 68 65 6e 20  gister,.** then 
11890 74 72 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20  try to move the 
118a0 76 61 6c 75 65 20 6f 76 65 72 20 74 6f 20 69 54  value over to iT
118b0 61 72 67 65 74 2e 20 20 49 66 20 69 54 61 72 67  arget.  If iTarg
118c0 65 74 20 69 73 20 61 0a 2a 2a 20 63 61 63 68 65  et is a.** cache
118d0 64 20 72 65 67 69 73 74 65 72 2c 20 74 68 65 6e  d register, then
118e0 20 63 6c 65 61 72 20 74 68 65 20 63 6f 72 72 65   clear the corre
118f0 73 70 6f 6e 64 69 6e 67 20 63 61 63 68 65 20 6c  sponding cache l
11900 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ine..**.** Retur
11910 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20 74  n the register t
11920 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 65 6e  hat the value en
11930 64 73 20 75 70 20 69 6e 2e 0a 2a 2f 0a 69 6e 74  ds up in..*/.int
11940 20 73 71 6c 69 74 65 33 45 78 70 72 57 72 69 74   sqlite3ExprWrit
11950 61 62 6c 65 52 65 67 69 73 74 65 72 28 50 61 72  ableRegister(Par
11960 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
11970 69 43 75 72 72 65 6e 74 2c 20 69 6e 74 20 69 54  iCurrent, int iT
11980 61 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69 3b  arget){.  int i;
11990 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
119a0 65 2d 3e 70 56 64 62 65 21 3d 30 20 29 3b 0a 20  e->pVdbe!=0 );. 
119b0 20 69 66 28 20 21 75 73 65 64 41 73 43 6f 6c 75   if( !usedAsColu
119c0 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c 20  mnCache(pParse, 
119d0 69 43 75 72 72 65 6e 74 2c 20 69 43 75 72 72 65  iCurrent, iCurre
119e0 6e 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  nt) ){.    retur
119f0 6e 20 69 43 75 72 72 65 6e 74 3b 0a 20 20 7d 0a  n iCurrent;.  }.
11a00 20 20 69 66 28 20 69 43 75 72 72 65 6e 74 21 3d    if( iCurrent!=
11a10 69 54 61 72 67 65 74 20 29 7b 0a 20 20 20 20 73  iTarget ){.    s
11a20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
11a30 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
11a40 4f 50 5f 53 43 6f 70 79 2c 20 69 43 75 72 72 65  OP_SCopy, iCurre
11a50 6e 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20  nt, iTarget);.  
11a60 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
11a70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65  Parse->nColCache
11a80 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
11a90 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
11aa0 65 5b 69 5d 2e 69 52 65 67 3d 3d 69 54 61 72 67  e[i].iReg==iTarg
11ab0 65 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  et ){.      pPar
11ac0 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d  se->aColCache[i]
11ad0 20 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   = pParse->aColC
11ae0 61 63 68 65 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e  ache[--pParse->n
11af0 43 6f 6c 43 61 63 68 65 5d 3b 0a 20 20 20 20 20  ColCache];.     
11b00 20 70 50 61 72 73 65 2d 3e 69 43 6f 6c 43 61 63   pParse->iColCac
11b10 68 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 43 6f  he = pParse->nCo
11b20 6c 43 61 63 68 65 3b 0a 20 20 20 20 7d 0a 20 20  lCache;.    }.  
11b30 7d 0a 20 20 72 65 74 75 72 6e 20 69 54 61 72 67  }.  return iTarg
11b40 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  et;.}../*.** If 
11b50 74 68 65 20 6c 61 73 74 20 69 6e 73 74 72 75 63  the last instruc
11b60 74 69 6f 6e 20 63 6f 64 65 64 20 69 73 20 61 6e  tion coded is an
11b70 20 65 70 68 65 6d 65 72 61 6c 20 63 6f 70 79 20   ephemeral copy 
11b80 6f 66 20 61 6e 79 20 6f 66 0a 2a 2a 20 74 68 65  of any of.** the
11b90 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 74 68   registers in th
11ba0 65 20 6e 52 65 67 20 72 65 67 69 73 74 65 72 73  e nReg registers
11bb0 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20   beginning with 
11bc0 69 52 65 67 2c 20 74 68 65 6e 0a 2a 2a 20 63 6f  iReg, then.** co
11bd0 6e 76 65 72 74 20 74 68 65 20 6c 61 73 74 20 69  nvert the last i
11be0 6e 73 74 72 75 63 74 69 6f 6e 20 66 72 6f 6d 20  nstruction from 
11bf0 4f 50 5f 53 43 6f 70 79 20 74 6f 20 4f 50 5f 43  OP_SCopy to OP_C
11c00 6f 70 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  opy..*/.void sql
11c10 69 74 65 33 45 78 70 72 48 61 72 64 43 6f 70 79  ite3ExprHardCopy
11c20 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
11c30 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52  int iReg, int nR
11c40 65 67 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b  eg){.  int addr;
11c50 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a  .  VdbeOp *pOp;.
11c60 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 76 20    Vdbe *v;..  v 
11c70 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
11c80 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  .  addr = sqlite
11c90 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
11ca0 28 76 29 3b 0a 20 20 70 4f 70 20 3d 20 73 71 6c  (v);.  pOp = sql
11cb0 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
11cc0 20 61 64 64 72 2d 31 29 3b 0a 20 20 61 73 73 65   addr-1);.  asse
11cd0 72 74 28 20 70 4f 70 20 7c 7c 20 70 50 61 72 73  rt( pOp || pPars
11ce0 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
11cf0 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 4f 70  led );.  if( pOp
11d00 20 26 26 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d   && pOp->opcode=
11d10 3d 4f 50 5f 53 43 6f 70 79 20 26 26 20 70 4f 70  =OP_SCopy && pOp
11d20 2d 3e 70 31 3e 3d 69 52 65 67 20 26 26 20 70 4f  ->p1>=iReg && pO
11d30 70 2d 3e 70 31 3c 69 52 65 67 2b 6e 52 65 67 20  p->p1<iReg+nReg 
11d40 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f  ){.    pOp->opco
11d50 64 65 20 3d 20 4f 50 5f 43 6f 70 79 3b 0a 20 20  de = OP_Copy;.  
11d60 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
11d70 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
11d80 65 20 63 75 72 72 65 6e 74 20 56 64 62 65 20 74  e current Vdbe t
11d90 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 67  o evaluate the g
11da0 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69  iven.** expressi
11db0 6f 6e 2e 20 20 41 74 74 65 6d 70 74 20 74 6f 20  on.  Attempt to 
11dc0 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
11dd0 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 22 74  s in register "t
11de0 61 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75 72  arget"..** Retur
11df0 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20 77  n the register w
11e00 68 65 72 65 20 72 65 73 75 6c 74 73 20 61 72 65  here results are
11e10 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57   stored..**.** W
11e20 69 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ith this routine
11e30 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 67 75  , there is no gu
11e40 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 72 65  aranteed that re
11e50 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65  sults will.** be
11e60 20 73 74 6f 72 65 64 20 69 6e 20 74 61 72 67 65   stored in targe
11e70 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d  t.  The result m
11e80 69 67 68 74 20 62 65 20 73 74 6f 72 65 64 20 69  ight be stored i
11e90 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  n some other.** 
11ea0 72 65 67 69 73 74 65 72 20 69 66 20 69 74 20 69  register if it i
11eb0 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20  s convenient to 
11ec0 64 6f 20 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c  do so.  The call
11ed0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ing function.** 
11ee0 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65 20 72  must check the r
11ef0 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d  eturn code and m
11f00 6f 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ove the results 
11f10 74 6f 20 74 68 65 20 64 65 73 69 72 65 64 0a 2a  to the desired.*
11f20 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69  * register..*/.i
11f30 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
11f40 64 65 54 61 72 67 65 74 28 50 61 72 73 65 20 2a  deTarget(Parse *
11f50 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
11f60 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
11f70 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
11f80 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a  arse->pVdbe;  /*
11f90 20 54 68 65 20 56 4d 20 75 6e 64 65 72 20 63 6f   The VM under co
11fa0 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
11fb0 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
11fc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
11fd0 20 6f 70 63 6f 64 65 20 62 65 69 6e 67 20 63 6f   opcode being co
11fe0 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52  ded */.  int inR
11ff0 65 67 20 3d 20 74 61 72 67 65 74 3b 20 20 20 20  eg = target;    
12000 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 73 74     /* Results st
12010 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72  ored in register
12020 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20   inReg */.  int 
12030 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20 20 20  regFree1 = 0;   
12040 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d        /* If non-
12050 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20 74  zero free this t
12060 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
12070 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72  r */.  int regFr
12080 65 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ee2 = 0;        
12090 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20   /* If non-zero 
120a0 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72  free this tempor
120b0 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  ary register */.
120c0 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33    int r1, r2, r3
120d0 2c 20 72 34 3b 20 20 20 20 20 20 20 2f 2a 20 56  , r4;       /* V
120e0 61 72 69 6f 75 73 20 72 65 67 69 73 74 65 72 20  arious register 
120f0 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 61 73  numbers */..  as
12100 73 65 72 74 28 20 76 21 3d 30 20 7c 7c 20 70 50  sert( v!=0 || pP
12110 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
12120 46 61 69 6c 65 64 20 29 3b 0a 20 20 61 73 73 65  Failed );.  asse
12130 72 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20  rt( target>0 && 
12140 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e  target<=pParse->
12150 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d  nMem );.  if( v=
12160 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  =0 ) return 0;..
12170 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
12180 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55  {.    op = TK_NU
12190 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LL;.  }else{.   
121a0 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
121b0 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f  .  }.  switch( o
121c0 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
121d0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  _AGG_COLUMN: {. 
121e0 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 41       AggInfo *pA
121f0 67 67 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e  ggInfo = pExpr->
12200 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
12210 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
12220 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67  ol *pCol = &pAgg
12230 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72  Info->aCol[pExpr
12240 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20 20 20 69  ->iAgg];.      i
12250 66 28 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69  f( !pAggInfo->di
12260 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20  rectMode ){.    
12270 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
12280 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20  ->iMem>0 );.    
12290 20 20 20 20 69 6e 52 65 67 20 3d 20 70 43 6f 6c      inReg = pCol
122a0 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->iMem;.        
122b0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c  break;.      }el
122c0 73 65 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d  se if( pAggInfo-
122d0 3e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 29  >useSortingIdx )
122e0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
122f0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
12300 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e  P_Column, pAggIn
12310 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64 78 2c 0a  fo->sortingIdx,.
12320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
12340 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
12350 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  n, target);.    
12360 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
12370 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68 65   }.      /* Othe
12380 72 77 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 75  rwise, fall thru
12390 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c   into the TK_COL
123a0 55 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  UMN case */.    
123b0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  }.    case TK_CO
123c0 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66  LUMN: {.      if
123d0 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3c  ( pExpr->iTable<
123e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
123f0 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e  This only happen
12400 73 20 77 68 65 6e 20 63 6f 64 69 6e 67 20 63 68  s when coding ch
12410 65 63 6b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  eck constraints 
12420 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
12430 74 28 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73  t( pParse->ckBas
12440 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  e>0 );.        i
12450 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 43  nReg = pExpr->iC
12460 6f 6c 75 6d 6e 20 2b 20 70 50 61 72 73 65 2d 3e  olumn + pParse->
12470 63 6b 42 61 73 65 3b 0a 20 20 20 20 20 20 7d 65  ckBase;.      }e
12480 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73  lse{.        tes
12490 74 63 61 73 65 28 20 28 70 45 78 70 72 2d 3e 66  tcase( (pExpr->f
124a0 6c 61 67 73 20 26 20 45 50 5f 41 6e 79 41 66 66  lags & EP_AnyAff
124b0 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )!=0 );.        
124c0 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
124d0 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
124e0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
124f0 70 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20  pTab,.          
12500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12510 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
12520 6f 6c 75 6d 6e 2c 20 70 45 78 70 72 2d 3e 69 54  olumn, pExpr->iT
12530 61 62 6c 65 2c 20 74 61 72 67 65 74 2c 0a 20 20  able, target,.  
12540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
12560 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
12570 5f 41 6e 79 41 66 66 29 3b 0a 20 20 20 20 20 20  _AnyAff);.      
12580 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
12590 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
125a0 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
125b0 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 76 2c    codeInteger(v,
125c0 20 70 45 78 70 72 2c 20 30 2c 20 74 61 72 67 65   pExpr, 0, targe
125d0 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
125e0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
125f0 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20  TK_FLOAT: {.    
12600 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 28 63    codeReal(v, (c
12610 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65  har*)pExpr->toke
12620 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  n.z, pExpr->toke
12630 6e 2e 6e 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  n.n, 0, target);
12640 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
12650 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
12660 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20  STRING: {.      
12670 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 45 78  sqlite3DequoteEx
12680 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  pr(pParse->db, p
12690 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  Expr);.      sql
126a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
126b0 2c 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20  ,OP_String8, 0, 
126c0 74 61 72 67 65 74 2c 20 30 2c 0a 20 20 20 20 20  target, 0,.     
126d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126e0 20 20 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d     (char*)pExpr-
126f0 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d  >token.z, pExpr-
12700 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20  >token.n);.     
12710 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
12720 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20    case TK_NULL: 
12730 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
12740 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12750 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29  Null, 0, target)
12760 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
12770 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
12780 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49  ITE_OMIT_BLOB_LI
12790 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54  TERAL.    case T
127a0 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20  K_BLOB: {.      
127b0 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e  int n;.      con
127c0 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20  st char *z;.    
127d0 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20    char *zBlob;. 
127e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
127f0 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3e 3d 33 20 29  pr->token.n>=3 )
12800 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
12810 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30  pExpr->token.z[0
12820 5d 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70 72 2d  ]=='x' || pExpr-
12830 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d 3d 27 58 27  >token.z[0]=='X'
12840 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
12850 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  ( pExpr->token.z
12860 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20  [1]=='\'' );.   
12870 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
12880 2d 3e 74 6f 6b 65 6e 2e 7a 5b 70 45 78 70 72 2d  ->token.z[pExpr-
12890 3e 74 6f 6b 65 6e 2e 6e 2d 31 5d 3d 3d 27 5c 27  >token.n-1]=='\'
128a0 27 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 70  ' );.      n = p
128b0 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 2d 20  Expr->token.n - 
128c0 33 3b 0a 20 20 20 20 20 20 7a 20 3d 20 28 63 68  3;.      z = (ch
128d0 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  ar*)pExpr->token
128e0 2e 7a 20 2b 20 32 3b 0a 20 20 20 20 20 20 7a 42  .z + 2;.      zB
128f0 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 48 65 78  lob = sqlite3Hex
12900 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65 33 56 64  ToBlob(sqlite3Vd
12910 62 65 44 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a  beDb(v), z, n);.
12920 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12930 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c  eAddOp4(v, OP_Bl
12940 6f 62 2c 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c  ob, n/2, target,
12950 20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59   0, zBlob, P4_DY
12960 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 62 72  NAMIC);.      br
12970 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
12980 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41  f.    case TK_VA
12990 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20  RIABLE: {.      
129a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
129b0 32 28 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65  2(v, OP_Variable
129c0 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
129d0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
129e0 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  if( pExpr->token
129f0 2e 6e 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  .n>1 ){.        
12a00 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
12a10 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72  eP4(v, -1, (char
12a20 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  *)pExpr->token.z
12a30 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  , pExpr->token.n
12a40 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
12a50 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
12a60 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54    case TK_REGIST
12a70 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65  ER: {.      inRe
12a80 67 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  g = pExpr->iTabl
12a90 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e;.      break;.
12aa0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
12ab0 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20  LITE_OMIT_CAST. 
12ac0 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a     case TK_CAST:
12ad0 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72   {.      /* Expr
12ae0 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66  essions of the f
12af0 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66  orm:   CAST(pLef
12b00 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20  t AS token) */. 
12b10 20 20 20 20 20 69 6e 74 20 61 66 66 2c 20 74 6f       int aff, to
12b20 5f 6f 70 3b 0a 20 20 20 20 20 20 69 6e 52 65 67  _op;.      inReg
12b30 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
12b40 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
12b50 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74   pExpr->pLeft, t
12b60 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 61 66  arget);.      af
12b70 66 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e  f = sqlite3Affin
12b80 69 74 79 54 79 70 65 28 26 70 45 78 70 72 2d 3e  ityType(&pExpr->
12b90 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 74 6f  token);.      to
12ba0 5f 6f 70 20 3d 20 61 66 66 20 2d 20 53 51 4c 49  _op = aff - SQLI
12bb0 54 45 5f 41 46 46 5f 54 45 58 54 20 2b 20 4f 50  TE_AFF_TEXT + OP
12bc0 5f 54 6f 54 65 78 74 3b 0a 20 20 20 20 20 20 61  _ToText;.      a
12bd0 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50  ssert( to_op==OP
12be0 5f 54 6f 54 65 78 74 20 20 20 20 7c 7c 20 61 66  _ToText    || af
12bf0 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  f!=SQLITE_AFF_TE
12c00 58 54 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61  XT    );.      a
12c10 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50  ssert( to_op==OP
12c20 5f 54 6f 42 6c 6f 62 20 20 20 20 7c 7c 20 61 66  _ToBlob    || af
12c30 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  f!=SQLITE_AFF_NO
12c40 4e 45 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61  NE    );.      a
12c50 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50  ssert( to_op==OP
12c60 5f 54 6f 4e 75 6d 65 72 69 63 20 7c 7c 20 61 66  _ToNumeric || af
12c70 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f!=SQLITE_AFF_NU
12c80 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 20 20 61  MERIC );.      a
12c90 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50  ssert( to_op==OP
12ca0 5f 54 6f 49 6e 74 20 20 20 20 20 7c 7c 20 61 66  _ToInt     || af
12cb0 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  f!=SQLITE_AFF_IN
12cc0 54 45 47 45 52 20 29 3b 0a 20 20 20 20 20 20 61  TEGER );.      a
12cd0 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50  ssert( to_op==OP
12ce0 5f 54 6f 52 65 61 6c 20 20 20 20 7c 7c 20 61 66  _ToReal    || af
12cf0 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  f!=SQLITE_AFF_RE
12d00 41 4c 20 20 20 20 29 3b 0a 20 20 20 20 20 20 74  AL    );.      t
12d10 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d  estcase( to_op==
12d20 4f 50 5f 54 6f 54 65 78 74 20 29 3b 0a 20 20 20  OP_ToText );.   
12d30 20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f     testcase( to_
12d40 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20 29 3b  op==OP_ToBlob );
12d50 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
12d60 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d   to_op==OP_ToNum
12d70 65 72 69 63 20 29 3b 0a 20 20 20 20 20 20 74 65  eric );.      te
12d80 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f  stcase( to_op==O
12d90 50 5f 54 6f 49 6e 74 20 29 3b 0a 20 20 20 20 20  P_ToInt );.     
12da0 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70   testcase( to_op
12db0 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20 29 3b 0a 20  ==OP_ToReal );. 
12dc0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12dd0 41 64 64 4f 70 31 28 76 2c 20 74 6f 5f 6f 70 2c  AddOp1(v, to_op,
12de0 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 74   inReg);.      t
12df0 65 73 74 63 61 73 65 28 20 75 73 65 64 41 73 43  estcase( usedAsC
12e00 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73  olumnCache(pPars
12e10 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65 67 29  e, inReg, inReg)
12e20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
12e30 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
12e40 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
12e50 20 69 6e 52 65 67 2c 20 31 29 3b 0a 20 20 20 20   inReg, 1);.    
12e60 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
12e70 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
12e80 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20  OMIT_CAST */.   
12e90 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
12ea0 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
12eb0 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
12ec0 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
12ed0 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
12ee0 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
12ef0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
12f00 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20  LT==OP_Lt );.   
12f10 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45     assert( TK_LE
12f20 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20  ==OP_Le );.     
12f30 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d   assert( TK_GT==
12f40 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20 20 20 61  OP_Gt );.      a
12f50 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50  ssert( TK_GE==OP
12f60 5f 47 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Ge );.      ass
12f70 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45  ert( TK_EQ==OP_E
12f80 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  q );.      asser
12f90 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20  t( TK_NE==OP_Ne 
12fa0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
12fb0 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a  e( op==TK_LT );.
12fc0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
12fd0 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20  op==TK_LE );.   
12fe0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
12ff0 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20  =TK_GT );.      
13000 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
13010 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _GE );.      tes
13020 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51  tcase( op==TK_EQ
13030 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
13040 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b  se( op==TK_NE );
13050 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
13060 72 65 4f 70 65 72 61 6e 64 73 28 70 50 61 72 73  reOperands(pPars
13070 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
13080 20 26 72 31 2c 20 26 72 65 67 46 72 65 65 31 2c   &r1, &regFree1,
13090 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
130a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130b0 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74     pExpr->pRight
130c0 2c 20 26 72 32 2c 20 26 72 65 67 46 72 65 65 32  , &r2, &regFree2
130d0 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
130e0 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
130f0 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
13100 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
13110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13120 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53  r1, r2, inReg, S
13130 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a  QLITE_STOREP2);.
13140 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
13150 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
13160 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
13170 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
13180 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
13190 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
131a0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  :.    case TK_OR
131b0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c  :.    case TK_PL
131c0 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  US:.    case TK_
131d0 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54  STAR:.    case T
131e0 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73  K_MINUS:.    cas
131f0 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61  e TK_REM:.    ca
13200 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20  se TK_BITAND:.  
13210 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a    case TK_BITOR:
13220 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41  .    case TK_SLA
13230 53 48 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  SH:.    case TK_
13240 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65  LSHIFT:.    case
13250 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20   TK_RSHIFT: .   
13260 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a   case TK_CONCAT:
13270 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
13280 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20   TK_AND==OP_And 
13290 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
132a0 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b   TK_OR==OP_Or );
132b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
132c0 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29  K_PLUS==OP_Add )
132d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
132e0 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62  TK_MINUS==OP_Sub
132f0 74 72 61 63 74 20 29 3b 0a 20 20 20 20 20 20 61  tract );.      a
13300 73 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f  ssert( TK_REM==O
13310 50 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b 0a 20  P_Remainder );. 
13320 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
13330 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e  BITAND==OP_BitAn
13340 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d );.      asser
13350 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f  t( TK_BITOR==OP_
13360 42 69 74 4f 72 20 29 3b 0a 20 20 20 20 20 20 61  BitOr );.      a
13370 73 73 65 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d  ssert( TK_SLASH=
13380 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b 0a 20 20  =OP_Divide );.  
13390 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
133a0 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c  SHIFT==OP_ShiftL
133b0 65 66 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  eft );.      ass
133c0 65 72 74 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d  ert( TK_RSHIFT==
133d0 4f 50 5f 53 68 69 66 74 52 69 67 68 74 20 29 3b  OP_ShiftRight );
133e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
133f0 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e  K_CONCAT==OP_Con
13400 63 61 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73  cat );.      tes
13410 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e  tcase( op==TK_AN
13420 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  D );.      testc
13430 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29  ase( op==TK_OR )
13440 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
13450 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b  ( op==TK_PLUS );
13460 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
13470 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b   op==TK_MINUS );
13480 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
13490 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20   op==TK_REM );. 
134a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
134b0 70 3d 3d 54 4b 5f 42 49 54 41 4e 44 20 29 3b 0a  p==TK_BITAND );.
134c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
134d0 6f 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a  op==TK_BITOR );.
134e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
134f0 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a  op==TK_SLASH );.
13500 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
13510 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20 29 3b  op==TK_LSHIFT );
13520 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
13530 20 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29   op==TK_RSHIFT )
13540 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
13550 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20  ( op==TK_CONCAT 
13560 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
13570 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
13580 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
13590 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
135a0 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
135b0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
135c0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
135d0 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
135e0 65 65 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee2);.      sqli
135f0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
13600 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74 61 72   op, r2, r1, tar
13610 67 65 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  get);.      test
13620 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
13630 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
13640 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
13650 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
13660 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
13670 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
13680 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
13690 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
136a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65       assert( pLe
136b0 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ft );.      if( 
136c0 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c  pLeft->op==TK_FL
136d0 4f 41 54 20 7c 7c 20 70 4c 65 66 74 2d 3e 6f 70  OAT || pLeft->op
136e0 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a  ==TK_INTEGER ){.
136f0 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 66          if( pLef
13700 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20  t->op==TK_FLOAT 
13710 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 64  ){.          cod
13720 65 52 65 61 6c 28 76 2c 20 28 63 68 61 72 2a 29  eReal(v, (char*)
13730 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  pLeft->token.z, 
13740 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20  pLeft->token.n, 
13750 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
13760 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13770 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72       codeInteger
13780 28 76 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74 61  (v, pLeft, 1, ta
13790 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  rget);.        }
137a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
137b0 20 20 20 20 20 20 72 65 67 46 72 65 65 31 20 3d        regFree1 =
137c0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
137d0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
137e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
137f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13800 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 31 29  _Integer, 0, r1)
13810 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73  ;.        r2 = s
13820 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
13830 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
13840 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
13850 65 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  e2);.        sql
13860 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
13870 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72  , OP_Subtract, r
13880 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a  2, r1, target);.
13890 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
138a0 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
138b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
138c0 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20  nReg = target;. 
138d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
138e0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  }.    case TK_BI
138f0 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54  TNOT:.    case T
13900 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61  K_NOT: {.      a
13910 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54  ssert( TK_BITNOT
13920 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 0a 20  ==OP_BitNot );. 
13930 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
13940 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 0a 20  NOT==OP_Not );. 
13950 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
13960 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a  p==TK_BITNOT );.
13970 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
13980 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20  op==TK_NOT );.  
13990 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
139a0 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
139b0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
139c0 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b  >pLeft, target);
139d0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
139e0 20 69 6e 52 65 67 3d 3d 74 61 72 67 65 74 20 29   inReg==target )
139f0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
13a00 28 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61  ( usedAsColumnCa
13a10 63 68 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65  che(pParse, inRe
13a20 67 2c 20 69 6e 52 65 67 29 20 29 3b 0a 20 20 20  g, inReg) );.   
13a30 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
13a40 65 33 45 78 70 72 57 72 69 74 61 62 6c 65 52 65  e3ExprWritableRe
13a50 67 69 73 74 65 72 28 70 50 61 72 73 65 2c 20 69  gister(pParse, i
13a60 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20  nReg, target);. 
13a70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13a80 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20 69 6e  AddOp1(v, op, in
13a90 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Reg);.      brea
13aa0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
13ab0 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
13ac0 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
13ad0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  : {.      int ad
13ae0 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  dr;.      assert
13af0 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f  ( TK_ISNULL==OP_
13b00 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20  IsNull );.      
13b10 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55  assert( TK_NOTNU
13b20 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  LL==OP_NotNull )
13b30 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
13b40 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ( op==TK_ISNULL 
13b50 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
13b60 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  e( op==TK_NOTNUL
13b70 4c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  L );.      sqlit
13b80 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13b90 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74  OP_Integer, 1, t
13ba0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 31  arget);.      r1
13bb0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
13bc0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
13bd0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
13be0 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74  gFree1);.      t
13bf0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
13c00 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 64  1==0 );.      ad
13c10 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
13c20 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31  AddOp1(v, op, r1
13c30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13c40 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13c50 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c  _AddImm, target,
13c60 20 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   -1);.      sqli
13c70 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
13c80 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20  v, addr);.      
13c90 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
13ca0 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
13cb0 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41  CTION: {.      A
13cc0 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20  ggInfo *pInfo = 
13cd0 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b  pExpr->pAggInfo;
13ce0 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f  .      if( pInfo
13cf0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
13d00 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
13d10 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f  Parse, "misuse o
13d20 66 20 61 67 67 72 65 67 61 74 65 3a 20 25 54 22  f aggregate: %T"
13d30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 70  ,.            &p
13d40 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20  Expr->span);.   
13d50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13d60 20 20 69 6e 52 65 67 20 3d 20 70 49 6e 66 6f 2d    inReg = pInfo-
13d70 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41  >aFunc[pExpr->iA
13d80 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20 20  gg].iMem;.      
13d90 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
13da0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
13db0 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20  _CONST_FUNC:.   
13dc0 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
13dd0 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c  N: {.      ExprL
13de0 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
13df0 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20  pr->pList;.     
13e00 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 4c 69   int nExpr = pLi
13e10 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70  st ? pList->nExp
13e20 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 46 75 6e  r : 0;.      Fun
13e30 63 44 65 66 20 2a 70 44 65 66 3b 0a 20 20 20 20  cDef *pDef;.    
13e40 20 20 69 6e 74 20 6e 49 64 3b 0a 20 20 20 20 20    int nId;.     
13e50 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
13e60 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6f 6e 73  ;.      int cons
13e70 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20  tMask = 0;.     
13e80 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 71   int i;.      sq
13e90 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
13ea0 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 75 38  se->db;.      u8
13eb0 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a   enc = ENC(db);.
13ec0 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
13ed0 43 6f 6c 6c 20 3d 20 30 3b 0a 0a 20 20 20 20 20  Coll = 0;..     
13ee0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
13ef0 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 20 29 3b 0a  K_CONST_FUNC );.
13f00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
13f10 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20  op==TK_FUNCTION 
13f20 29 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d 20 28  );.      zId = (
13f30 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b  char*)pExpr->tok
13f40 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 6e 49 64 20  en.z;.      nId 
13f50 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  = pExpr->token.n
13f60 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73  ;.      pDef = s
13f70 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
13f80 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  on(pParse->db, z
13f90 49 64 2c 20 6e 49 64 2c 20 6e 45 78 70 72 2c 20  Id, nId, nExpr, 
13fa0 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  enc, 0);.      a
13fb0 73 73 65 72 74 28 20 70 44 65 66 21 3d 30 20 29  ssert( pDef!=0 )
13fc0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73  ;.      if( pLis
13fd0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 45 78  t ){.        nEx
13fe0 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  pr = pList->nExp
13ff0 72 3b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  r;.        r1 = 
14000 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
14010 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 45 78 70  nge(pParse, nExp
14020 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
14030 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
14040 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73  ist(pParse, pLis
14050 74 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20  t, r1, 1);.     
14060 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14070 6e 45 78 70 72 20 3d 20 72 31 20 3d 20 30 3b 0a  nExpr = r1 = 0;.
14080 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
14090 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
140a0 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f  UALTABLE.      /
140b0 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c  * Possibly overl
140c0 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  oad the function
140d0 20 69 66 20 74 68 65 20 66 69 72 73 74 20 61 72   if the first ar
140e0 67 75 6d 65 6e 74 20 69 73 0a 20 20 20 20 20 20  gument is.      
140f0 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ** a virtual tab
14100 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20  le column..     
14110 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72   **.      ** For
14120 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73   infix functions
14130 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45   (LIKE, GLOB, RE
14140 47 45 58 50 2c 20 61 6e 64 20 4d 41 54 43 48 29  GEXP, and MATCH)
14150 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 2a   use the.      *
14160 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  * second argumen
14170 74 2c 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74  t, not the first
14180 2c 20 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e  , as the argumen
14190 74 20 74 6f 20 74 65 73 74 20 74 6f 0a 20 20 20  t to test to.   
141a0 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20     ** see if it 
141b0 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61  is a column in a
141c0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
141d0 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65   This is done be
141e0 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74  cause.      ** t
141f0 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20  he left operand 
14200 6f 66 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f  of infix functio
14210 6e 73 20 28 74 68 65 20 6f 70 65 72 61 6e 64 20  ns (the operand 
14220 77 65 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 20  we want to.     
14230 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72   ** control over
14240 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73 20 75 70  loading) ends up
14250 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
14260 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20  rgument to the. 
14270 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
14280 2e 20 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  .  The expressio
14290 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 69 73 20  n "A glob B" is 
142a0 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20  equivalent to . 
142b0 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c       ** "glob(B,
142c0 41 29 2e 20 20 57 65 20 77 61 6e 74 20 74 6f 20  A).  We want to 
142d0 75 73 65 20 74 68 65 20 41 20 69 6e 20 22 41 20  use the A in "A 
142e0 67 6c 6f 62 20 42 22 20 74 6f 20 74 65 73 74 0a  glob B" to test.
142f0 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e        ** for fun
14300 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e  ction overloadin
14310 67 2e 20 20 42 75 74 20 77 65 20 75 73 65 20 74  g.  But we use t
14320 68 65 20 42 20 74 65 72 6d 20 69 6e 20 22 67 6c  he B term in "gl
14330 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20 20 20 20  ob(B,A)"..      
14340 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78  */.      if( nEx
14350 70 72 3e 3d 32 20 26 26 20 28 70 45 78 70 72 2d  pr>=2 && (pExpr-
14360 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 66 69  >flags & EP_Infi
14370 78 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20  xFunc) ){.      
14380 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
14390 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63  VtabOverloadFunc
143a0 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e  tion(db, pDef, n
143b0 45 78 70 72 2c 20 70 4c 69 73 74 2d 3e 61 5b 31  Expr, pList->a[1
143c0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
143d0 7d 65 6c 73 65 20 69 66 28 20 6e 45 78 70 72 3e  }else if( nExpr>
143e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  0 ){.        pDe
143f0 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f  f = sqlite3VtabO
14400 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28  verloadFunction(
14410 64 62 2c 20 70 44 65 66 2c 20 6e 45 78 70 72 2c  db, pDef, nExpr,
14420 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78   pList->a[0].pEx
14430 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  pr);.      }.#en
14440 64 69 66 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  dif.      for(i=
14450 30 3b 20 69 3c 6e 45 78 70 72 20 26 26 20 69 3c  0; i<nExpr && i<
14460 33 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  32; i++){.      
14470 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
14480 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 4c 69 73  rIsConstant(pLis
14490 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  t->a[i].pExpr) )
144a0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  {.          cons
144b0 74 4d 61 73 6b 20 7c 3d 20 28 31 3c 3c 69 29 3b  tMask |= (1<<i);
144c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
144d0 20 20 20 69 66 28 20 70 44 65 66 2d 3e 6e 65 65     if( pDef->nee
144e0 64 43 6f 6c 6c 53 65 71 20 26 26 20 21 70 43 6f  dCollSeq && !pCo
144f0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
14500 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
14510 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
14520 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  e, pList->a[i].p
14530 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Expr);.        }
14540 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
14550 66 28 20 70 44 65 66 2d 3e 6e 65 65 64 43 6f 6c  f( pDef->needCol
14560 6c 53 65 71 20 29 7b 0a 20 20 20 20 20 20 20 20  lSeq ){.        
14570 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
14580 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  ll = pParse->db-
14590 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20  >pDfltColl; .   
145a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
145b0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp4(v, OP_Col
145c0 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28  lSeq, 0, 0, 0, (
145d0 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34  char *)pColl, P4
145e0 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20  _COLLSEQ);.     
145f0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
14600 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
14610 5f 46 75 6e 63 74 69 6f 6e 2c 20 63 6f 6e 73 74  _Function, const
14620 4d 61 73 6b 2c 20 72 31 2c 20 74 61 72 67 65 74  Mask, r1, target
14630 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14640 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
14650 29 70 44 65 66 2c 20 50 34 5f 46 55 4e 43 44 45  )pDef, P4_FUNCDE
14660 46 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  F);.      sqlite
14670 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
14680 20 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69   nExpr);.      i
14690 66 28 20 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  f( nExpr ){.    
146a0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
146b0 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
146c0 73 65 2c 20 72 31 2c 20 6e 45 78 70 72 29 3b 0a  se, r1, nExpr);.
146d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
146e0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
146f0 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
14700 72 73 65 2c 20 72 31 2c 20 6e 45 78 70 72 29 3b  rse, r1, nExpr);
14710 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14720 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
14730 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
14740 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49  .    case TK_EXI
14750 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  STS:.    case TK
14760 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20  _SELECT: {.     
14770 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
14780 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20  K_EXISTS );.    
14790 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
147a0 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20  TK_SELECT );.   
147b0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
147c0 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  olumn==0 ){.    
147d0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53      sqlite3CodeS
147e0 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
147f0 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20   pExpr, 0);.    
14800 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67 20    }.      inReg 
14810 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
14820 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
14830 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
14840 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _IN: {.      int
14850 20 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 30 3b 0a   rNotFound = 0;.
14860 20 20 20 20 20 20 69 6e 74 20 72 4d 61 79 48 61        int rMayHa
14870 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  veNull = 0;.    
14880 20 20 69 6e 74 20 6a 32 2c 20 6a 33 2c 20 6a 34    int j2, j3, j4
14890 2c 20 6a 35 3b 0a 20 20 20 20 20 20 63 68 61 72  , j5;.      char
148a0 20 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20   affinity;.     
148b0 20 69 6e 74 20 65 54 79 70 65 3b 0a 0a 20 20 20   int eType;..   
148c0 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
148d0 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20 49 4e  nt((v, "begin IN
148e0 20 65 78 70 72 20 72 25 64 22 2c 20 74 61 72 67   expr r%d", targ
148f0 65 74 29 29 3b 0a 20 20 20 20 20 20 65 54 79 70  et));.      eTyp
14900 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  e = sqlite3FindI
14910 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  nIndex(pParse, p
14920 45 78 70 72 2c 20 26 72 4d 61 79 48 61 76 65 4e  Expr, &rMayHaveN
14930 75 6c 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ull);.      if( 
14940 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 29 7b 0a  rMayHaveNull ){.
14950 20 20 20 20 20 20 20 20 72 4e 6f 74 46 6f 75 6e          rNotFoun
14960 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  d = ++pParse->nM
14970 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  em;.      }..   
14980 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
14990 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f   the affinity to
149a0 20 75 73 65 20 74 6f 20 63 72 65 61 74 65 20 61   use to create a
149b0 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 72 65   key from the re
149c0 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 6f  sults.      ** o
149d0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
149e0 2e 20 61 66 66 69 6e 69 74 79 53 74 72 20 73 74  . affinityStr st
149f0 6f 72 65 73 20 61 20 73 74 61 74 69 63 20 73 74  ores a static st
14a00 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f  ring suitable fo
14a10 72 0a 20 20 20 20 20 20 2a 2a 20 50 34 20 6f 66  r.      ** P4 of
14a20 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a   OP_MakeRecord..
14a30 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
14a40 66 66 69 6e 69 74 79 20 3d 20 63 6f 6d 70 61 72  ffinity = compar
14a50 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78  isonAffinity(pEx
14a60 70 72 29 3b 0a 0a 0a 20 20 20 20 20 20 2f 2a 20  pr);...      /* 
14a70 43 6f 64 65 20 74 68 65 20 3c 65 78 70 72 3e 20  Code the <expr> 
14a80 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20  from "<expr> IN 
14a90 28 2e 2e 2e 29 22 2e 20 54 68 65 20 74 65 6d 70  (...)". The temp
14aa0 6f 72 61 72 79 20 74 61 62 6c 65 0a 20 20 20 20  orary table.    
14ab0 20 20 2a 2a 20 70 45 78 70 72 2d 3e 69 54 61 62    ** pExpr->iTab
14ac0 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  le contains the 
14ad0 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65  values that make
14ae0 20 75 70 20 74 68 65 20 28 2e 2e 2e 29 20 73 65   up the (...) se
14af0 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
14b00 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c    pParse->disabl
14b10 65 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20 20 20  eColCache++;.   
14b20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
14b30 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
14b40 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29  ->pLeft, target)
14b50 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
14b60 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d  disableColCache-
14b70 2d 3b 0a 20 20 20 20 20 20 6a 32 20 3d 20 73 71  -;.      j2 = sq
14b80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
14b90 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 74 61  v, OP_IsNull, ta
14ba0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28  rget);.      if(
14bb0 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
14bc0 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20  _ROWID ){.      
14bd0 20 20 6a 33 20 3d 20 73 71 6c 69 74 65 33 56 64    j3 = sqlite3Vd
14be0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d  beAddOp1(v, OP_M
14bf0 75 73 74 42 65 49 6e 74 2c 20 74 61 72 67 65 74  ustBeInt, target
14c00 29 3b 0a 20 20 20 20 20 20 20 20 6a 34 20 3d 20  );.        j4 = 
14c10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14c20 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74  3(v, OP_NotExist
14c30 73 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  s, pExpr->iTable
14c40 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
14c50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14c60 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
14c70 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74  teger, 1, target
14c80 29 3b 0a 20 20 20 20 20 20 20 20 6a 35 20 3d 20  );.        j5 = 
14c90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14ca0 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20  0(v, OP_Goto);. 
14cb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
14cc0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 33  beJumpHere(v, j3
14cd0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
14ce0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
14cf0 2c 20 6a 34 29 3b 0a 20 20 20 20 20 20 20 20 73  , j4);.        s
14d00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14d10 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
14d20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
14d30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14d40 20 72 32 20 3d 20 72 65 67 46 72 65 65 32 20 3d   r2 = regFree2 =
14d50 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
14d60 65 67 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20  eg(pParse);..   
14d70 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61       /* Create a
14d80 20 72 65 63 6f 72 64 20 61 6e 64 20 74 65 73 74   record and test
14d90 20 66 6f 72 20 73 65 74 20 6d 65 6d 62 65 72 73   for set members
14da0 68 69 70 2e 20 49 66 20 74 68 65 20 73 65 74 20  hip. If the set 
14db0 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 20  contains.       
14dc0 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 2c 20 74   ** the value, t
14dd0 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65 20  hen jump to the 
14de0 65 6e 64 20 6f 66 20 74 68 65 20 74 65 73 74 20  end of the test 
14df0 63 6f 64 65 2e 20 54 68 65 20 74 61 72 67 65 74  code. The target
14e00 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 67 69  .        ** regi
14e10 73 74 65 72 20 73 74 69 6c 6c 20 63 6f 6e 74 61  ster still conta
14e20 69 6e 73 20 74 68 65 20 74 72 75 65 20 28 31 29  ins the true (1)
14e30 20 76 61 6c 75 65 20 77 72 69 74 74 65 6e 20 74   value written t
14e40 6f 20 69 74 20 65 61 72 6c 69 65 72 2e 0a 20 20  o it earlier..  
14e50 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
14e60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14e70 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p4(v, OP_MakeRec
14e80 6f 72 64 2c 20 74 61 72 67 65 74 2c 20 31 2c 20  ord, target, 1, 
14e90 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31  r2, &affinity, 1
14ea0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
14eb0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14ec0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74  OP_Integer, 1, t
14ed0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
14ee0 6a 35 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j5 = sqlite3Vdbe
14ef0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 46 6f 75  AddOp3(v, OP_Fou
14f00 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nd, pExpr->iTabl
14f10 65 2c 20 30 2c 20 72 32 29 3b 0a 0a 20 20 20 20  e, 0, r2);..    
14f20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65      /* If the se
14f30 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73  t membership tes
14f40 74 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68  t fails, then th
14f50 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
14f60 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 78 20 49  .        ** "x I
14f70 4e 20 28 2e 2e 2e 29 22 20 65 78 70 72 65 73 73  N (...)" express
14f80 69 6f 6e 20 6d 75 73 74 20 62 65 20 65 69 74 68  ion must be eith
14f90 65 72 20 30 20 6f 72 20 4e 55 4c 4c 2e 20 49 66  er 0 or NULL. If
14fa0 20 74 68 65 20 73 65 74 0a 20 20 20 20 20 20 20   the set.       
14fb0 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20   ** contains no 
14fc0 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68 65  NULL values, the
14fd0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  n the result is 
14fe0 30 2e 20 49 66 20 74 68 65 20 73 65 74 20 0a 20  0. If the set . 
14ff0 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69         ** contai
15000 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e  ns one or more N
15010 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68 65 6e  ULL values, then
15020 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
15030 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78  he.        ** ex
15040 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6c 73 6f  pression is also
15050 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20 2a   NULL..        *
15060 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 4e  /.        if( rN
15070 6f 74 46 6f 75 6e 64 3d 3d 30 20 29 7b 0a 20 20  otFound==0 ){.  
15080 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
15090 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20 69  branch runs if i
150a0 74 20 69 73 20 6b 6e 6f 77 6e 20 61 74 20 63 6f  t is known at co
150b0 6d 70 69 6c 65 20 74 69 6d 65 20 28 6e 6f 77 29  mpile time (now)
150c0 20 74 68 61 74 20 0a 20 20 20 20 20 20 20 20 20   that .         
150d0 20 2a 2a 20 74 68 65 20 73 65 74 20 63 6f 6e 74   ** the set cont
150e0 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c  ains no NULL val
150f0 75 65 73 2e 20 54 68 69 73 20 68 61 70 70 65 6e  ues. This happen
15100 73 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 0a  s as the result.
15110 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20            ** of 
15120 61 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e  a "NOT NULL" con
15130 73 74 72 61 69 6e 74 20 69 6e 20 74 68 65 20 64  straint in the d
15140 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20  atabase schema. 
15150 4e 6f 20 6e 65 65 64 0a 20 20 20 20 20 20 20 20  No need.        
15160 20 20 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65    ** to test the
15170 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
15180 61 74 20 72 75 6e 74 69 6d 65 20 69 6e 20 74 68  at runtime in th
15190 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20  is case..       
151a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
151b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
151c0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
151d0 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
151e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
151f0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c        /* This bl
15200 6f 63 6b 20 70 6f 70 75 6c 61 74 65 73 20 74 68  ock populates th
15210 65 20 72 4e 6f 74 46 6f 75 6e 64 20 72 65 67 69  e rNotFound regi
15220 73 74 65 72 20 77 69 74 68 20 65 69 74 68 65 72  ster with either
15230 20 4e 55 4c 4c 0a 20 20 20 20 20 20 20 20 20 20   NULL.          
15240 2a 2a 20 6f 72 20 30 20 28 61 6e 20 69 6e 74 65  ** or 0 (an inte
15250 67 65 72 20 76 61 6c 75 65 29 2e 20 49 66 20 74  ger value). If t
15260 68 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  he data structur
15270 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 0a 20  e contains one. 
15280 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 6d           ** or m
15290 6f 72 65 20 4e 55 4c 4c 73 2c 20 74 68 65 6e 20  ore NULLs, then 
152a0 73 65 74 20 72 4e 6f 74 46 6f 75 6e 64 20 74 6f  set rNotFound to
152b0 20 4e 55 4c 4c 2e 20 4f 74 68 65 72 77 69 73 65   NULL. Otherwise
152c0 2c 20 73 65 74 20 69 74 0a 20 20 20 20 20 20 20  , set it.       
152d0 20 20 20 2a 2a 20 74 6f 20 30 2e 20 49 66 20 72     ** to 0. If r
152e0 65 67 69 73 74 65 72 20 72 4d 61 79 48 61 76 65  egister rMayHave
152f0 4e 75 6c 6c 20 69 73 20 61 6c 72 65 61 64 79 20  Null is already 
15300 73 65 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c 75  set to some valu
15310 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f  e.          ** o
15320 74 68 65 72 20 74 68 61 6e 20 4e 55 4c 4c 2c 20  ther than NULL, 
15330 74 68 65 6e 20 74 68 65 20 74 65 73 74 20 68 61  then the test ha
15340 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72  s already been r
15350 75 6e 20 61 6e 64 20 0a 20 20 20 20 20 20 20 20  un and .        
15360 20 20 2a 2a 20 72 4e 6f 74 46 6f 75 6e 64 20 69    ** rNotFound i
15370 73 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61  s already popula
15380 74 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ted..          *
15390 2f 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74  /.          stat
153a0 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6e 75  ic const char nu
153b0 6c 6c 52 65 63 6f 72 64 5b 5d 20 3d 20 7b 20 30  llRecord[] = { 0
153c0 78 30 32 2c 20 30 78 30 30 20 7d 3b 0a 20 20 20  x02, 0x00 };.   
153d0 20 20 20 20 20 20 20 6a 33 20 3d 20 73 71 6c 69         j3 = sqli
153e0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
153f0 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 4d 61   OP_NotNull, rMa
15400 79 48 61 76 65 4e 75 6c 6c 29 3b 0a 20 20 20 20  yHaveNull);.    
15410 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15420 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
15430 6c 6c 2c 20 30 2c 20 72 4e 6f 74 46 6f 75 6e 64  ll, 0, rNotFound
15440 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
15450 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
15460 2c 20 4f 50 5f 42 6c 6f 62 2c 20 32 2c 20 72 4d  , OP_Blob, 2, rM
15470 61 79 48 61 76 65 4e 75 6c 6c 2c 20 30 2c 20 0a  ayHaveNull, 0, .
15480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15490 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6c               nul
154a0 6c 52 65 63 6f 72 64 2c 20 50 34 5f 53 54 41 54  lRecord, P4_STAT
154b0 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a  IC);.          j
154c0 34 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  4 = sqlite3VdbeA
154d0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 46 6f 75 6e  ddOp3(v, OP_Foun
154e0 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
154f0 2c 20 30 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c  , 0, rMayHaveNul
15500 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  l);.          sq
15510 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15520 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
15530 2c 20 72 4e 6f 74 46 6f 75 6e 64 29 3b 0a 20 20  , rNotFound);.  
15540 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15550 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
15560 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  4);.          sq
15570 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
15580 65 28 76 2c 20 6a 33 29 3b 0a 0a 20 20 20 20 20  e(v, j3);..     
15590 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65       /* Copy the
155a0 20 76 61 6c 75 65 20 6f 66 20 72 65 67 69 73 74   value of regist
155b0 65 72 20 72 4e 6f 74 46 6f 75 6e 64 20 28 77 68  er rNotFound (wh
155c0 69 63 68 20 69 73 20 65 69 74 68 65 72 20 4e 55  ich is either NU
155d0 4c 4c 20 6f 72 20 30 29 0a 09 20 20 2a 2a 20 69  LL or 0)..  ** i
155e0 6e 74 6f 20 74 68 65 20 74 61 72 67 65 74 20 72  nto the target r
155f0 65 67 69 73 74 65 72 2e 20 54 68 69 73 20 77 69  egister. This wi
15600 6c 6c 20 62 65 20 74 68 65 20 72 65 73 75 6c 74  ll be the result
15610 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
15620 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e    ** expression.
15630 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
15640 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15650 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15660 43 6f 70 79 2c 20 72 4e 6f 74 46 6f 75 6e 64 2c  Copy, rNotFound,
15670 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
15680 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
15690 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
156a0 70 48 65 72 65 28 76 2c 20 6a 32 29 3b 0a 20 20  pHere(v, j2);.  
156b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
156c0 75 6d 70 48 65 72 65 28 76 2c 20 6a 35 29 3b 0a  umpHere(v, j5);.
156d0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
156e0 74 28 28 76 2c 20 22 65 6e 64 20 49 4e 20 65 78  t((v, "end IN ex
156f0 70 72 20 72 25 64 22 2c 20 74 61 72 67 65 74 29  pr r%d", target)
15700 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
15710 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
15720 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 20   /*.    **    x 
15730 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a  BETWEEN y AND z.
15740 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
15750 69 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  is is equivalent
15760 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   to.    **.    *
15770 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c  *    x>=y AND x<
15780 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  =z.    **.    **
15790 20 58 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   X is stored in 
157a0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20  pExpr->pLeft..  
157b0 20 20 2a 2a 20 59 20 69 73 20 73 74 6f 72 65 64    ** Y is stored
157c0 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   in pExpr->pList
157d0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20  ->a[0].pExpr..  
157e0 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65 64    ** Z is stored
157f0 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   in pExpr->pList
15800 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20  ->a[1].pExpr..  
15810 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b    */.    case TK
15820 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
15830 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
15840 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
15850 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
15860 69 73 74 5f 69 74 65 6d 20 2a 70 4c 49 74 65 6d  ist_item *pLItem
15870 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
15880 3e 61 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  >a;.      Expr *
15890 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d  pRight = pLItem-
158a0 3e 70 45 78 70 72 3b 0a 0a 20 20 20 20 20 20 63  >pExpr;..      c
158b0 6f 64 65 43 6f 6d 70 61 72 65 4f 70 65 72 61 6e  odeCompareOperan
158c0 64 73 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  ds(pParse, pLeft
158d0 2c 20 26 72 31 2c 20 26 72 65 67 46 72 65 65 31  , &r1, &regFree1
158e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
158f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15900 20 20 20 20 70 52 69 67 68 74 2c 20 26 72 32 2c      pRight, &r2,
15910 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
15920 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
15930 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
15940 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
15950 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
15960 20 72 33 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r3 = sqlite3Get
15970 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
15980 0a 20 20 20 20 20 20 72 34 20 3d 20 73 71 6c 69  .      r4 = sqli
15990 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
159a0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 63 6f 64  arse);.      cod
159b0 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
159c0 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
159d0 4f 50 5f 47 65 2c 0a 20 20 20 20 20 20 20 20 20  OP_Ge,.         
159e0 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
159f0 20 72 33 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52   r3, SQLITE_STOR
15a00 45 50 32 29 3b 0a 20 20 20 20 20 20 70 4c 49 74  EP2);.      pLIt
15a10 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 52 69 67  em++;.      pRig
15a20 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78  ht = pLItem->pEx
15a30 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
15a40 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
15a50 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32  pParse, regFree2
15a60 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
15a70 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
15a80 70 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  p(pParse, pRight
15a90 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
15aa0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
15ab0 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
15ac0 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
15ad0 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52  Parse, pLeft, pR
15ae0 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 72 31 2c  ight, OP_Le, r1,
15af0 20 72 32 2c 20 72 34 2c 20 53 51 4c 49 54 45 5f   r2, r4, SQLITE_
15b00 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20  STOREP2);.      
15b10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15b20 33 28 76 2c 20 4f 50 5f 41 6e 64 2c 20 72 33 2c  3(v, OP_And, r3,
15b30 20 72 34 2c 20 74 61 72 67 65 74 29 3b 0a 20 20   r4, target);.  
15b40 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
15b50 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
15b60 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r3);.      sql
15b70 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
15b80 65 67 28 70 50 61 72 73 65 2c 20 72 34 29 3b 0a  eg(pParse, r4);.
15b90 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15ba0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
15bb0 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e  PLUS: {.      in
15bc0 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
15bd0 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
15be0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
15bf0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
15c00 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
15c10 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     /*.    ** For
15c20 6d 20 41 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41  m A:.    **   CA
15c30 53 45 20 78 20 57 48 45 4e 20 65 31 20 54 48 45  SE x WHEN e1 THE
15c40 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48 45  N r1 WHEN e2 THE
15c50 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e  N r2 ... WHEN eN
15c60 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20   THEN rN ELSE y 
15c70 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  END.    **.    *
15c80 2a 20 46 6f 72 6d 20 42 3a 0a 20 20 20 20 2a 2a  * Form B:.    **
15c90 20 20 20 43 41 53 45 20 57 48 45 4e 20 65 31 20     CASE WHEN e1 
15ca0 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20  THEN r1 WHEN e2 
15cb0 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e  THEN r2 ... WHEN
15cc0 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45   eN THEN rN ELSE
15cd0 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20   y END.    **.  
15ce0 20 20 2a 2a 20 46 6f 72 6d 20 41 20 69 73 20 63    ** Form A is c
15cf0 61 6e 20 62 65 20 74 72 61 6e 73 66 6f 72 6d 65  an be transforme
15d00 64 20 69 6e 74 6f 20 74 68 65 20 65 71 75 69 76  d into the equiv
15d10 61 6c 65 6e 74 20 66 6f 72 6d 20 42 20 61 73 20  alent form B as 
15d20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 20  follows:.    ** 
15d30 20 20 43 41 53 45 20 57 48 45 4e 20 78 3d 65 31    CASE WHEN x=e1
15d40 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 78 3d   THEN r1 WHEN x=
15d50 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 0a 20  e2 THEN r2 .... 
15d60 20 20 20 2a 2a 20 20 20 20 20 20 20 20 57 48 45     **        WHE
15d70 4e 20 78 3d 65 4e 20 54 48 45 4e 20 72 4e 20 45  N x=eN THEN rN E
15d80 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a  LSE y END.    **
15d90 0a 20 20 20 20 2a 2a 20 58 20 28 69 66 20 69 74  .    ** X (if it
15da0 20 65 78 69 73 74 73 29 20 69 73 20 69 6e 20 70   exists) is in p
15db0 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20  Expr->pLeft..   
15dc0 20 2a 2a 20 59 20 69 73 20 69 6e 20 70 45 78 70   ** Y is in pExp
15dd0 72 2d 3e 70 52 69 67 68 74 2e 20 20 54 68 65 20  r->pRight.  The 
15de0 59 20 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f 6e  Y is also option
15df0 61 6c 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  al.  If there is
15e00 20 6e 6f 0a 20 20 20 20 2a 2a 20 45 4c 53 45 20   no.    ** ELSE 
15e10 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 20 6f 74  clause and no ot
15e20 68 65 72 20 74 65 72 6d 20 6d 61 74 63 68 65 73  her term matches
15e30 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
15e40 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  t of the.    ** 
15e50 65 78 70 72 73 73 69 6f 6e 20 69 73 20 4e 55 4c  exprssion is NUL
15e60 4c 2e 0a 20 20 20 20 2a 2a 20 45 69 20 69 73 20  L..    ** Ei is 
15e70 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  in pExpr->pList-
15e80 3e 61 5b 69 2a 32 5d 20 61 6e 64 20 52 69 20 69  >a[i*2] and Ri i
15e90 73 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  s pExpr->pList->
15ea0 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a  a[i*2+1]..    **
15eb0 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73 75  .    ** The resu
15ec0 6c 74 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  lt of the expres
15ed0 73 69 6f 6e 20 69 73 20 74 68 65 20 52 69 20 66  sion is the Ri f
15ee0 6f 72 20 74 68 65 20 66 69 72 73 74 20 6d 61 74  or the first mat
15ef0 63 68 69 6e 67 20 45 69 2c 0a 20 20 20 20 2a 2a  ching Ei,.    **
15f00 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 20   or if there is 
15f10 6e 6f 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 20  no matching Ei, 
15f20 74 68 65 20 45 4c 53 45 20 74 65 72 6d 20 59 2c  the ELSE term Y,
15f30 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 0a   or if there is.
15f40 20 20 20 20 2a 2a 20 6e 6f 20 45 4c 53 45 20 74      ** no ELSE t
15f50 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a  erm, NULL..    *
15f60 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41  /.    case TK_CA
15f70 53 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  SE: {.      int 
15f80 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20 20 20  endLabel;       
15f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15fa0 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20   GOTO label for 
15fb0 65 6e 64 20 6f 66 20 43 41 53 45 20 73 74 6d 74  end of CASE stmt
15fc0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 65   */.      int ne
15fd0 78 74 43 61 73 65 3b 20 20 20 20 20 20 20 20 20  xtCase;         
15fe0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
15ff0 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65  OTO label for ne
16000 78 74 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a  xt WHEN clause *
16010 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70  /.      int nExp
16020 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
16030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 78 20            /* 2x 
16040 6e 75 6d 62 65 72 20 6f 66 20 57 48 45 4e 20 74  number of WHEN t
16050 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  erms */.      in
16060 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
16070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16080 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
16090 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  */.      ExprLis
160a0 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20  t *pEList;      
160b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
160c0 73 74 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73  st of WHEN terms
160d0 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74   */.      struct
160e0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
160f0 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41  aListelem;  /* A
16100 72 72 61 79 20 6f 66 20 57 48 45 4e 20 74 65 72  rray of WHEN ter
16110 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  ms */.      Expr
16120 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20 20 20   opCompare;     
16130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16140 20 54 68 65 20 58 3d 3d 45 69 20 65 78 70 72 65   The X==Ei expre
16150 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45  ssion */.      E
16160 78 70 72 20 63 61 63 68 65 58 3b 20 20 20 20 20  xpr cacheX;     
16170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16180 20 2f 2a 20 43 61 63 68 65 64 20 65 78 70 72 65   /* Cached expre
16190 73 73 69 6f 6e 20 58 20 2a 2f 0a 20 20 20 20 20  ssion X */.     
161a0 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20   Expr *pX;      
161b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161c0 20 20 20 2f 2a 20 54 68 65 20 58 20 65 78 70 72     /* The X expr
161d0 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ession */.      
161e0 45 78 70 72 20 2a 70 54 65 73 74 3b 20 20 20 20  Expr *pTest;    
161f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16200 20 20 2f 2a 20 58 3d 3d 45 69 20 28 66 6f 72 6d    /* X==Ei (form
16210 20 41 29 20 6f 72 20 6a 75 73 74 20 45 69 20 28   A) or just Ei (
16220 66 6f 72 6d 20 42 29 20 2a 2f 0a 0a 20 20 20 20  form B) */..    
16230 20 20 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e    assert(pExpr->
16240 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 61 73  pList);.      as
16250 73 65 72 74 28 28 70 45 78 70 72 2d 3e 70 4c 69  sert((pExpr->pLi
16260 73 74 2d 3e 6e 45 78 70 72 20 25 20 32 29 20 3d  st->nExpr % 2) =
16270 3d 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  = 0);.      asse
16280 72 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  rt(pExpr->pList-
16290 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20 20  >nExpr > 0);.   
162a0 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70     pEList = pExp
162b0 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  r->pList;.      
162c0 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69  aListelem = pELi
162d0 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78  st->a;.      nEx
162e0 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  pr = pEList->nEx
162f0 70 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c 61 62  pr;.      endLab
16300 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  el = sqlite3Vdbe
16310 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
16320 20 20 20 20 69 66 28 20 28 70 58 20 3d 20 70 45      if( (pX = pE
16330 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29  xpr->pLeft)!=0 )
16340 7b 0a 20 20 20 20 20 20 20 20 63 61 63 68 65 58  {.        cacheX
16350 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20   = *pX;.        
16360 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70  testcase( pX->op
16370 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70  ==TK_COLUMN || p
16380 58 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  X->op==TK_REGIST
16390 45 52 20 29 3b 0a 20 20 20 20 20 20 20 20 63 61  ER );.        ca
163a0 63 68 65 58 2e 69 54 61 62 6c 65 20 3d 20 73 71  cheX.iTable = sq
163b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
163c0 70 28 70 50 61 72 73 65 2c 20 70 58 2c 20 26 72  p(pParse, pX, &r
163d0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
163e0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
163f0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
16400 20 20 20 63 61 63 68 65 58 2e 6f 70 20 3d 20 54     cacheX.op = T
16410 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 20 20  K_REGISTER;.    
16420 20 20 20 20 63 61 63 68 65 58 2e 69 43 6f 6c 75      cacheX.iColu
16430 6d 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  mn = 0;.        
16440 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d 20 54  opCompare.op = T
16450 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20 20 6f 70  K_EQ;.        op
16460 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20 3d 20  Compare.pLeft = 
16470 26 63 61 63 68 65 58 3b 0a 20 20 20 20 20 20 20  &cacheX;.       
16480 20 70 54 65 73 74 20 3d 20 26 6f 70 43 6f 6d 70   pTest = &opComp
16490 61 72 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  are;.      }.   
164a0 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62     pParse->disab
164b0 6c 65 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20 20  leColCache++;.  
164c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
164d0 45 78 70 72 3b 20 69 3d 69 2b 32 29 7b 0a 20 20  Expr; i=i+2){.  
164e0 20 20 20 20 20 20 69 66 28 20 70 58 20 29 7b 0a        if( pX ){.
164f0 20 20 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70            opComp
16500 61 72 65 2e 70 52 69 67 68 74 20 3d 20 61 4c 69  are.pRight = aLi
16510 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b  stelem[i].pExpr;
16520 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
16530 20 20 20 20 20 20 20 20 20 20 70 54 65 73 74 20            pTest 
16540 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70  = aListelem[i].p
16550 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Expr;.        }.
16560 20 20 20 20 20 20 20 20 6e 65 78 74 43 61 73 65          nextCase
16570 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
16580 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
16590 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
165a0 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  est->op==TK_COLU
165b0 4d 4e 20 7c 7c 20 70 54 65 73 74 2d 3e 6f 70 3d  MN || pTest->op=
165c0 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a  =TK_REGISTER );.
165d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
165e0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
165f0 65 2c 20 70 54 65 73 74 2c 20 6e 65 78 74 43 61  e, pTest, nextCa
16600 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  se, SQLITE_JUMPI
16610 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20  FNULL);.        
16620 74 65 73 74 63 61 73 65 28 20 61 4c 69 73 74 65  testcase( aListe
16630 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e  lem[i+1].pExpr->
16640 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
16650 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
16660 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31  e( aListelem[i+1
16670 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ].pExpr->op==TK_
16680 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20 20 20  REGISTER );.    
16690 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
166a0 6f 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73  ode(pParse, aLis
166b0 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72  telem[i+1].pExpr
166c0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
166d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
166e0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
166f0 20 30 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20   0, endLabel);. 
16700 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
16710 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
16720 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a 20 20 20  , nextCase);.   
16730 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
16740 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a  Expr->pRight ){.
16750 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
16760 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
16770 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 74  pExpr->pRight, t
16780 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 65  arget);.      }e
16790 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
167a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
167b0 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61  , OP_Null, 0, ta
167c0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rget);.      }. 
167d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
167e0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
167f0 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20  endLabel);.     
16800 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
16810 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65  >disableColCache
16820 3e 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72  >0 );.      pPar
16830 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61  se->disableColCa
16840 63 68 65 2d 2d 3b 0a 20 20 20 20 20 20 62 72 65  che--;.      bre
16850 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
16860 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
16870 49 47 47 45 52 0a 20 20 20 20 63 61 73 65 20 54  IGGER.    case T
16880 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20  K_RAISE: {.     
16890 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 74 72   if( !pParse->tr
168a0 69 67 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 20  igStack ){.     
168b0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
168c0 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
168d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168e0 20 20 22 52 41 49 53 45 28 29 20 6d 61 79 20 6f    "RAISE() may o
168f0 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68  nly be used with
16900 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72 6f  in a trigger-pro
16910 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 20 20  gram");.        
16920 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
16930 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  }.      if( pExp
16940 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 4f 45 5f 49  r->iColumn!=OE_I
16950 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20  gnore ){.       
16960 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
16970 3e 69 43 6f 6c 75 6d 6e 3d 3d 4f 45 5f 52 6f 6c  >iColumn==OE_Rol
16980 6c 62 61 63 6b 20 7c 7c 0a 20 20 20 20 20 20 20  lback ||.       
16990 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
169a0 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 41  >iColumn == OE_A
169b0 62 6f 72 74 20 7c 7c 0a 20 20 20 20 20 20 20 20  bort ||.        
169c0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
169d0 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 46 61  iColumn == OE_Fa
169e0 69 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 73  il );.         s
169f0 71 6c 69 74 65 33 44 65 71 75 6f 74 65 45 78 70  qlite3DequoteExp
16a00 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45  r(pParse->db, pE
16a10 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 73  xpr);.         s
16a20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
16a30 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c  (v, OP_Halt, SQL
16a40 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20  ITE_CONSTRAINT, 
16a50 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20  pExpr->iColumn, 
16a60 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
16a70 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
16a80 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  *)pExpr->token.z
16a90 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  , pExpr->token.n
16aa0 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  );.      } else 
16ab0 7b 0a 20 20 20 20 20 20 20 20 20 61 73 73 65 72  {.         asser
16ac0 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  t( pExpr->iColum
16ad0 6e 20 3d 3d 20 4f 45 5f 49 67 6e 6f 72 65 20 29  n == OE_Ignore )
16ae0 3b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  ;.         sqlit
16af0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16b00 4f 50 5f 43 6f 6e 74 65 78 74 50 6f 70 2c 20 30  OP_ContextPop, 0
16b10 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 73  , 0);.         s
16b20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16b30 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
16b40 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63  pParse->trigStac
16b50 6b 2d 3e 69 67 6e 6f 72 65 4a 75 6d 70 29 3b 0a  k->ignoreJump);.
16b60 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d           VdbeCom
16b70 6d 65 6e 74 28 28 76 2c 20 22 72 61 69 73 65 28  ment((v, "raise(
16b80 49 47 4e 4f 52 45 29 22 29 29 3b 0a 20 20 20 20  IGNORE)"));.    
16b90 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
16ba0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
16bb0 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
16bc0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
16bd0 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73  , regFree1);.  s
16be0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
16bf0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
16c00 46 72 65 65 32 29 3b 0a 20 20 72 65 74 75 72 6e  Free2);.  return
16c10 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   inReg;.}../*.**
16c20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
16c30 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 65 78  o evaluate an ex
16c40 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 74 6f  pression and sto
16c50 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a  re the results.*
16c60 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65  * into a registe
16c70 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72  r.  Return the r
16c80 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77  egister number w
16c90 68 65 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  here the results
16ca0 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 2e 0a  .** are stored..
16cb0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 67  **.** If the reg
16cc0 69 73 74 65 72 20 69 73 20 61 20 74 65 6d 70 6f  ister is a tempo
16cd0 72 61 72 79 20 72 65 67 69 73 74 65 72 20 74 68  rary register th
16ce0 61 74 20 63 61 6e 20 62 65 20 64 65 61 6c 6c 6f  at can be deallo
16cf0 63 61 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 77  cated,.** then w
16d00 72 69 74 65 20 69 74 73 20 6e 75 6d 62 65 72 20  rite its number 
16d10 69 6e 74 6f 20 2a 70 52 65 67 2e 20 20 49 66 20  into *pReg.  If 
16d20 74 68 65 20 72 65 73 75 6c 74 20 72 65 67 69 73  the result regis
16d30 74 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20  ter is not.** a 
16d40 74 65 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e 20  temporary, then 
16d50 73 65 74 20 2a 70 52 65 67 20 74 6f 20 7a 65 72  set *pReg to zer
16d60 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  o..*/.int sqlite
16d70 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 50 61  3ExprCodeTemp(Pa
16d80 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
16d90 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a 70  r *pExpr, int *p
16da0 52 65 67 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d  Reg){.  int r1 =
16db0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
16dc0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e  eg(pParse);.  in
16dd0 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78  t r2 = sqlite3Ex
16de0 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
16df0 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31 29 3b  rse, pExpr, r1);
16e00 0a 20 20 69 66 28 20 72 32 3d 3d 72 31 20 29 7b  .  if( r2==r1 ){
16e10 0a 20 20 20 20 2a 70 52 65 67 20 3d 20 72 31 3b  .    *pReg = r1;
16e20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
16e30 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
16e40 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
16e50 0a 20 20 20 20 2a 70 52 65 67 20 3d 20 30 3b 0a  .    *pReg = 0;.
16e60 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 32 3b    }.  return r2;
16e70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
16e80 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
16e90 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70 72 65  l evaluate expre
16ea0 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20  ssion pExpr and 
16eb0 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73  store the.** res
16ec0 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72  ults in register
16ed0 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65   target.  The re
16ee0 73 75 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e  sults are guaran
16ef0 74 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a  teed to appear.*
16f00 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  * in register ta
16f10 72 67 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rget..*/.int sql
16f20 69 74 65 33 45 78 70 72 43 6f 64 65 28 50 61 72  ite3ExprCode(Par
16f30 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
16f40 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
16f50 67 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e 52 65  get){.  int inRe
16f60 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61  g;..  assert( ta
16f70 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65 74  rget>0 && target
16f80 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29  <=pParse->nMem )
16f90 3b 0a 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69  ;.  inReg = sqli
16fa0 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
16fb0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
16fc0 20 74 61 72 67 65 74 29 3b 0a 20 20 61 73 73 65   target);.  asse
16fd0 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62  rt( pParse->pVdb
16fe0 65 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  e || pParse->db-
16ff0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
17000 0a 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61  .  if( inReg!=ta
17010 72 67 65 74 20 26 26 20 70 50 61 72 73 65 2d 3e  rget && pParse->
17020 70 56 64 62 65 20 29 7b 0a 20 20 20 20 73 71 6c  pVdbe ){.    sql
17030 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70  ite3VdbeAddOp2(p
17040 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
17050 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74  _SCopy, inReg, t
17060 61 72 67 65 74 29 3b 0a 20 20 7d 0a 20 20 72 65  arget);.  }.  re
17070 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 7d 0a 0a  turn target;.}..
17080 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
17090 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 74 65  ode that evalute
170a0 73 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  s the given expr
170b0 65 73 73 69 6f 6e 20 61 6e 64 20 70 75 74 73 20  ession and puts 
170c0 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e  the result.** in
170d0 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74   register target
170e0 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b  ..**.** Also mak
170f0 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
17100 65 78 70 72 65 73 73 69 6f 6e 20 72 65 73 75 6c  expression resul
17110 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20  ts into another 
17120 22 63 61 63 68 65 22 20 72 65 67 69 73 74 65 72  "cache" register
17130 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20 74  .** and modify t
17140 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73 6f  he expression so
17150 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 74   that the next t
17160 69 6d 65 20 69 74 20 69 73 20 65 76 61 6c 75 61  ime it is evalua
17170 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75  ted,.** the resu
17180 6c 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  lt is a copy of 
17190 74 68 65 20 63 61 63 68 65 20 72 65 67 69 73 74  the cache regist
171a0 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
171b0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
171c0 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  or expressions t
171d0 68 61 74 20 61 72 65 20 75 73 65 64 20 6d 75 6c  hat are used mul
171e0 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e  tiple .** times.
171f0 20 20 54 68 65 79 20 61 72 65 20 65 76 61 6c 75    They are evalu
17200 61 74 65 64 20 6f 6e 63 65 20 61 6e 64 20 74 68  ated once and th
17210 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
17220 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61   expression.** a
17230 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 69 6e  re reused..*/.in
17240 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
17250 65 41 6e 64 43 61 63 68 65 28 50 61 72 73 65 20  eAndCache(Parse 
17260 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
17270 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
17280 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
17290 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
172a0 69 6e 74 20 69 6e 52 65 67 3b 0a 20 20 69 6e 52  int inReg;.  inR
172b0 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
172c0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
172d0 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 61  pr, target);.  a
172e0 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
172f0 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  );.  if( pExpr->
17300 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op!=TK_REGISTER 
17310 29 7b 20 20 0a 20 20 20 20 69 6e 74 20 69 4d 65  ){  .    int iMe
17320 6d 3b 0a 20 20 20 20 69 4d 65 6d 20 3d 20 2b 2b  m;.    iMem = ++
17330 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
17340 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17350 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
17360 69 6e 52 65 67 2c 20 69 4d 65 6d 29 3b 0a 20 20  inReg, iMem);.  
17370 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
17380 3d 20 69 4d 65 6d 3b 0a 20 20 20 20 70 45 78 70  = iMem;.    pExp
17390 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78  r->iColumn = pEx
173a0 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 70 45 78 70  pr->op;.    pExp
173b0 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53  r->op = TK_REGIS
173c0 54 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  TER;.  }.  retur
173d0 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  n inReg;.}../*.*
173e0 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
173f0 20 70 45 78 70 72 20 69 73 20 61 6e 20 63 6f 6e   pExpr is an con
17400 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  stant expression
17410 20 74 68 61 74 20 69 73 20 61 70 70 72 6f 70 72   that is appropr
17420 69 61 74 65 0a 2a 2a 20 66 6f 72 20 66 61 63 74  iate.** for fact
17430 6f 72 69 6e 67 20 6f 75 74 20 6f 66 20 61 20 6c  oring out of a l
17440 6f 6f 70 2e 20 20 41 70 70 72 6f 70 72 69 61 74  oop.  Appropriat
17450 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  e expressions ar
17460 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 41  e:.**.**    *  A
17470 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  ny expression th
17480 61 74 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  at evaluates to 
17490 74 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 70 63 6f  two or more opco
174a0 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  des..**.**    * 
174b0 20 41 6e 79 20 4f 50 5f 49 6e 74 65 67 65 72 2c   Any OP_Integer,
174c0 20 4f 50 5f 52 65 61 6c 2c 20 4f 50 5f 53 74 72   OP_Real, OP_Str
174d0 69 6e 67 2c 20 4f 50 5f 42 6c 6f 62 2c 20 4f 50  ing, OP_Blob, OP
174e0 5f 4e 75 6c 6c 2c 20 0a 2a 2a 20 20 20 20 20 20  _Null, .**      
174f0 20 6f 72 20 4f 50 5f 56 61 72 69 61 62 6c 65 20   or OP_Variable 
17500 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65  that does not ne
17510 65 64 20 74 6f 20 62 65 20 70 6c 61 63 65 64 20  ed to be placed 
17520 69 6e 20 61 20 0a 2a 2a 20 20 20 20 20 20 20 73  in a .**       s
17530 70 65 63 69 66 69 63 20 72 65 67 69 73 74 65 72  pecific register
17540 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  ..**.** There is
17550 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 66 61 63   no point in fac
17560 74 6f 72 69 6e 67 20 6f 75 74 20 73 69 6e 67 6c  toring out singl
17570 65 2d 69 6e 73 74 72 75 63 74 69 6f 6e 20 63 6f  e-instruction co
17580 6e 73 74 61 6e 74 0a 2a 2a 20 65 78 70 72 65 73  nstant.** expres
17590 73 69 6f 6e 73 20 74 68 61 74 20 6e 65 65 64 20  sions that need 
175a0 74 6f 20 62 65 20 70 6c 61 63 65 64 20 69 6e 20  to be placed in 
175b0 61 20 70 61 72 74 69 63 75 6c 61 72 20 72 65 67  a particular reg
175c0 69 73 74 65 72 2e 20 20 0a 2a 2a 20 57 65 20 63  ister.  .** We c
175d0 6f 75 6c 64 20 66 61 63 74 6f 72 20 74 68 65 6d  ould factor them
175e0 20 6f 75 74 2c 20 62 75 74 20 74 68 65 6e 20 77   out, but then w
175f0 65 20 77 6f 75 6c 64 20 65 6e 64 20 75 70 20 61  e would end up a
17600 64 64 69 6e 67 20 61 6e 0a 2a 2a 20 4f 50 5f 53  dding an.** OP_S
17610 43 6f 70 79 20 69 6e 73 74 72 75 63 74 69 6f 6e  Copy instruction
17620 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 76 61 6c   to move the val
17630 75 65 20 69 6e 74 6f 20 74 68 65 20 63 6f 72 72  ue into the corr
17640 65 63 74 20 72 65 67 69 73 74 65 72 0a 2a 2a 20  ect register.** 
17650 6c 61 74 65 72 2e 20 20 57 65 20 6d 69 67 68 74  later.  We might
17660 20 61 73 20 77 65 6c 6c 20 6a 75 73 74 20 75 73   as well just us
17670 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 69  e the original i
17680 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 0a 2a  nstruction and.*
17690 2a 20 61 76 6f 69 64 20 74 68 65 20 4f 50 5f 53  * avoid the OP_S
176a0 43 6f 70 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Copy..*/.static 
176b0 69 6e 74 20 69 73 41 70 70 72 6f 70 72 69 61 74  int isAppropriat
176c0 65 46 6f 72 46 61 63 74 6f 72 69 6e 67 28 45 78  eForFactoring(Ex
176d0 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 21 73  pr *p){.  if( !s
176e0 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
176f0 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 29 20 29  tantNotJoin(p) )
17700 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
17710 20 2f 2a 20 4f 6e 6c 79 20 63 6f 6e 73 74 61 6e   /* Only constan
17720 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  t expressions ar
17730 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  e appropriate fo
17740 72 20 66 61 63 74 6f 72 69 6e 67 20 2a 2f 0a 20  r factoring */. 
17750 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 66 6c 61   }.  if( (p->fla
17760 67 73 20 26 20 45 50 5f 46 69 78 65 64 44 65 73  gs & EP_FixedDes
17770 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  t)==0 ){.    ret
17780 75 72 6e 20 31 3b 20 20 2f 2a 20 41 6e 79 20 63  urn 1;  /* Any c
17790 6f 6e 73 74 61 6e 74 20 77 69 74 68 6f 75 74 20  onstant without 
177a0 61 20 66 69 78 65 64 20 64 65 73 74 69 6e 61 74  a fixed destinat
177b0 69 6f 6e 20 69 73 20 61 70 70 72 6f 70 72 69 61  ion is appropria
177c0 74 65 20 2a 2f 0a 20 20 7d 0a 20 20 77 68 69 6c  te */.  }.  whil
177d0 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c  e( p->op==TK_UPL
177e0 55 53 20 29 20 70 20 3d 20 70 2d 3e 70 4c 65 66  US ) p = p->pLef
177f0 74 3b 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e  t;.  switch( p->
17800 6f 70 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  op ){.#ifndef SQ
17810 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c  LITE_OMIT_BLOB_L
17820 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20  ITERAL.    case 
17830 54 4b 5f 42 4c 4f 42 3a 0a 23 65 6e 64 69 66 0a  TK_BLOB:.#endif.
17840 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49      case TK_VARI
17850 41 42 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  ABLE:.    case T
17860 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63  K_INTEGER:.    c
17870 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20  ase TK_FLOAT:.  
17880 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a    case TK_NULL:.
17890 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49      case TK_STRI
178a0 4e 47 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  NG: {.      test
178b0 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  case( p->op==TK_
178c0 42 4c 4f 42 20 29 3b 0a 20 20 20 20 20 20 74 65  BLOB );.      te
178d0 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
178e0 4b 5f 56 41 52 49 41 42 4c 45 20 29 3b 0a 20 20  K_VARIABLE );.  
178f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
17900 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20  >op==TK_INTEGER 
17910 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
17920 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f  e( p->op==TK_FLO
17930 41 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  AT );.      test
17940 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  case( p->op==TK_
17950 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65  NULL );.      te
17960 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
17970 4b 5f 53 54 52 49 4e 47 20 29 3b 0a 20 20 20 20  K_STRING );.    
17980 20 20 2f 2a 20 53 69 6e 67 6c 65 2d 69 6e 73 74    /* Single-inst
17990 72 75 63 74 69 6f 6e 20 63 6f 6e 73 74 61 6e 74  ruction constant
179a0 73 20 77 69 74 68 20 61 20 66 69 78 65 64 20 64  s with a fixed d
179b0 65 73 74 69 6e 61 74 69 6f 6e 20 61 72 65 0a 20  estination are. 
179c0 20 20 20 20 20 2a 2a 20 62 65 74 74 65 72 20 64       ** better d
179d0 6f 6e 65 20 69 6e 2d 6c 69 6e 65 2e 20 20 49 66  one in-line.  If
179e0 20 77 65 20 66 61 63 74 6f 72 20 74 68 65 6d 2c   we factor them,
179f0 20 74 68 65 79 20 77 69 6c 6c 20 6a 75 73 74 20   they will just 
17a00 65 6e 64 0a 20 20 20 20 20 20 2a 2a 20 75 70 20  end.      ** up 
17a10 67 65 6e 65 72 61 74 69 6e 67 20 61 6e 20 4f 50  generating an OP
17a20 5f 53 43 6f 70 79 20 74 6f 20 6d 6f 76 65 20 74  _SCopy to move t
17a30 68 65 20 76 61 6c 75 65 20 74 6f 20 74 68 65 20  he value to the 
17a40 64 65 73 74 69 6e 61 74 69 6f 6e 0a 20 20 20 20  destination.    
17a50 20 20 2a 2a 20 72 65 67 69 73 74 65 72 2e 20 2a    ** register. *
17a60 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  /.      return 0
17a70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
17a80 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20   TK_UMINUS: {.  
17a90 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66       if( p->pLef
17aa0 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20  t->op==TK_FLOAT 
17ab0 7c 7c 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  || p->pLeft->op=
17ac0 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20  =TK_INTEGER ){. 
17ad0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
17ae0 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ;.       }.     
17af0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
17b00 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
17b10 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
17b20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
17b30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 45 78  .}../*.** If pEx
17b40 70 72 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  pr is a constant
17b50 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
17b60 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
17b70 66 6f 72 0a 2a 2a 20 66 61 63 74 6f 72 69 6e 67  for.** factoring
17b80 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2c 20   out of a loop, 
17b90 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20 74 68  then evaluate th
17ba0 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  e expression.** 
17bb0 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 20  into a register 
17bc0 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 68 65 20  and convert the 
17bd0 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 74 6f 20  expression into 
17be0 61 20 54 4b 5f 52 45 47 49 53 54 45 52 0a 2a 2a  a TK_REGISTER.**
17bf0 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a   expression..*/.
17c00 73 74 61 74 69 63 20 69 6e 74 20 65 76 61 6c 43  static int evalC
17c10 6f 6e 73 74 45 78 70 72 28 76 6f 69 64 20 2a 70  onstExpr(void *p
17c20 41 72 67 2c 20 45 78 70 72 20 2a 70 45 78 70 72  Arg, Expr *pExpr
17c30 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
17c40 73 65 20 3d 20 28 50 61 72 73 65 2a 29 70 41 72  se = (Parse*)pAr
17c50 67 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  g;.  switch( pEx
17c60 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
17c70 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20  se TK_REGISTER: 
17c80 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
17c90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
17ca0 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20   TK_FUNCTION:.  
17cb0 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
17cc0 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65  NCTION:.    case
17cd0 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 20   TK_CONST_FUNC: 
17ce0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61  {.      /* The a
17cf0 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 20 66 75  rguments to a fu
17d00 6e 63 74 69 6f 6e 20 68 61 76 65 20 61 20 66 69  nction have a fi
17d10 78 65 64 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e  xed destination.
17d20 0a 20 20 20 20 20 20 2a 2a 20 4d 61 72 6b 20 74  .      ** Mark t
17d30 68 65 6d 20 74 68 69 73 20 77 61 79 20 74 6f 20  hem this way to 
17d40 61 76 6f 69 64 20 67 65 6e 65 72 61 74 65 64 20  avoid generated 
17d50 75 6e 6e 65 65 64 65 64 20 4f 50 5f 53 43 6f 70  unneeded OP_SCop
17d60 79 0a 20 20 20 20 20 20 2a 2a 20 69 6e 73 74 72  y.      ** instr
17d70 75 63 74 69 6f 6e 73 2e 20 0a 20 20 20 20 20 20  uctions. .      
17d80 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  */.      ExprLis
17d90 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72  t *pList = pExpr
17da0 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 69  ->pList;.      i
17db0 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
17dc0 20 20 20 20 69 6e 74 20 69 20 3d 20 70 4c 69 73      int i = pLis
17dd0 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
17de0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
17df0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
17e00 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  pList->a;.      
17e10 20 20 66 6f 72 28 3b 20 69 3e 30 3b 20 69 2d 2d    for(; i>0; i--
17e20 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
17e30 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
17e40 3e 70 45 78 70 72 20 29 20 70 49 74 65 6d 2d 3e  >pExpr ) pItem->
17e50 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  pExpr->flags |= 
17e60 45 50 5f 46 69 78 65 64 44 65 73 74 3b 0a 20 20  EP_FixedDest;.  
17e70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
17e80 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17e90 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41   }.  }.  if( isA
17ea0 70 70 72 6f 70 72 69 61 74 65 46 6f 72 46 61 63  ppropriateForFac
17eb0 74 6f 72 69 6e 67 28 70 45 78 70 72 29 20 29 7b  toring(pExpr) ){
17ec0 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20 2b 2b  .    int r1 = ++
17ed0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
17ee0 20 20 69 6e 74 20 72 32 3b 0a 20 20 20 20 72 32    int r2;.    r2
17ef0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
17f00 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
17f10 20 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 20   pExpr, r1);.   
17f20 20 69 66 28 20 72 31 21 3d 72 32 20 29 20 73 71   if( r1!=r2 ) sq
17f30 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
17f40 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
17f50 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c  .    pExpr->iCol
17f60 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b  umn = pExpr->op;
17f70 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d  .    pExpr->op =
17f80 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20   TK_REGISTER;.  
17f90 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
17fa0 3d 20 72 32 3b 0a 20 20 20 20 72 65 74 75 72 6e  = r2;.    return
17fb0 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
17fc0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65   0;.}../*.** Pre
17fd0 65 76 61 6c 75 61 74 65 20 63 6f 6e 73 74 61 6e  evaluate constan
17fe0 74 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73  t subexpressions
17ff0 20 77 69 74 68 69 6e 20 70 45 78 70 72 20 61 6e   within pExpr an
18000 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72  d store the.** r
18010 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74  esults in regist
18020 65 72 73 2e 20 20 4d 6f 64 69 66 79 20 70 45 78  ers.  Modify pEx
18030 70 72 20 73 6f 20 74 68 61 74 20 74 68 65 20 63  pr so that the c
18040 6f 6e 73 74 61 6e 74 20 73 75 62 65 78 70 72 65  onstant subexpre
18050 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 54 4b 5f  sions.** are TK_
18060 52 45 47 49 53 54 45 52 20 6f 70 63 6f 64 65 73  REGISTER opcodes
18070 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74   that refer to t
18080 68 65 20 70 72 65 63 6f 6d 70 75 74 65 64 20 76  he precomputed v
18090 61 6c 75 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  alues..*/.void s
180a0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f  qlite3ExprCodeCo
180b0 6e 73 74 61 6e 74 73 28 50 61 72 73 65 20 2a 70  nstants(Parse *p
180c0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
180d0 70 72 29 7b 0a 20 20 20 77 61 6c 6b 45 78 70 72  pr){.   walkExpr
180e0 54 72 65 65 28 70 45 78 70 72 2c 20 65 76 61 6c  Tree(pExpr, eval
180f0 43 6f 6e 73 74 45 78 70 72 2c 20 70 50 61 72 73  ConstExpr, pPars
18100 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  e);.}.../*.** Ge
18110 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
18120 20 70 75 73 68 65 73 20 74 68 65 20 76 61 6c 75   pushes the valu
18130 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65  e of every eleme
18140 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a  nt of the given.
18150 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
18160 73 74 20 69 6e 74 6f 20 61 20 73 65 71 75 65 6e  st into a sequen
18170 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ce of registers 
18180 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 74 61 72  beginning at tar
18190 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  get..**.** Retur
181a0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
181b0 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75 61 74  elements evaluat
181c0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
181d0 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
181e0 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
181f0 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73  rse,     /* Pars
18200 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
18210 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
18220 2c 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65  ,   /* The expre
18230 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65  ssion list to be
18240 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
18250 74 61 72 67 65 74 2c 20 20 20 20 20 20 20 20 2f  target,        /
18260 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65  * Where to write
18270 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
18280 74 20 64 6f 48 61 72 64 43 6f 70 79 20 20 20 20  t doHardCopy    
18290 20 2f 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33   /* Call sqlite3
182a0 45 78 70 72 48 61 72 64 43 6f 70 79 20 6f 6e 20  ExprHardCopy on 
182b0 65 61 63 68 20 65 6c 65 6d 65 6e 74 20 69 66 20  each element if 
182c0 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  true */.){.  str
182d0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
182e0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
182f0 69 2c 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  i, n;.  assert( 
18300 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50 61 72  pList!=0 || pPar
18310 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
18320 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 4c  iled );.  if( pL
18330 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ist==0 ){.    re
18340 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 73  turn 0;.  }.  as
18350 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29  sert( target>0 )
18360 3b 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e  ;.  n = pList->n
18370 45 78 70 72 3b 0a 20 20 66 6f 72 28 70 49 74 65  Expr;.  for(pIte
18380 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b  m=pList->a, i=0;
18390 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d   i<n; i++, pItem
183a0 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
183b0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
183c0 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 74   pItem->pExpr, t
183d0 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 69 66  arget+i);.    if
183e0 28 20 64 6f 48 61 72 64 43 6f 70 79 20 29 20 73  ( doHardCopy ) s
183f0 71 6c 69 74 65 33 45 78 70 72 48 61 72 64 43 6f  qlite3ExprHardCo
18400 70 79 28 70 50 61 72 73 65 2c 20 74 61 72 67 65  py(pParse, targe
18410 74 2c 20 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74  t, n);.  }.  ret
18420 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
18430 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
18440 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72  r a boolean expr
18450 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74  ession such that
18460 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a   a jump is made.
18470 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20  ** to the label 
18480 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78  "dest" if the ex
18490 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65  pression is true
184a0 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a   but execution.*
184b0 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61  * continues stra
184c0 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65  ight thru if the
184d0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
184e0 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  alse..**.** If t
184f0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76  he expression ev
18500 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20  aluates to NULL 
18510 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f  (neither true no
18520 72 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a  r false), then.*
18530 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20  * take the jump 
18540 69 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c  if the jumpIfNul
18550 6c 20 66 6c 61 67 20 69 73 20 53 51 4c 49 54 45  l flag is SQLITE
18560 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a  _JUMPIFNULL..**.
18570 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70  ** This code dep
18580 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74  ends on the fact
18590 20 74 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f   that certain to
185a0 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20  ken values (ex: 
185b0 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68  TK_EQ).** are th
185c0 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65  e same as opcode
185d0 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f   values (ex: OP_
185e0 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  Eq) that impleme
185f0 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  nt the correspon
18600 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  ding.** operatio
18610 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d  n.  Special comm
18620 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61  ents in vdbe.c a
18630 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68  nd the mkopcodeh
18640 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a  .awk script in.*
18650 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65  * the make proce
18660 73 73 20 63 61 75 73 65 20 74 68 65 73 65 20 76  ss cause these v
18670 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20  alues to align. 
18680 20 41 73 73 65 72 74 28 29 73 20 69 6e 20 74 68   Assert()s in th
18690 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20  e code.** below 
186a0 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
186b0 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67  numbers are alig
186c0 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a  ned correctly..*
186d0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
186e0 70 72 49 66 54 72 75 65 28 50 61 72 73 65 20 2a  prIfTrue(Parse *
186f0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
18700 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69  xpr, int dest, i
18710 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
18720 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
18730 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
18740 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72   op = 0;.  int r
18750 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69  egFree1 = 0;.  i
18760 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  nt regFree2 = 0;
18770 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a  .  int r1, r2;..
18780 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66    assert( jumpIf
18790 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d  Null==SQLITE_JUM
187a0 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49  PIFNULL || jumpI
187b0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66  fNull==0 );.  if
187c0 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d  ( v==0 || pExpr=
187d0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6f  =0 ) return;.  o
187e0 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
187f0 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
18800 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20     case TK_AND: 
18810 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d  {.      int d2 =
18820 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
18830 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
18840 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
18850 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
18860 20 74 65 73 74 63 61 73 65 28 20 70 50 61 72 73   testcase( pPars
18870 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63  e->disableColCac
18880 68 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  he==0 );.      s
18890 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
188a0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
188b0 3e 70 4c 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49  >pLeft, d2,jumpI
188c0 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d  fNull^SQLITE_JUM
188d0 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
188e0 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43  pParse->disableC
188f0 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20 20 20 20 20  olCache++;.     
18900 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
18910 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
18920 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
18930 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
18940 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
18950 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63  e->disableColCac
18960 68 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 70 50  he>0 );.      pP
18970 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c  arse->disableCol
18980 43 61 63 68 65 2d 2d 3b 0a 20 20 20 20 20 20 73  Cache--;.      s
18990 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
189a0 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20  eLabel(v, d2);. 
189b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
189c0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  }.    case TK_OR
189d0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
189e0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
189f0 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
18a00 61 73 65 28 20 70 50 61 72 73 65 2d 3e 64 69 73  ase( pParse->dis
18a10 61 62 6c 65 43 6f 6c 43 61 63 68 65 3d 3d 30 20  ableColCache==0 
18a20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
18a30 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
18a40 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
18a50 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
18a60 6c 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  l);.      pParse
18a70 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68  ->disableColCach
18a80 65 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e++;.      sqlit
18a90 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
18aa0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
18ab0 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
18ac0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73  Null);.      ass
18ad0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 69 73  ert( pParse->dis
18ae0 61 62 6c 65 43 6f 6c 43 61 63 68 65 3e 30 20 29  ableColCache>0 )
18af0 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
18b00 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d  disableColCache-
18b10 2d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  -;.      break;.
18b20 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
18b30 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74  K_NOT: {.      t
18b40 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
18b50 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
18b60 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
18b70 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
18b80 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
18b90 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
18ba0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
18bb0 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
18bc0 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
18bd0 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
18be0 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
18bf0 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
18c00 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
18c10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
18c20 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20  K_LT==OP_Lt );. 
18c30 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
18c40 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20  LE==OP_Le );.   
18c50 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54     assert( TK_GT
18c60 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20 20  ==OP_Gt );.     
18c70 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d   assert( TK_GE==
18c80 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20 20 20 61  OP_Ge );.      a
18c90 73 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50  ssert( TK_EQ==OP
18ca0 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Eq );.      ass
18cb0 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e  ert( TK_NE==OP_N
18cc0 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
18cd0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29  ase( op==TK_LT )
18ce0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
18cf0 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20  ( op==TK_LE );. 
18d00 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
18d10 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20  p==TK_GT );.    
18d20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
18d30 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74  TK_GE );.      t
18d40 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
18d50 45 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  EQ );.      test
18d60 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20  case( op==TK_NE 
18d70 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
18d80 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
18d90 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f   );.      codeCo
18da0 6d 70 61 72 65 4f 70 65 72 61 6e 64 73 28 70 50  mpareOperands(pP
18db0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
18dc0 66 74 2c 20 26 72 31 2c 20 26 72 65 67 46 72 65  ft, &r1, &regFre
18dd0 65 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e1,.            
18de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18df0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69        pExpr->pRi
18e00 67 68 74 2c 20 26 72 32 2c 20 26 72 65 67 46 72  ght, &r2, &regFr
18e10 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ee2);.      code
18e20 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
18e30 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
18e40 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
18e50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18e60 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c     r1, r2, dest,
18e70 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
18e80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
18e90 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
18ea0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
18eb0 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
18ec0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
18ed0 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
18ee0 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
18ef0 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
18f00 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c  assert( TK_ISNUL
18f10 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a  L==OP_IsNull );.
18f20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
18f30 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74  _NOTNULL==OP_Not
18f40 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 74 65  Null );.      te
18f50 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
18f60 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74  SNULL );.      t
18f70 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
18f80 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  NOTNULL );.     
18f90 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
18fa0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
18fb0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
18fc0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
18fd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18fe0 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64  Op2(v, op, r1, d
18ff0 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  est);.      test
19000 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
19010 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
19020 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
19030 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
19040 20 20 20 20 20 2f 2a 20 20 20 20 78 20 42 45 54       /*    x BET
19050 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20  WEEN y AND z.   
19060 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
19070 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
19080 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
19090 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78  **    x>=y AND x
190a0 3c 3d 7a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  <=z.      **.   
190b0 20 20 20 2a 2a 20 43 6f 64 65 20 69 74 20 61 73     ** Code it as
190c0 20 73 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61   such, taking ca
190d0 72 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d  re to do the com
190e0 6d 6f 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f  mon subexpressio
190f0 6e 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65  n.      ** eleme
19100 6e 74 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 20 20  ntation of x..  
19110 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70      */.      Exp
19120 72 20 65 78 70 72 41 6e 64 3b 0a 20 20 20 20 20  r exprAnd;.     
19130 20 45 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b 0a   Expr compLeft;.
19140 20 20 20 20 20 20 45 78 70 72 20 63 6f 6d 70 52        Expr compR
19150 69 67 68 74 3b 0a 20 20 20 20 20 20 45 78 70 72  ight;.      Expr
19160 20 65 78 70 72 58 3b 0a 0a 20 20 20 20 20 20 65   exprX;..      e
19170 78 70 72 58 20 3d 20 2a 70 45 78 70 72 2d 3e 70  xprX = *pExpr->p
19180 4c 65 66 74 3b 0a 20 20 20 20 20 20 65 78 70 72  Left;.      expr
19190 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b  And.op = TK_AND;
191a0 0a 20 20 20 20 20 20 65 78 70 72 41 6e 64 2e 70  .      exprAnd.p
191b0 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74  Left = &compLeft
191c0 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e 64 2e  ;.      exprAnd.
191d0 70 52 69 67 68 74 20 3d 20 26 63 6f 6d 70 52 69  pRight = &compRi
191e0 67 68 74 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c  ght;.      compL
191f0 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a  eft.op = TK_GE;.
19200 20 20 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 70        compLeft.p
19210 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20  Left = &exprX;. 
19220 20 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52       compLeft.pR
19230 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  ight = pExpr->pL
19240 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
19250 0a 20 20 20 20 20 20 63 6f 6d 70 52 69 67 68 74  .      compRight
19260 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 20  .op = TK_LE;.   
19270 20 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65     compRight.pLe
19280 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 20  ft = &exprX;.   
19290 20 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52 69     compRight.pRi
192a0 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  ght = pExpr->pLi
192b0 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a  st->a[1].pExpr;.
192c0 20 20 20 20 20 20 65 78 70 72 58 2e 69 54 61 62        exprX.iTab
192d0 6c 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  le = sqlite3Expr
192e0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
192f0 20 26 65 78 70 72 58 2c 20 26 72 65 67 46 72 65   &exprX, &regFre
19300 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e1);.      testc
19310 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
19320 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 58 2e   );.      exprX.
19330 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52  op = TK_REGISTER
19340 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
19350 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
19360 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19370 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
19380 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73  e, &exprAnd, des
19390 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
193a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
193b0 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
193c0 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  {.      r1 = sql
193d0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
193e0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
193f0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
19400 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19410 4f 70 33 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31  Op3(v, OP_If, r1
19420 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
19430 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 74 65  ll!=0);.      te
19440 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
19450 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
19460 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
19470 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  l==0 );.      br
19480 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
19490 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
194a0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
194b0 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69  egFree1);.  sqli
194c0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
194d0 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
194e0 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e2);  .}../*.** 
194f0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
19500 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72  r a boolean expr
19510 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74  ession such that
19520 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a   a jump is made.
19530 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20  ** to the label 
19540 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78  "dest" if the ex
19550 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73  pression is fals
19560 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a  e but execution.
19570 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72  ** continues str
19580 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68  aight thru if th
19590 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
195a0 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  true..**.** If t
195b0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76  he expression ev
195c0 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20  aluates to NULL 
195d0 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f  (neither true no
195e0 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a  r false) then.**
195f0 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e   jump if jumpIfN
19600 75 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a 55  ull is SQLITE_JU
19610 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c  MPIFNULL or fall
19620 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70   through if jump
19630 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a  IfNull.** is 0..
19640 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
19650 78 70 72 49 66 46 61 6c 73 65 28 50 61 72 73 65  xprIfFalse(Parse
19660 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
19670 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c  pExpr, int dest,
19680 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
19690 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
196a0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
196b0 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74  nt op = 0;.  int
196c0 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20   regFree1 = 0;. 
196d0 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20   int regFree2 = 
196e0 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b  0;.  int r1, r2;
196f0 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70  ..  assert( jump
19700 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a  IfNull==SQLITE_J
19710 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d  UMPIFNULL || jum
19720 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
19730 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70  if( v==0 || pExp
19740 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  r==0 ) return;..
19750 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f    /* The value o
19760 66 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20  f pExpr->op and 
19770 6f 70 20 61 72 65 20 72 65 6c 61 74 65 64 20 61  op are related a
19780 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a  s follows:.  **.
19790 20 20 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72    **       pExpr
197a0 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20 20  ->op            
197b0 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d  op.  **       --
197c0 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20  -------         
197d0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a   ----------.  **
197e0 20 20 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c         TK_ISNULL
197f0 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74            OP_Not
19800 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20  Null.  **       
19810 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20  TK_NOTNULL      
19820 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a     OP_IsNull.  *
19830 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20  *       TK_NE   
19840 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71             OP_Eq
19850 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45  .  **       TK_E
19860 51 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  Q              O
19870 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Ne.  **       
19880 54 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20 20  TK_GT           
19890 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20     OP_Le.  **   
198a0 20 20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20      TK_LE       
198b0 20 20 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a         OP_Gt.  *
198c0 2a 20 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20  *       TK_GE   
198d0 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74             OP_Lt
198e0 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c  .  **       TK_L
198f0 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  T              O
19900 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46  P_Ge.  **.  ** F
19910 6f 72 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20  or other values 
19920 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70  of pExpr->op, op
19930 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e   is undefined an
19940 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54  d unused..  ** T
19950 68 65 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20  he value of TK_ 
19960 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74  and OP_ constant
19970 73 20 61 72 65 20 61 72 72 61 6e 67 65 64 20 73  s are arranged s
19980 75 63 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a  uch that we.  **
19990 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65   can compute the
199a0 20 6d 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75   mapping above u
199b0 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  sing the followi
199c0 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20  ng expression.. 
199d0 20 2a 2a 20 41 73 73 65 72 74 28 29 73 20 76 65   ** Assert()s ve
199e0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63 6f  rify that the co
199f0 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72  mputation is cor
19a00 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20  rect..  */.  op 
19a10 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54  = ((pExpr->op+(T
19a20 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d  K_ISNULL&1))^1)-
19a30 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a  (TK_ISNULL&1);..
19a40 20 20 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72    /* Verify corr
19a50 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66  ect alignment of
19a60 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e   TK_ and OP_ con
19a70 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73  stants.  */.  as
19a80 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
19a90 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70  =TK_ISNULL || op
19aa0 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a  ==OP_NotNull );.
19ab0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
19ac0 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20  >op!=TK_NOTNULL 
19ad0 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c  || op==OP_IsNull
19ae0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
19af0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c  xpr->op!=TK_NE |
19b00 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20  | op==OP_Eq );. 
19b10 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
19b20 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d  op!=TK_EQ || op=
19b30 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65  =OP_Ne );.  asse
19b40 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
19b50 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47  K_LT || op==OP_G
19b60 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
19b70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20  Expr->op!=TK_LE 
19b80 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a  || op==OP_Gt );.
19b90 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
19ba0 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70  >op!=TK_GT || op
19bb0 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73  ==OP_Le );.  ass
19bc0 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
19bd0 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_GE || op==OP_
19be0 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28  Lt );..  switch(
19bf0 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
19c00 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b    case TK_AND: {
19c10 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
19c20 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
19c30 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
19c40 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c  ( pParse->disabl
19c50 65 43 6f 6c 43 61 63 68 65 3d 3d 30 20 29 3b 0a  eColCache==0 );.
19c60 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
19c70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
19c80 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
19c90 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
19ca0 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
19cb0 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b  disableColCache+
19cc0 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  +;.      sqlite3
19cd0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
19ce0 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
19cf0 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
19d00 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ull);.      asse
19d10 72 74 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61  rt( pParse->disa
19d20 62 6c 65 43 6f 6c 43 61 63 68 65 3e 30 20 29 3b  bleColCache>0 );
19d30 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  .      pParse->d
19d40 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d 2d  isableColCache--
19d50 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
19d60 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
19d70 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _OR: {.      int
19d80 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   d2 = sqlite3Vdb
19d90 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
19da0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
19db0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
19dc0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19dd0 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43  pParse->disableC
19de0 6f 6c 43 61 63 68 65 3d 3d 30 20 29 3b 0a 20 20  olCache==0 );.  
19df0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
19e00 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
19e10 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20  xpr->pLeft, d2, 
19e20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54  jumpIfNull^SQLIT
19e30 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
19e40 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73       pParse->dis
19e50 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a  ableColCache++;.
19e60 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
19e70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
19e80 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
19e90 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
19ea0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
19eb0 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65   pParse->disable
19ec0 43 6f 6c 43 61 63 68 65 3e 30 20 29 3b 0a 20 20  ColCache>0 );.  
19ed0 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61      pParse->disa
19ee0 62 6c 65 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20  bleColCache--;. 
19ef0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19f00 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
19f10 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  d2);.      break
19f20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
19f30 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_NOT: {.     
19f40 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
19f50 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
19f60 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
19f70 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
19f80 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
19f90 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
19fa0 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
19fb0 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
19fc0 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
19fd0 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
19fe0 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
19ff0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1a000 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20   op==TK_LT );.  
1a010 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1a020 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20  ==TK_LE );.     
1a030 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1a040 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65  K_GT );.      te
1a050 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47  stcase( op==TK_G
1a060 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  E );.      testc
1a070 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20 29  ase( op==TK_EQ )
1a080 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1a090 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20  ( op==TK_NE );. 
1a0a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
1a0b0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
1a0c0 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
1a0d0 65 4f 70 65 72 61 6e 64 73 28 70 50 61 72 73 65  eOperands(pParse
1a0e0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1a0f0 26 72 31 2c 20 26 72 65 67 46 72 65 65 31 2c 0a  &r1, &regFree1,.
1a100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a120 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c    pExpr->pRight,
1a130 20 26 72 32 2c 20 26 72 65 67 46 72 65 65 32 29   &r2, &regFree2)
1a140 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
1a150 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
1a160 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
1a170 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
1a180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1a190 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d  1, r2, dest, jum
1a1a0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
1a1b0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1a1c0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
1a1d0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1a1e0 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
1a1f0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1a200 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
1a210 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
1a220 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  LL: {.      test
1a230 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  case( op==TK_ISN
1a240 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ULL );.      tes
1a250 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f  tcase( op==TK_NO
1a260 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72  TNULL );.      r
1a270 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1a280 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1a290 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
1a2a0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1a2b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a2c0 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73  2(v, op, r1, des
1a2d0 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
1a2e0 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1a2f0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1a300 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1a310 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20  K_BETWEEN: {.   
1a320 20 20 20 2f 2a 20 20 20 20 78 20 42 45 54 57 45     /*    x BETWE
1a330 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 20  EN y AND z.     
1a340 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 73 20   **.      ** Is 
1a350 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20  equivalent to . 
1a360 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
1a370 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d      x>=y AND x<=
1a380 7a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  z.      **.     
1a390 20 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20 73   ** Code it as s
1a3a0 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72 65  uch, taking care
1a3b0 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f   to do the commo
1a3c0 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a  n subexpression.
1a3d0 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74        ** element
1a3e0 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 20 20 20 20  ation of x..    
1a3f0 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20    */.      Expr 
1a400 65 78 70 72 41 6e 64 3b 0a 20 20 20 20 20 20 45  exprAnd;.      E
1a410 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b 0a 20 20  xpr compLeft;.  
1a420 20 20 20 20 45 78 70 72 20 63 6f 6d 70 52 69 67      Expr compRig
1a430 68 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 65  ht;.      Expr e
1a440 78 70 72 58 3b 0a 0a 20 20 20 20 20 20 65 78 70  xprX;..      exp
1a450 72 58 20 3d 20 2a 70 45 78 70 72 2d 3e 70 4c 65  rX = *pExpr->pLe
1a460 66 74 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e  ft;.      exprAn
1a470 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20  d.op = TK_AND;. 
1a480 20 20 20 20 20 65 78 70 72 41 6e 64 2e 70 4c 65       exprAnd.pLe
1a490 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a  ft = &compLeft;.
1a4a0 20 20 20 20 20 20 65 78 70 72 41 6e 64 2e 70 52        exprAnd.pR
1a4b0 69 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67 68  ight = &compRigh
1a4c0 74 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65 66  t;.      compLef
1a4d0 74 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20  t.op = TK_GE;.  
1a4e0 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65      compLeft.pLe
1a4f0 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 20  ft = &exprX;.   
1a500 20 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67     compLeft.pRig
1a510 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  ht = pExpr->pLis
1a520 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
1a530 20 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f       compRight.o
1a540 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 20 20 20  p = TK_LE;.     
1a550 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66 74   compRight.pLeft
1a560 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 20 20 20   = &exprX;.     
1a570 20 63 6f 6d 70 52 69 67 68 74 2e 70 52 69 67 68   compRight.pRigh
1a580 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
1a590 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
1a5a0 20 20 20 20 65 78 70 72 58 2e 69 54 61 62 6c 65      exprX.iTable
1a5b0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1a5c0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26  deTemp(pParse, &
1a5d0 65 78 70 72 58 2c 20 26 72 65 67 46 72 65 65 31  exprX, &regFree1
1a5e0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1a5f0 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1a600 3b 0a 20 20 20 20 20 20 65 78 70 72 58 2e 6f 70  ;.      exprX.op
1a610 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a   = TK_REGISTER;.
1a620 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1a630 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1a640 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1a650 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
1a660 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74  , &exprAnd, dest
1a670 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
1a680 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1a690 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
1a6a0 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
1a6b0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1a6c0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26  pParse, pExpr, &
1a6d0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1a6e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a6f0 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p3(v, OP_IfNot, 
1a700 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  r1, dest, jumpIf
1a710 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20  Null!=0);.      
1a720 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1a730 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
1a740 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
1a750 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
1a760 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
1a770 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
1a780 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1a790 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71   regFree1);.  sq
1a7a0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1a7b0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
1a7c0 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ree2);.}../*.** 
1a7d0 44 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61 72  Do a deep compar
1a7e0 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70 72  ison of two expr
1a7f0 65 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20 52  ession trees.  R
1a800 65 74 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d  eturn TRUE (non-
1a810 7a 65 72 6f 29 0a 2a 2a 20 69 66 20 74 68 65 79  zero).** if they
1a820 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 20 61   are identical a
1a830 6e 64 20 72 65 74 75 72 6e 20 46 41 4c 53 45 20  nd return FALSE 
1a840 69 66 20 74 68 65 79 20 64 69 66 66 65 72 20 69  if they differ i
1a850 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a  n any way..**.**
1a860 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 69 73 20   Sometimes this 
1a870 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
1a880 75 72 6e 20 46 41 4c 53 45 20 65 76 65 6e 20 69  urn FALSE even i
1a890 66 20 74 68 65 20 74 77 6f 20 65 78 70 72 65 73  f the two expres
1a8a0 73 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20  sions.** really 
1a8b0 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20  are equivalent. 
1a8c0 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 70 72   If we cannot pr
1a8d0 6f 76 65 20 74 68 61 74 20 74 68 65 20 65 78 70  ove that the exp
1a8e0 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20  ressions are.** 
1a8f0 69 64 65 6e 74 69 63 61 6c 2c 20 77 65 20 72 65  identical, we re
1a900 74 75 72 6e 20 46 41 4c 53 45 20 6a 75 73 74 20  turn FALSE just 
1a910 74 6f 20 62 65 20 73 61 66 65 2e 20 20 53 6f 20  to be safe.  So 
1a920 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  if this routine.
1a930 2a 2a 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  ** returns false
1a940 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f  , then you do no
1a950 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f  t really know fo
1a960 72 20 63 65 72 74 61 69 6e 20 69 66 20 74 68 65  r certain if the
1a970 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69   two.** expressi
1a980 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  ons are the same
1a990 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20 67 65  .  But if you ge
1a9a0 74 20 61 20 54 52 55 45 20 72 65 74 75 72 6e 2c  t a TRUE return,
1a9b0 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e   then you.** can
1a9c0 20 62 65 20 73 75 72 65 20 74 68 65 20 65 78 70   be sure the exp
1a9d0 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65  ressions are the
1a9e0 20 73 61 6d 65 2e 20 20 49 6e 20 74 68 65 20 70   same.  In the p
1a9f0 6c 61 63 65 73 20 77 68 65 72 65 0a 2a 2a 20 74  laces where.** t
1aa00 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
1aa10 73 65 64 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  sed, it does not
1aa20 20 68 75 72 74 20 74 6f 20 67 65 74 20 61 6e 20   hurt to get an 
1aa30 65 78 74 72 61 20 46 41 4c 53 45 20 2d 20 74 68  extra FALSE - th
1aa40 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74  at.** just might
1aa50 20 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20   result in some 
1aa60 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20  slightly slower 
1aa70 63 6f 64 65 2e 20 20 42 75 74 20 72 65 74 75 72  code.  But retur
1aa80 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72  ning.** an incor
1aa90 72 65 63 74 20 54 52 55 45 20 63 6f 75 6c 64 20  rect TRUE could 
1aaa0 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e  lead to a malfun
1aab0 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
1aac0 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
1aad0 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72 20  (Expr *pA, Expr 
1aae0 2a 70 42 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  *pB){.  int i;. 
1aaf0 20 69 66 28 20 70 41 3d 3d 30 7c 7c 70 42 3d 3d   if( pA==0||pB==
1ab00 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1ab10 70 42 3d 3d 70 41 3b 0a 20 20 7d 0a 20 20 69 66  pB==pA;.  }.  if
1ab20 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70  ( pA->op!=pB->op
1ab30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
1ab40 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20  f( (pA->flags & 
1ab50 45 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70  EP_Distinct)!=(p
1ab60 42 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69  B->flags & EP_Di
1ab70 73 74 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e  stinct) ) return
1ab80 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   0;.  if( !sqlit
1ab90 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41  e3ExprCompare(pA
1aba0 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65  ->pLeft, pB->pLe
1abb0 66 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ft) ) return 0;.
1abc0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78    if( !sqlite3Ex
1abd0 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52  prCompare(pA->pR
1abe0 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74  ight, pB->pRight
1abf0 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
1ac00 69 66 28 20 70 41 2d 3e 70 4c 69 73 74 20 29 7b  if( pA->pList ){
1ac10 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 70 4c 69  .    if( pB->pLi
1ac20 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
1ac30 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 70 4c  ;.    if( pA->pL
1ac40 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e  ist->nExpr!=pB->
1ac50 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 20 72  pList->nExpr ) r
1ac60 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f 72  eturn 0;.    for
1ac70 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 70 4c 69 73  (i=0; i<pA->pLis
1ac80 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
1ac90 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74        if( !sqlit
1aca0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41  e3ExprCompare(pA
1acb0 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  ->pList->a[i].pE
1acc0 78 70 72 2c 20 70 42 2d 3e 70 4c 69 73 74 2d 3e  xpr, pB->pList->
1acd0 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  a[i].pExpr) ){. 
1ace0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
1acf0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1ad00 20 7d 65 6c 73 65 20 69 66 28 20 70 42 2d 3e 70   }else if( pB->p
1ad10 4c 69 73 74 20 29 7b 0a 20 20 20 20 72 65 74 75  List ){.    retu
1ad20 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
1ad30 70 41 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 70  pA->pSelect || p
1ad40 42 2d 3e 70 53 65 6c 65 63 74 20 29 20 72 65 74  B->pSelect ) ret
1ad50 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d  urn 0;.  if( pA-
1ad60 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61  >iTable!=pB->iTa
1ad70 62 6c 65 20 7c 7c 20 70 41 2d 3e 69 43 6f 6c 75  ble || pA->iColu
1ad80 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20  mn!=pB->iColumn 
1ad90 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
1ada0 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  ( pA->op!=TK_COL
1adb0 55 4d 4e 20 26 26 20 70 41 2d 3e 74 6f 6b 65 6e  UMN && pA->token
1adc0 2e 7a 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42  .z ){.    if( pB
1add0 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 20 72  ->token.z==0 ) r
1ade0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28  eturn 0;.    if(
1adf0 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 70 41   pB->token.n!=pA
1ae00 2d 3e 74 6f 6b 65 6e 2e 6e 20 29 20 72 65 74 75  ->token.n ) retu
1ae10 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71  rn 0;.    if( sq
1ae20 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63  lite3StrNICmp((c
1ae30 68 61 72 2a 29 70 41 2d 3e 74 6f 6b 65 6e 2e 7a  har*)pA->token.z
1ae40 2c 28 63 68 61 72 2a 29 70 42 2d 3e 74 6f 6b 65  ,(char*)pB->toke
1ae50 6e 2e 7a 2c 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 29  n.z,pB->token.n)
1ae60 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=0 ){.      ret
1ae70 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
1ae80 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
1ae90 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
1aea0 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
1aeb0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
1aec0 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20   array.  Return 
1aed0 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20  the index of.** 
1aee0 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e  the new element.
1aef0 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74    Return a negat
1af00 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61  ive number if ma
1af10 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  lloc fails..*/.s
1af20 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67  tatic int addAgg
1af30 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74  InfoColumn(sqlit
1af40 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20  e3 *db, AggInfo 
1af50 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69  *pInfo){.  int i
1af60 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20  ;.  pInfo->aCol 
1af70 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c  = sqlite3ArrayAl
1af80 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64  locate(.       d
1af90 62 2c 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d  b,.       pInfo-
1afa0 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69  >aCol,.       si
1afb0 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c  zeof(pInfo->aCol
1afc0 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 33 2c 0a  [0]),.       3,.
1afd0 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e         &pInfo->n
1afe0 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26  Column,.       &
1aff0 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 41 6c  pInfo->nColumnAl
1b000 6c 6f 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20  loc,.       &i. 
1b010 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a   );.  return i;.
1b020 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  }    ../*.** Add
1b030 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
1b040 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e  o the pAggInfo->
1b050 61 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20  aFunc[] array.  
1b060 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
1b070 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65   of.** the new e
1b080 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  lement.  Return 
1b090 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
1b0a0 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  r if malloc fail
1b0b0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
1b0c0 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28   addAggInfoFunc(
1b0d0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67  sqlite3 *db, Agg
1b0e0 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20  Info *pInfo){.  
1b0f0 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e  int i;.  pInfo->
1b100 61 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 41  aFunc = sqlite3A
1b110 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20  rrayAllocate(.  
1b120 20 20 20 20 20 64 62 2c 20 0a 20 20 20 20 20 20       db, .      
1b130 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20   pInfo->aFunc,. 
1b140 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e        sizeof(pIn
1b150 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20  fo->aFunc[0]),. 
1b160 20 20 20 20 20 20 33 2c 0a 20 20 20 20 20 20 20        3,.       
1b170 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20  &pInfo->nFunc,. 
1b180 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46        &pInfo->nF
1b190 75 6e 63 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20  uncAlloc,.      
1b1a0 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72   &i.  );.  retur
1b1b0 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a  n i;.}    ../*.*
1b1c0 2a 20 54 68 69 73 20 69 73 20 61 6e 20 78 46 75  * This is an xFu
1b1d0 6e 63 20 66 6f 72 20 77 61 6c 6b 45 78 70 72 54  nc for walkExprT
1b1e0 72 65 65 28 29 20 75 73 65 64 20 74 6f 20 69 6d  ree() used to im
1b1f0 70 6c 65 6d 65 6e 74 20 0a 2a 2a 20 73 71 6c 69  plement .** sqli
1b200 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
1b210 67 72 65 67 61 74 65 73 28 29 2e 20 20 53 65 65  gregates().  See
1b220 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
1b230 79 7a 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a  yzeAggregates.**
1b240 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
1b250 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a  information..**.
1b260 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1b270 61 6e 61 6c 79 7a 65 73 20 74 68 65 20 61 67 67  analyzes the agg
1b280 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20  regate function 
1b290 61 74 20 70 45 78 70 72 2e 0a 2a 2f 0a 73 74 61  at pExpr..*/.sta
1b2a0 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41  tic int analyzeA
1b2b0 67 67 72 65 67 61 74 65 28 76 6f 69 64 20 2a 70  ggregate(void *p
1b2c0 41 72 67 2c 20 45 78 70 72 20 2a 70 45 78 70 72  Arg, Expr *pExpr
1b2d0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61  ){.  int i;.  Na
1b2e0 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d  meContext *pNC =
1b2f0 20 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 29   (NameContext *)
1b300 70 41 72 67 3b 0a 20 20 50 61 72 73 65 20 2a 70  pArg;.  Parse *p
1b310 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61  Parse = pNC->pPa
1b320 72 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  rse;.  SrcList *
1b330 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e  pSrcList = pNC->
1b340 70 53 72 63 4c 69 73 74 3b 0a 20 20 41 67 67 49  pSrcList;.  AggI
1b350 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20  nfo *pAggInfo = 
1b360 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 0a  pNC->pAggInfo;..
1b370 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
1b380 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
1b390 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20  TK_AGG_COLUMN:. 
1b3a0 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
1b3b0 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 43 68  N: {.      /* Ch
1b3c0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
1b3d0 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f  e column is in o
1b3e0 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73  ne of the tables
1b3f0 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 20   in the FROM.   
1b400 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20     ** clause of 
1b410 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75  the aggregate qu
1b420 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ery */.      if(
1b430 20 70 53 72 63 4c 69 73 74 20 29 7b 0a 20 20 20   pSrcList ){.   
1b440 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
1b450 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
1b460 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20  = pSrcList->a;. 
1b470 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
1b480 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63  i<pSrcList->nSrc
1b490 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
1b4a0 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  .          struc
1b4b0 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
1b4c0 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Col;.          i
1b4d0 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  f( pExpr->iTable
1b4e0 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ==pItem->iCursor
1b4f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1b500 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
1b510 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65  his point, it me
1b520 61 6e 73 20 74 68 61 74 20 70 45 78 70 72 20 72  ans that pExpr r
1b530 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
1b540 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1b550 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 46  that is in the F
1b560 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
1b570 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  e aggregate quer
1b580 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  y.  .           
1b590 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20   **.            
1b5a0 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79  ** Make an entry
1b5b0 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20   for the column 
1b5c0 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  in pAggInfo->aCo
1b5d0 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20 20 20  l[] if there.   
1b5e0 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e           ** is n
1b5f0 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68 65 72  ot an entry ther
1b600 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 20  e already..     
1b610 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1b620 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
1b630 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20           pCol = 
1b640 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a  pAggInfo->aCol;.
1b650 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
1b660 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d  k=0; k<pAggInfo-
1b670 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70  >nColumn; k++, p
1b680 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
1b690 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
1b6a0 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69  iTable==pExpr->i
1b6b0 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20  Table &&.       
1b6c0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
1b6d0 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d  >iColumn==pExpr-
1b6e0 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
1b6f0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
1b700 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
1b710 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
1b720 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1b730 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e   (k>=pAggInfo->n
1b740 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20 20  Column).        
1b750 20 20 20 20 20 26 26 20 28 6b 20 3d 20 61 64 64       && (k = add
1b760 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50  AggInfoColumn(pP
1b770 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e  arse->db, pAggIn
1b780 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20 20 20  fo))>=0 .       
1b790 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1b7a0 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 41        pCol = &pA
1b7b0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b  ggInfo->aCol[k];
1b7c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1b7d0 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78 70  Col->pTab = pExp
1b7e0 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  r->pTab;.       
1b7f0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61         pCol->iTa
1b800 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61  ble = pExpr->iTa
1b810 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ble;.           
1b820 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e     pCol->iColumn
1b830 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
1b840 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n;.             
1b850 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b   pCol->iMem = ++
1b860 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1b870 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
1b880 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20  ->iSorterColumn 
1b890 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
1b8a0 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20      pCol->pExpr 
1b8b0 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
1b8c0 20 20 20 20 20 20 20 69 66 28 20 70 41 67 67 49         if( pAggI
1b8d0 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b  nfo->pGroupBy ){
1b8e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b8f0 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20   int j, n;.     
1b900 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 4c             ExprL
1b910 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67 67 49  ist *pGB = pAggI
1b920 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  nfo->pGroupBy;. 
1b930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1b940 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
1b950 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47 42  tem *pTerm = pGB
1b960 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ->a;.           
1b970 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45       n = pGB->nE
1b980 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
1b990 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
1b9a0 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  n; j++, pTerm++)
1b9b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1b9c0 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
1b9d0 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
1b9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1b9f0 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( pE->op==TK_CO
1ba00 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61 62  LUMN && pE->iTab
1ba10 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  le==pExpr->iTabl
1ba20 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  e &&.           
1ba30 20 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e 69             pE->i
1ba40 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69  Column==pExpr->i
1ba50 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
1ba60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
1ba70 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
1ba80 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  n = j;.         
1ba90 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1baa0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1bab0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1bac0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1bad0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1bae0 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
1baf0 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20  iSorterColumn<0 
1bb00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1bb10 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
1bb20 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66  Column = pAggInf
1bb30 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  o->nSortingColum
1bb40 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  n++;.           
1bb50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1bb60 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f   }.            /
1bb70 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77 20 61  * There is now a
1bb80 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45 78 70  n entry for pExp
1bb90 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61  r in pAggInfo->a
1bba0 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20 20  Col[] (either.  
1bbb0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63            ** bec
1bbc0 61 75 73 65 20 69 74 20 77 61 73 20 74 68 65 72  ause it was ther
1bbd0 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65 63 61  e before or beca
1bbe0 75 73 65 20 77 65 20 6a 75 73 74 20 63 72 65 61  use we just crea
1bbf0 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20 20 20  ted it)..       
1bc00 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20       ** Convert 
1bc10 74 68 65 20 70 45 78 70 72 20 74 6f 20 62 65 20  the pExpr to be 
1bc20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  a TK_AGG_COLUMN 
1bc30 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74 68 61  referring to tha
1bc40 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  t.            **
1bc50 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
1bc60 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20 20 20  ] entry..       
1bc70 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1bc80 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49      pExpr->pAggI
1bc90 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a  nfo = pAggInfo;.
1bca0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
1bcb0 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43  r->op = TK_AGG_C
1bcc0 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20  OLUMN;.         
1bcd0 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d     pExpr->iAgg =
1bce0 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   k;.            
1bcf0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
1bd00 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45 78 70   } /* endif pExp
1bd10 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d  r->iTable==pItem
1bd20 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20  ->iCursor */.   
1bd30 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f       } /* end lo
1bd40 6f 70 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74  op over pSrcList
1bd50 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
1bd60 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1bd70 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  }.    case TK_AG
1bd80 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  G_FUNCTION: {.  
1bd90 20 20 20 20 2f 2a 20 54 68 65 20 70 4e 43 2d 3e      /* The pNC->
1bda0 6e 44 65 70 74 68 3d 3d 30 20 74 65 73 74 20 63  nDepth==0 test c
1bdb0 61 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20  auses aggregate 
1bdc0 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 73 75 62  functions in sub
1bdd0 71 75 65 72 69 65 73 0a 20 20 20 20 20 20 2a 2a  queries.      **
1bde0 20 74 6f 20 62 65 20 69 67 6e 6f 72 65 64 20 2a   to be ignored *
1bdf0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d  /.      if( pNC-
1be00 3e 6e 44 65 70 74 68 3d 3d 30 20 29 7b 0a 20 20  >nDepth==0 ){.  
1be10 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
1be20 6f 20 73 65 65 20 69 66 20 70 45 78 70 72 20 69  o see if pExpr i
1be30 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66  s a duplicate of
1be40 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65 67 61   another aggrega
1be50 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  te .        ** f
1be60 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20  unction that is 
1be70 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70  already in the p
1be80 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72  AggInfo structur
1be90 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  e.        */.   
1bea0 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
1beb0 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20  nfo_func *pItem 
1bec0 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  = pAggInfo->aFun
1bed0 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  c;.        for(i
1bee0 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
1bef0 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65  nFunc; i++, pIte
1bf00 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
1bf10 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
1bf20 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45  ompare(pItem->pE
1bf30 78 70 72 2c 20 70 45 78 70 72 29 20 29 7b 0a 20  xpr, pExpr) ){. 
1bf40 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1bf50 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1bf60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1bf70 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d  if( i>=pAggInfo-
1bf80 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20  >nFunc ){.      
1bf90 20 20 20 20 2f 2a 20 70 45 78 70 72 20 69 73 20      /* pExpr is 
1bfa0 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20  original.  Make 
1bfb0 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70  a new entry in p
1bfc0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d  AggInfo->aFunc[]
1bfd0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
1bfe0 20 20 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d          u8 enc =
1bff0 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29   ENC(pParse->db)
1c000 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d 20  ;.          i = 
1c010 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 70  addAggInfoFunc(p
1c020 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49  Parse->db, pAggI
1c030 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nfo);.          
1c040 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20  if( i>=0 ){.    
1c050 20 20 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20          pItem = 
1c060 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  &pAggInfo->aFunc
1c070 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [i];.           
1c080 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20   pItem->pExpr = 
1c090 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
1c0a0 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d     pItem->iMem =
1c0b0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1c0c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
1c0d0 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69  em->pFunc = sqli
1c0e0 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
1c0f0 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20  pParse->db,.    
1c100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1c110 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b  char*)pExpr->tok
1c120 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  en.z, pExpr->tok
1c130 65 6e 2e 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  en.n,.          
1c140 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
1c150 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e 70  pList ? pExpr->p
1c160 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c  List->nExpr : 0,
1c170 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20   enc, 0);.      
1c180 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
1c190 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74  >flags & EP_Dist
1c1a0 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  inct ){.        
1c1b0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69        pItem->iDi
1c1c0 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d  stinct = pParse-
1c1d0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
1c1e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c1f0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
1c200 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b  >iDistinct = -1;
1c210 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1c220 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1c230 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
1c240 4d 61 6b 65 20 70 45 78 70 72 20 70 6f 69 6e 74  Make pExpr point
1c250 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69   to the appropri
1c260 61 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  ate pAggInfo->aF
1c270 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20  unc[] entry.    
1c280 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
1c290 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 69 3b 0a  Expr->iAgg = i;.
1c2a0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
1c2b0 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e  AggInfo = pAggIn
1c2c0 66 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  fo;.        retu
1c2d0 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
1c2e0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
1c2f0 63 75 72 73 69 76 65 6c 79 20 77 61 6c 6b 20 73  cursively walk s
1c300 75 62 71 75 65 72 69 65 73 20 6c 6f 6f 6b 69 6e  ubqueries lookin
1c310 67 20 66 6f 72 20 54 4b 5f 43 4f 4c 55 4d 4e 20  g for TK_COLUMN 
1c320 6e 6f 64 65 73 20 74 68 61 74 20 6e 65 65 64 0a  nodes that need.
1c330 20 20 2a 2a 20 74 6f 20 62 65 20 63 68 61 6e 67    ** to be chang
1c340 65 64 20 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c  ed to TK_AGG_COL
1c350 55 4d 4e 2e 20 20 42 75 74 20 69 6e 63 72 65 6d  UMN.  But increm
1c360 65 6e 74 20 6e 44 65 70 74 68 20 73 6f 20 74 68  ent nDepth so th
1c370 61 74 0a 20 20 2a 2a 20 54 4b 5f 41 47 47 5f 46  at.  ** TK_AGG_F
1c380 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e  UNCTION nodes in
1c390 20 73 75 62 71 75 65 72 69 65 73 20 77 69 6c 6c   subqueries will
1c3a0 20 62 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20   be unchanged.. 
1c3b0 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d   */.  if( pExpr-
1c3c0 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
1c3d0 70 4e 43 2d 3e 6e 44 65 70 74 68 2b 2b 3b 0a 20  pNC->nDepth++;. 
1c3e0 20 20 20 77 61 6c 6b 53 65 6c 65 63 74 45 78 70     walkSelectExp
1c3f0 72 28 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  r(pExpr->pSelect
1c400 2c 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  , analyzeAggrega
1c410 74 65 2c 20 70 4e 43 29 3b 0a 20 20 20 20 70 4e  te, pNC);.    pN
1c420 43 2d 3e 6e 44 65 70 74 68 2d 2d 3b 0a 20 20 7d  C->nDepth--;.  }
1c430 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1c440 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68  /*.** Analyze th
1c450 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
1c460 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  on looking for a
1c470 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
1c480 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61  ns and.** for va
1c490 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65  riables that nee
1c4a0 64 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f  d to be added to
1c4b0 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67   the pParse->aAg
1c4c0 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 20 4d 61  g[] array..** Ma
1c4d0 6b 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 6e  ke additional en
1c4e0 74 72 69 65 73 20 74 6f 20 74 68 65 20 70 50 61  tries to the pPa
1c4f0 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61  rse->aAgg[] arra
1c500 79 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  y as necessary..
1c510 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1c520 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62  ne should only b
1c530 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74  e called after t
1c540 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61  he expression ha
1c550 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a  s been.** analyz
1c560 65 64 20 62 79 20 73 71 6c 69 74 65 33 45 78 70  ed by sqlite3Exp
1c570 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29 2e  rResolveNames().
1c580 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1c590 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
1c5a0 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78  gates(NameContex
1c5b0 74 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70 45  t *pNC, Expr *pE
1c5c0 78 70 72 29 7b 0a 20 20 77 61 6c 6b 45 78 70 72  xpr){.  walkExpr
1c5d0 54 72 65 65 28 70 45 78 70 72 2c 20 61 6e 61 6c  Tree(pExpr, anal
1c5e0 79 7a 65 41 67 67 72 65 67 61 74 65 2c 20 70 4e  yzeAggregate, pN
1c5f0 43 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c  C);.}../*.** Cal
1c600 6c 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  l sqlite3ExprAna
1c610 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29  lyzeAggregates()
1c620 20 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65   for every expre
1c630 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65  ssion in an.** e
1c640 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20  xpression list. 
1c650 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
1c660 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a  er of errors..**
1c670 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
1c680 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e  is found, the an
1c690 61 6c 79 73 69 73 20 69 73 20 63 75 74 20 73 68  alysis is cut sh
1c6a0 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ort..*/.void sql
1c6b0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
1c6c0 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65  ggList(NameConte
1c6d0 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73  xt *pNC, ExprLis
1c6e0 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74 72  t *pList){.  str
1c6f0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
1c700 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
1c710 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  i;.  if( pList )
1c720 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d  {.    for(pItem=
1c730 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
1c740 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
1c750 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
1c760 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
1c770 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
1c780 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78  (pNC, pItem->pEx
1c790 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  pr);.    }.  }.}
1c7a0 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
1c7b0 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 20 74   or deallocate t
1c7c0 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65 67  emporary use reg
1c7d0 69 73 74 65 72 73 20 64 75 72 69 6e 67 20 63 6f  isters during co
1c7e0 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 0a 2a  de generation..*
1c7f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74  /.int sqlite3Get
1c800 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70  TempReg(Parse *p
1c810 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70 50  Parse){.  if( pP
1c820 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d  arse->nTempReg==
1c830 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1c840 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1c850 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61    }.  return pPa
1c860 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 2d 2d  rse->aTempReg[--
1c870 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
1c880 5d 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  ];.}.void sqlite
1c890 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1c8a0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
1c8b0 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 66 28 20  nt iReg){.  if( 
1c8c0 69 52 65 67 20 26 26 20 70 50 61 72 73 65 2d 3e  iReg && pParse->
1c8d0 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69  nTempReg<ArraySi
1c8e0 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70  ze(pParse->aTemp
1c8f0 52 65 67 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Reg) ){.    sqli
1c900 74 65 33 45 78 70 72 57 72 69 74 61 62 6c 65 52  te3ExprWritableR
1c910 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2c 20  egister(pParse, 
1c920 69 52 65 67 2c 20 69 52 65 67 29 3b 0a 20 20 20  iReg, iReg);.   
1c930 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65   pParse->aTempRe
1c940 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  g[pParse->nTempR
1c950 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20 20  eg++] = iReg;.  
1c960 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  }.}../*.** Alloc
1c970 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74  ate or deallocat
1c980 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52 65  e a block of nRe
1c990 67 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65  g consecutive re
1c9a0 67 69 73 74 65 72 73 0a 2a 2f 0a 69 6e 74 20 73  gisters.*/.int s
1c9b0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
1c9c0 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
1c9d0 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69  , int nReg){.  i
1c9e0 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 20 3d 20 70  nt i, n;.  i = p
1c9f0 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67  Parse->iRangeReg
1ca00 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  n = pParse->
1ca10 6e 52 61 6e 67 65 52 65 67 3b 0a 20 20 69 66 28  nRangeReg;.  if(
1ca20 20 6e 52 65 67 3c 3d 6e 20 26 26 20 21 75 73 65   nReg<=n && !use
1ca30 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70  dAsColumnCache(p
1ca40 50 61 72 73 65 2c 20 69 2c 20 69 2b 6e 2d 31 29  Parse, i, i+n-1)
1ca50 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
1ca60 69 52 61 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65  iRangeReg += nRe
1ca70 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  g;.    pParse->n
1ca80 52 61 6e 67 65 52 65 67 20 2d 3d 20 6e 52 65 67  RangeReg -= nReg
1ca90 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1caa0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
1cab0 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
1cac0 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d  Mem += nReg;.  }
1cad0 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76  .  return i;.}.v
1cae0 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61  oid sqlite3Relea
1caf0 73 65 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73  seTempRange(Pars
1cb00 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
1cb10 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a  Reg, int nReg){.
1cb20 20 20 69 66 28 20 6e 52 65 67 3e 70 50 61 72 73    if( nReg>pPars
1cb30 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 29 7b 0a  e->nRangeReg ){.
1cb40 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e      pParse->nRan
1cb50 67 65 52 65 67 20 3d 20 6e 52 65 67 3b 0a 20 20  geReg = nReg;.  
1cb60 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65    pParse->iRange
1cb70 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a  Reg = iReg;.  }.
1cb80 7d 0a                                            }.