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

Artifact 11e00cafa3c6c7e432b06f06c923d1332349354a:


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 35 35 20 32 30 30 38 2f 30 33 2f 32 30 20  .355 2008/03/20 
0220: 31 34 3a 30 33 3a 32 39 20 64 72 68 20 45 78 70  14:03:29 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 63 6f  *.** Generate co
17c0: 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 61 72 69  de for a compari
17d0: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f  son operator..*/
17e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
17f0: 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65  Compare(.  Parse
1800: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
1810: 54 68 65 20 70 61 72 73 69 6e 67 20 28 61 6e 64  The parsing (and
1820: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
1830: 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  ) context */.  E
1840: 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20  xpr *pLeft,     
1850: 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70 65   /* The left ope
1860: 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  rand */.  Expr *
1870: 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20 54  pRight,     /* T
1880: 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
1890: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64 65   */.  int opcode
18a0: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  ,       /* The c
18b0: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64 65  omparison opcode
18c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c 20 69   */.  int in1, i
18d0: 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67 69 73  nt in2, /* Regis
18e0: 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70 65 72  ter holding oper
18f0: 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20 64 65  ands */.  int de
1900: 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  st,         /* J
1910: 75 6d 70 20 68 65 72 65 20 69 66 20 74 72 75 65  ump here if true
1920: 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70  .  */.  int jump
1930: 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66 20  IfNull    /* If 
1940: 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20 65 69  true, jump if ei
1950: 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20  ther operand is 
1960: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  NULL */.){.  int
1970: 20 70 35 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b   p5;.  int addr;
1980: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34 3b 0a  .  CollSeq *p4;.
1990: 0a 20 20 70 34 20 3d 20 73 71 6c 69 74 65 33 42  .  p4 = sqlite3B
19a0: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
19b0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66  Seq(pParse, pLef
19c0: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 70 35  t, pRight);.  p5
19d0: 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65   = binaryCompare
19e0: 50 35 28 70 4c 65 66 74 2c 20 70 52 69 67 68 74  P5(pLeft, pRight
19f0: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
1a00: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
1a10: 64 62 65 41 64 64 4f 70 34 28 70 50 61 72 73 65  dbeAddOp4(pParse
1a20: 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64 65 2c  ->pVdbe, opcode,
1a30: 20 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e 31 2c   in2, dest, in1,
1a40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a50: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
1a60: 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c 53 45  d*)p4, P4_COLLSE
1a70: 51 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  Q);.  sqlite3Vdb
1a80: 65 43 68 61 6e 67 65 50 35 28 70 50 61 72 73 65  eChangeP5(pParse
1a90: 2d 3e 70 56 64 62 65 2c 20 70 35 29 3b 0a 20 20  ->pVdbe, p5);.  
1aa0: 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a  return addr;.}..
1ab0: 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  /*.** Construct 
1ac0: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
1ad0: 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e   node and return
1ae0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74   a pointer to it
1af0: 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72  .  Memory.** for
1b00: 20 74 68 69 73 20 6e 6f 64 65 20 69 73 20 6f 62   this node is ob
1b10: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
1b20: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 20 20 54  te3_malloc().  T
1b30: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
1b40: 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e  ion.** is respon
1b50: 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67  sible for making
1b60: 20 73 75 72 65 20 74 68 65 20 6e 6f 64 65 20 65   sure the node e
1b70: 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20 66  ventually gets f
1b80: 72 65 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  reed..*/.Expr *s
1b90: 71 6c 69 74 65 33 45 78 70 72 28 0a 20 20 73 71  qlite3Expr(.  sq
1ba0: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
1bb0: 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
1bc0: 66 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  for sqlite3DbMal
1bd0: 6c 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62  locZero() (may b
1be0: 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74  e null) */.  int
1bf0: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
1c00: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
1c10: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45  on opcode */.  E
1c20: 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20  xpr *pLeft,     
1c30: 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f         /* Left o
1c40: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72  perand */.  Expr
1c50: 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20 20 20   *pRight,       
1c60: 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65      /* Right ope
1c70: 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rand */.  const 
1c80: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 20 20  Token *pToken   
1c90: 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
1ca0: 6b 65 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ken */.){.  Expr
1cb0: 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d   *pNew;.  pNew =
1cc0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1cd0: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
1ce0: 45 78 70 72 29 29 3b 0a 20 20 69 66 28 20 70 4e  Expr));.  if( pN
1cf0: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ew==0 ){.    /* 
1d00: 57 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  When malloc fail
1d10: 73 2c 20 64 65 6c 65 74 65 20 70 4c 65 66 74 20  s, delete pLeft 
1d20: 61 6e 64 20 70 52 69 67 68 74 2e 20 45 78 70 72  and pRight. Expr
1d30: 65 73 73 69 6f 6e 73 20 70 61 73 73 65 64 20 74  essions passed t
1d40: 6f 20 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 66  o .    ** this f
1d50: 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 61 6c 77  unction must alw
1d60: 61 79 73 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  ays be allocated
1d70: 20 77 69 74 68 20 73 71 6c 69 74 65 33 45 78 70   with sqlite3Exp
1d80: 72 28 29 20 66 6f 72 20 74 68 69 73 20 0a 20 20  r() for this .  
1d90: 20 20 2a 2a 20 72 65 61 73 6f 6e 2e 20 0a 20 20    ** reason. .  
1da0: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
1db0: 45 78 70 72 44 65 6c 65 74 65 28 70 4c 65 66 74  ExprDelete(pLeft
1dc0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
1dd0: 70 72 44 65 6c 65 74 65 28 70 52 69 67 68 74 29  prDelete(pRight)
1de0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1df0: 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d    }.  pNew->op =
1e00: 20 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65   op;.  pNew->pLe
1e10: 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 70 4e  ft = pLeft;.  pN
1e20: 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 70 52 69  ew->pRight = pRi
1e30: 67 68 74 3b 0a 20 20 70 4e 65 77 2d 3e 69 41 67  ght;.  pNew->iAg
1e40: 67 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 54  g = -1;.  if( pT
1e50: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65  oken ){.    asse
1e60: 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e 3d  rt( pToken->dyn=
1e70: 3d 30 20 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  =0 );.    pNew->
1e80: 73 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b  span = pNew->tok
1e90: 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20  en = *pToken;.  
1ea0: 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74 20  }else if( pLeft 
1eb0: 29 7b 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  ){.    if( pRigh
1ec0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
1ed0: 65 33 45 78 70 72 53 70 61 6e 28 70 4e 65 77 2c  e3ExprSpan(pNew,
1ee0: 20 26 70 4c 65 66 74 2d 3e 73 70 61 6e 2c 20 26   &pLeft->span, &
1ef0: 70 52 69 67 68 74 2d 3e 73 70 61 6e 29 3b 0a 20  pRight->span);. 
1f00: 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d       if( pRight-
1f10: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
1f20: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20  ollate ){.      
1f30: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
1f40: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a   EP_ExpCollate;.
1f50: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 43          pNew->pC
1f60: 6f 6c 6c 20 3d 20 70 52 69 67 68 74 2d 3e 70 43  oll = pRight->pC
1f70: 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
1f80: 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74   }.    if( pLeft
1f90: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70  ->flags & EP_Exp
1fa0: 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20  Collate ){.     
1fb0: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
1fc0: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20  EP_ExpCollate;. 
1fd0: 20 20 20 20 20 70 4e 65 77 2d 3e 70 43 6f 6c 6c       pNew->pColl
1fe0: 20 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b   = pLeft->pColl;
1ff0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71  .    }.  }..  sq
2000: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
2010: 68 74 28 70 4e 65 77 29 3b 0a 20 20 72 65 74 75  ht(pNew);.  retu
2020: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
2030: 2a 20 57 6f 72 6b 73 20 6c 69 6b 65 20 73 71 6c  * Works like sql
2040: 69 74 65 33 45 78 70 72 28 29 20 65 78 63 65 70  ite3Expr() excep
2050: 74 20 74 68 61 74 20 69 74 20 74 61 6b 65 73 20  t that it takes 
2060: 61 6e 20 65 78 74 72 61 20 50 61 72 73 65 2a 0a  an extra Parse*.
2070: 2a 2a 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20  ** argument and 
2080: 6e 6f 74 69 66 69 65 73 20 74 68 65 20 61 73 73  notifies the ass
2090: 6f 63 69 61 74 65 64 20 63 6f 6e 6e 65 63 74 69  ociated connecti
20a0: 6f 6e 20 6f 62 6a 65 63 74 20 69 66 20 6d 61 6c  on object if mal
20b0: 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 45 78  loc fails..*/.Ex
20c0: 70 72 20 2a 73 71 6c 69 74 65 33 50 45 78 70 72  pr *sqlite3PExpr
20d0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
20e0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
20f0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
2100: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
2110: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
2120: 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65  xpression opcode
2130: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66   */.  Expr *pLef
2140: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
2150: 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   Left operand */
2160: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
2170: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69             /* Ri
2180: 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  ght operand */. 
2190: 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54   const Token *pT
21a0: 6f 6b 65 6e 20 20 20 20 20 2f 2a 20 41 72 67 75  oken     /* Argu
21b0: 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b  ment token */.){
21c0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
21d0: 33 45 78 70 72 28 70 50 61 72 73 65 2d 3e 64 62  3Expr(pParse->db
21e0: 2c 20 6f 70 2c 20 70 4c 65 66 74 2c 20 70 52 69  , op, pLeft, pRi
21f0: 67 68 74 2c 20 70 54 6f 6b 65 6e 29 3b 0a 7d 0a  ght, pToken);.}.
2200: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64 6f 69 6e  ./*.** When doin
2210: 67 20 61 20 6e 65 73 74 65 64 20 70 61 72 73 65  g a nested parse
2220: 2c 20 79 6f 75 20 63 61 6e 20 69 6e 63 6c 75 64  , you can includ
2230: 65 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 65 78  e terms in an ex
2240: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 68 61 74  pression.** that
2250: 20 6c 6f 6f 6b 20 6c 69 6b 65 20 74 68 69 73 3a   look like this:
2260: 20 20 20 23 31 20 23 32 20 2e 2e 2e 20 20 54 68     #1 #2 ...  Th
2270: 65 73 65 20 74 65 72 6d 73 20 72 65 66 65 72 20  ese terms refer 
2280: 74 6f 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20  to registers.** 
2290: 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d  in the virtual m
22a0: 61 63 68 69 6e 65 2e 20 20 23 4e 20 69 73 20 74  achine.  #N is t
22b0: 68 65 20 4e 2d 74 68 20 72 65 67 69 73 74 65 72  he N-th register
22c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
22d0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
22e0: 79 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20  y the parser to 
22f0: 64 65 61 6c 20 77 69 74 68 20 6f 6e 20 6f 66 20  deal with on of 
2300: 74 68 6f 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20  those terms..** 
2310: 49 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 67  It immediately g
2320: 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f  enerates code to
2330: 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65   store the value
2340: 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20 6c 6f 63   in a memory loc
2350: 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 72 65  ation..** The re
2360: 74 75 72 6e 73 20 61 6e 20 65 78 70 72 65 73 73  turns an express
2370: 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 63 6f  ion that will co
2380: 64 65 20 74 6f 20 65 78 74 72 61 63 74 20 74 68  de to extract th
2390: 65 20 76 61 6c 75 65 20 66 72 6f 6d 0a 2a 2a 20  e value from.** 
23a0: 74 68 61 74 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  that memory loca
23b0: 74 69 6f 6e 20 61 73 20 6e 65 65 64 65 64 2e 0a  tion as needed..
23c0: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
23d0: 52 65 67 69 73 74 65 72 45 78 70 72 28 50 61 72  RegisterExpr(Par
23e0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
23f0: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 56 64  n *pToken){.  Vd
2400: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
2410: 70 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70  pVdbe;.  Expr *p
2420: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
2430: 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  nested==0 ){.   
2440: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2450: 28 70 50 61 72 73 65 2c 20 22 6e 65 61 72 20 5c  (pParse, "near \
2460: 22 25 54 5c 22 3a 20 73 79 6e 74 61 78 20 65 72  "%T\": syntax er
2470: 72 6f 72 22 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20  ror", pToken);. 
2480: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
2490: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
24a0: 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20 30 29  K_NULL, 0, 0, 0)
24b0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 76 3d 3d 30  ;.  }.  if( v==0
24c0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
24d0: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
24e0: 70 50 61 72 73 65 2c 20 54 4b 5f 52 45 47 49 53  pParse, TK_REGIS
24f0: 54 45 52 2c 20 30 2c 20 30 2c 20 70 54 6f 6b 65  TER, 0, 0, pToke
2500: 6e 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  n);.  if( p==0 )
2510: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
2520: 20 2f 2a 20 4d 61 6c 6c 6f 63 20 66 61 69 6c 65   /* Malloc faile
2530: 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 2d 3e 69 54  d */.  }.  p->iT
2540: 61 62 6c 65 20 3d 20 61 74 6f 69 28 28 63 68 61  able = atoi((cha
2550: 72 2a 29 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d  r*)&pToken->z[1]
2560: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  );.  return p;.}
2570: 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f  ../*.** Join two
2580: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73 69   expressions usi
2590: 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74  ng an AND operat
25a0: 6f 72 2e 20 20 49 66 20 65 69 74 68 65 72 20 65  or.  If either e
25b0: 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20  xpression is.** 
25c0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74 20  NULL, then just 
25d0: 72 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65 72  return the other
25e0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a   expression..*/.
25f0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
2600: 72 41 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62  rAnd(sqlite3 *db
2610: 2c 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45  , Expr *pLeft, E
2620: 78 70 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20  xpr *pRight){.  
2630: 69 66 28 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a  if( pLeft==0 ){.
2640: 20 20 20 20 72 65 74 75 72 6e 20 70 52 69 67 68      return pRigh
2650: 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  t;.  }else if( p
2660: 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20  Right==0 ){.    
2670: 72 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20  return pLeft;.  
2680: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
2690: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  n sqlite3Expr(db
26a0: 2c 20 54 4b 5f 41 4e 44 2c 20 70 4c 65 66 74 2c  , TK_AND, pLeft,
26b0: 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 7d   pRight, 0);.  }
26c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
26d0: 65 20 45 78 70 72 2e 73 70 61 6e 20 66 69 65 6c  e Expr.span fiel
26e0: 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65  d of the given e
26f0: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 73 70 61  xpression to spa
2700: 6e 20 61 6c 6c 0a 2a 2a 20 74 65 78 74 20 62 65  n all.** text be
2710: 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20 67 69  tween the two gi
2720: 76 65 6e 20 74 6f 6b 65 6e 73 2e 0a 2a 2f 0a 76  ven tokens..*/.v
2730: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53  oid sqlite3ExprS
2740: 70 61 6e 28 45 78 70 72 20 2a 70 45 78 70 72 2c  pan(Expr *pExpr,
2750: 20 54 6f 6b 65 6e 20 2a 70 4c 65 66 74 2c 20 54   Token *pLeft, T
2760: 6f 6b 65 6e 20 2a 70 52 69 67 68 74 29 7b 0a 20  oken *pRight){. 
2770: 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74 21   assert( pRight!
2780: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2790: 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 69 66  pLeft!=0 );.  if
27a0: 28 20 70 45 78 70 72 20 26 26 20 70 52 69 67 68  ( pExpr && pRigh
27b0: 74 2d 3e 7a 20 26 26 20 70 4c 65 66 74 2d 3e 7a  t->z && pLeft->z
27c0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
27d0: 70 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30 20 7c 7c  pLeft->dyn==0 ||
27e0: 20 70 4c 65 66 74 2d 3e 7a 5b 70 4c 65 66 74 2d   pLeft->z[pLeft-
27f0: 3e 6e 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  >n]==0 );.    if
2800: 28 20 70 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30 20  ( pLeft->dyn==0 
2810: 26 26 20 70 52 69 67 68 74 2d 3e 64 79 6e 3d 3d  && pRight->dyn==
2820: 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72  0 ){.      pExpr
2830: 2d 3e 73 70 61 6e 2e 7a 20 3d 20 70 4c 65 66 74  ->span.z = pLeft
2840: 2d 3e 7a 3b 0a 20 20 20 20 20 20 70 45 78 70 72  ->z;.      pExpr
2850: 2d 3e 73 70 61 6e 2e 6e 20 3d 20 70 52 69 67 68  ->span.n = pRigh
2860: 74 2d 3e 6e 20 2b 20 28 70 52 69 67 68 74 2d 3e  t->n + (pRight->
2870: 7a 20 2d 20 70 4c 65 66 74 2d 3e 7a 29 3b 0a 20  z - pLeft->z);. 
2880: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2890: 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 20 3d 20  pExpr->span.z = 
28a0: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
28b0: 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  /*.** Construct 
28c0: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
28d0: 20 6e 6f 64 65 20 66 6f 72 20 61 20 66 75 6e 63   node for a func
28e0: 74 69 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69 70  tion with multip
28f0: 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e  le.** arguments.
2900: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
2910: 33 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 50 61  3ExprFunction(Pa
2920: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
2930: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f  rList *pList, To
2940: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
2950: 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 61 73  Expr *pNew;.  as
2960: 73 65 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b 0a  sert( pToken );.
2970: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
2980: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61  DbMallocZero(pPa
2990: 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28  rse->db, sizeof(
29a0: 45 78 70 72 29 20 29 3b 0a 20 20 69 66 28 20 70  Expr) );.  if( p
29b0: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  New==0 ){.    sq
29c0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
29d0: 65 74 65 28 70 4c 69 73 74 29 3b 20 2f 2a 20 41  ete(pList); /* A
29e0: 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d  void leaking mem
29f0: 6f 72 79 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20  ory when malloc 
2a00: 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74  fails */.    ret
2a10: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65  urn 0;.  }.  pNe
2a20: 77 2d 3e 6f 70 20 3d 20 54 4b 5f 46 55 4e 43 54  w->op = TK_FUNCT
2a30: 49 4f 4e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  ION;.  pNew->pLi
2a40: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73  st = pList;.  as
2a50: 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79  sert( pToken->dy
2a60: 6e 3d 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e  n==0 );.  pNew->
2a70: 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b  token = *pToken;
2a80: 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20  .  pNew->span = 
2a90: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 3b 0a 0a 20 20  pNew->token;..  
2aa0: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65  sqlite3ExprSetHe
2ab0: 69 67 68 74 28 70 4e 65 77 29 3b 0a 20 20 72 65  ight(pNew);.  re
2ac0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
2ad0: 0a 2a 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72  .** Assign a var
2ae0: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20  iable number to 
2af0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  an expression th
2b00: 61 74 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c  at encodes a wil
2b10: 64 63 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20  dcard.** in the 
2b20: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61  original SQL sta
2b30: 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20  tement.  .**.** 
2b40: 57 69 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73  Wildcards consis
2b50: 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65  ting of a single
2b60: 20 22 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65   "?" are assigne
2b70: 64 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65  d the next seque
2b80: 6e 74 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c  ntial.** variabl
2b90: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
2ba0: 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65  Wildcards of the
2bb0: 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65   form "?nnn" are
2bc0: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75   assigned the nu
2bd0: 6d 62 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20  mber "nnn".  We 
2be0: 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e  make.** sure "nn
2bf0: 6e 22 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65  n" is not too be
2c00: 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69   to avoid a deni
2c10: 61 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61 74  al of service at
2c20: 74 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65  tack when.** the
2c30: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63   SQL statement c
2c40: 6f 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74  omes from an ext
2c50: 65 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a  ernal source..**
2c60: 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66  .** Wildcards of
2c70: 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22   the form ":aaa"
2c80: 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20 61   or "$aaa" are a
2c90: 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d 65  ssigned the same
2ca0: 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68   number.** as th
2cb0: 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61  e previous insta
2cc0: 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  nce of the same 
2cd0: 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69 66  wildcard.  Or if
2ce0: 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
2cf0: 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f  st.** instance o
2d00: 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c 20  f the wildcard, 
2d10: 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 69  the next sequeni
2d20: 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  al variable numb
2d30: 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65  er is.** assigne
2d40: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
2d50: 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72 4e  e3ExprAssignVarN
2d60: 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50 61  umber(Parse *pPa
2d70: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
2d80: 29 7b 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ){.  Token *pTok
2d90: 65 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  en;.  sqlite3 *d
2da0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
2db0: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
2dc0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 6f 6b  ) return;.  pTok
2dd0: 65 6e 20 3d 20 26 70 45 78 70 72 2d 3e 74 6f 6b  en = &pExpr->tok
2de0: 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  en;.  assert( pT
2df0: 6f 6b 65 6e 2d 3e 6e 3e 3d 31 20 29 3b 0a 20 20  oken->n>=1 );.  
2e00: 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e  assert( pToken->
2e10: 7a 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  z!=0 );.  assert
2e20: 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 21 3d  ( pToken->z[0]!=
2e30: 30 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65  0 );.  if( pToke
2e40: 6e 2d 3e 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f  n->n==1 ){.    /
2e50: 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68  * Wildcard of th
2e60: 65 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73  e form "?".  Ass
2e70: 69 67 6e 20 74 68 65 20 6e 65 78 74 20 76 61 72  ign the next var
2e80: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  iable number */.
2e90: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
2ea0: 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 56  e = ++pParse->nV
2eb0: 61 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ar;.  }else if( 
2ec0: 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 3f  pToken->z[0]=='?
2ed0: 27 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64  ' ){.    /* Wild
2ee0: 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d  card of the form
2ef0: 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72   "?nnn".  Conver
2f00: 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e  t "nnn" to an in
2f10: 74 65 67 65 72 20 61 6e 64 0a 20 20 20 20 2a 2a  teger and.    **
2f20: 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76   use it as the v
2f30: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a  ariable number *
2f40: 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  /.    int i;.   
2f50: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
2f60: 20 69 20 3d 20 61 74 6f 69 28 28 63 68 61 72 2a   i = atoi((char*
2f70: 29 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d 29 3b  )&pToken->z[1]);
2f80: 0a 20 20 20 20 69 66 28 20 69 3c 31 20 7c 7c 20  .    if( i<1 || 
2f90: 69 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  i>db->aLimit[SQL
2fa0: 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
2fb0: 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20  LE_NUMBER] ){.  
2fc0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
2fd0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 61 72  Msg(pParse, "var
2fe0: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73  iable number mus
2ff0: 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20  t be between ?1 
3000: 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20  and ?%d",.      
3010: 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53      db->aLimit[S
3020: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
3030: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a 20  ABLE_NUMBER]);. 
3040: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 70     }.    if( i>p
3050: 50 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a 20  Parse->nVar ){. 
3060: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61       pParse->nVa
3070: 72 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d  r = i;.    }.  }
3080: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57 69 6c  else{.    /* Wil
3090: 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f  dcards of the fo
30a0: 72 6d 20 22 3a 61 61 61 22 20 6f 72 20 22 24 61  rm ":aaa" or "$a
30b0: 61 61 22 2e 20 20 52 65 75 73 65 20 74 68 65 20  aa".  Reuse the 
30c0: 73 61 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20  same variable.  
30d0: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20 74    ** number as t
30e0: 68 65 20 70 72 69 6f 72 20 61 70 70 65 61 72 61  he prior appeara
30f0: 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  nce of the same 
3100: 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65 20  name, or if the 
3110: 6e 61 6d 65 0a 20 20 20 20 2a 2a 20 68 61 73 20  name.    ** has 
3120: 6e 65 76 65 72 20 61 70 70 65 61 72 65 64 20 62  never appeared b
3130: 65 66 6f 72 65 2c 20 72 65 75 73 65 20 74 68 65  efore, reuse the
3140: 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 20 6e   same variable n
3150: 75 6d 62 65 72 0a 20 20 20 20 2a 2f 0a 20 20 20  umber.    */.   
3160: 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 20 20 6e   int i, n;.    n
3170: 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 3b 0a 20 20   = pToken->n;.  
3180: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
3190: 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 3b 20 69  rse->nVarExpr; i
31a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
31b0: 2a 70 45 3b 0a 20 20 20 20 20 20 69 66 28 20 28  *pE;.      if( (
31c0: 70 45 20 3d 20 70 50 61 72 73 65 2d 3e 61 70 56  pE = pParse->apV
31d0: 61 72 45 78 70 72 5b 69 5d 29 21 3d 30 0a 20 20  arExpr[i])!=0.  
31e0: 20 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e 74          && pE->t
31f0: 6f 6b 65 6e 2e 6e 3d 3d 6e 0a 20 20 20 20 20 20  oken.n==n.      
3200: 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 45      && memcmp(pE
3210: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 54 6f 6b 65  ->token.z, pToke
3220: 6e 2d 3e 7a 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  n->z, n)==0 ){. 
3230: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
3240: 61 62 6c 65 20 3d 20 70 45 2d 3e 69 54 61 62 6c  able = pE->iTabl
3250: 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  e;.        break
3260: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3270: 20 20 20 20 69 66 28 20 69 3e 3d 70 50 61 72 73      if( i>=pPars
3280: 65 2d 3e 6e 56 61 72 45 78 70 72 20 29 7b 0a 20  e->nVarExpr ){. 
3290: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
32a0: 6c 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  le = ++pParse->n
32b0: 56 61 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Var;.      if( p
32c0: 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 3e  Parse->nVarExpr>
32d0: 3d 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70  =pParse->nVarExp
32e0: 72 41 6c 6c 6f 63 2d 31 20 29 7b 0a 20 20 20 20  rAlloc-1 ){.    
32f0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72      pParse->nVar
3300: 45 78 70 72 41 6c 6c 6f 63 20 2b 3d 20 70 50 61  ExprAlloc += pPa
3310: 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c  rse->nVarExprAll
3320: 6f 63 20 2b 20 31 30 3b 0a 20 20 20 20 20 20 20  oc + 10;.       
3330: 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78   pParse->apVarEx
3340: 70 72 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20  pr =.           
3350: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
3360: 63 4f 72 46 72 65 65 28 0a 20 20 20 20 20 20 20  cOrFree(.       
3370: 20 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20         db,.     
3380: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
3390: 3e 61 70 56 61 72 45 78 70 72 2c 0a 20 20 20 20  >apVarExpr,.    
33a0: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
33b0: 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 2a  ->nVarExprAlloc*
33c0: 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61  sizeof(pParse->a
33d0: 70 56 61 72 45 78 70 72 5b 30 5d 29 0a 20 20 20  pVarExpr[0]).   
33e0: 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
33f0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 64    }.      if( !d
3400: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
3410: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
3420: 74 28 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72  t( pParse->apVar
3430: 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  Expr!=0 );.     
3440: 20 20 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72     pParse->apVar
3450: 45 78 70 72 5b 70 50 61 72 73 65 2d 3e 6e 56 61  Expr[pParse->nVa
3460: 72 45 78 70 72 2b 2b 5d 20 3d 20 70 45 78 70 72  rExpr++] = pExpr
3470: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3480: 20 20 7d 20 0a 20 20 69 66 28 20 21 70 50 61 72    } .  if( !pPar
3490: 73 65 2d 3e 6e 45 72 72 20 26 26 20 70 50 61 72  se->nErr && pPar
34a0: 73 65 2d 3e 6e 56 61 72 3e 64 62 2d 3e 61 4c 69  se->nVar>db->aLi
34b0: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
34c0: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
34d0: 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ] ){.    sqlite3
34e0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
34f0: 20 22 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20 76   "too many SQL v
3500: 61 72 69 61 62 6c 65 73 22 29 3b 0a 20 20 7d 0a  ariables");.  }.
3510: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69  }../*.** Recursi
3520: 76 65 6c 79 20 64 65 6c 65 74 65 20 61 6e 20 65  vely delete an e
3530: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a  xpression tree..
3540: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
3550: 78 70 72 44 65 6c 65 74 65 28 45 78 70 72 20 2a  xprDelete(Expr *
3560: 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  p){.  if( p==0 )
3570: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
3580: 2d 3e 73 70 61 6e 2e 64 79 6e 20 29 20 73 71 6c  ->span.dyn ) sql
3590: 69 74 65 33 5f 66 72 65 65 28 28 63 68 61 72 2a  ite3_free((char*
35a0: 29 70 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20 69  )p->span.z);.  i
35b0: 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20  f( p->token.dyn 
35c0: 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 28  ) sqlite3_free((
35d0: 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a  char*)p->token.z
35e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
35f0: 44 65 6c 65 74 65 28 70 2d 3e 70 4c 65 66 74 29  Delete(p->pLeft)
3600: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
3610: 65 6c 65 74 65 28 70 2d 3e 70 52 69 67 68 74 29  elete(p->pRight)
3620: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
3630: 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69  istDelete(p->pLi
3640: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  st);.  sqlite3Se
3650: 6c 65 63 74 44 65 6c 65 74 65 28 70 2d 3e 70 53  lectDelete(p->pS
3660: 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65  elect);.  sqlite
3670: 33 5f 66 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a  3_free(p);.}../*
3680: 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e 74 6f 6b  .** The Expr.tok
3690: 65 6e 20 66 69 65 6c 64 20 6d 69 67 68 74 20 62  en field might b
36a0: 65 20 61 20 73 74 72 69 6e 67 20 6c 69 74 65 72  e a string liter
36b0: 61 6c 20 74 68 61 74 20 69 73 20 71 75 6f 74 65  al that is quote
36c0: 64 2e 0a 2a 2a 20 49 66 20 73 6f 2c 20 72 65 6d  d..** If so, rem
36d0: 6f 76 65 20 74 68 65 20 71 75 6f 74 61 74 69 6f  ove the quotatio
36e0: 6e 20 6d 61 72 6b 73 2e 0a 2a 2f 0a 76 6f 69 64  n marks..*/.void
36f0: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 45   sqlite3DequoteE
3700: 78 70 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  xpr(sqlite3 *db,
3710: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28   Expr *p){.  if(
3720: 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65   ExprHasAnyPrope
3730: 72 74 79 28 70 2c 20 45 50 5f 44 65 71 75 6f 74  rty(p, EP_Dequot
3740: 65 64 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ed) ){.    retur
3750: 6e 3b 0a 20 20 7d 0a 20 20 45 78 70 72 53 65 74  n;.  }.  ExprSet
3760: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 44  Property(p, EP_D
3770: 65 71 75 6f 74 65 64 29 3b 0a 20 20 69 66 28 20  equoted);.  if( 
3780: 70 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 3d 3d 30 20  p->token.dyn==0 
3790: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 6f  ){.    sqlite3To
37a0: 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70 2d 3e  kenCopy(db, &p->
37b0: 74 6f 6b 65 6e 2c 20 26 70 2d 3e 74 6f 6b 65 6e  token, &p->token
37c0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
37d0: 44 65 71 75 6f 74 65 28 28 63 68 61 72 2a 29 70  Dequote((char*)p
37e0: 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 7d 0a 0a 0a  ->token.z);.}...
37f0: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
3800: 69 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75  ing group of rou
3810: 74 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20  tines make deep 
3820: 63 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65 73  copies of expres
3830: 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73  sions,.** expres
3840: 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c  sion lists, ID l
3850: 69 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74  ists, and select
3860: 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68   statements.  Th
3870: 65 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20  e copies can.** 
3880: 62 65 20 64 65 6c 65 74 65 64 20 28 62 79 20 62  be deleted (by b
3890: 65 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74  eing passed to t
38a0: 68 65 69 72 20 72 65 73 70 65 63 74 69 76 65 20  heir respective 
38b0: 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74  ...Delete() rout
38c0: 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74  ines).** without
38d0: 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f   effecting the o
38e0: 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20  riginals..**.** 
38f0: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  The expression l
3900: 69 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75  ist, ID, and sou
3910: 72 63 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e  rce lists return
3920: 20 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c   by sqlite3ExprL
3930: 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c  istDup(),.** sql
3940: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c  ite3IdListDup(),
3950: 20 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c   and sqlite3SrcL
3960: 69 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74  istDup() can not
3970: 20 62 65 20 66 75 72 74 68 65 72 20 65 78 70 61   be further expa
3980: 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73  nded .** by subs
3990: 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20  equent calls to 
39a0: 73 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e  sqlite*ListAppen
39b0: 64 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a  d() routines..**
39c0: 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74  .** Any tables t
39d0: 68 61 74 20 74 68 65 20 53 72 63 4c 69 73 74 20  hat the SrcList 
39e0: 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61  might point to a
39f0: 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65  re not duplicate
3a00: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
3a10: 74 65 33 45 78 70 72 44 75 70 28 73 71 6c 69 74  te3ExprDup(sqlit
3a20: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29  e3 *db, Expr *p)
3a30: 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a  {.  Expr *pNew;.
3a40: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
3a50: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
3a60: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
3a70: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  aw(db, sizeof(*p
3a80: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
3a90: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
3aa0: 20 6d 65 6d 63 70 79 28 70 4e 65 77 2c 20 70 2c   memcpy(pNew, p,
3ab0: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b   sizeof(*pNew));
3ac0: 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e  .  if( p->token.
3ad0: 7a 21 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77  z!=0 ){.    pNew
3ae0: 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 28 75 38 2a  ->token.z = (u8*
3af0: 29 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75  )sqlite3DbStrNDu
3b00: 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 2d 3e  p(db, (char*)p->
3b10: 74 6f 6b 65 6e 2e 7a 2c 20 70 2d 3e 74 6f 6b 65  token.z, p->toke
3b20: 6e 2e 6e 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  n.n);.    pNew->
3b30: 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20  token.dyn = 1;. 
3b40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
3b50: 72 74 28 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e  rt( pNew->token.
3b60: 7a 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70 4e  z==0 );.  }.  pN
3b70: 65 77 2d 3e 73 70 61 6e 2e 7a 20 3d 20 30 3b 0a  ew->span.z = 0;.
3b80: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
3b90: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
3ba0: 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  b, p->pLeft);.  
3bb0: 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 73  pNew->pRight = s
3bc0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
3bd0: 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  , p->pRight);.  
3be0: 70 4e 65 77 2d 3e 70 4c 69 73 74 20 3d 20 73 71  pNew->pList = sq
3bf0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
3c00: 28 64 62 2c 20 70 2d 3e 70 4c 69 73 74 29 3b 0a  (db, p->pList);.
3c10: 20 20 70 4e 65 77 2d 3e 70 53 65 6c 65 63 74 20    pNew->pSelect 
3c20: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
3c30: 75 70 28 64 62 2c 20 70 2d 3e 70 53 65 6c 65 63  up(db, p->pSelec
3c40: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  t);.  return pNe
3c50: 77 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  w;.}.void sqlite
3c60: 33 54 6f 6b 65 6e 43 6f 70 79 28 73 71 6c 69 74  3TokenCopy(sqlit
3c70: 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70  e3 *db, Token *p
3c80: 54 6f 2c 20 54 6f 6b 65 6e 20 2a 70 46 72 6f 6d  To, Token *pFrom
3c90: 29 7b 0a 20 20 69 66 28 20 70 54 6f 2d 3e 64 79  ){.  if( pTo->dy
3ca0: 6e 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  n ) sqlite3_free
3cb0: 28 28 63 68 61 72 2a 29 70 54 6f 2d 3e 7a 29 3b  ((char*)pTo->z);
3cc0: 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 20  .  if( pFrom->z 
3cd0: 29 7b 0a 20 20 20 20 70 54 6f 2d 3e 6e 20 3d 20  ){.    pTo->n = 
3ce0: 70 46 72 6f 6d 2d 3e 6e 3b 0a 20 20 20 20 70 54  pFrom->n;.    pT
3cf0: 6f 2d 3e 7a 20 3d 20 28 75 38 2a 29 73 71 6c 69  o->z = (u8*)sqli
3d00: 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c  te3DbStrNDup(db,
3d10: 20 28 63 68 61 72 2a 29 70 46 72 6f 6d 2d 3e 7a   (char*)pFrom->z
3d20: 2c 20 70 46 72 6f 6d 2d 3e 6e 29 3b 0a 20 20 20  , pFrom->n);.   
3d30: 20 70 54 6f 2d 3e 64 79 6e 20 3d 20 31 3b 0a 20   pTo->dyn = 1;. 
3d40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 6f 2d   }else{.    pTo-
3d50: 3e 7a 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 45 78  >z = 0;.  }.}.Ex
3d60: 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45  prList *sqlite3E
3d70: 78 70 72 4c 69 73 74 44 75 70 28 73 71 6c 69 74  xprListDup(sqlit
3d80: 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74  e3 *db, ExprList
3d90: 20 2a 70 29 7b 0a 20 20 45 78 70 72 4c 69 73 74   *p){.  ExprList
3da0: 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74   *pNew;.  struct
3db0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
3dc0: 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d  pItem, *pOldItem
3dd0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
3de0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
3df0: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
3e00: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
3e10: 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  , sizeof(*pNew) 
3e20: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
3e30: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
3e40: 4e 65 77 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20  New->iECursor = 
3e50: 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72  0;.  pNew->nExpr
3e60: 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20   = pNew->nAlloc 
3e70: 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 4e  = p->nExpr;.  pN
3e80: 65 77 2d 3e 61 20 3d 20 70 49 74 65 6d 20 3d 20  ew->a = pItem = 
3e90: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
3ea0: 61 77 28 64 62 2c 20 20 70 2d 3e 6e 45 78 70 72  aw(db,  p->nExpr
3eb0: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29  *sizeof(p->a[0])
3ec0: 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 3d   );.  if( pItem=
3ed0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
3ee0: 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  3_free(pNew);.  
3ef0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20    return 0;.  } 
3f00: 0a 20 20 70 4f 6c 64 49 74 65 6d 20 3d 20 70 2d  .  pOldItem = p-
3f10: 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  >a;.  for(i=0; i
3f20: 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  <p->nExpr; i++, 
3f30: 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65  pItem++, pOldIte
3f40: 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  m++){.    Expr *
3f50: 70 4e 65 77 45 78 70 72 2c 20 2a 70 4f 6c 64 45  pNewExpr, *pOldE
3f60: 78 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  xpr;.    pItem->
3f70: 70 45 78 70 72 20 3d 20 70 4e 65 77 45 78 70 72  pExpr = pNewExpr
3f80: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
3f90: 70 28 64 62 2c 20 70 4f 6c 64 45 78 70 72 20 3d  p(db, pOldExpr =
3fa0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72   pOldItem->pExpr
3fb0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 45  );.    if( pOldE
3fc0: 78 70 72 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 26  xpr->span.z!=0 &
3fd0: 26 20 70 4e 65 77 45 78 70 72 20 29 7b 0a 20 20  & pNewExpr ){.  
3fe0: 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 6d 61      /* Always ma
3ff0: 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
4000: 20 73 70 61 6e 20 66 6f 72 20 74 6f 70 2d 6c 65   span for top-le
4010: 76 65 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 20  vel expressions 
4020: 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  in the.      ** 
4030: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
4040: 20 20 54 68 65 20 6c 6f 67 69 63 20 69 6e 20 53    The logic in S
4050: 45 4c 45 43 54 20 70 72 6f 63 65 73 73 69 6e 67  ELECT processing
4060: 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73   that determines
4070: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 61  .      ** the na
4080: 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  mes of columns i
4090: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
40a0: 20 6e 65 65 64 73 20 74 68 69 73 20 69 6e 66 6f   needs this info
40b0: 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  rmation */.     
40c0: 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70   sqlite3TokenCop
40d0: 79 28 64 62 2c 20 26 70 4e 65 77 45 78 70 72 2d  y(db, &pNewExpr-
40e0: 3e 73 70 61 6e 2c 20 26 70 4f 6c 64 45 78 70 72  >span, &pOldExpr
40f0: 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 7d 0a 20  ->span);.    }. 
4100: 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 45     assert( pNewE
4110: 78 70 72 3d 3d 30 20 7c 7c 20 70 4e 65 77 45 78  xpr==0 || pNewEx
4120: 70 72 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 0a 20  pr->span.z!=0 . 
4130: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4f             || pO
4140: 6c 64 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 3d 3d  ldExpr->span.z==
4150: 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  0.            ||
4160: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
4170: 64 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  d );.    pItem->
4180: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
4190: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
41a0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
41b0: 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64    pItem->sortOrd
41c0: 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73  er = pOldItem->s
41d0: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 70 49  ortOrder;.    pI
41e0: 74 65 6d 2d 3e 69 73 41 67 67 20 3d 20 70 4f 6c  tem->isAgg = pOl
41f0: 64 49 74 65 6d 2d 3e 69 73 41 67 67 3b 0a 20 20  dItem->isAgg;.  
4200: 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20    pItem->done = 
4210: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
4220: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  pNew;.}../*.** I
4230: 66 20 63 75 72 73 6f 72 73 2c 20 74 72 69 67 67  f cursors, trigg
4240: 65 72 73 2c 20 76 69 65 77 73 20 61 6e 64 20 73  ers, views and s
4250: 75 62 71 75 65 72 69 65 73 20 61 72 65 20 61 6c  ubqueries are al
4260: 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 0a 2a  l omitted from.*
4270: 2a 20 74 68 65 20 62 75 69 6c 64 2c 20 74 68 65  * the build, the
4280: 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  n none of the fo
4290: 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73  llowing routines
42a0: 2c 20 65 78 63 65 70 74 20 66 6f 72 20 0a 2a 2a  , except for .**
42b0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
42c0: 70 28 29 2c 20 63 61 6e 20 62 65 20 63 61 6c 6c  p(), can be call
42d0: 65 64 2e 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ed. sqlite3Selec
42e0: 74 44 75 70 28 29 20 69 73 20 73 6f 6d 65 74 69  tDup() is someti
42f0: 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69  mes.** called wi
4300: 74 68 20 61 20 4e 55 4c 4c 20 61 72 67 75 6d 65  th a NULL argume
4310: 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  nt..*/.#if !defi
4320: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
4330: 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
4340: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
4350: 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21 64 65  IGGER) \. || !de
4360: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
4370: 54 5f 53 55 42 51 55 45 52 59 29 0a 53 72 63 4c  T_SUBQUERY).SrcL
4380: 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c  ist *sqlite3SrcL
4390: 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  istDup(sqlite3 *
43a0: 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 29 7b  db, SrcList *p){
43b0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77  .  SrcList *pNew
43c0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
43d0: 20 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 70 3d   nByte;.  if( p=
43e0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
43f0: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
4400: 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30  *p) + (p->nSrc>0
4410: 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30   ? sizeof(p->a[0
4420: 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29  ]) * (p->nSrc-1)
4430: 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20   : 0);.  pNew = 
4440: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
4450: 61 77 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a  aw(db, nByte );.
4460: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
4470: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
4480: 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e  ->nSrc = pNew->n
4490: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b  Alloc = p->nSrc;
44a0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
44b0: 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
44c0: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
44d0: 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d  item *pNewItem =
44e0: 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20   &pNew->a[i];.  
44f0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
4500: 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20  _item *pOldItem 
4510: 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  = &p->a[i];.    
4520: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
4530: 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61   pNewItem->zData
4540: 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62  base = sqlite3Db
4550: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
4560: 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  tem->zDatabase);
4570: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a  .    pNewItem->z
4580: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
4590: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
45a0: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
45b0: 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61   pNewItem->zAlia
45c0: 73 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  s = sqlite3DbStr
45d0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
45e0: 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70  ->zAlias);.    p
45f0: 4e 65 77 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  NewItem->jointyp
4600: 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 6a 6f  e = pOldItem->jo
4610: 69 6e 74 79 70 65 3b 0a 20 20 20 20 70 4e 65 77  intype;.    pNew
4620: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20  Item->iCursor = 
4630: 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pOldItem->iCurso
4640: 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  r;.    pNewItem-
4650: 3e 69 73 50 6f 70 75 6c 61 74 65 64 20 3d 20 70  >isPopulated = p
4660: 4f 6c 64 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c  OldItem->isPopul
4670: 61 74 65 64 3b 0a 20 20 20 20 70 54 61 62 20 3d  ated;.    pTab =
4680: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62 20   pNewItem->pTab 
4690: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62  = pOldItem->pTab
46a0: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 29  ;.    if( pTab )
46b0: 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52  {.      pTab->nR
46c0: 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ef++;.    }.    
46d0: 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63  pNewItem->pSelec
46e0: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
46f0: 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  tDup(db, pOldIte
4700: 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  m->pSelect);.   
4710: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d   pNewItem->pOn =
4720: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
4730: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f  db, pOldItem->pO
4740: 6e 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  n);.    pNewItem
4750: 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c 69 74  ->pUsing = sqlit
4760: 65 33 49 64 4c 69 73 74 44 75 70 28 64 62 2c 20  e3IdListDup(db, 
4770: 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67  pOldItem->pUsing
4780: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
4790: 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49  >colUsed = pOldI
47a0: 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20  tem->colUsed;.  
47b0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
47c0: 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74  .}.IdList *sqlit
47d0: 65 33 49 64 4c 69 73 74 44 75 70 28 73 71 6c 69  e3IdListDup(sqli
47e0: 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20  te3 *db, IdList 
47f0: 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70  *p){.  IdList *p
4800: 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  New;.  int i;.  
4810: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
4820: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
4830: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
4840: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  (db, sizeof(*pNe
4850: 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
4860: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
4870: 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 4e    pNew->nId = pN
4880: 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e  ew->nAlloc = p->
4890: 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d  nId;.  pNew->a =
48a0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
48b0: 52 61 77 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73  Raw(db, p->nId*s
48c0: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29  izeof(p->a[0]) )
48d0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d  ;.  if( pNew->a=
48e0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
48f0: 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  3_free(pNew);.  
4900: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
4910: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
4920: 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nId; i++){.    s
4930: 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65  truct IdList_ite
4940: 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70  m *pNewItem = &p
4950: 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73  New->a[i];.    s
4960: 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65  truct IdList_ite
4970: 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70  m *pOldItem = &p
4980: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77  ->a[i];.    pNew
4990: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
49a0: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
49b0: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d  , pOldItem->zNam
49c0: 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  e);.    pNewItem
49d0: 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d  ->idx = pOldItem
49e0: 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74  ->idx;.  }.  ret
49f0: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65  urn pNew;.}.Sele
4a00: 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63  ct *sqlite3Selec
4a10: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
4a20: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
4a30: 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20  Select *pNew;.  
4a40: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
4a50: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
4a60: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
4a70: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20  (db, sizeof(*p) 
4a80: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
4a90: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
4aa0: 4e 65 77 2d 3e 69 73 44 69 73 74 69 6e 63 74 20  New->isDistinct 
4ab0: 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b  = p->isDistinct;
4ac0: 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20  .  pNew->pEList 
4ad0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
4ae0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69  tDup(db, p->pELi
4af0: 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72  st);.  pNew->pSr
4b00: 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
4b10: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 53 72  stDup(db, p->pSr
4b20: 63 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65  c);.  pNew->pWhe
4b30: 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
4b40: 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 68 65 72  Dup(db, p->pWher
4b50: 65 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f  e);.  pNew->pGro
4b60: 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  upBy = sqlite3Ex
4b70: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
4b80: 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 70 4e  >pGroupBy);.  pN
4b90: 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71  ew->pHaving = sq
4ba0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
4bb0: 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20   p->pHaving);.  
4bc0: 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
4bd0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
4be0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  Dup(db, p->pOrde
4bf0: 72 42 79 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70  rBy);.  pNew->op
4c00: 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77   = p->op;.  pNew
4c10: 2d 3e 70 50 72 69 6f 72 20 3d 20 73 71 6c 69 74  ->pPrior = sqlit
4c20: 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
4c30: 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 70 4e  p->pPrior);.  pN
4c40: 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c  ew->pLimit = sql
4c50: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
4c60: 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70 4e  p->pLimit);.  pN
4c70: 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 73 71  ew->pOffset = sq
4c80: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
4c90: 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20   p->pOffset);.  
4ca0: 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d  pNew->iLimit = -
4cb0: 31 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73  1;.  pNew->iOffs
4cc0: 65 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  et = -1;.  pNew-
4cd0: 3e 69 73 52 65 73 6f 6c 76 65 64 20 3d 20 70 2d  >isResolved = p-
4ce0: 3e 69 73 52 65 73 6f 6c 76 65 64 3b 0a 20 20 70  >isResolved;.  p
4cf0: 4e 65 77 2d 3e 69 73 41 67 67 20 3d 20 70 2d 3e  New->isAgg = p->
4d00: 69 73 41 67 67 3b 0a 20 20 70 4e 65 77 2d 3e 75  isAgg;.  pNew->u
4d10: 73 65 73 45 70 68 6d 20 3d 20 30 3b 0a 20 20 70  sesEphm = 0;.  p
4d20: 4e 65 77 2d 3e 64 69 73 61 6c 6c 6f 77 4f 72 64  New->disallowOrd
4d30: 65 72 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65 77  erBy = 0;.  pNew
4d40: 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30  ->pRightmost = 0
4d50: 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70  ;.  pNew->addrOp
4d60: 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a  enEphm[0] = -1;.
4d70: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
4d80: 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[1] = -1;.  
4d90: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
4da0: 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 72 65  hm[2] = -1;.  re
4db0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c  turn pNew;.}.#el
4dc0: 73 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74  se.Select *sqlit
4dd0: 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69  e3SelectDup(sqli
4de0: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
4df0: 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
4e00: 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
4e10: 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  0;.}.#endif.../*
4e20: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
4e30: 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65 6e 64  ement to the end
4e40: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
4e50: 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c 69 73  n list.  If pLis
4e60: 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c  t is.** initiall
4e70: 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65  y NULL, then cre
4e80: 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65 73  ate a new expres
4e90: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 45 78  sion list..*/.Ex
4ea0: 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45  prList *sqlite3E
4eb0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 0a 20  xprListAppend(. 
4ec0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
4ed0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
4ee0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
4ef0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
4f00: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  ,        /* List
4f10: 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70   to which to app
4f20: 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  end. Might be NU
4f30: 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  LL */.  Expr *pE
4f40: 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  xpr,            
4f50: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f  /* Expression to
4f60: 20 62 65 20 61 70 70 65 6e 64 65 64 20 2a 2f 0a   be appended */.
4f70: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 20    Token *pName  
4f80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 53 20            /* AS 
4f90: 6b 65 79 77 6f 72 64 20 66 6f 72 20 74 68 65 20  keyword for the 
4fa0: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b  expression */.){
4fb0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
4fc0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
4fd0: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
4fe0: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
4ff0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
5000: 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 4c 69  b, sizeof(ExprLi
5010: 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  st) );.    if( p
5020: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  List==0 ){.     
5030: 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
5040: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
5050: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30  pList->nAlloc==0
5060: 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c   );.  }.  if( pL
5070: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3c 3d 70 4c 69  ist->nAlloc<=pLi
5080: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
5090: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
50a0: 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 69 6e  _item *a;.    in
50b0: 74 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c  t n = pList->nAl
50c0: 6c 6f 63 2a 32 20 2b 20 34 3b 0a 20 20 20 20 61  loc*2 + 4;.    a
50d0: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
50e0: 6c 6f 63 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  loc(db, pList->a
50f0: 2c 20 6e 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74  , n*sizeof(pList
5100: 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66  ->a[0]));.    if
5110: 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( a==0 ){.      
5120: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20  goto no_mem;.   
5130: 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20   }.    pList->a 
5140: 3d 20 61 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  = a;.    pList->
5150: 6e 41 6c 6c 6f 63 20 3d 20 6e 3b 0a 20 20 7d 0a  nAlloc = n;.  }.
5160: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
5170: 3e 61 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  >a!=0 );.  if( p
5180: 45 78 70 72 20 7c 7c 20 70 4e 61 6d 65 20 29 7b  Expr || pName ){
5190: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
51a0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
51b0: 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
51c0: 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20  st->nExpr++];.  
51d0: 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20    memset(pItem, 
51e0: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d  0, sizeof(*pItem
51f0: 29 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a  ));.    pItem->z
5200: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
5210: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
5220: 70 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65  pName);.    pIte
5230: 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  m->pExpr = pExpr
5240: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
5250: 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20  List;..no_mem:  
5260: 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c     .  /* Avoid l
5270: 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66  eaking memory if
5280: 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c   malloc has fail
5290: 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ed. */.  sqlite3
52a0: 45 78 70 72 44 65 6c 65 74 65 28 70 45 78 70 72  ExprDelete(pExpr
52b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
52c0: 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
52d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
52e0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ../*.** If the e
52f0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70  xpression list p
5300: 45 4c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d  EList contains m
5310: 6f 72 65 20 74 68 61 6e 20 69 4c 69 6d 69 74 20  ore than iLimit 
5320: 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61  elements,.** lea
5330: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
5340: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  age in pParse..*
5350: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
5360: 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74  prListCheckLengt
5370: 68 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  h(.  Parse *pPar
5380: 73 65 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  se,.  ExprList *
5390: 70 45 4c 69 73 74 2c 0a 20 20 69 6e 74 20 69 4c  pEList,.  int iL
53a0: 69 6d 69 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68  imit,.  const ch
53b0: 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20  ar *zObject.){. 
53c0: 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70   if( pEList && p
53d0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 69 4c 69  EList->nExpr>iLi
53e0: 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
53f0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
5400: 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c  e, "too many col
5410: 75 6d 6e 73 20 69 6e 20 25 73 22 2c 20 7a 4f 62  umns in %s", zOb
5420: 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  ject);.  }.}.../
5430: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
5440: 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 2c  three functions,
5450: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 29 2c   heightOfExpr(),
5460: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
5470: 74 28 29 0a 2a 2a 20 61 6e 64 20 68 65 69 67 68  t().** and heigh
5480: 74 4f 66 53 65 6c 65 63 74 28 29 2c 20 61 72 65  tOfSelect(), are
5490: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
54a0: 6e 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68  ne the maximum h
54b0: 65 69 67 68 74 0a 2a 2a 20 6f 66 20 61 6e 79 20  eight.** of any 
54c0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
54d0: 72 65 66 65 72 65 6e 63 65 64 20 62 79 20 74 68  referenced by th
54e0: 65 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73  e structure pass
54f0: 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 66 69 72  ed as the.** fir
5500: 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  st argument..**.
5510: 2a 2a 20 49 66 20 74 68 69 73 20 6d 61 78 69 6d  ** If this maxim
5520: 75 6d 20 68 65 69 67 68 74 20 69 73 20 67 72 65  um height is gre
5530: 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75  ater than the cu
5540: 72 72 65 6e 74 20 76 61 6c 75 65 20 70 6f 69 6e  rrent value poin
5550: 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 70 6e 48  ted.** to by pnH
5560: 65 69 67 68 74 2c 20 74 68 65 20 73 65 63 6f 6e  eight, the secon
5570: 64 20 70 61 72 61 6d 65 74 65 72 2c 20 74 68 65  d parameter, the
5580: 6e 20 73 65 74 20 2a 70 6e 48 65 69 67 68 74 20  n set *pnHeight 
5590: 74 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65  to that.** value
55a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
55b0: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 45 78   heightOfExpr(Ex
55c0: 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65  pr *p, int *pnHe
55d0: 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29  ight){.  if( p )
55e0: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 48 65  {.    if( p->nHe
55f0: 69 67 68 74 3e 2a 70 6e 48 65 69 67 68 74 20 29  ight>*pnHeight )
5600: 7b 0a 20 20 20 20 20 20 2a 70 6e 48 65 69 67 68  {.      *pnHeigh
5610: 74 20 3d 20 70 2d 3e 6e 48 65 69 67 68 74 3b 0a  t = p->nHeight;.
5620: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74      }.  }.}.stat
5630: 69 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66  ic void heightOf
5640: 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73  ExprList(ExprLis
5650: 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69  t *p, int *pnHei
5660: 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b  ght){.  if( p ){
5670: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
5680: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45  for(i=0; i<p->nE
5690: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
56a0: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
56b0: 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 6e 48  >a[i].pExpr, pnH
56c0: 65 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20  eight);.    }.  
56d0: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
56e0: 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 53  heightOfSelect(S
56f0: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 2a 70  elect *p, int *p
5700: 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20  nHeight){.  if( 
5710: 70 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f  p ){.    heightO
5720: 66 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c  fExpr(p->pWhere,
5730: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
5740: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
5750: 70 48 61 76 69 6e 67 2c 20 70 6e 48 65 69 67 68  pHaving, pnHeigh
5760: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
5770: 45 78 70 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20  Expr(p->pLimit, 
5780: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
5790: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
57a0: 4f 66 66 73 65 74 2c 20 70 6e 48 65 69 67 68 74  Offset, pnHeight
57b0: 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  );.    heightOfE
57c0: 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73  xprList(p->pELis
57d0: 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  t, pnHeight);.  
57e0: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69    heightOfExprLi
57f0: 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20  st(p->pGroupBy, 
5800: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
5810: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
5820: 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 6e 48  p->pOrderBy, pnH
5830: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
5840: 68 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e 70 50  htOfSelect(p->pP
5850: 72 69 6f 72 2c 20 70 6e 48 65 69 67 68 74 29 3b  rior, pnHeight);
5860: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
5870: 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65 69 67  t the Expr.nHeig
5880: 68 74 20 76 61 72 69 61 62 6c 65 20 69 6e 20 74  ht variable in t
5890: 68 65 20 73 74 72 75 63 74 75 72 65 20 70 61 73  he structure pas
58a0: 73 65 64 20 61 73 20 61 6e 20 0a 2a 2a 20 61 72  sed as an .** ar
58b0: 67 75 6d 65 6e 74 2e 20 41 6e 20 65 78 70 72 65  gument. An expre
58c0: 73 73 69 6f 6e 20 77 69 74 68 20 6e 6f 20 63 68  ssion with no ch
58d0: 69 6c 64 72 65 6e 2c 20 45 78 70 72 2e 70 4c 69  ildren, Expr.pLi
58e0: 73 74 20 6f 72 20 0a 2a 2a 20 45 78 70 72 2e 70  st or .** Expr.p
58f0: 53 65 6c 65 63 74 20 6d 65 6d 62 65 72 20 68 61  Select member ha
5900: 73 20 61 20 68 65 69 67 68 74 20 6f 66 20 31 2e  s a height of 1.
5910: 20 41 6e 79 20 6f 74 68 65 72 20 65 78 70 72 65   Any other expre
5920: 73 73 69 6f 6e 0a 2a 2a 20 68 61 73 20 61 20 68  ssion.** has a h
5930: 65 69 67 68 74 20 65 71 75 61 6c 20 74 6f 20 74  eight equal to t
5940: 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68  he maximum heigh
5950: 74 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 0a  t of any other .
5960: 2a 2a 20 72 65 66 65 72 65 6e 63 65 64 20 45 78  ** referenced Ex
5970: 70 72 20 70 6c 75 73 20 6f 6e 65 2e 0a 2a 2f 0a  pr plus one..*/.
5980: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
5990: 53 65 74 48 65 69 67 68 74 28 45 78 70 72 20 2a  SetHeight(Expr *
59a0: 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67 68  p){.  int nHeigh
59b0: 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74 4f  t = 0;.  heightO
59c0: 66 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20  fExpr(p->pLeft, 
59d0: 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 68 65 69  &nHeight);.  hei
59e0: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 52 69  ghtOfExpr(p->pRi
59f0: 67 68 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  ght, &nHeight);.
5a00: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69    heightOfExprLi
5a10: 73 74 28 70 2d 3e 70 4c 69 73 74 2c 20 26 6e 48  st(p->pList, &nH
5a20: 65 69 67 68 74 29 3b 0a 20 20 68 65 69 67 68 74  eight);.  height
5a30: 4f 66 53 65 6c 65 63 74 28 70 2d 3e 70 53 65 6c  OfSelect(p->pSel
5a40: 65 63 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  ect, &nHeight);.
5a50: 20 20 70 2d 3e 6e 48 65 69 67 68 74 20 3d 20 6e    p->nHeight = n
5a60: 48 65 69 67 68 74 20 2b 20 31 3b 0a 7d 0a 0a 2f  Height + 1;.}../
5a70: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
5a80: 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f  maximum height o
5a90: 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  f any expression
5aa0: 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65 64   tree referenced
5ab0: 0a 2a 2a 20 62 79 20 74 68 65 20 73 65 6c 65 63  .** by the selec
5ac0: 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  t statement pass
5ad0: 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
5ae0: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
5af0: 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68  3SelectExprHeigh
5b00: 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  t(Select *p){.  
5b10: 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b  int nHeight = 0;
5b20: 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63  .  heightOfSelec
5b30: 74 28 70 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  t(p, &nHeight);.
5b40: 20 20 72 65 74 75 72 6e 20 6e 48 65 69 67 68 74    return nHeight
5b50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
5b60: 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72  e an entire expr
5b70: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a  ession list..*/.
5b80: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
5b90: 4c 69 73 74 44 65 6c 65 74 65 28 45 78 70 72 4c  ListDelete(ExprL
5ba0: 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
5bb0: 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 45  nt i;.  struct E
5bc0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
5bd0: 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  tem;.  if( pList
5be0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
5bf0: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61  assert( pList->a
5c00: 21 3d 30 20 7c 7c 20 28 70 4c 69 73 74 2d 3e 6e  !=0 || (pList->n
5c10: 45 78 70 72 3d 3d 30 20 26 26 20 70 4c 69 73 74  Expr==0 && pList
5c20: 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 29 20 29 3b 0a  ->nAlloc==0) );.
5c30: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
5c40: 3e 6e 45 78 70 72 3c 3d 70 4c 69 73 74 2d 3e 6e  >nExpr<=pList->n
5c50: 41 6c 6c 6f 63 20 29 3b 0a 20 20 66 6f 72 28 70  Alloc );.  for(p
5c60: 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
5c70: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
5c80: 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
5c90: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
5ca0: 70 72 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e  prDelete(pItem->
5cb0: 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69  pExpr);.    sqli
5cc0: 74 65 33 5f 66 72 65 65 28 70 49 74 65 6d 2d 3e  te3_free(pItem->
5cd0: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71  zName);.  }.  sq
5ce0: 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 69 73 74  lite3_free(pList
5cf0: 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ->a);.  sqlite3_
5d00: 66 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a  free(pList);.}..
5d10: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
5d20: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
5d30: 43 61 6c 6c 20 78 46 75 6e 63 20 66 6f 72 20 65  Call xFunc for e
5d40: 61 63 68 20 6e 6f 64 65 20 76 69 73 69 74 65 64  ach node visited
5d50: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
5d60: 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 78 46  rn value from xF
5d70: 75 6e 63 20 64 65 74 65 72 6d 69 6e 65 73 20 77  unc determines w
5d80: 68 65 74 68 65 72 20 74 68 65 20 74 72 65 65 20  hether the tree 
5d90: 77 61 6c 6b 20 63 6f 6e 74 69 6e 75 65 73 2e 0a  walk continues..
5da0: 2a 2a 20 30 20 6d 65 61 6e 73 20 63 6f 6e 74 69  ** 0 means conti
5db0: 6e 75 65 20 77 61 6c 6b 69 6e 67 20 74 68 65 20  nue walking the 
5dc0: 74 72 65 65 2e 20 20 31 20 6d 65 61 6e 73 20 64  tree.  1 means d
5dd0: 6f 20 6e 6f 74 20 77 61 6c 6b 20 63 68 69 6c 64  o not walk child
5de0: 72 65 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 63 75  ren.** of the cu
5df0: 72 72 65 6e 74 20 6e 6f 64 65 20 62 75 74 20 63  rrent node but c
5e00: 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 73 69 62  ontinue with sib
5e10: 6c 69 6e 67 73 2e 20 20 32 20 6d 65 61 6e 73 20  lings.  2 means 
5e20: 61 62 61 6e 64 6f 6e 0a 2a 2a 20 74 68 65 20 74  abandon.** the t
5e30: 72 65 65 20 77 61 6c 6b 20 63 6f 6d 70 6c 65 74  ree walk complet
5e40: 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ely..**.** The r
5e50: 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d  eturn value from
5e60: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
5e70: 20 31 20 74 6f 20 61 62 61 6e 64 6f 6e 20 74 68   1 to abandon th
5e80: 65 20 74 72 65 65 20 77 61 6c 6b 0a 2a 2a 20 61  e tree walk.** a
5e90: 6e 64 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75 65  nd 0 to continue
5ea0: 2e 0a 2a 2a 0a 2a 2a 20 4e 4f 54 49 43 45 3a 20  ..**.** NOTICE: 
5eb0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
5ec0: 65 73 20 2a 6e 6f 74 2a 20 64 65 73 63 65 6e 64  es *not* descend
5ed0: 20 69 6e 74 6f 20 73 75 62 71 75 65 72 69 65 73   into subqueries
5ee0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5ef0: 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 45 78 70  walkExprList(Exp
5f00: 72 4c 69 73 74 20 2a 2c 20 69 6e 74 20 28 2a 29  rList *, int (*)
5f10: 28 76 6f 69 64 20 2a 2c 20 45 78 70 72 2a 29 2c  (void *, Expr*),
5f20: 20 76 6f 69 64 20 2a 29 3b 0a 73 74 61 74 69 63   void *);.static
5f30: 20 69 6e 74 20 77 61 6c 6b 45 78 70 72 54 72 65   int walkExprTre
5f40: 65 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  e(Expr *pExpr, i
5f50: 6e 74 20 28 2a 78 46 75 6e 63 29 28 76 6f 69 64  nt (*xFunc)(void
5f60: 2a 2c 45 78 70 72 2a 29 2c 20 76 6f 69 64 20 2a  *,Expr*), void *
5f70: 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pArg){.  int rc;
5f80: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
5f90: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 63  ) return 0;.  rc
5fa0: 20 3d 20 28 2a 78 46 75 6e 63 29 28 70 41 72 67   = (*xFunc)(pArg
5fb0: 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  , pExpr);.  if( 
5fc0: 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  rc==0 ){.    if(
5fd0: 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70 45   walkExprTree(pE
5fe0: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 78 46 75 6e  xpr->pLeft, xFun
5ff0: 63 2c 20 70 41 72 67 29 20 29 20 72 65 74 75 72  c, pArg) ) retur
6000: 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 77 61 6c  n 1;.    if( wal
6010: 6b 45 78 70 72 54 72 65 65 28 70 45 78 70 72 2d  kExprTree(pExpr-
6020: 3e 70 52 69 67 68 74 2c 20 78 46 75 6e 63 2c 20  >pRight, xFunc, 
6030: 70 41 72 67 29 20 29 20 72 65 74 75 72 6e 20 31  pArg) ) return 1
6040: 3b 0a 20 20 20 20 69 66 28 20 77 61 6c 6b 45 78  ;.    if( walkEx
6050: 70 72 4c 69 73 74 28 70 45 78 70 72 2d 3e 70 4c  prList(pExpr->pL
6060: 69 73 74 2c 20 78 46 75 6e 63 2c 20 70 41 72 67  ist, xFunc, pArg
6070: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
6080: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3e 31 3b  }.  return rc>1;
6090: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 77  .}../*.** Call w
60a0: 61 6c 6b 45 78 70 72 54 72 65 65 28 29 20 66 6f  alkExprTree() fo
60b0: 72 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69  r every expressi
60c0: 6f 6e 20 69 6e 20 6c 69 73 74 20 70 2e 0a 2a 2f  on in list p..*/
60d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c 6b  .static int walk
60e0: 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73  ExprList(ExprLis
60f0: 74 20 2a 70 2c 20 69 6e 74 20 28 2a 78 46 75 6e  t *p, int (*xFun
6100: 63 29 28 76 6f 69 64 20 2a 2c 20 45 78 70 72 2a  c)(void *, Expr*
6110: 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  ), void *pArg){.
6120: 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
6130: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
6140: 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 21 70  *pItem;.  if( !p
6150: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66   ) return 0;.  f
6160: 6f 72 28 69 3d 70 2d 3e 6e 45 78 70 72 2c 20 70  or(i=p->nExpr, p
6170: 49 74 65 6d 3d 70 2d 3e 61 3b 20 69 3e 30 3b 20  Item=p->a; i>0; 
6180: 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i--, pItem++){. 
6190: 20 20 20 69 66 28 20 77 61 6c 6b 45 78 70 72 54     if( walkExprT
61a0: 72 65 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72  ree(pItem->pExpr
61b0: 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 20 29  , xFunc, pArg) )
61c0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
61d0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
61e0: 0a 2a 2a 20 43 61 6c 6c 20 77 61 6c 6b 45 78 70  .** Call walkExp
61f0: 72 54 72 65 65 28 29 20 66 6f 72 20 65 76 65 72  rTree() for ever
6200: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  y expression in 
6210: 53 65 6c 65 63 74 20 70 2c 20 6e 6f 74 20 69 6e  Select p, not in
6220: 63 6c 75 64 69 6e 67 0a 2a 2a 20 65 78 70 72 65  cluding.** expre
6230: 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  ssions that are 
6240: 70 61 72 74 20 6f 66 20 73 75 62 2d 73 65 6c 65  part of sub-sele
6250: 63 74 73 20 69 6e 20 61 6e 79 20 46 52 4f 4d 20  cts in any FROM 
6260: 63 6c 61 75 73 65 20 6f 72 20 74 68 65 20 4c 49  clause or the LI
6270: 4d 49 54 0a 2a 2a 20 6f 72 20 4f 46 46 53 45 54  MIT.** or OFFSET
6280: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 2e 0a 2a   expressions...*
6290: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c  /.static int wal
62a0: 6b 53 65 6c 65 63 74 45 78 70 72 28 53 65 6c 65  kSelectExpr(Sele
62b0: 63 74 20 2a 70 2c 20 69 6e 74 20 28 2a 78 46 75  ct *p, int (*xFu
62c0: 6e 63 29 28 76 6f 69 64 20 2a 2c 20 45 78 70 72  nc)(void *, Expr
62d0: 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  *), void *pArg){
62e0: 0a 20 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28  .  walkExprList(
62f0: 70 2d 3e 70 45 4c 69 73 74 2c 20 78 46 75 6e 63  p->pEList, xFunc
6300: 2c 20 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b 45  , pArg);.  walkE
6310: 78 70 72 54 72 65 65 28 70 2d 3e 70 57 68 65 72  xprTree(p->pWher
6320: 65 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 3b  e, xFunc, pArg);
6330: 0a 20 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28  .  walkExprList(
6340: 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 78 46 75  p->pGroupBy, xFu
6350: 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 77 61 6c  nc, pArg);.  wal
6360: 6b 45 78 70 72 54 72 65 65 28 70 2d 3e 70 48 61  kExprTree(p->pHa
6370: 76 69 6e 67 2c 20 78 46 75 6e 63 2c 20 70 41 72  ving, xFunc, pAr
6380: 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72 4c 69  g);.  walkExprLi
6390: 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  st(p->pOrderBy, 
63a0: 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20  xFunc, pArg);.  
63b0: 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
63c0: 0a 20 20 20 20 77 61 6c 6b 53 65 6c 65 63 74 45  .    walkSelectE
63d0: 78 70 72 28 70 2d 3e 70 50 72 69 6f 72 2c 20 78  xpr(p->pPrior, x
63e0: 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 7d  Func, pArg);.  }
63f0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
6400: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
6410: 69 6e 65 20 69 73 20 64 65 73 69 67 6e 65 64 20  ine is designed 
6420: 61 73 20 61 6e 20 78 46 75 6e 63 20 66 6f 72 20  as an xFunc for 
6430: 77 61 6c 6b 45 78 70 72 54 72 65 65 28 29 2e 0a  walkExprTree()..
6440: 2a 2a 0a 2a 2a 20 70 41 72 67 20 69 73 20 72 65  **.** pArg is re
6450: 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74  ally a pointer t
6460: 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 49  o an integer.  I
6470: 66 20 77 65 20 63 61 6e 20 74 65 6c 6c 20 62 79  f we can tell by
6480: 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 61 74 20 70   looking.** at p
6490: 45 78 70 72 20 74 68 61 74 20 74 68 65 20 65 78  Expr that the ex
64a0: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f  pression that co
64b0: 6e 74 61 69 6e 73 20 70 45 78 70 72 20 69 73 20  ntains pExpr is 
64c0: 6e 6f 74 20 61 20 63 6f 6e 73 74 61 6e 74 0a 2a  not a constant.*
64d0: 2a 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  * expression, th
64e0: 65 6e 20 73 65 74 20 2a 70 41 72 67 20 74 6f 20  en set *pArg to 
64f0: 30 20 61 6e 64 20 72 65 74 75 72 6e 20 32 20 74  0 and return 2 t
6500: 6f 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 74 72  o abandon the tr
6510: 65 65 20 77 61 6c 6b 2e 0a 2a 2a 20 49 66 20 70  ee walk..** If p
6520: 45 78 70 72 20 64 6f 65 73 20 64 6f 65 73 20 6e  Expr does does n
6530: 6f 74 20 64 69 73 71 75 61 6c 69 66 79 20 74 68  ot disqualify th
6540: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f  e expression fro
6550: 6d 20 62 65 69 6e 67 20 61 20 63 6f 6e 73 74 61  m being a consta
6560: 6e 74 0a 2a 2a 20 74 68 65 6e 20 64 6f 20 6e 6f  nt.** then do no
6570: 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 66 74  thing..**.** Aft
6580: 65 72 20 77 61 6c 6b 69 6e 67 20 74 68 65 20 77  er walking the w
6590: 68 6f 6c 65 20 74 72 65 65 2c 20 69 66 20 6e 6f  hole tree, if no
65a0: 20 6e 6f 64 65 73 20 61 72 65 20 66 6f 75 6e 64   nodes are found
65b0: 20 74 68 61 74 20 64 69 73 71 75 61 6c 69 66 79   that disqualify
65c0: 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73 69  .** the expressi
65d0: 6f 6e 20 61 73 20 63 6f 6e 73 74 61 6e 74 2c 20  on as constant, 
65e0: 74 68 65 6e 20 77 65 20 61 73 73 75 6d 65 20 74  then we assume t
65f0: 68 65 20 77 68 6f 6c 65 20 65 78 70 72 65 73 73  he whole express
6600: 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 74 61  ion.** is consta
6610: 6e 74 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  nt.  See sqlite3
6620: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 29  ExprIsConstant()
6630: 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
6640: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
6650: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e  static int exprN
6660: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 76 6f  odeIsConstant(vo
6670: 69 64 20 2a 70 41 72 67 2c 20 45 78 70 72 20 2a  id *pArg, Expr *
6680: 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 2a 70  pExpr){.  int *p
6690: 4e 20 3d 20 28 69 6e 74 2a 29 70 41 72 67 3b 0a  N = (int*)pArg;.
66a0: 0a 20 20 2f 2a 20 49 66 20 2a 70 41 72 67 20 69  .  /* If *pArg i
66b0: 73 20 33 20 74 68 65 6e 20 61 6e 79 20 74 65 72  s 3 then any ter
66c0: 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  m of the express
66d0: 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66  ion that comes f
66e0: 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20  rom.  ** the ON 
66f0: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
6700: 20 6f 66 20 61 20 6a 6f 69 6e 20 64 69 73 71 75   of a join disqu
6710: 61 6c 69 66 69 65 73 20 74 68 65 20 65 78 70 72  alifies the expr
6720: 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d  ession.  ** from
6730: 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65   being considere
6740: 64 20 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20  d constant. */. 
6750: 20 69 66 28 20 28 2a 70 4e 29 3d 3d 33 20 26 26   if( (*pN)==3 &&
6760: 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65   ExprHasAnyPrope
6770: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
6780: 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 2a  omJoin) ){.    *
6790: 70 4e 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  pN = 0;.    retu
67a0: 72 6e 20 32 3b 0a 20 20 7d 0a 0a 20 20 73 77 69  rn 2;.  }..  swi
67b0: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
67c0: 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65  {.    /* Conside
67d0: 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62  r functions to b
67e0: 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c  e constant if al
67f0: 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74  l their argument
6800: 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20  s are constant. 
6810: 20 20 20 2a 2a 20 61 6e 64 20 2a 70 41 72 67 3d     ** and *pArg=
6820: 3d 32 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  =2 */.    case T
6830: 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  K_FUNCTION:.    
6840: 20 20 69 66 28 20 28 2a 70 4e 29 3d 3d 32 20 29    if( (*pN)==2 )
6850: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
6860: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
6870: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
6880: 49 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ID:.    case TK_
6890: 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
68a0: 20 54 4b 5f 44 4f 54 3a 0a 20 20 20 20 63 61 73   TK_DOT:.    cas
68b0: 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  e TK_AGG_FUNCTIO
68c0: 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  N:.    case TK_A
68d0: 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 23 69 66 6e 64  GG_COLUMN:.#ifnd
68e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
68f0: 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
6900: 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20   TK_SELECT:.    
6910: 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a  case TK_EXISTS:.
6920: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 2a 70 4e  #endif.      *pN
6930: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
6940: 72 6e 20 32 3b 0a 20 20 20 20 63 61 73 65 20 54  rn 2;.    case T
6950: 4b 5f 49 4e 3a 0a 20 20 20 20 20 20 69 66 28 20  K_IN:.      if( 
6960: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29  pExpr->pSelect )
6970: 7b 0a 20 20 20 20 20 20 20 20 2a 70 4e 20 3d 20  {.        *pN = 
6980: 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
6990: 6e 20 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 2;.      }.   
69a0: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
69b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a  return 0;.  }.}.
69c0: 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
69d0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
69e0: 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
69f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
6a00: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30  onstant.** and 0
6a10: 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20   if it involves 
6a20: 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e  variables or fun
6a30: 63 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a  ction calls..**.
6a40: 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
6a50: 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ses of this func
6a60: 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71  tion, a double-q
6a70: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
6a80: 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63  : "abc").** is c
6a90: 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69  onsidered a vari
6aa0: 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c  able but a singl
6ab0: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
6ac0: 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a  (ex: 'abc') is.*
6ad0: 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f  * a constant..*/
6ae0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
6af0: 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20  IsConstant(Expr 
6b00: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 73 43 6f 6e  *p){.  int isCon
6b10: 73 74 20 3d 20 31 3b 0a 20 20 77 61 6c 6b 45 78  st = 1;.  walkEx
6b20: 70 72 54 72 65 65 28 70 2c 20 65 78 70 72 4e 6f  prTree(p, exprNo
6b30: 64 65 49 73 43 6f 6e 73 74 61 6e 74 2c 20 26 69  deIsConstant, &i
6b40: 73 43 6f 6e 73 74 29 3b 0a 20 20 72 65 74 75 72  sConst);.  retur
6b50: 6e 20 69 73 43 6f 6e 73 74 3b 0a 7d 0a 0a 2f 2a  n isConst;.}../*
6b60: 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
6b70: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
6b80: 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78  turn 1 if the ex
6b90: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
6ba0: 74 61 6e 74 0a 2a 2a 20 74 68 61 74 20 64 6f 65  tant.** that doe
6bb0: 73 20 6e 6f 20 6f 72 69 67 69 6e 61 74 65 20 66  s no originate f
6bc0: 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55 53  rom the ON or US
6bd0: 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61  ING clauses of a
6be0: 20 6a 6f 69 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e   join..** Return
6bf0: 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65   0 if it involve
6c00: 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66  s variables or f
6c10: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 6f 72  unction calls or
6c20: 20 74 65 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61   terms from.** a
6c30: 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  n ON or USING cl
6c40: 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ause..*/.int sql
6c50: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
6c60: 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a  ntNotJoin(Expr *
6c70: 70 29 7b 0a 20 20 69 6e 74 20 69 73 43 6f 6e 73  p){.  int isCons
6c80: 74 20 3d 20 33 3b 0a 20 20 77 61 6c 6b 45 78 70  t = 3;.  walkExp
6c90: 72 54 72 65 65 28 70 2c 20 65 78 70 72 4e 6f 64  rTree(p, exprNod
6ca0: 65 49 73 43 6f 6e 73 74 61 6e 74 2c 20 26 69 73  eIsConstant, &is
6cb0: 43 6f 6e 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  Const);.  return
6cc0: 20 69 73 43 6f 6e 73 74 21 3d 30 3b 0a 7d 0a 0a   isConst!=0;.}..
6cd0: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
6ce0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
6cf0: 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
6d00: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
6d10: 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66  nstant.** or a f
6d20: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74  unction call wit
6d30: 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d  h constant argum
6d40: 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 61 6e  ents.  Return an
6d50: 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a 2a 20  d 0 if there.** 
6d60: 61 72 65 20 61 6e 79 20 76 61 72 69 61 62 6c 65  are any variable
6d70: 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  s..**.** For the
6d80: 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
6d90: 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f  s function, a do
6da0: 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  uble-quoted stri
6db0: 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a  ng (ex: "abc").*
6dc0: 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
6dd0: 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61  a variable but a
6de0: 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73   single-quoted s
6df0: 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27  tring (ex: 'abc'
6e00: 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61  ) is.** a consta
6e10: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
6e20: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
6e30: 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 20  OrFunction(Expr 
6e40: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 73 43 6f 6e  *p){.  int isCon
6e50: 73 74 20 3d 20 32 3b 0a 20 20 77 61 6c 6b 45 78  st = 2;.  walkEx
6e60: 70 72 54 72 65 65 28 70 2c 20 65 78 70 72 4e 6f  prTree(p, exprNo
6e70: 64 65 49 73 43 6f 6e 73 74 61 6e 74 2c 20 26 69  deIsConstant, &i
6e80: 73 43 6f 6e 73 74 29 3b 0a 20 20 72 65 74 75 72  sConst);.  retur
6e90: 6e 20 69 73 43 6f 6e 73 74 21 3d 30 3b 0a 7d 0a  n isConst!=0;.}.
6ea0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  ./*.** If the ex
6eb0: 70 72 65 73 73 69 6f 6e 20 70 20 63 6f 64 65 73  pression p codes
6ec0: 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65   a constant inte
6ed0: 67 65 72 20 74 68 61 74 20 69 73 20 73 6d 61 6c  ger that is smal
6ee0: 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66  l enough.** to f
6ef0: 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69  it in a 32-bit i
6f00: 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 31  nteger, return 1
6f10: 20 61 6e 64 20 70 75 74 20 74 68 65 20 76 61 6c   and put the val
6f20: 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ue of the intege
6f30: 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e  r.** in *pValue.
6f40: 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73    If the express
6f50: 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e  ion is not an in
6f60: 74 65 67 65 72 20 6f 72 20 69 66 20 69 74 20 69  teger or if it i
6f70: 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20  s too big.** to 
6f80: 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65 64 20  fit in a signed 
6f90: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20  32-bit integer, 
6fa0: 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c 65 61  return 0 and lea
6fb0: 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63 68 61  ve *pValue uncha
6fc0: 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nged..*/.int sql
6fd0: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
6fe0: 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a  r(Expr *p, int *
6ff0: 70 56 61 6c 75 65 29 7b 0a 20 20 73 77 69 74 63  pValue){.  switc
7000: 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
7010: 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
7020: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c   {.      if( sql
7030: 69 74 65 33 47 65 74 49 6e 74 33 32 28 28 63 68  ite3GetInt32((ch
7040: 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  ar*)p->token.z, 
7050: 70 56 61 6c 75 65 29 20 29 7b 0a 20 20 20 20 20  pValue) ){.     
7060: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
7070: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
7080: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
7090: 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20   TK_UPLUS: {.   
70a0: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
70b0: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
70c0: 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29  ->pLeft, pValue)
70d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
70e0: 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20   TK_UMINUS: {.  
70f0: 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 20      int v;.     
7100: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
7110: 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65  IsInteger(p->pLe
7120: 66 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20 20  ft, &v) ){.     
7130: 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b     *pValue = -v;
7140: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
7150: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
7160: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7170: 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61 6b    default: break
7180: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
7190: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
71a0: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
71b0: 76 65 6e 20 73 74 72 69 6e 67 20 69 73 20 61 20  ven string is a 
71c0: 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61  row-id column na
71d0: 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  me..*/.int sqlit
71e0: 65 33 49 73 52 6f 77 69 64 28 63 6f 6e 73 74 20  e3IsRowid(const 
71f0: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20  char *z){.  if( 
7200: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
7210: 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20  , "_ROWID_")==0 
7220: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
7230: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
7240: 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30 20  (z, "ROWID")==0 
7250: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
7260: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
7270: 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29 20  (z, "OID")==0 ) 
7280: 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75  return 1;.  retu
7290: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
72a0: 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  iven the name of
72b0: 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65   a column of the
72c0: 20 66 6f 72 6d 20 58 2e 59 2e 5a 20 6f 72 20 59   form X.Y.Z or Y
72d0: 2e 5a 20 6f 72 20 6a 75 73 74 20 5a 2c 20 6c 6f  .Z or just Z, lo
72e0: 6f 6b 20 75 70 0a 2a 2a 20 74 68 61 74 20 6e 61  ok up.** that na
72f0: 6d 65 20 69 6e 20 74 68 65 20 73 65 74 20 6f 66  me in the set of
7300: 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20 69   source tables i
7310: 6e 20 70 53 72 63 4c 69 73 74 20 61 6e 64 20 6d  n pSrcList and m
7320: 61 6b 65 20 74 68 65 20 70 45 78 70 72 20 0a 2a  ake the pExpr .*
7330: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  * expression nod
7340: 65 20 72 65 66 65 72 20 62 61 63 6b 20 74 6f 20  e refer back to 
7350: 74 68 61 74 20 73 6f 75 72 63 65 20 63 6f 6c 75  that source colu
7360: 6d 6e 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  mn.  The followi
7370: 6e 67 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72  ng changes.** ar
7380: 65 20 6d 61 64 65 20 74 6f 20 70 45 78 70 72 3a  e made to pExpr:
7390: 0a 2a 2a 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d  .**.**    pExpr-
73a0: 3e 69 44 62 20 20 20 20 20 20 20 20 20 20 20 53  >iDb           S
73b0: 65 74 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20  et the index in 
73c0: 64 62 2d 3e 61 44 62 5b 5d 20 6f 66 20 74 68 65  db->aDb[] of the
73d0: 20 64 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e   database holdin
73e0: 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  g.**            
73f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65               the
7400: 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 70 45   table..**    pE
7410: 78 70 72 2d 3e 69 54 61 62 6c 65 20 20 20 20 20  xpr->iTable     
7420: 20 20 20 53 65 74 20 74 6f 20 74 68 65 20 63 75     Set to the cu
7430: 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
7440: 74 68 65 20 74 61 62 6c 65 20 6f 62 74 61 69 6e  the table obtain
7450: 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ed.**           
7460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 72                fr
7470: 6f 6d 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2a 20  om pSrcList..** 
7480: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
7490: 6e 20 20 20 20 20 20 20 53 65 74 20 74 6f 20 74  n       Set to t
74a0: 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  he column number
74b0: 20 77 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c   within the tabl
74c0: 65 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e  e..**    pExpr->
74d0: 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 53 65  op            Se
74e0: 74 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 0a  t to TK_COLUMN..
74f0: 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65  **    pExpr->pLe
7500: 66 74 20 20 20 20 20 20 20 20 20 41 6e 79 20 65  ft         Any e
7510: 78 70 72 65 73 73 69 6f 6e 20 74 68 69 73 20 70  xpression this p
7520: 6f 69 6e 74 73 20 74 6f 20 69 73 20 64 65 6c 65  oints to is dele
7530: 74 65 64 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d  ted.**    pExpr-
7540: 3e 70 52 69 67 68 74 20 20 20 20 20 20 20 20 41  >pRight        A
7550: 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  ny expression th
7560: 69 73 20 70 6f 69 6e 74 73 20 74 6f 20 69 73 20  is points to is 
7570: 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  deleted..**.** T
7580: 68 65 20 70 44 62 54 6f 6b 65 6e 20 69 73 20 74  he pDbToken is t
7590: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
75a0: 61 74 61 62 61 73 65 20 28 74 68 65 20 22 58 22  atabase (the "X"
75b0: 29 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d  ).  This value m
75c0: 61 79 20 62 65 0a 2a 2a 20 4e 55 4c 4c 20 6d 65  ay be.** NULL me
75d0: 61 6e 69 6e 67 20 74 68 61 74 20 6e 61 6d 65 20  aning that name 
75e0: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 59  is of the form Y
75f0: 2e 5a 20 6f 72 20 5a 2e 20 20 41 6e 79 20 61 76  .Z or Z.  Any av
7600: 61 69 6c 61 62 6c 65 20 64 61 74 61 62 61 73 65  ailable database
7610: 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 2e  .** can be used.
7620: 20 20 54 68 65 20 70 54 61 62 6c 65 54 6f 6b 65    The pTableToke
7630: 6e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  n is the name of
7640: 20 74 68 65 20 74 61 62 6c 65 20 28 74 68 65 20   the table (the 
7650: 22 59 22 29 2e 20 20 54 68 69 73 0a 2a 2a 20 76  "Y").  This.** v
7660: 61 6c 75 65 20 63 61 6e 20 62 65 20 4e 55 4c 4c  alue can be NULL
7670: 20 69 66 20 70 44 62 54 6f 6b 65 6e 20 69 73 20   if pDbToken is 
7680: 61 6c 73 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 70  also NULL.  If p
7690: 54 61 62 6c 65 54 6f 6b 65 6e 20 69 73 20 4e 55  TableToken is NU
76a0: 4c 4c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74  LL it.** means t
76b0: 68 61 74 20 74 68 65 20 66 6f 72 6d 20 6f 66 20  hat the form of 
76c0: 74 68 65 20 6e 61 6d 65 20 69 73 20 5a 20 61 6e  the name is Z an
76d0: 64 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 66  d that columns f
76e0: 72 6f 6d 20 61 6e 79 20 74 61 62 6c 65 0a 2a 2a  rom any table.**
76f0: 20 63 61 6e 20 62 65 20 75 73 65 64 2e 0a 2a 2a   can be used..**
7700: 0a 2a 2a 20 49 66 20 74 68 65 20 6e 61 6d 65 20  .** If the name 
7710: 63 61 6e 6e 6f 74 20 62 65 20 72 65 73 6f 6c 76  cannot be resolv
7720: 65 64 20 75 6e 61 6d 62 69 67 75 6f 75 73 6c 79  ed unambiguously
7730: 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
7740: 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70   message.** in p
7750: 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e  Parse and return
7760: 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 52 65 74 75   non-zero.  Retu
7770: 72 6e 20 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65  rn zero on succe
7780: 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ss..*/.static in
7790: 74 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 0a 20 20  t lookupName(.  
77a0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
77b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
77c0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
77d0: 20 54 6f 6b 65 6e 20 2a 70 44 62 54 6f 6b 65 6e   Token *pDbToken
77e0: 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ,     /* Name of
77f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
7800: 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2c 20  ntaining table, 
7810: 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b  or NULL */.  Tok
7820: 65 6e 20 2a 70 54 61 62 6c 65 54 6f 6b 65 6e 2c  en *pTableToken,
7830: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62    /* Name of tab
7840: 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f  le containing co
7850: 6c 75 6d 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  lumn, or NULL */
7860: 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75 6d  .  Token *pColum
7870: 6e 54 6f 6b 65 6e 2c 20 2f 2a 20 4e 61 6d 65 20  nToken, /* Name 
7880: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 2a  of the column. *
7890: 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  /.  NameContext 
78a0: 2a 70 4e 43 2c 20 20 20 20 2f 2a 20 54 68 65 20  *pNC,    /* The 
78b0: 6e 61 6d 65 20 63 6f 6e 74 65 78 74 20 75 73 65  name context use
78c0: 64 20 74 6f 20 72 65 73 6f 6c 76 65 20 74 68 65  d to resolve the
78d0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20   name */.  Expr 
78e0: 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20  *pExpr          
78f0: 2f 2a 20 4d 61 6b 65 20 74 68 69 73 20 45 58 50  /* Make this EXP
7900: 52 20 6e 6f 64 65 20 70 6f 69 6e 74 20 74 6f 20  R node point to 
7910: 74 68 65 20 73 65 6c 65 63 74 65 64 20 63 6f 6c  the selected col
7920: 75 6d 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  umn */.){.  char
7930: 20 2a 7a 44 62 20 3d 20 30 3b 20 20 20 20 20 20   *zDb = 0;      
7940: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
7950: 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 22  database.  The "
7960: 58 22 20 69 6e 20 58 2e 59 2e 5a 20 2a 2f 0a 20  X" in X.Y.Z */. 
7970: 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 30 3b   char *zTab = 0;
7980: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
7990: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 65   the table.  The
79a0: 20 22 59 22 20 69 6e 20 58 2e 59 2e 5a 20 6f 72   "Y" in X.Y.Z or
79b0: 20 59 2e 5a 20 2a 2f 0a 20 20 63 68 61 72 20 2a   Y.Z */.  char *
79c0: 7a 43 6f 6c 20 3d 20 30 3b 20 20 20 20 20 20 2f  zCol = 0;      /
79d0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
79e0: 6c 75 6d 6e 2e 20 20 54 68 65 20 22 5a 22 20 2a  lumn.  The "Z" *
79f0: 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  /.  int i, j;   
7a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
7a10: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
7a20: 6e 74 20 63 6e 74 20 3d 20 30 3b 20 20 20 20 20  nt cnt = 0;     
7a30: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7a40: 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e   matching column
7a50: 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20   names */.  int 
7a60: 63 6e 74 54 61 62 20 3d 20 30 3b 20 20 20 20 20  cntTab = 0;     
7a70: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61   /* Number of ma
7a80: 74 63 68 69 6e 67 20 74 61 62 6c 65 20 6e 61 6d  tching table nam
7a90: 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  es */.  sqlite3 
7aa0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
7ab0: 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61  ;  /* The databa
7ac0: 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
7ad0: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
7ae0: 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20 55 73 65  em;       /* Use
7af0: 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   for looping ove
7b00: 72 20 70 53 72 63 4c 69 73 74 20 69 74 65 6d 73  r pSrcList items
7b10: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
7b20: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4d 61 74 63  List_item *pMatc
7b30: 68 20 3d 20 30 3b 20 20 2f 2a 20 54 68 65 20 6d  h = 0;  /* The m
7b40: 61 74 63 68 69 6e 67 20 70 53 72 63 4c 69 73 74  atching pSrcList
7b50: 20 69 74 65 6d 20 2a 2f 0a 20 20 4e 61 6d 65 43   item */.  NameC
7b60: 6f 6e 74 65 78 74 20 2a 70 54 6f 70 4e 43 20 3d  ontext *pTopNC =
7b70: 20 70 4e 43 3b 20 20 20 20 20 20 20 20 2f 2a 20   pNC;        /* 
7b80: 46 69 72 73 74 20 6e 61 6d 65 63 6f 6e 74 65 78  First namecontex
7b90: 74 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f  t in the list */
7ba0: 0a 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65  .  Schema *pSche
7bb0: 6d 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ma = 0;         
7bc0: 20 20 20 20 20 2f 2a 20 53 63 68 65 6d 61 20 6f       /* Schema o
7bd0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
7be0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
7bf0: 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 20 26 26 20 70  ColumnToken && p
7c00: 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e 7a 20 29  ColumnToken->z )
7c10: 3b 20 2f 2a 20 54 68 65 20 5a 20 69 6e 20 58 2e  ; /* The Z in X.
7c20: 59 2e 5a 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55  Y.Z cannot be NU
7c30: 4c 4c 20 2a 2f 0a 20 20 7a 44 62 20 3d 20 73 71  LL */.  zDb = sq
7c40: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
7c50: 65 6e 28 64 62 2c 20 70 44 62 54 6f 6b 65 6e 29  en(db, pDbToken)
7c60: 3b 0a 20 20 7a 54 61 62 20 3d 20 73 71 6c 69 74  ;.  zTab = sqlit
7c70: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
7c80: 64 62 2c 20 70 54 61 62 6c 65 54 6f 6b 65 6e 29  db, pTableToken)
7c90: 3b 0a 20 20 7a 43 6f 6c 20 3d 20 73 71 6c 69 74  ;.  zCol = sqlit
7ca0: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
7cb0: 64 62 2c 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e  db, pColumnToken
7cc0: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
7cd0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
7ce0: 20 67 6f 74 6f 20 6c 6f 6f 6b 75 70 6e 61 6d 65   goto lookupname
7cf0: 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 70 45 78  _end;.  }..  pEx
7d00: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2d 31 3b  pr->iTable = -1;
7d10: 0a 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26  .  while( pNC &&
7d20: 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 45   cnt==0 ){.    E
7d30: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
7d40: 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53  .    SrcList *pS
7d50: 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53  rcList = pNC->pS
7d60: 72 63 4c 69 73 74 3b 0a 0a 20 20 20 20 69 66 28  rcList;..    if(
7d70: 20 70 53 72 63 4c 69 73 74 20 29 7b 0a 20 20 20   pSrcList ){.   
7d80: 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65     for(i=0, pIte
7d90: 6d 3d 70 53 72 63 4c 69 73 74 2d 3e 61 3b 20 69  m=pSrcList->a; i
7da0: 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pSrcList->nSrc;
7db0: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
7dc0: 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70          Table *p
7dd0: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Tab;.        int
7de0: 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 43 6f   iDb;.        Co
7df0: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 0a 20  lumn *pCol;.  . 
7e00: 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 49         pTab = pI
7e10: 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  tem->pTab;.     
7e20: 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21     assert( pTab!
7e30: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 44  =0 );.        iD
7e40: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
7e50: 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
7e60: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
7e70: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
7e80: 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 20  b->nCol>0 );.   
7e90: 20 20 20 20 20 69 66 28 20 7a 54 61 62 20 29 7b       if( zTab ){
7ea0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
7eb0: 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a  Item->zAlias ){.
7ec0: 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
7ed0: 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 49 74   *zTabName = pIt
7ee0: 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20  em->zAlias;.    
7ef0: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
7f00: 74 65 33 53 74 72 49 43 6d 70 28 7a 54 61 62 4e  te3StrICmp(zTabN
7f10: 61 6d 65 2c 20 7a 54 61 62 29 21 3d 30 20 29 20  ame, zTab)!=0 ) 
7f20: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
7f30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7f40: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61         char *zTa
7f50: 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e  bName = pTab->zN
7f60: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
7f70: 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30   if( zTabName==0
7f80: 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43   || sqlite3StrIC
7f90: 6d 70 28 7a 54 61 62 4e 61 6d 65 2c 20 7a 54 61  mp(zTabName, zTa
7fa0: 62 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  b)!=0 ) continue
7fb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
7fc0: 28 20 7a 44 62 21 3d 30 20 26 26 20 73 71 6c 69  ( zDb!=0 && sqli
7fd0: 74 65 33 53 74 72 49 43 6d 70 28 64 62 2d 3e 61  te3StrICmp(db->a
7fe0: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 7a  Db[iDb].zName, z
7ff0: 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Db)!=0 ){.      
8000: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
8010: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
8020: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8030: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
8040: 28 20 30 3d 3d 28 63 6e 74 54 61 62 2b 2b 29 20  ( 0==(cntTab++) 
8050: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  ){.          pEx
8060: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 49 74  pr->iTable = pIt
8070: 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
8080: 20 20 20 20 20 20 20 70 53 63 68 65 6d 61 20 3d         pSchema =
8090: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3b 0a   pTab->pSchema;.
80a0: 20 20 20 20 20 20 20 20 20 20 70 4d 61 74 63 68            pMatch
80b0: 20 3d 20 70 49 74 65 6d 3b 0a 20 20 20 20 20 20   = pItem;.      
80c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28    }.        for(
80d0: 6a 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e  j=0, pCol=pTab->
80e0: 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  aCol; j<pTab->nC
80f0: 6f 6c 3b 20 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; j++, pCol++)
8100: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
8110: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
8120: 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  Col->zName, zCol
8130: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
8140: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
8150: 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43  zColl = pTab->aC
8160: 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20  ol[j].zColl;.   
8170: 20 20 20 20 20 20 20 20 20 49 64 4c 69 73 74 20           IdList 
8180: 2a 70 55 73 69 6e 67 3b 0a 20 20 20 20 20 20 20  *pUsing;.       
8190: 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20       cnt++;.    
81a0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
81b0: 54 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69  Table = pItem->i
81c0: 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20  Cursor;.        
81d0: 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70 49 74      pMatch = pIt
81e0: 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  em;.            
81f0: 70 53 63 68 65 6d 61 20 3d 20 70 54 61 62 2d 3e  pSchema = pTab->
8200: 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20 20  pSchema;.       
8210: 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75       /* Substitu
8220: 74 65 20 74 68 65 20 72 6f 77 69 64 20 28 63 6f  te the rowid (co
8230: 6c 75 6d 6e 20 2d 31 29 20 66 6f 72 20 74 68 65  lumn -1) for the
8240: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
8250: 20 4b 45 59 20 2a 2f 0a 20 20 20 20 20 20 20 20   KEY */.        
8260: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
8270: 6d 6e 20 3d 20 6a 3d 3d 70 54 61 62 2d 3e 69 50  mn = j==pTab->iP
8280: 4b 65 79 20 3f 20 2d 31 20 3a 20 6a 3b 0a 20 20  Key ? -1 : j;.  
8290: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
82a0: 3e 61 66 66 69 6e 69 74 79 20 3d 20 70 54 61 62  >affinity = pTab
82b0: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66 69 6e 69  ->aCol[j].affini
82c0: 74 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ty;.            
82d0: 69 66 28 20 28 70 45 78 70 72 2d 3e 66 6c 61 67  if( (pExpr->flag
82e0: 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74  s & EP_ExpCollat
82f0: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
8300: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 43         pExpr->pC
8310: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
8320: 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43  dCollSeq(db, ENC
8330: 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 2d 31 2c 20  (db), zColl,-1, 
8340: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
8350: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
8360: 28 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53  ( i<pSrcList->nS
8370: 72 63 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  rc-1 ){.        
8380: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 5b        if( pItem[
8390: 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  1].jointype & JT
83a0: 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20 20  _NATURAL ){.    
83b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
83c0: 66 20 74 68 69 73 20 6d 61 74 63 68 20 6f 63 63  f this match occ
83d0: 75 72 72 65 64 20 69 6e 20 74 68 65 20 6c 65 66  urred in the lef
83e0: 74 20 74 61 62 6c 65 20 6f 66 20 61 20 6e 61 74  t table of a nat
83f0: 75 72 61 6c 20 6a 6f 69 6e 2c 0a 20 20 20 20 20  ural join,.     
8400: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
8410: 65 6e 20 73 6b 69 70 20 74 68 65 20 72 69 67 68  en skip the righ
8420: 74 20 74 61 62 6c 65 20 74 6f 20 61 76 6f 69 64  t table to avoid
8430: 20 61 20 64 75 70 6c 69 63 61 74 65 20 6d 61 74   a duplicate mat
8440: 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ch */.          
8450: 20 20 20 20 20 20 70 49 74 65 6d 2b 2b 3b 0a 20        pItem++;. 
8460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
8470: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
8480: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 55 73    }else if( (pUs
8490: 69 6e 67 20 3d 20 70 49 74 65 6d 5b 31 5d 2e 70  ing = pItem[1].p
84a0: 55 73 69 6e 67 29 21 3d 30 20 29 7b 0a 20 20 20  Using)!=0 ){.   
84b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
84c0: 49 66 20 74 68 69 73 20 6d 61 74 63 68 20 6f 63  If this match oc
84d0: 63 75 72 73 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  curs on a column
84e0: 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20   that is in the 
84f0: 55 53 49 4e 47 20 63 6c 61 75 73 65 0a 20 20 20  USING clause.   
8500: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
8510: 6f 66 20 61 20 6a 6f 69 6e 2c 20 73 6b 69 70 20  of a join, skip 
8520: 74 68 65 20 73 65 61 72 63 68 20 6f 66 20 74 68  the search of th
8530: 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66  e right table of
8540: 20 74 68 65 20 6a 6f 69 6e 0a 20 20 20 20 20 20   the join.      
8550: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20            ** to 
8560: 61 76 6f 69 64 20 61 20 64 75 70 6c 69 63 61 74  avoid a duplicat
8570: 65 20 6d 61 74 63 68 20 74 68 65 72 65 2e 20 2a  e match there. *
8580: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
8590: 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20    int k;.       
85a0: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30           for(k=0
85b0: 3b 20 6b 3c 70 55 73 69 6e 67 2d 3e 6e 49 64 3b  ; k<pUsing->nId;
85c0: 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   k++){.         
85d0: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
85e0: 69 74 65 33 53 74 72 49 43 6d 70 28 70 55 73 69  ite3StrICmp(pUsi
85f0: 6e 67 2d 3e 61 5b 6b 5d 2e 7a 4e 61 6d 65 2c 20  ng->a[k].zName, 
8600: 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  zCol)==0 ){.    
8610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8620: 70 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20  pItem++;.       
8630: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 2b 2b               i++
8640: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
8650: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
8670: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8680: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
8690: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
86a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
86b0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
86c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
86d0: 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  }.    }..#ifndef
86e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
86f0: 47 47 45 52 0a 20 20 20 20 2f 2a 20 49 66 20 77  GGER.    /* If w
8700: 65 20 68 61 76 65 20 6e 6f 74 20 61 6c 72 65 61  e have not alrea
8710: 64 79 20 72 65 73 6f 6c 76 65 64 20 74 68 65 20  dy resolved the 
8720: 6e 61 6d 65 2c 20 74 68 65 6e 20 6d 61 79 62 65  name, then maybe
8730: 20 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 61   .    ** it is a
8740: 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20   new.* or old.* 
8750: 74 72 69 67 67 65 72 20 61 72 67 75 6d 65 6e 74  trigger argument
8760: 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20 2a   reference.    *
8770: 2f 0a 20 20 20 20 69 66 28 20 7a 44 62 3d 3d 30  /.    if( zDb==0
8780: 20 26 26 20 7a 54 61 62 21 3d 30 20 26 26 20 63   && zTab!=0 && c
8790: 6e 74 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d  nt==0 && pParse-
87a0: 3e 74 72 69 67 53 74 61 63 6b 21 3d 30 20 29 7b  >trigStack!=0 ){
87b0: 0a 20 20 20 20 20 20 54 72 69 67 67 65 72 53 74  .      TriggerSt
87c0: 61 63 6b 20 2a 70 54 72 69 67 67 65 72 53 74 61  ack *pTriggerSta
87d0: 63 6b 20 3d 20 70 50 61 72 73 65 2d 3e 74 72 69  ck = pParse->tri
87e0: 67 53 74 61 63 6b 3b 0a 20 20 20 20 20 20 54 61  gStack;.      Ta
87f0: 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20  ble *pTab = 0;. 
8800: 20 20 20 20 20 75 33 32 20 2a 70 69 43 6f 6c 4d       u32 *piColM
8810: 61 73 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ask;.      if( p
8820: 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6e 65  TriggerStack->ne
8830: 77 49 64 78 20 21 3d 20 2d 31 20 26 26 20 73 71  wIdx != -1 && sq
8840: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 22 6e 65  lite3StrICmp("ne
8850: 77 22 2c 20 7a 54 61 62 29 20 3d 3d 20 30 20 29  w", zTab) == 0 )
8860: 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  {.        pExpr-
8870: 3e 69 54 61 62 6c 65 20 3d 20 70 54 72 69 67 67  >iTable = pTrigg
8880: 65 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64 78 3b  erStack->newIdx;
8890: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
88a0: 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e   pTriggerStack->
88b0: 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 20 20  pTab );.        
88c0: 70 54 61 62 20 3d 20 70 54 72 69 67 67 65 72 53  pTab = pTriggerS
88d0: 74 61 63 6b 2d 3e 70 54 61 62 3b 0a 20 20 20 20  tack->pTab;.    
88e0: 20 20 20 20 70 69 43 6f 6c 4d 61 73 6b 20 3d 20      piColMask = 
88f0: 26 28 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d  &(pTriggerStack-
8900: 3e 6e 65 77 43 6f 6c 4d 61 73 6b 29 3b 0a 20 20  >newColMask);.  
8910: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54      }else if( pT
8920: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64  riggerStack->old
8930: 49 64 78 20 21 3d 20 2d 31 20 26 26 20 73 71 6c  Idx != -1 && sql
8940: 69 74 65 33 53 74 72 49 43 6d 70 28 22 6f 6c 64  ite3StrICmp("old
8950: 22 2c 20 7a 54 61 62 29 3d 3d 30 20 29 7b 0a 20  ", zTab)==0 ){. 
8960: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
8970: 61 62 6c 65 20 3d 20 70 54 72 69 67 67 65 72 53  able = pTriggerS
8980: 74 61 63 6b 2d 3e 6f 6c 64 49 64 78 3b 0a 20 20  tack->oldIdx;.  
8990: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
89a0: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61  riggerStack->pTa
89b0: 62 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61  b );.        pTa
89c0: 62 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63  b = pTriggerStac
89d0: 6b 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  k->pTab;.       
89e0: 20 70 69 43 6f 6c 4d 61 73 6b 20 3d 20 26 28 70   piColMask = &(p
89f0: 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c  TriggerStack->ol
8a00: 64 43 6f 6c 4d 61 73 6b 29 3b 0a 20 20 20 20 20  dColMask);.     
8a10: 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54   }..      if( pT
8a20: 61 62 20 29 7b 20 0a 20 20 20 20 20 20 20 20 69  ab ){ .        i
8a30: 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20  nt iCol;.       
8a40: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20   Column *pCol = 
8a50: 70 54 61 62 2d 3e 61 43 6f 6c 3b 0a 0a 20 20 20  pTab->aCol;..   
8a60: 20 20 20 20 20 70 53 63 68 65 6d 61 20 3d 20 70       pSchema = p
8a70: 54 61 62 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  Tab->pSchema;.  
8a80: 20 20 20 20 20 20 63 6e 74 54 61 62 2b 2b 3b 0a        cntTab++;.
8a90: 20 20 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c          for(iCol
8aa0: 3d 30 3b 20 69 43 6f 6c 20 3c 20 70 54 61 62 2d  =0; iCol < pTab-
8ab0: 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 2c 20 70  >nCol; iCol++, p
8ac0: 43 6f 6c 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20  Col++) {.       
8ad0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
8ae0: 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  rICmp(pCol->zNam
8af0: 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20  e, zCol)==0 ){. 
8b00: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74             const
8b10: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70   char *zColl = p
8b20: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
8b30: 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20  zColl;.         
8b40: 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20     cnt++;.      
8b50: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
8b60: 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3d 3d 70 54 61  lumn = iCol==pTa
8b70: 62 2d 3e 69 50 4b 65 79 20 3f 20 2d 31 20 3a 20  b->iPKey ? -1 : 
8b80: 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  iCol;.          
8b90: 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74    pExpr->affinit
8ba0: 79 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  y = pTab->aCol[i
8bb0: 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20  Col].affinity;. 
8bc0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
8bd0: 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
8be0: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3d 3d 30  P_ExpCollate)==0
8bf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8c00: 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d    pExpr->pColl =
8c10: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
8c20: 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c  Seq(db, ENC(db),
8c30: 20 7a 43 6f 6c 6c 2c 2d 31 2c 20 30 29 3b 0a 20   zColl,-1, 0);. 
8c40: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
8c50: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
8c60: 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20  pTab = pTab;.   
8c70: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f           if( iCo
8c80: 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  l>=0 ){.        
8c90: 20 20 20 20 20 20 2a 70 69 43 6f 6c 4d 61 73 6b        *piColMask
8ca0: 20 7c 3d 20 28 28 75 33 32 29 31 3c 3c 69 43 6f   |= ((u32)1<<iCo
8cb0: 6c 29 20 7c 20 28 69 43 6f 6c 3e 3d 33 32 3f 30  l) | (iCol>=32?0
8cc0: 78 66 66 66 66 66 66 66 66 3a 30 29 3b 0a 20 20  xffffffff:0);.  
8cd0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8ce0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8cf0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8d00: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
8d10: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65   }.#endif /* !de
8d20: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
8d30: 54 5f 54 52 49 47 47 45 52 29 20 2a 2f 0a 0a 20  T_TRIGGER) */.. 
8d40: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 50 65 72     /*.    ** Per
8d50: 68 61 70 73 20 74 68 65 20 6e 61 6d 65 20 69 73  haps the name is
8d60: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
8d70: 74 68 65 20 52 4f 57 49 44 0a 20 20 20 20 2a 2f  the ROWID.    */
8d80: 0a 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20  .    if( cnt==0 
8d90: 26 26 20 63 6e 74 54 61 62 3d 3d 31 20 26 26 20  && cntTab==1 && 
8da0: 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a  sqlite3IsRowid(z
8db0: 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 63 6e  Col) ){.      cn
8dc0: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 45 78  t = 1;.      pEx
8dd0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31  pr->iColumn = -1
8de0: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61  ;.      pExpr->a
8df0: 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
8e00: 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20  _AFF_INTEGER;.  
8e10: 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
8e20: 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20  ** If the input 
8e30: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 5a  is of the form Z
8e40: 20 28 6e 6f 74 20 59 2e 5a 20 6f 72 20 58 2e 59   (not Y.Z or X.Y
8e50: 2e 5a 29 20 74 68 65 6e 20 74 68 65 20 6e 61 6d  .Z) then the nam
8e60: 65 20 5a 0a 20 20 20 20 2a 2a 20 6d 69 67 68 74  e Z.    ** might
8e70: 20 72 65 66 65 72 20 74 6f 20 61 6e 20 72 65 73   refer to an res
8e80: 75 6c 74 2d 73 65 74 20 61 6c 69 61 73 2e 20 20  ult-set alias.  
8e90: 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20 66 6f  This happens, fo
8ea0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a  r example, when.
8eb0: 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20 72 65      ** we are re
8ec0: 73 6f 6c 76 69 6e 67 20 6e 61 6d 65 73 20 69 6e  solving names in
8ed0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
8ee0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
8ef0: 6e 67 20 63 6f 6d 6d 61 6e 64 3a 0a 20 20 20 20  ng command:.    
8f00: 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 45  **.    **     SE
8f10: 4c 45 43 54 20 61 2b 62 20 41 53 20 78 20 46 52  LECT a+b AS x FR
8f20: 4f 4d 20 74 61 62 6c 65 20 57 48 45 52 45 20 78  OM table WHERE x
8f30: 3c 31 30 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  <10;.    **.    
8f40: 2a 2a 20 49 6e 20 63 61 73 65 73 20 6c 69 6b 65  ** In cases like
8f50: 20 74 68 69 73 2c 20 72 65 70 6c 61 63 65 20 70   this, replace p
8f60: 45 78 70 72 20 77 69 74 68 20 61 20 63 6f 70 79  Expr with a copy
8f70: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
8f80: 6f 6e 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 66  on that.    ** f
8f90: 6f 72 6d 73 20 74 68 65 20 72 65 73 75 6c 74 20  orms the result 
8fa0: 73 65 74 20 65 6e 74 72 79 20 28 22 61 2b 62 22  set entry ("a+b"
8fb0: 20 69 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 29   in the example)
8fc0: 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d 65   and return imme
8fd0: 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20  diately..    ** 
8fe0: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 65 78  Note that the ex
8ff0: 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20  pression in the 
9000: 72 65 73 75 6c 74 20 73 65 74 20 73 68 6f 75 6c  result set shoul
9010: 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  d have already b
9020: 65 65 6e 0a 20 20 20 20 2a 2a 20 72 65 73 6f 6c  een.    ** resol
9030: 76 65 64 20 62 79 20 74 68 65 20 74 69 6d 65 20  ved by the time 
9040: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
9050: 20 69 73 20 72 65 73 6f 6c 76 65 64 2e 0a 20 20   is resolved..  
9060: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e 74    */.    if( cnt
9070: 3d 3d 30 20 26 26 20 28 70 45 4c 69 73 74 20 3d  ==0 && (pEList =
9080: 20 70 4e 43 2d 3e 70 45 4c 69 73 74 29 21 3d 30   pNC->pEList)!=0
9090: 20 26 26 20 7a 54 61 62 3d 3d 30 20 29 7b 0a 20   && zTab==0 ){. 
90a0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
90b0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a  pEList->nExpr; j
90c0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
90d0: 72 20 2a 7a 41 73 20 3d 20 70 45 4c 69 73 74 2d  r *zAs = pEList-
90e0: 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >a[j].zName;.   
90f0: 20 20 20 20 20 69 66 28 20 7a 41 73 21 3d 30 20       if( zAs!=0 
9100: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
9110: 70 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d 3d 30 20  p(zAs, zCol)==0 
9120: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
9130: 72 20 2a 70 44 75 70 2c 20 2a 70 4f 72 69 67 3b  r *pDup, *pOrig;
9140: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
9150: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d  t( pExpr->pLeft=
9160: 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69  =0 && pExpr->pRi
9170: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ght==0 );.      
9180: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
9190: 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20  r->pList==0 );. 
91a0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
91b0: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 3d   pExpr->pSelect=
91c0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
91d0: 70 4f 72 69 67 20 3d 20 70 45 4c 69 73 74 2d 3e  pOrig = pEList->
91e0: 61 5b 6a 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[j].pExpr;.    
91f0: 20 20 20 20 20 20 69 66 28 20 21 70 4e 43 2d 3e        if( !pNC->
9200: 61 6c 6c 6f 77 41 67 67 20 26 26 20 45 78 70 72  allowAgg && Expr
9210: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4f 72 69  HasProperty(pOri
9220: 67 2c 20 45 50 5f 41 67 67 29 20 29 7b 0a 20 20  g, EP_Agg) ){.  
9230: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
9240: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
9250: 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61 6c 69  , "misuse of ali
9260: 61 73 65 64 20 61 67 67 72 65 67 61 74 65 20 25  ased aggregate %
9270: 73 22 2c 20 7a 41 73 29 3b 0a 20 20 20 20 20 20  s", zAs);.      
9280: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
9290: 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20  ee(zCol);.      
92a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a        return 2;.
92b0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
92c0: 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c        pDup = sql
92d0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
92e0: 70 4f 72 69 67 29 3b 0a 20 20 20 20 20 20 20 20  pOrig);.        
92f0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61    if( pExpr->fla
9300: 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61  gs & EP_ExpColla
9310: 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  te ){.          
9320: 20 20 70 44 75 70 2d 3e 70 43 6f 6c 6c 20 3d 20    pDup->pColl = 
9330: 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20  pExpr->pColl;.  
9340: 20 20 20 20 20 20 20 20 20 20 70 44 75 70 2d 3e            pDup->
9350: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78 70 43  flags |= EP_ExpC
9360: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 20 20  ollate;.        
9370: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
9380: 28 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79  ( pExpr->span.dy
9390: 6e 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  n ) sqlite3_free
93a0: 28 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 73  ((char*)pExpr->s
93b0: 70 61 6e 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20  pan.z);.        
93c0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b    if( pExpr->tok
93d0: 65 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74 65 33  en.dyn ) sqlite3
93e0: 5f 66 72 65 65 28 28 63 68 61 72 2a 29 70 45 78  _free((char*)pEx
93f0: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20  pr->token.z);.  
9400: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
9410: 45 78 70 72 2c 20 70 44 75 70 2c 20 73 69 7a 65  Expr, pDup, size
9420: 6f 66 28 2a 70 45 78 70 72 29 29 3b 0a 20 20 20  of(*pExpr));.   
9430: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
9440: 72 65 65 28 70 44 75 70 29 3b 0a 20 20 20 20 20  ree(pDup);.     
9450: 20 20 20 20 20 63 6e 74 20 3d 20 31 3b 0a 20 20       cnt = 1;.  
9460: 20 20 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d          pMatch =
9470: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   0;.          as
9480: 73 65 72 74 28 20 7a 54 61 62 3d 3d 30 20 26 26  sert( zTab==0 &&
9490: 20 7a 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20   zDb==0 );.     
94a0: 20 20 20 20 20 67 6f 74 6f 20 6c 6f 6f 6b 75 70       goto lookup
94b0: 6e 61 6d 65 5f 65 6e 64 5f 32 3b 0a 20 20 20 20  name_end_2;.    
94c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 0a 20      }.      } . 
94d0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 76     }..    /* Adv
94e0: 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74  ance to the next
94f0: 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 2e 20 20   name context.  
9500: 54 68 65 20 6c 6f 6f 70 20 77 69 6c 6c 20 65 78  The loop will ex
9510: 69 74 20 77 68 65 6e 20 65 69 74 68 65 72 0a 20  it when either. 
9520: 20 20 20 2a 2a 20 77 65 20 68 61 76 65 20 61 20     ** we have a 
9530: 6d 61 74 63 68 20 28 63 6e 74 3e 30 29 20 6f 72  match (cnt>0) or
9540: 20 77 68 65 6e 20 77 65 20 72 75 6e 20 6f 75 74   when we run out
9550: 20 6f 66 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74   of name context
9560: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
9570: 28 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( cnt==0 ){.    
9580: 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65    pNC = pNC->pNe
9590: 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  xt;.    }.  }.. 
95a0: 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 58 20 61 6e   /*.  ** If X an
95b0: 64 20 59 20 61 72 65 20 4e 55 4c 4c 20 28 69 6e  d Y are NULL (in
95c0: 20 6f 74 68 65 72 20 77 6f 72 64 73 20 69 66 20   other words if 
95d0: 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20  only the column 
95e0: 6e 61 6d 65 20 5a 20 69 73 0a 20 20 2a 2a 20 73  name Z is.  ** s
95f0: 75 70 70 6c 69 65 64 29 20 61 6e 64 20 74 68 65  upplied) and the
9600: 20 76 61 6c 75 65 20 6f 66 20 5a 20 69 73 20 65   value of Z is e
9610: 6e 63 6c 6f 73 65 64 20 69 6e 20 64 6f 75 62 6c  nclosed in doubl
9620: 65 2d 71 75 6f 74 65 73 2c 20 74 68 65 6e 0a 20  e-quotes, then. 
9630: 20 2a 2a 20 5a 20 69 73 20 61 20 73 74 72 69 6e   ** Z is a strin
9640: 67 20 6c 69 74 65 72 61 6c 20 69 66 20 69 74 20  g literal if it 
9650: 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 20 61 6e  doesn't match an
9660: 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20  y column names. 
9670: 20 49 6e 20 74 68 61 74 0a 20 20 2a 2a 20 63 61   In that.  ** ca
9680: 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72  se, we need to r
9690: 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79  eturn right away
96a0: 20 61 6e 64 20 6e 6f 74 20 6d 61 6b 65 20 61 6e   and not make an
96b0: 79 20 63 68 61 6e 67 65 73 20 74 6f 0a 20 20 2a  y changes to.  *
96c0: 2a 20 70 45 78 70 72 2e 0a 20 20 2a 2a 0a 20 20  * pExpr..  **.  
96d0: 2a 2a 20 42 65 63 61 75 73 65 20 6e 6f 20 72 65  ** Because no re
96e0: 66 65 72 65 6e 63 65 20 77 61 73 20 6d 61 64 65  ference was made
96f0: 20 74 6f 20 6f 75 74 65 72 20 63 6f 6e 74 65 78   to outer contex
9700: 74 73 2c 20 74 68 65 20 70 4e 43 2d 3e 6e 52 65  ts, the pNC->nRe
9710: 66 0a 20 20 2a 2a 20 66 69 65 6c 64 73 20 61 72  f.  ** fields ar
9720: 65 20 6e 6f 74 20 63 68 61 6e 67 65 64 20 69 6e  e not changed in
9730: 20 61 6e 79 20 63 6f 6e 74 65 78 74 2e 0a 20 20   any context..  
9740: 2a 2f 0a 20 20 69 66 28 20 63 6e 74 3d 3d 30 20  */.  if( cnt==0 
9750: 26 26 20 7a 54 61 62 3d 3d 30 20 26 26 20 70 43  && zTab==0 && pC
9760: 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d  olumnToken->z[0]
9770: 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 73 71 6c  =='"' ){.    sql
9780: 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c 29 3b  ite3_free(zCol);
9790: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
97a0: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63 6e   }..  /*.  ** cn
97b0: 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 72 65  t==0 means there
97c0: 20 77 61 73 20 6e 6f 74 20 6d 61 74 63 68 2e 20   was not match. 
97d0: 20 63 6e 74 3e 31 20 6d 65 61 6e 73 20 74 68 65   cnt>1 means the
97e0: 72 65 20 77 65 72 65 20 74 77 6f 20 6f 72 0a 20  re were two or. 
97f0: 20 2a 2a 20 6d 6f 72 65 20 6d 61 74 63 68 65 73   ** more matches
9800: 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 77  .  Either way, w
9810: 65 20 68 61 76 65 20 61 6e 20 65 72 72 6f 72 2e  e have an error.
9820: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74 21  .  */.  if( cnt!
9830: 3d 31 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =1 ){.    const 
9840: 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20  char *zErr;.    
9850: 7a 45 72 72 20 3d 20 63 6e 74 3d 3d 30 20 3f 20  zErr = cnt==0 ? 
9860: 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e 22  "no such column"
9870: 20 3a 20 22 61 6d 62 69 67 75 6f 75 73 20 63 6f   : "ambiguous co
9880: 6c 75 6d 6e 20 6e 61 6d 65 22 3b 0a 20 20 20 20  lumn name";.    
9890: 69 66 28 20 7a 44 62 20 29 7b 0a 20 20 20 20 20  if( zDb ){.     
98a0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
98b0: 28 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73  (pParse, "%s: %s
98c0: 2e 25 73 2e 25 73 22 2c 20 7a 45 72 72 2c 20 7a  .%s.%s", zErr, z
98d0: 44 62 2c 20 7a 54 61 62 2c 20 7a 43 6f 6c 29 3b  Db, zTab, zCol);
98e0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  .    }else if( z
98f0: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Tab ){.      sql
9900: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
9910: 72 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73 22  rse, "%s: %s.%s"
9920: 2c 20 7a 45 72 72 2c 20 7a 54 61 62 2c 20 7a 43  , zErr, zTab, zC
9930: 6f 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ol);.    }else{.
9940: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
9950: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
9960: 73 3a 20 25 73 22 2c 20 7a 45 72 72 2c 20 7a 43  s: %s", zErr, zC
9970: 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ol);.    }.    p
9980: 54 6f 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  TopNC->nErr++;. 
9990: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 63 6f   }..  /* If a co
99a0: 6c 75 6d 6e 20 66 72 6f 6d 20 61 20 74 61 62 6c  lumn from a tabl
99b0: 65 20 69 6e 20 70 53 72 63 4c 69 73 74 20 69 73  e in pSrcList is
99c0: 20 72 65 66 65 72 65 6e 63 65 64 2c 20 74 68 65   referenced, the
99d0: 6e 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 74 68  n record.  ** th
99e0: 69 73 20 66 61 63 74 20 69 6e 20 74 68 65 20 70  is fact in the p
99f0: 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 63 6f 6c 55  SrcList.a[].colU
9a00: 73 65 64 20 62 69 74 6d 61 73 6b 2e 20 20 43 6f  sed bitmask.  Co
9a10: 6c 75 6d 6e 20 30 20 63 61 75 73 65 73 0a 20 20  lumn 0 causes.  
9a20: 2a 2a 20 62 69 74 20 30 20 74 6f 20 62 65 20 73  ** bit 0 to be s
9a30: 65 74 2e 20 20 43 6f 6c 75 6d 6e 20 31 20 73 65  et.  Column 1 se
9a40: 74 73 20 62 69 74 20 31 2e 20 20 41 6e 64 20 73  ts bit 1.  And s
9a50: 6f 20 66 6f 72 74 68 2e 20 20 49 66 20 74 68 65  o forth.  If the
9a60: 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 75 6d  .  ** column num
9a70: 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ber is greater t
9a80: 68 61 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  han the number o
9a90: 66 20 62 69 74 73 20 69 6e 20 74 68 65 20 62 69  f bits in the bi
9aa0: 74 6d 61 73 6b 0a 20 20 2a 2a 20 74 68 65 6e 20  tmask.  ** then 
9ab0: 73 65 74 20 74 68 65 20 68 69 67 68 2d 6f 72 64  set the high-ord
9ac0: 65 72 20 62 69 74 20 6f 66 20 74 68 65 20 62 69  er bit of the bi
9ad0: 74 6d 61 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66  tmask..  */.  if
9ae0: 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
9af0: 3e 3d 30 20 26 26 20 70 4d 61 74 63 68 21 3d 30  >=0 && pMatch!=0
9b00: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20   ){.    int n = 
9b10: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
9b20: 20 20 20 20 69 66 28 20 6e 3e 3d 73 69 7a 65 6f      if( n>=sizeo
9b30: 66 28 42 69 74 6d 61 73 6b 29 2a 38 20 29 7b 0a  f(Bitmask)*8 ){.
9b40: 20 20 20 20 20 20 6e 20 3d 20 73 69 7a 65 6f 66        n = sizeof
9b50: 28 42 69 74 6d 61 73 6b 29 2a 38 2d 31 3b 0a 20  (Bitmask)*8-1;. 
9b60: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
9b70: 20 70 4d 61 74 63 68 2d 3e 69 43 75 72 73 6f 72   pMatch->iCursor
9b80: 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  ==pExpr->iTable 
9b90: 29 3b 0a 20 20 20 20 70 4d 61 74 63 68 2d 3e 63  );.    pMatch->c
9ba0: 6f 6c 55 73 65 64 20 7c 3d 20 28 28 42 69 74 6d  olUsed |= ((Bitm
9bb0: 61 73 6b 29 31 29 3c 3c 6e 3b 0a 20 20 7d 0a 0a  ask)1)<<n;.  }..
9bc0: 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 3a 0a  lookupname_end:.
9bd0: 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e    /* Clean up an
9be0: 64 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20  d return.  */.  
9bf0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 44 62  sqlite3_free(zDb
9c00: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
9c10: 65 28 7a 54 61 62 29 3b 0a 20 20 73 71 6c 69 74  e(zTab);.  sqlit
9c20: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 78  e3ExprDelete(pEx
9c30: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 70 45  pr->pLeft);.  pE
9c40: 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a  xpr->pLeft = 0;.
9c50: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
9c60: 65 74 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68  ete(pExpr->pRigh
9c70: 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52 69  t);.  pExpr->pRi
9c80: 67 68 74 20 3d 20 30 3b 0a 20 20 70 45 78 70 72  ght = 0;.  pExpr
9c90: 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e  ->op = TK_COLUMN
9ca0: 3b 0a 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64  ;.lookupname_end
9cb0: 5f 32 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  _2:.  sqlite3_fr
9cc0: 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 69 66 28 20  ee(zCol);.  if( 
9cd0: 63 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 61 73  cnt==1 ){.    as
9ce0: 73 65 72 74 28 20 70 4e 43 21 3d 30 20 29 3b 0a  sert( pNC!=0 );.
9cf0: 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 68 52      sqlite3AuthR
9d00: 65 61 64 28 70 50 61 72 73 65 2c 20 70 45 78 70  ead(pParse, pExp
9d10: 72 2c 20 70 53 63 68 65 6d 61 2c 20 70 4e 43 2d  r, pSchema, pNC-
9d20: 3e 70 53 72 63 4c 69 73 74 29 3b 0a 20 20 20 20  >pSrcList);.    
9d30: 69 66 28 20 70 4d 61 74 63 68 20 26 26 20 21 70  if( pMatch && !p
9d40: 4d 61 74 63 68 2d 3e 70 53 65 6c 65 63 74 20 29  Match->pSelect )
9d50: 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  {.      pExpr->p
9d60: 54 61 62 20 3d 20 70 4d 61 74 63 68 2d 3e 70 54  Tab = pMatch->pT
9d70: 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ab;.    }.    /*
9d80: 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 6e   Increment the n
9d90: 52 65 66 20 76 61 6c 75 65 20 6f 6e 20 61 6c 6c  Ref value on all
9da0: 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 73 20 66   name contexts f
9db0: 72 6f 6d 20 54 6f 70 4e 43 20 75 70 20 74 6f 0a  rom TopNC up to.
9dc0: 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74      ** the point
9dd0: 20 77 68 65 72 65 20 74 68 65 20 6e 61 6d 65 20   where the name 
9de0: 6d 61 74 63 68 65 64 2e 20 2a 2f 0a 20 20 20 20  matched. */.    
9df0: 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 61  for(;;){.      a
9e00: 73 73 65 72 74 28 20 70 54 6f 70 4e 43 21 3d 30  ssert( pTopNC!=0
9e10: 20 29 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e 43   );.      pTopNC
9e20: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
9e30: 69 66 28 20 70 54 6f 70 4e 43 3d 3d 70 4e 43 20  if( pTopNC==pNC 
9e40: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70  ) break;.      p
9e50: 54 6f 70 4e 43 20 3d 20 70 54 6f 70 4e 43 2d 3e  TopNC = pTopNC->
9e60: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
9e70: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20 65   return 0;.  } e
9e80: 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  lse {.    return
9e90: 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
9ea0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
9eb0: 20 64 65 73 69 67 6e 65 64 20 61 73 20 61 6e 20   designed as an 
9ec0: 78 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b 45 78  xFunc for walkEx
9ed0: 70 72 54 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  prTree()..**.** 
9ee0: 52 65 73 6f 6c 76 65 20 73 79 6d 62 6f 6c 69 63  Resolve symbolic
9ef0: 20 6e 61 6d 65 73 20 69 6e 74 6f 20 54 4b 5f 43   names into TK_C
9f00: 4f 4c 55 4d 4e 20 6f 70 65 72 61 74 6f 72 73 20  OLUMN operators 
9f10: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 0a  for the current.
9f20: 2a 2a 20 6e 6f 64 65 20 69 6e 20 74 68 65 20 65  ** node in the e
9f30: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
9f40: 20 52 65 74 75 72 6e 20 30 20 74 6f 20 63 6f 6e   Return 0 to con
9f50: 74 69 6e 75 65 20 74 68 65 20 73 65 61 72 63 68  tinue the search
9f60: 20 64 6f 77 6e 0a 2a 2a 20 74 68 65 20 74 72 65   down.** the tre
9f70: 65 20 6f 72 20 32 20 74 6f 20 61 62 6f 72 74 20  e or 2 to abort 
9f80: 74 68 65 20 74 72 65 65 20 77 61 6c 6b 2e 0a 2a  the tree walk..*
9f90: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
9fa0: 65 20 61 6c 73 6f 20 64 6f 65 73 20 65 72 72 6f  e also does erro
9fb0: 72 20 63 68 65 63 6b 69 6e 67 20 61 6e 64 20 6e  r checking and n
9fc0: 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 66  ame resolution f
9fd0: 6f 72 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6e  or.** function n
9fe0: 61 6d 65 73 2e 20 20 54 68 65 20 6f 70 65 72 61  ames.  The opera
9ff0: 74 6f 72 20 66 6f 72 20 61 67 67 72 65 67 61 74  tor for aggregat
a000: 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 73 20 63  e functions is c
a010: 68 61 6e 67 65 64 0a 2a 2a 20 74 6f 20 54 4b 5f  hanged.** to TK_
a020: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 2e 0a 2a 2f  AGG_FUNCTION..*/
a030: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 61 6d 65  .static int name
a040: 52 65 73 6f 6c 76 65 72 53 74 65 70 28 76 6f 69  ResolverStep(voi
a050: 64 20 2a 70 41 72 67 2c 20 45 78 70 72 20 2a 70  d *pArg, Expr *p
a060: 45 78 70 72 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e  Expr){.  NameCon
a070: 74 65 78 74 20 2a 70 4e 43 20 3d 20 28 4e 61 6d  text *pNC = (Nam
a080: 65 43 6f 6e 74 65 78 74 2a 29 70 41 72 67 3b 0a  eContext*)pArg;.
a090: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
a0a0: 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ..  if( pExpr==0
a0b0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 61   ) return 1;.  a
a0c0: 73 73 65 72 74 28 20 70 4e 43 21 3d 30 20 29 3b  ssert( pNC!=0 );
a0d0: 0a 20 20 70 50 61 72 73 65 20 3d 20 70 4e 43 2d  .  pParse = pNC-
a0e0: 3e 70 50 61 72 73 65 3b 0a 0a 20 20 69 66 28 20  >pParse;..  if( 
a0f0: 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72  ExprHasAnyProper
a100: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 52 65 73  ty(pExpr, EP_Res
a110: 6f 6c 76 65 64 29 20 29 20 72 65 74 75 72 6e 20  olved) ) return 
a120: 31 3b 0a 20 20 45 78 70 72 53 65 74 50 72 6f 70  1;.  ExprSetProp
a130: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 52  erty(pExpr, EP_R
a140: 65 73 6f 6c 76 65 64 29 3b 0a 23 69 66 6e 64 65  esolved);.#ifnde
a150: 66 20 4e 44 45 42 55 47 0a 20 20 69 66 28 20 70  f NDEBUG.  if( p
a160: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 20 26 26 20  NC->pSrcList && 
a170: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 2d 3e 6e  pNC->pSrcList->n
a180: 41 6c 6c 6f 63 3e 30 20 29 7b 0a 20 20 20 20 53  Alloc>0 ){.    S
a190: 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74  rcList *pSrcList
a1a0: 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
a1b0: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
a1c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 43 2d   for(i=0; i<pNC-
a1d0: 3e 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b  >pSrcList->nSrc;
a1e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   i++){.      ass
a1f0: 65 72 74 28 20 70 53 72 63 4c 69 73 74 2d 3e 61  ert( pSrcList->a
a200: 5b 69 5d 2e 69 43 75 72 73 6f 72 3e 3d 30 20 26  [i].iCursor>=0 &
a210: 26 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d  & pSrcList->a[i]
a220: 2e 69 43 75 72 73 6f 72 3c 70 50 61 72 73 65 2d  .iCursor<pParse-
a230: 3e 6e 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20  >nTab);.    }.  
a240: 7d 0a 23 65 6e 64 69 66 0a 20 20 73 77 69 74 63  }.#endif.  switc
a250: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
a260: 20 20 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 71 75      /* Double-qu
a270: 6f 74 65 64 20 73 74 72 69 6e 67 73 20 28 65 78  oted strings (ex
a280: 3a 20 22 61 62 63 22 29 20 61 72 65 20 75 73 65  : "abc") are use
a290: 64 20 61 73 20 69 64 65 6e 74 69 66 69 65 72 73  d as identifiers
a2a0: 20 69 66 0a 20 20 20 20 2a 2a 20 70 6f 73 73 69   if.    ** possi
a2b0: 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20  ble.  Otherwise 
a2c0: 74 68 65 79 20 72 65 6d 61 69 6e 20 61 73 20 73  they remain as s
a2d0: 74 72 69 6e 67 73 2e 20 20 53 69 6e 67 6c 65 2d  trings.  Single-
a2e0: 71 75 6f 74 65 64 0a 20 20 20 20 2a 2a 20 73 74  quoted.    ** st
a2f0: 72 69 6e 67 73 20 28 65 78 3a 20 27 61 62 63 27  rings (ex: 'abc'
a300: 29 20 61 72 65 20 61 6c 77 61 79 73 20 73 74 72  ) are always str
a310: 69 6e 67 20 6c 69 74 65 72 61 6c 73 2e 0a 20 20  ing literals..  
a320: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b    */.    case TK
a330: 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20  _STRING: {.     
a340: 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65   if( pExpr->toke
a350: 6e 2e 7a 5b 30 5d 3d 3d 27 5c 27 27 20 29 20 62  n.z[0]=='\'' ) b
a360: 72 65 61 6b 3b 0a 20 20 20 20 20 20 2f 2a 20 46  reak;.      /* F
a370: 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68  all thru into th
a380: 65 20 54 4b 5f 49 44 20 63 61 73 65 20 69 66 20  e TK_ID case if 
a390: 74 68 69 73 20 69 73 20 61 20 64 6f 75 62 6c 65  this is a double
a3a0: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 2a  -quoted string *
a3b0: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 41  /.    }.    /* A
a3c0: 20 6c 6f 6e 65 20 69 64 65 6e 74 69 66 69 65 72   lone identifier
a3d0: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
a3e0: 61 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f  a column..    */
a3f0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a  .    case TK_ID:
a400: 20 7b 0a 20 20 20 20 20 20 6c 6f 6f 6b 75 70 4e   {.      lookupN
a410: 61 6d 65 28 70 50 61 72 73 65 2c 20 30 2c 20 30  ame(pParse, 0, 0
a420: 2c 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c  , &pExpr->token,
a430: 20 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20 20   pNC, pExpr);.  
a440: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
a450: 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 41 20    }.  .    /* A 
a460: 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 63  table name and c
a470: 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20 20 20 20  olumn name:     
a480: 49 44 2e 49 44 0a 20 20 20 20 2a 2a 20 4f 72 20  ID.ID.    ** Or 
a490: 61 20 64 61 74 61 62 61 73 65 2c 20 74 61 62 6c  a database, tabl
a4a0: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 3a 20 20 49  e and column:  I
a4b0: 44 2e 49 44 2e 49 44 0a 20 20 20 20 2a 2f 0a 20  D.ID.ID.    */. 
a4c0: 20 20 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a 20     case TK_DOT: 
a4d0: 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70  {.      Token *p
a4e0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 54 6f  Column;.      To
a4f0: 6b 65 6e 20 2a 70 54 61 62 6c 65 3b 0a 20 20 20  ken *pTable;.   
a500: 20 20 20 54 6f 6b 65 6e 20 2a 70 44 62 3b 0a 20     Token *pDb;. 
a510: 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
a520: 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 69 66 28  t;..      /* if(
a530: 20 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 62   pSrcList==0 ) b
a540: 72 65 61 6b 3b 20 2a 2f 0a 20 20 20 20 20 20 70  reak; */.      p
a550: 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70  Right = pExpr->p
a560: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28  Right;.      if(
a570: 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f   pRight->op==TK_
a580: 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  ID ){.        pD
a590: 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  b = 0;.        p
a5a0: 54 61 62 6c 65 20 3d 20 26 70 45 78 70 72 2d 3e  Table = &pExpr->
a5b0: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  pLeft->token;.  
a5c0: 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d 20        pColumn = 
a5d0: 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 3b 0a  &pRight->token;.
a5e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a5f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52 69       assert( pRi
a600: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20  ght->op==TK_DOT 
a610: 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62 20 3d  );.        pDb =
a620: 20 26 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e   &pExpr->pLeft->
a630: 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 70  token;.        p
a640: 54 61 62 6c 65 20 3d 20 26 70 52 69 67 68 74 2d  Table = &pRight-
a650: 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20  >pLeft->token;. 
a660: 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d         pColumn =
a670: 20 26 70 52 69 67 68 74 2d 3e 70 52 69 67 68 74   &pRight->pRight
a680: 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d  ->token;.      }
a690: 0a 20 20 20 20 20 20 6c 6f 6f 6b 75 70 4e 61 6d  .      lookupNam
a6a0: 65 28 70 50 61 72 73 65 2c 20 70 44 62 2c 20 70  e(pParse, pDb, p
a6b0: 54 61 62 6c 65 2c 20 70 43 6f 6c 75 6d 6e 2c 20  Table, pColumn, 
a6c0: 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  pNC, pExpr);.   
a6d0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
a6e0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 6f 6c   }..    /* Resol
a6f0: 76 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  ve function name
a700: 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  s.    */.    cas
a710: 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a  e TK_CONST_FUNC:
a720: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
a730: 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45  CTION: {.      E
a740: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
a750: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 20 20   pExpr->pList;  
a760: 20 20 2f 2a 20 54 68 65 20 61 72 67 75 6d 65 6e    /* The argumen
a770: 74 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20  t list */.      
a780: 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 20 3f 20  int n = pList ? 
a790: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
a7a0: 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
a7b0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
a7c0: 20 20 20 69 6e 74 20 6e 6f 5f 73 75 63 68 5f 66     int no_such_f
a7d0: 75 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  unc = 0;       /
a7e0: 2a 20 54 72 75 65 20 69 66 20 6e 6f 20 73 75 63  * True if no suc
a7f0: 68 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73 74  h function exist
a800: 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 77  s */.      int w
a810: 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20  rong_num_args = 
a820: 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  0;     /* True i
a830: 66 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f  f wrong number o
a840: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
a850: 20 20 20 20 20 69 6e 74 20 69 73 5f 61 67 67 20       int is_agg 
a860: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
a870: 20 2f 2a 20 54 72 75 65 20 69 66 20 69 73 20 61   /* True if is a
a880: 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  n aggregate func
a890: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tion */.      in
a8a0: 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 61  t i;.      int a
a8b0: 75 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  uth;            
a8c0: 20 20 20 20 20 20 20 2f 2a 20 41 75 74 68 6f 72         /* Author
a8d0: 69 7a 61 74 69 6f 6e 20 74 6f 20 75 73 65 20 74  ization to use t
a8e0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  he function */. 
a8f0: 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 20 20 20       int nId;   
a900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a910: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68   /* Number of ch
a920: 61 72 61 63 74 65 72 73 20 69 6e 20 66 75 6e 63  aracters in func
a930: 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  tion name */.   
a940: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
a950: 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  Id;            /
a960: 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e  * The function n
a970: 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 46 75  ame. */.      Fu
a980: 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20 20  ncDef *pDef;    
a990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66            /* Inf
a9a0: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
a9b0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  he function */. 
a9c0: 20 20 20 20 20 69 6e 74 20 65 6e 63 20 3d 20 45       int enc = E
a9d0: 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 20  NC(pParse->db); 
a9e0: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
a9f0: 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 0a 20 20   encoding */..  
aa00: 20 20 20 20 7a 49 64 20 3d 20 28 63 68 61 72 2a      zId = (char*
aa10: 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b  )pExpr->token.z;
aa20: 0a 20 20 20 20 20 20 6e 49 64 20 3d 20 70 45 78  .      nId = pEx
aa30: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20  pr->token.n;.   
aa40: 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
aa50: 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50  3FindFunction(pP
aa60: 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e  arse->db, zId, n
aa70: 49 64 2c 20 6e 2c 20 65 6e 63 2c 20 30 29 3b 0a  Id, n, enc, 0);.
aa80: 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d        if( pDef==
aa90: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  0 ){.        pDe
aaa0: 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  f = sqlite3FindF
aab0: 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e  unction(pParse->
aac0: 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 2d 31  db, zId, nId, -1
aad0: 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  , enc, 0);.     
aae0: 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29     if( pDef==0 )
aaf0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 5f 73  {.          no_s
ab00: 75 63 68 5f 66 75 6e 63 20 3d 20 31 3b 0a 20 20  uch_func = 1;.  
ab10: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ab20: 20 20 20 20 20 20 20 77 72 6f 6e 67 5f 6e 75 6d         wrong_num
ab30: 5f 61 72 67 73 20 3d 20 31 3b 0a 20 20 20 20 20  _args = 1;.     
ab40: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
ab50: 7b 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67 67  {.        is_agg
ab60: 20 3d 20 70 44 65 66 2d 3e 78 46 75 6e 63 3d 3d   = pDef->xFunc==
ab70: 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  0;.      }.#ifnd
ab80: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
ab90: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20  UTHORIZATION.   
aba0: 20 20 20 69 66 28 20 70 44 65 66 20 29 7b 0a 20     if( pDef ){. 
abb0: 20 20 20 20 20 20 20 61 75 74 68 20 3d 20 73 71         auth = sq
abc0: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
abd0: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 46 55  Parse, SQLITE_FU
abe0: 4e 43 54 49 4f 4e 2c 20 30 2c 20 70 44 65 66 2d  NCTION, 0, pDef-
abf0: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
ac00: 20 20 20 20 69 66 28 20 61 75 74 68 21 3d 53 51      if( auth!=SQ
ac10: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
ac20: 20 20 20 20 20 69 66 28 20 61 75 74 68 3d 3d 53       if( auth==S
ac30: 51 4c 49 54 45 5f 44 45 4e 59 20 29 7b 0a 20 20  QLITE_DENY ){.  
ac40: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ac50: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
ac60: 2c 20 22 6e 6f 74 20 61 75 74 68 6f 72 69 7a 65  , "not authorize
ac70: 64 20 74 6f 20 75 73 65 20 66 75 6e 63 74 69 6f  d to use functio
ac80: 6e 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20  n: %s",.        
ac90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aca0: 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65 66              pDef
acb0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
acc0: 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b        pNC->nErr+
acd0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
ace0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
acf0: 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20  op = TK_NULL;.  
ad00: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
ad10: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ad20: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
ad30: 20 69 66 28 20 69 73 5f 61 67 67 20 26 26 20 21   if( is_agg && !
ad40: 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 29 7b  pNC->allowAgg ){
ad50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ad60: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
ad70: 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72   "misuse of aggr
ad80: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 25  egate function %
ad90: 2e 2a 73 28 29 22 2c 20 6e 49 64 2c 7a 49 64 29  .*s()", nId,zId)
ada0: 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e  ;.        pNC->n
adb0: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69  Err++;.        i
adc0: 73 5f 61 67 67 20 3d 20 30 3b 0a 20 20 20 20 20  s_agg = 0;.     
add0: 20 7d 65 6c 73 65 20 69 66 28 20 6e 6f 5f 73 75   }else if( no_su
ade0: 63 68 5f 66 75 6e 63 20 29 7b 0a 20 20 20 20 20  ch_func ){.     
adf0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
ae00: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
ae10: 75 63 68 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e  uch function: %.
ae20: 2a 73 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a  *s", nId, zId);.
ae30: 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72          pNC->nEr
ae40: 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  r++;.      }else
ae50: 20 69 66 28 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61   if( wrong_num_a
ae60: 72 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73  rgs ){.        s
ae70: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
ae80: 50 61 72 73 65 2c 22 77 72 6f 6e 67 20 6e 75 6d  Parse,"wrong num
ae90: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
aea0: 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a   to function %.*
aeb0: 73 28 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s()",.          
aec0: 20 20 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20     nId, zId);.  
aed0: 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b        pNC->nErr+
aee0: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
aef0: 20 69 66 28 20 69 73 5f 61 67 67 20 29 7b 0a 20   if( is_agg ){. 
af00: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
af10: 20 3d 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49   = TK_AGG_FUNCTI
af20: 4f 4e 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d  ON;.        pNC-
af30: 3e 68 61 73 41 67 67 20 3d 20 31 3b 0a 20 20 20  >hasAgg = 1;.   
af40: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
af50: 73 5f 61 67 67 20 29 20 70 4e 43 2d 3e 61 6c 6c  s_agg ) pNC->all
af60: 6f 77 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 20  owAgg = 0;.     
af70: 20 66 6f 72 28 69 3d 30 3b 20 70 4e 43 2d 3e 6e   for(i=0; pNC->n
af80: 45 72 72 3d 3d 30 20 26 26 20 69 3c 6e 3b 20 69  Err==0 && i<n; i
af90: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 77 61 6c  ++){.        wal
afa0: 6b 45 78 70 72 54 72 65 65 28 70 4c 69 73 74 2d  kExprTree(pList-
afb0: 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 6e 61 6d  >a[i].pExpr, nam
afc0: 65 52 65 73 6f 6c 76 65 72 53 74 65 70 2c 20 70  eResolverStep, p
afd0: 4e 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  NC);.      }.   
afe0: 20 20 20 69 66 28 20 69 73 5f 61 67 67 20 29 20     if( is_agg ) 
aff0: 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 3d 20  pNC->allowAgg = 
b000: 31 3b 0a 20 20 20 20 20 20 2f 2a 20 46 49 58 20  1;.      /* FIX 
b010: 4d 45 3a 20 20 43 6f 6d 70 75 74 65 20 70 45 78  ME:  Compute pEx
b020: 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 62 61 73  pr->affinity bas
b030: 65 64 20 6f 6e 20 74 68 65 20 65 78 70 65 63 74  ed on the expect
b040: 65 64 20 72 65 74 75 72 6e 0a 20 20 20 20 20 20  ed return.      
b050: 2a 2a 20 74 79 70 65 20 6f 66 20 74 68 65 20 66  ** type of the f
b060: 75 6e 63 74 69 6f 6e 20 0a 20 20 20 20 20 20 2a  unction .      *
b070: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 69  /.      return i
b080: 73 5f 61 67 67 3b 0a 20 20 20 20 7d 0a 23 69 66  s_agg;.    }.#if
b090: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b0a0: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
b0b0: 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20  se TK_SELECT:.  
b0c0: 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53    case TK_EXISTS
b0d0: 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  :.#endif.    cas
b0e0: 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
b0f0: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c   if( pExpr->pSel
b100: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ect ){.        i
b110: 6e 74 20 6e 52 65 66 20 3d 20 70 4e 43 2d 3e 6e  nt nRef = pNC->n
b120: 52 65 66 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  Ref;.#ifndef SQL
b130: 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20  ITE_OMIT_CHECK. 
b140: 20 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e         if( pNC->
b150: 69 73 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 20  isCheck ){.     
b160: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
b170: 72 4d 73 67 28 70 50 61 72 73 65 2c 22 73 75 62  rMsg(pParse,"sub
b180: 71 75 65 72 69 65 73 20 70 72 6f 68 69 62 69 74  queries prohibit
b190: 65 64 20 69 6e 20 43 48 45 43 4b 20 63 6f 6e 73  ed in CHECK cons
b1a0: 74 72 61 69 6e 74 73 22 29 3b 0a 20 20 20 20 20  traints");.     
b1b0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
b1c0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
b1d0: 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c  tResolve(pParse,
b1e0: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c   pExpr->pSelect,
b1f0: 20 70 4e 43 29 3b 0a 20 20 20 20 20 20 20 20 61   pNC);.        a
b200: 73 73 65 72 74 28 20 70 4e 43 2d 3e 6e 52 65 66  ssert( pNC->nRef
b210: 3e 3d 6e 52 65 66 20 29 3b 0a 20 20 20 20 20 20  >=nRef );.      
b220: 20 20 69 66 28 20 6e 52 65 66 21 3d 70 4e 43 2d    if( nRef!=pNC-
b230: 3e 6e 52 65 66 20 29 7b 0a 20 20 20 20 20 20 20  >nRef ){.       
b240: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
b250: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72  ty(pExpr, EP_Var
b260: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
b270: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
b280: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
b290: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b2a0: 54 5f 43 48 45 43 4b 0a 20 20 20 20 63 61 73 65  T_CHECK.    case
b2b0: 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a   TK_VARIABLE: {.
b2c0: 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 69        if( pNC->i
b2d0: 73 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 20 20  sCheck ){.      
b2e0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
b2f0: 67 28 70 50 61 72 73 65 2c 22 70 61 72 61 6d 65  g(pParse,"parame
b300: 74 65 72 73 20 70 72 6f 68 69 62 69 74 65 64 20  ters prohibited 
b310: 69 6e 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  in CHECK constra
b320: 69 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 7d 0a  ints");.      }.
b330: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b340: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
b350: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
b360: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
b370: 77 61 6c 6b 73 20 61 6e 20 65 78 70 72 65 73 73  walks an express
b380: 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 72 65 73  ion tree and res
b390: 6f 6c 76 65 73 20 72 65 66 65 72 65 6e 63 65 73  olves references
b3a0: 20 74 6f 0a 2a 2a 20 74 61 62 6c 65 20 63 6f 6c   to.** table col
b3b0: 75 6d 6e 73 2e 20 20 4e 6f 64 65 73 20 6f 66 20  umns.  Nodes of 
b3c0: 74 68 65 20 66 6f 72 6d 20 49 44 2e 49 44 20 6f  the form ID.ID o
b3d0: 72 20 49 44 20 72 65 73 6f 6c 76 65 20 69 6e 74  r ID resolve int
b3e0: 6f 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 20 74 6f  o an.** index to
b3f0: 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 74 68   the table in th
b400: 65 20 74 61 62 6c 65 20 6c 69 73 74 20 61 6e 64  e table list and
b410: 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 66 73 65 74   a column offset
b420: 2e 20 20 54 68 65 20 0a 2a 2a 20 45 78 70 72 2e  .  The .** Expr.
b430: 6f 70 63 6f 64 65 20 66 6f 72 20 73 75 63 68 20  opcode for such 
b440: 6e 6f 64 65 73 20 69 73 20 63 68 61 6e 67 65 64  nodes is changed
b450: 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 20 20   to TK_COLUMN.  
b460: 54 68 65 20 45 78 70 72 2e 69 54 61 62 6c 65 0a  The Expr.iTable.
b470: 2a 2a 20 76 61 6c 75 65 20 69 73 20 63 68 61 6e  ** value is chan
b480: 67 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78  ged to the index
b490: 20 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e 63   of the referenc
b4a0: 65 64 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62  ed table in pTab
b4b0: 4c 69 73 74 0a 2a 2a 20 70 6c 75 73 20 74 68 65  List.** plus the
b4c0: 20 22 62 61 73 65 22 20 76 61 6c 75 65 2e 20 20   "base" value.  
b4d0: 54 68 65 20 62 61 73 65 20 76 61 6c 75 65 20 77  The base value w
b4e0: 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 62  ill ultimately b
b4f0: 65 63 6f 6d 65 20 74 68 65 0a 2a 2a 20 56 44 42  ecome the.** VDB
b500: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  E cursor number 
b510: 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68 61  for a cursor tha
b520: 74 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e  t is pointing in
b530: 74 6f 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  to the reference
b540: 64 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 54 68 65  d.** table.  The
b550: 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 76 61   Expr.iColumn va
b560: 6c 75 65 20 69 73 20 63 68 61 6e 67 65 64 20 74  lue is changed t
b570: 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
b580: 68 65 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 6f 66  he column .** of
b590: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20   the referenced 
b5a0: 74 61 62 6c 65 2e 20 20 54 68 65 20 45 78 70 72  table.  The Expr
b5b0: 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 66  .iColumn value f
b5c0: 6f 72 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a  or the special.*
b5d0: 2a 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 69  * ROWID column i
b5e0: 73 20 2d 31 2e 20 20 41 6e 79 20 49 4e 54 45 47  s -1.  Any INTEG
b5f0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  ER PRIMARY KEY c
b600: 6f 6c 75 6d 6e 20 69 73 20 74 72 69 65 64 20 61  olumn is tried a
b610: 73 20 61 6e 0a 2a 2a 20 61 6c 69 61 73 20 66 6f  s an.** alias fo
b620: 72 20 52 4f 57 49 44 2e 0a 2a 2a 0a 2a 2a 20 41  r ROWID..**.** A
b630: 6c 73 6f 20 72 65 73 6f 6c 76 65 20 66 75 6e 63  lso resolve func
b640: 74 69 6f 6e 20 6e 61 6d 65 73 20 61 6e 64 20 63  tion names and c
b650: 68 65 63 6b 20 74 68 65 20 66 75 6e 63 74 69 6f  heck the functio
b660: 6e 73 20 66 6f 72 20 70 72 6f 70 65 72 0a 2a 2a  ns for proper.**
b670: 20 75 73 61 67 65 2e 20 20 4d 61 6b 65 20 73 75   usage.  Make su
b680: 72 65 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 20  re all function 
b690: 6e 61 6d 65 73 20 61 72 65 20 72 65 63 6f 67 6e  names are recogn
b6a0: 69 7a 65 64 20 61 6e 64 20 61 6c 6c 20 66 75 6e  ized and all fun
b6b0: 63 74 69 6f 6e 73 0a 2a 2a 20 68 61 76 65 20 74  ctions.** have t
b6c0: 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65  he correct numbe
b6d0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20  r of arguments. 
b6e0: 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   Leave an error 
b6f0: 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50  message.** in pP
b700: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20 69 66  arse->zErrMsg if
b710: 20 61 6e 79 74 68 69 6e 67 20 69 73 20 61 6d 69   anything is ami
b720: 73 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ss.  Return the 
b730: 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
b740: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
b750: 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69  xpression contai
b760: 6e 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  ns aggregate fun
b770: 63 74 69 6f 6e 73 20 74 68 65 6e 20 73 65 74 20  ctions then set 
b780: 74 68 65 20 45 50 5f 41 67 67 0a 2a 2a 20 70 72  the EP_Agg.** pr
b790: 6f 70 65 72 74 79 20 6f 6e 20 74 68 65 20 65 78  operty on the ex
b7a0: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  pression..*/.int
b7b0: 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
b7c0: 6c 76 65 4e 61 6d 65 73 28 20 0a 20 20 4e 61 6d  lveNames( .  Nam
b7d0: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20  eContext *pNC,  
b7e0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61 63       /* Namespac
b7f0: 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 65 78 70  e to resolve exp
b800: 72 65 73 73 69 6f 6e 73 20 69 6e 2e 20 2a 2f 0a  ressions in. */.
b810: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20    Expr *pExpr   
b820: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
b830: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62   expression to b
b840: 65 20 61 6e 61 6c 79 7a 65 64 2e 20 2a 2f 0a 29  e analyzed. */.)
b850: 7b 0a 20 20 69 6e 74 20 73 61 76 65 64 48 61 73  {.  int savedHas
b860: 41 67 67 3b 0a 0a 20 20 69 66 28 20 70 45 78 70  Agg;..  if( pExp
b870: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  r==0 ) return 0;
b880: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
b890: 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 7b  EXPR_DEPTH>0.  {
b8a0: 0a 20 20 20 20 69 6e 74 20 6d 78 44 65 70 74 68  .    int mxDepth
b8b0: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e   = pNC->pParse->
b8c0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
b8d0: 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50  E_LIMIT_EXPR_DEP
b8e0: 54 48 5d 3b 0a 20 20 20 20 69 66 28 20 28 70 45  TH];.    if( (pE
b8f0: 78 70 72 2d 3e 6e 48 65 69 67 68 74 2b 70 4e 43  xpr->nHeight+pNC
b900: 2d 3e 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68  ->pParse->nHeigh
b910: 74 29 3e 6d 78 44 65 70 74 68 20 29 7b 0a 20 20  t)>mxDepth ){.  
b920: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
b930: 4d 73 67 28 70 4e 43 2d 3e 70 50 61 72 73 65 2c  Msg(pNC->pParse,
b940: 20 0a 20 20 20 20 20 20 20 20 20 22 45 78 70 72   .         "Expr
b950: 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73 20 74  ession tree is t
b960: 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78 69 6d 75  oo large (maximu
b970: 6d 20 64 65 70 74 68 20 25 64 29 22 2c 20 6d 78  m depth %d)", mx
b980: 44 65 70 74 68 0a 20 20 20 20 20 20 29 3b 0a 20  Depth.      );. 
b990: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
b9a0: 20 20 20 7d 0a 20 20 20 20 70 4e 43 2d 3e 70 50     }.    pNC->pP
b9b0: 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d  arse->nHeight +=
b9c0: 20 70 45 78 70 72 2d 3e 6e 48 65 69 67 68 74 3b   pExpr->nHeight;
b9d0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 61  .  }.#endif.  sa
b9e0: 76 65 64 48 61 73 41 67 67 20 3d 20 70 4e 43 2d  vedHasAgg = pNC-
b9f0: 3e 68 61 73 41 67 67 3b 0a 20 20 70 4e 43 2d 3e  >hasAgg;.  pNC->
ba00: 68 61 73 41 67 67 20 3d 20 30 3b 0a 20 20 77 61  hasAgg = 0;.  wa
ba10: 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78 70 72  lkExprTree(pExpr
ba20: 2c 20 6e 61 6d 65 52 65 73 6f 6c 76 65 72 53 74  , nameResolverSt
ba30: 65 70 2c 20 70 4e 43 29 3b 0a 23 69 66 20 53 51  ep, pNC);.#if SQ
ba40: 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
ba50: 50 54 48 3e 30 0a 20 20 70 4e 43 2d 3e 70 50 61  PTH>0.  pNC->pPa
ba60: 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20  rse->nHeight -= 
ba70: 70 45 78 70 72 2d 3e 6e 48 65 69 67 68 74 3b 0a  pExpr->nHeight;.
ba80: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 4e 43  #endif.  if( pNC
ba90: 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20 20  ->nErr>0 ){.    
baa0: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
bab0: 70 45 78 70 72 2c 20 45 50 5f 45 72 72 6f 72 29  pExpr, EP_Error)
bac0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 43 2d  ;.  }.  if( pNC-
bad0: 3e 68 61 73 41 67 67 20 29 7b 0a 20 20 20 20 45  >hasAgg ){.    E
bae0: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
baf0: 45 78 70 72 2c 20 45 50 5f 41 67 67 29 3b 0a 20  Expr, EP_Agg);. 
bb00: 20 7d 65 6c 73 65 20 69 66 28 20 73 61 76 65 64   }else if( saved
bb10: 48 61 73 41 67 67 20 29 7b 0a 20 20 20 20 70 4e  HasAgg ){.    pN
bb20: 43 2d 3e 68 61 73 41 67 67 20 3d 20 31 3b 0a 20  C->hasAgg = 1;. 
bb30: 20 7d 0a 20 20 72 65 74 75 72 6e 20 45 78 70 72   }.  return Expr
bb40: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
bb50: 72 2c 20 45 50 5f 45 72 72 6f 72 29 3b 0a 7d 0a  r, EP_Error);.}.
bb60: 0a 2f 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72  ./*.** A pointer
bb70: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
bb80: 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20 75  s structure is u
bb90: 73 65 64 20 74 6f 20 70 61 73 73 20 69 6e 66 6f  sed to pass info
bba0: 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 68 72 6f 75  rmation.** throu
bbb0: 67 68 20 77 61 6c 6b 45 78 70 72 54 72 65 65 20  gh walkExprTree 
bbc0: 69 6e 74 6f 20 63 6f 64 65 53 75 62 71 75 65 72  into codeSubquer
bbd0: 79 53 74 65 70 28 29 2e 0a 2a 2f 0a 74 79 70 65  yStep()..*/.type
bbe0: 64 65 66 20 73 74 72 75 63 74 20 51 75 65 72 79  def struct Query
bbf0: 43 6f 64 65 72 20 51 75 65 72 79 43 6f 64 65 72  Coder QueryCoder
bc00: 3b 0a 73 74 72 75 63 74 20 51 75 65 72 79 43 6f  ;.struct QueryCo
bc10: 64 65 72 20 7b 0a 20 20 50 61 72 73 65 20 2a 70  der {.  Parse *p
bc20: 50 61 72 73 65 3b 20 20 20 20 20 20 20 2f 2a 20  Parse;       /* 
bc30: 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
bc40: 65 78 74 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e  ext */.  NameCon
bc50: 74 65 78 74 20 2a 70 4e 43 3b 20 20 20 20 2f 2a  text *pNC;    /*
bc60: 20 4e 61 6d 65 73 70 61 63 65 20 6f 66 20 66 69   Namespace of fi
bc70: 72 73 74 20 65 6e 63 6c 6f 73 69 6e 67 20 71 75  rst enclosing qu
bc80: 65 72 79 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 64 65  ery */.};..#ifde
bc90: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
bca0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 6e 61 62  int sqlite3_enab
bcb0: 6c 65 5f 69 6e 5f 6f 70 74 20 3d 20 31 3b 0a 23  le_in_opt = 1;.#
bcc0: 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 73  else.  #define s
bcd0: 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 69 6e  qlite3_enable_in
bce0: 5f 6f 70 74 20 31 0a 23 65 6e 64 69 66 0a 0a 2f  _opt 1.#endif../
bcf0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
bd00: 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20 74 68  on is used by th
bd10: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
bd20: 20 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e 29   of the IN (...)
bd30: 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 49 74   operator..** It
bd40: 27 73 20 6a 6f 62 20 69 73 20 74 6f 20 66 69 6e  's job is to fin
bd50: 64 20 6f 72 20 63 72 65 61 74 65 20 61 20 62 2d  d or create a b-
bd60: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 74  tree structure t
bd70: 68 61 74 20 6d 61 79 20 62 65 20 75 73 65 64 0a  hat may be used.
bd80: 2a 2a 20 65 69 74 68 65 72 20 74 6f 20 74 65 73  ** either to tes
bd90: 74 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70  t for membership
bda0: 20 6f 66 20 74 68 65 20 28 2e 2e 2e 29 20 73 65   of the (...) se
bdb0: 74 20 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20  t or to iterate 
bdc0: 74 68 72 6f 75 67 68 0a 2a 2a 20 69 74 73 20 6d  through.** its m
bdd0: 65 6d 62 65 72 73 2c 20 73 6b 69 70 70 69 6e 67  embers, skipping
bde0: 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a   duplicates..**.
bdf0: 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f 70  ** The cursor op
be00: 65 6e 65 64 20 6f 6e 20 74 68 65 20 73 74 72 75  ened on the stru
be10: 63 74 75 72 65 20 28 64 61 74 61 62 61 73 65 20  cture (database 
be20: 74 61 62 6c 65 2c 20 64 61 74 61 62 61 73 65 20  table, database 
be30: 69 6e 64 65 78 20 0a 2a 2a 20 6f 72 20 65 70 68  index .** or eph
be40: 65 72 6d 61 6c 20 74 61 62 6c 65 29 20 69 73 20  ermal table) is 
be50: 73 74 6f 72 65 64 20 69 6e 20 70 58 2d 3e 69 54  stored in pX->iT
be60: 61 62 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73  able before this
be70: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
be80: 73 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  s..** The return
be90: 65 64 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74  ed value indicat
bea0: 65 73 20 74 68 65 20 73 74 72 75 63 74 75 72 65  es the structure
beb0: 20 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c 6f 77   type, as follow
bec0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e  s:.**.**   IN_IN
bed0: 44 45 58 5f 52 4f 57 49 44 20 2d 20 54 68 65 20  DEX_ROWID - The 
bee0: 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65  cursor was opene
bef0: 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20  d on a database 
bf00: 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49  table..**   IN_I
bf10: 4e 44 45 58 5f 49 4e 44 45 58 20 2d 20 54 68 65  NDEX_INDEX - The
bf20: 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e   cursor was open
bf30: 65 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  ed on a database
bf40: 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f   index..**   IN_
bf50: 49 4e 44 45 58 5f 45 50 48 20 2d 20 20 20 54 68  INDEX_EPH -   Th
bf60: 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
bf70: 6e 65 64 20 6f 6e 20 61 20 73 70 65 63 69 61 6c  ned on a special
bf80: 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a  ly created and.*
bf90: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
bfa0: 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20 65       populated e
bfb0: 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a  pheremal table..
bfc0: 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e  **.** An existin
bfd0: 67 20 73 74 72 75 63 74 75 72 65 20 6d 61 79 20  g structure may 
bfe0: 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 69 66 20  only be used if 
bff0: 74 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66  the SELECT is of
c000: 20 74 68 65 20 73 69 6d 70 6c 65 0a 2a 2a 20 66   the simple.** f
c010: 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  orm:.**.**     S
c020: 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46  ELECT <column> F
c030: 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a  ROM <table>.**.*
c040: 2a 20 49 66 20 74 68 65 20 6d 75 73 74 42 65 55  * If the mustBeU
c050: 6e 69 71 75 65 20 70 61 72 61 6d 65 74 65 72 20  nique parameter 
c060: 69 73 20 66 61 6c 73 65 2c 20 74 68 65 20 73 74  is false, the st
c070: 72 75 63 74 75 72 65 20 77 69 6c 6c 20 62 65 20  ructure will be 
c080: 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73  used .** for fas
c090: 74 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70  t set membership
c0a0: 20 74 65 73 74 73 2e 20 49 6e 20 74 68 69 73 20   tests. In this 
c0b0: 63 61 73 65 20 61 6e 20 65 70 68 65 72 65 6d 61  case an epherema
c0c0: 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a 2a  l table must .**
c0d0: 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20   be used unless 
c0e0: 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 61 6e 20 49  <column> is an I
c0f0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
c100: 45 59 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 63  EY or an index c
c110: 61 6e 20 0a 2a 2a 20 62 65 20 66 6f 75 6e 64 20  an .** be found 
c120: 77 69 74 68 20 3c 63 6f 6c 75 6d 6e 3e 20 61 73  with <column> as
c130: 20 69 74 73 20 6c 65 66 74 2d 6d 6f 73 74 20 63   its left-most c
c140: 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  olumn..**.** If 
c150: 6d 75 73 74 42 65 55 6e 69 71 75 65 20 69 73 20  mustBeUnique is 
c160: 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 73  true, then the s
c170: 74 72 75 63 74 75 72 65 20 77 69 6c 6c 20 62 65  tructure will be
c180: 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
c190: 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74 68 65 20  .** through the 
c1a0: 73 65 74 20 6d 65 6d 62 65 72 73 2c 20 73 6b 69  set members, ski
c1b0: 70 70 69 6e 67 20 61 6e 79 20 64 75 70 6c 69 63  pping any duplic
c1c0: 61 74 65 73 2e 20 49 6e 20 74 68 69 73 20 63 61  ates. In this ca
c1d0: 73 65 20 61 6e 0a 2a 2a 20 65 70 68 65 72 65 6d  se an.** epherem
c1e0: 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  al table must be
c1f0: 20 75 73 65 64 20 75 6e 6c 65 73 73 20 74 68 65   used unless the
c200: 20 73 65 6c 65 63 74 65 64 20 3c 63 6f 6c 75 6d   selected <colum
c210: 6e 3e 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  n> is guaranteed
c220: 0a 2a 2a 20 74 6f 20 62 65 20 75 6e 69 71 75 65  .** to be unique
c230: 20 2d 20 65 69 74 68 65 72 20 62 65 63 61 75 73   - either becaus
c240: 65 20 69 74 20 69 73 20 61 6e 20 49 4e 54 45 47  e it is an INTEG
c250: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f  ER PRIMARY KEY o
c260: 72 20 69 74 0a 2a 2a 20 69 73 20 75 6e 69 71 75  r it.** is uniqu
c270: 65 20 62 79 20 76 69 72 74 75 65 20 6f 66 20 61  e by virtue of a
c280: 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20 69   constraint or i
c290: 6d 70 6c 69 63 69 74 20 69 6e 64 65 78 2e 0a 2a  mplicit index..*
c2a0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
c2b0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69  _OMIT_SUBQUERY.i
c2c0: 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  nt sqlite3FindIn
c2d0: 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
c2e0: 72 73 65 2c 20 45 78 70 72 20 2a 70 58 2c 20 69  rse, Expr *pX, i
c2f0: 6e 74 20 6d 75 73 74 42 65 55 6e 69 71 75 65 29  nt mustBeUnique)
c300: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 0a 20  {.  Select *p;. 
c310: 20 69 6e 74 20 65 54 79 70 65 20 3d 20 30 3b 0a   int eType = 0;.
c320: 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61    int iTab = pPa
c330: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 0a 20 20  rse->nTab++;..  
c340: 2f 2a 20 54 68 65 20 66 6f 6c 6c 77 69 6e 67 20  /* The follwing 
c350: 69 66 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69  if(...) expressi
c360: 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20 74 68  on is true if th
c370: 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66 20 74  e SELECT is of t
c380: 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20  he .  ** simple 
c390: 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  form:.  **.  ** 
c3a0: 20 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75      SELECT <colu
c3b0: 6d 6e 3e 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e  mn> FROM <table>
c3c0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
c3d0: 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  is is the case, 
c3e0: 69 74 20 6d 61 79 20 62 65 20 70 6f 73 73 69 62  it may be possib
c3f0: 6c 65 20 74 6f 20 75 73 65 20 61 6e 20 65 78 69  le to use an exi
c400: 73 74 69 6e 67 20 74 61 62 6c 65 0a 20 20 2a 2a  sting table.  **
c410: 20 6f 72 20 69 6e 64 65 78 20 69 6e 73 74 65 61   or index instea
c420: 64 20 6f 66 20 67 65 6e 65 72 61 74 69 6e 67 20  d of generating 
c430: 61 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62  an epheremal tab
c440: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  le..  */.  if( s
c450: 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 69 6e  qlite3_enable_in
c460: 5f 6f 70 74 0a 20 20 20 26 26 20 28 70 3d 70 58  _opt.   && (p=pX
c470: 2d 3e 70 53 65 6c 65 63 74 29 21 3d 30 20 26 26  ->pSelect)!=0 &&
c480: 20 21 70 2d 3e 70 50 72 69 6f 72 0a 20 20 20 26   !p->pPrior.   &
c490: 26 20 21 70 2d 3e 69 73 44 69 73 74 69 6e 63 74  & !p->isDistinct
c4a0: 20 26 26 20 21 70 2d 3e 69 73 41 67 67 20 26 26   && !p->isAgg &&
c4b0: 20 21 70 2d 3e 70 47 72 6f 75 70 42 79 0a 20 20   !p->pGroupBy.  
c4c0: 20 26 26 20 70 2d 3e 70 53 72 63 20 26 26 20 70   && p->pSrc && p
c4d0: 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3d 3d 31 20  ->pSrc->nSrc==1 
c4e0: 26 26 20 21 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  && !p->pSrc->a[0
c4f0: 5d 2e 70 53 65 6c 65 63 74 0a 20 20 20 26 26 20  ].pSelect.   && 
c500: 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54  p->pSrc->a[0].pT
c510: 61 62 20 26 26 20 21 70 2d 3e 70 53 72 63 2d 3e  ab && !p->pSrc->
c520: 61 5b 30 5d 2e 70 54 61 62 2d 3e 70 53 65 6c 65  a[0].pTab->pSele
c530: 63 74 0a 20 20 20 26 26 20 70 2d 3e 70 45 4c 69  ct.   && p->pELi
c540: 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 26 26 20  st->nExpr==1 && 
c550: 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
c560: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
c570: 4c 55 4d 4e 0a 20 20 20 26 26 20 21 70 2d 3e 70  LUMN.   && !p->p
c580: 4c 69 6d 69 74 20 26 26 20 21 70 2d 3e 70 4f 66  Limit && !p->pOf
c590: 66 73 65 74 20 26 26 20 21 70 2d 3e 70 57 68 65  fset && !p->pWhe
c5a0: 72 65 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69  re.  ){.    sqli
c5b0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
c5c0: 2d 3e 64 62 3b 0a 20 20 20 20 49 6e 64 65 78 20  ->db;.    Index 
c5d0: 2a 70 49 64 78 3b 0a 20 20 20 20 45 78 70 72 20  *pIdx;.    Expr 
c5e0: 2a 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69  *pExpr = p->pELi
c5f0: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
c600: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
c610: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
c620: 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c     Vdbe *v = sql
c630: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
c640: 73 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69  se);..    /* Thi
c650: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
c660: 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 74  ly called from t
c670: 77 6f 20 70 6c 61 63 65 73 2e 20 49 6e 20 62 6f  wo places. In bo
c680: 74 68 20 63 61 73 65 73 20 74 68 65 20 76 64 62  th cases the vdb
c690: 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 61 6c 72  e.    ** has alr
c6a0: 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
c6b0: 74 65 64 2e 20 53 6f 20 61 73 73 75 6d 65 20 73  ted. So assume s
c6c0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 29 20  qlite3GetVdbe() 
c6d0: 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20 2a 2a  is always.    **
c6e0: 20 73 75 63 63 65 73 73 66 75 6c 20 68 65 72 65   successful here
c6f0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
c700: 65 72 74 28 76 29 3b 0a 20 20 20 20 69 66 28 20  ert(v);.    if( 
c710: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
c720: 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61  int iMem = ++pPa
c730: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
c740: 20 69 6e 74 20 69 41 64 64 72 3b 0a 20 20 20 20   int iAddr;.    
c750: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
c760: 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54  p->pSrc->a[0].pT
c770: 61 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 44  ab;.      int iD
c780: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
c790: 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
c7a0: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
c7b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73     sqlite3VdbeUs
c7c0: 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b  esBtree(v, iDb);
c7d0: 0a 0a 20 20 20 20 20 20 69 41 64 64 72 20 3d 20  ..      iAddr = 
c7e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c7f0: 31 28 76 2c 20 4f 50 5f 49 66 2c 20 69 4d 65 6d  1(v, OP_If, iMem
c800: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c810: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
c820: 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 4d 65  _Integer, 1, iMe
c830: 6d 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  m);..      sqlit
c840: 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
c850: 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70  se, iTab, iDb, p
c860: 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  Tab, OP_OpenRead
c870: 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d  );.      eType =
c880: 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b   IN_INDEX_ROWID;
c890: 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ..      sqlite3V
c8a0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69  dbeJumpHere(v, i
c8b0: 41 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Addr);.    }else
c8c0: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  {.      /* The c
c8d0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
c8e0: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63 6f  e used by the co
c8f0: 6d 70 61 72 69 73 6f 6e 2e 20 49 66 20 61 6e 20  mparison. If an 
c900: 69 6e 64 65 78 20 69 73 20 74 6f 20 0a 20 20 20  index is to .   
c910: 20 20 20 2a 2a 20 62 65 20 75 73 65 64 20 69 6e     ** be used in
c920: 20 70 6c 61 63 65 20 6f 66 20 61 20 74 65 6d 70   place of a temp
c930: 2d 74 61 62 6c 65 2c 20 69 74 20 6d 75 73 74 20  -table, it must 
c940: 62 65 20 6f 72 64 65 72 65 64 20 61 63 63 6f 72  be ordered accor
c950: 64 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 6f  ding.      ** to
c960: 20 74 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20   this collation 
c970: 73 65 71 75 65 6e 63 65 2e 0a 20 20 20 20 20 20  sequence..      
c980: 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  */.      CollSeq
c990: 20 2a 70 52 65 71 20 3d 20 73 71 6c 69 74 65 33   *pReq = sqlite3
c9a0: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
c9b0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d  lSeq(pParse, pX-
c9c0: 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 29 3b 0a  >pLeft, pExpr);.
c9d0: 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
c9e0: 74 68 61 74 20 74 68 65 20 61 66 66 69 6e 69 74  that the affinit
c9f0: 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75  y that will be u
ca00: 73 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 74  sed to perform t
ca10: 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d  he .      ** com
ca20: 70 61 72 69 73 6f 6e 20 69 73 20 74 68 65 20 73  parison is the s
ca30: 61 6d 65 20 61 73 20 74 68 65 20 61 66 66 69 6e  ame as the affin
ca40: 69 74 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ity of the colum
ca50: 6e 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 69  n. If.      ** i
ca60: 74 20 69 73 20 6e 6f 74 2c 20 69 74 20 69 73 20  t is not, it is 
ca70: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
ca80: 75 73 65 20 61 6e 79 20 69 6e 64 65 78 2e 0a 20  use any index.. 
ca90: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61       */.      Ta
caa0: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 2d 3e 70  ble *pTab = p->p
cab0: 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a  Src->a[0].pTab;.
cac0: 20 20 20 20 20 20 63 68 61 72 20 61 66 66 20 3d        char aff =
cad0: 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e   comparisonAffin
cae0: 69 74 79 28 70 58 29 3b 0a 20 20 20 20 20 20 69  ity(pX);.      i
caf0: 6e 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d  nt affinity_ok =
cb00: 20 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f   (pTab->aCol[iCo
cb10: 6c 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 61 66 66  l].affinity==aff
cb20: 7c 7c 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  ||aff==SQLITE_AF
cb30: 46 5f 4e 4f 4e 45 29 3b 0a 0a 20 20 20 20 20 20  F_NONE);..      
cb40: 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
cb50: 49 6e 64 65 78 3b 20 70 49 64 78 20 26 26 20 65  Index; pIdx && e
cb60: 54 79 70 65 3d 3d 30 20 26 26 20 61 66 66 69 6e  Type==0 && affin
cb70: 69 74 79 5f 6f 6b 3b 20 70 49 64 78 3d 70 49 64  ity_ok; pIdx=pId
cb80: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
cb90: 20 20 20 69 66 28 20 28 70 49 64 78 2d 3e 61 69     if( (pIdx->ai
cba0: 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 29  Column[0]==iCol)
cbb0: 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 52  .         && (pR
cbc0: 65 71 3d 3d 73 71 6c 69 74 65 33 46 69 6e 64 43  eq==sqlite3FindC
cbd0: 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64  ollSeq(db, ENC(d
cbe0: 62 29 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  b), pIdx->azColl
cbf0: 5b 30 5d 2c 20 2d 31 2c 20 30 29 29 0a 20 20 20  [0], -1, 0)).   
cc00: 20 20 20 20 20 20 26 26 20 28 21 6d 75 73 74 42        && (!mustB
cc10: 65 55 6e 69 71 75 65 20 7c 7c 20 28 70 49 64 78  eUnique || (pIdx
cc20: 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 26 26 20  ->nColumn==1 && 
cc30: 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  pIdx->onError!=O
cc40: 45 5f 4e 6f 6e 65 29 29 0a 20 20 20 20 20 20 20  E_None)).       
cc50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
cc60: 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20  t iDb;.         
cc70: 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50   int iMem = ++pP
cc80: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
cc90: 20 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 3b        int iAddr;
cca0: 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
ccb0: 2a 70 4b 65 79 3b 0a 20 20 0a 20 20 20 20 20 20  *pKey;.  .      
ccc0: 20 20 20 20 70 4b 65 79 20 3d 20 28 63 68 61 72      pKey = (char
ccd0: 20 2a 29 73 71 6c 69 74 65 33 49 6e 64 65 78 4b   *)sqlite3IndexK
cce0: 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyinfo(pParse, p
ccf0: 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Idx);.          
cd00: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
cd10: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
cd20: 49 64 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Idx->pSchema);. 
cd30: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
cd40: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c  VdbeUsesBtree(v,
cd50: 20 69 44 62 29 3b 0a 0a 20 20 20 20 20 20 20 20   iDb);..        
cd60: 20 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65    iAddr = sqlite
cd70: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
cd80: 50 5f 49 66 2c 20 69 4d 65 6d 29 3b 0a 20 20 20  P_If, iMem);.   
cd90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
cda0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
cdb0: 6e 74 65 67 65 72 2c 20 31 2c 20 69 4d 65 6d 29  nteger, 1, iMem)
cdc0: 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 73  ;.  .          s
cdd0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
cde0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c  (v, OP_OpenRead,
cdf0: 20 69 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e 75   iTab, pIdx->tnu
ce00: 6d 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20  m, iDb,.        
ce10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce20: 20 20 20 20 20 20 20 70 4b 65 79 2c 50 34 5f 4b         pKey,P4_K
ce30: 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
ce40: 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43  .          VdbeC
ce50: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
ce60: 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a   pIdx->zName));.
ce70: 20 20 20 20 20 20 20 20 20 20 65 54 79 70 65 20            eType 
ce80: 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  = IN_INDEX_INDEX
ce90: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
cea0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
ceb0: 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
cec0: 73 2c 20 69 54 61 62 2c 20 70 49 64 78 2d 3e 6e  s, iTab, pIdx->n
ced0: 43 6f 6c 75 6d 6e 29 3b 0a 0a 20 20 20 20 20 20  Column);..      
cee0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
cef0: 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64 72  umpHere(v, iAddr
cf00: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
cf10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
cf20: 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30 20 29    if( eType==0 )
cf30: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  {.    sqlite3Cod
cf40: 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73  eSubselect(pPars
cf50: 65 2c 20 70 58 29 3b 0a 20 20 20 20 65 54 79 70  e, pX);.    eTyp
cf60: 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48  e = IN_INDEX_EPH
cf70: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
cf80: 58 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  X->iTable = iTab
cf90: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65  ;.  }.  return e
cfa0: 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Type;.}.#endif..
cfb0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
cfc0: 6f 64 65 20 66 6f 72 20 73 63 61 6c 61 72 20 73  ode for scalar s
cfd0: 75 62 71 75 65 72 69 65 73 20 75 73 65 64 20 61  ubqueries used a
cfe0: 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a  s an expression.
cff0: 2a 2a 20 61 6e 64 20 49 4e 20 6f 70 65 72 61 74  ** and IN operat
d000: 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a  ors.  Examples:.
d010: 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45 43  **.**     (SELEC
d020: 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20  T a FROM b)     
d030: 20 20 20 20 20 2d 2d 20 73 75 62 71 75 65 72 79       -- subquery
d040: 0a 2a 2a 20 20 20 20 20 45 58 49 53 54 53 20 28  .**     EXISTS (
d050: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29  SELECT a FROM b)
d060: 20 20 20 2d 2d 20 45 58 49 53 54 53 20 73 75 62     -- EXISTS sub
d070: 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 78 20 49  query.**     x I
d080: 4e 20 28 34 2c 35 2c 31 31 29 20 20 20 20 20 20  N (4,5,11)      
d090: 20 20 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70          -- IN op
d0a0: 65 72 61 74 6f 72 20 77 69 74 68 20 6c 69 73 74  erator with list
d0b0: 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73   on right-hand s
d0c0: 69 64 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20  ide.**     x IN 
d0d0: 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62  (SELECT a FROM b
d0e0: 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72  )     -- IN oper
d0f0: 61 74 6f 72 20 77 69 74 68 20 73 75 62 71 75 65  ator with subque
d100: 72 79 20 6f 6e 20 74 68 65 20 72 69 67 68 74 0a  ry on the right.
d110: 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70 72 20  **.** The pExpr 
d120: 70 61 72 61 6d 65 74 65 72 20 64 65 73 63 72 69  parameter descri
d130: 62 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69  bes the expressi
d140: 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  on that contains
d150: 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70 65 72 61   the IN.** opera
d160: 74 6f 72 20 6f 72 20 73 75 62 71 75 65 72 79 2e  tor or subquery.
d170: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
d180: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
d190: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64  .void sqlite3Cod
d1a0: 65 53 75 62 73 65 6c 65 63 74 28 50 61 72 73 65  eSubselect(Parse
d1b0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
d1c0: 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 74 65  pExpr){.  int te
d1d0: 73 74 41 64 64 72 20 3d 20 30 3b 20 20 20 20 20  stAddr = 0;     
d1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1f0: 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65    /* One-time te
d200: 73 74 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20  st address */.  
d210: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
d220: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
d230: 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
d240: 65 74 75 72 6e 3b 0a 0a 0a 20 20 2f 2a 20 54 68  eturn;...  /* Th
d250: 69 73 20 63 6f 64 65 20 6d 75 73 74 20 62 65 20  is code must be 
d260: 72 75 6e 20 69 6e 20 69 74 73 20 65 6e 74 69 72  run in its entir
d270: 65 74 79 20 65 76 65 72 79 20 74 69 6d 65 20 69  ety every time i
d280: 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  t is encountered
d290: 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 6f 66 20  .  ** if any of 
d2a0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  the following is
d2b0: 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   true:.  **.  **
d2c0: 20 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74      *  The right
d2d0: 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 20  -hand side is a 
d2e0: 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75  correlated subqu
d2f0: 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54  ery.  **    *  T
d300: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
d310: 64 65 20 69 73 20 61 6e 20 65 78 70 72 65 73 73  de is an express
d320: 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e  ion list contain
d330: 69 6e 67 20 76 61 72 69 61 62 6c 65 73 0a 20 20  ing variables.  
d340: 2a 2a 20 20 20 20 2a 20 20 57 65 20 61 72 65 20  **    *  We are 
d350: 69 6e 73 69 64 65 20 61 20 74 72 69 67 67 65 72  inside a trigger
d360: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c  .  **.  ** If al
d370: 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61  l of the above a
d380: 72 65 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 77  re false, then w
d390: 65 20 63 61 6e 20 72 75 6e 20 74 68 69 73 20 63  e can run this c
d3a0: 6f 64 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20  ode just once.  
d3b0: 2a 2a 20 73 61 76 65 20 74 68 65 20 72 65 73 75  ** save the resu
d3c0: 6c 74 73 2c 20 61 6e 64 20 72 65 75 73 65 20 74  lts, and reuse t
d3d0: 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 20 6f  he same result o
d3e0: 6e 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76  n subsequent inv
d3f0: 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  ocations..  */. 
d400: 20 69 66 28 20 21 45 78 70 72 48 61 73 41 6e 79   if( !ExprHasAny
d410: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
d420: 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20 26 26  EP_VarSelect) &&
d430: 20 21 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74   !pParse->trigSt
d440: 61 63 6b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d  ack ){.    int m
d450: 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
d460: 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
d470: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
d480: 5f 49 66 2c 20 6d 65 6d 29 3b 0a 20 20 20 20 74  _If, mem);.    t
d490: 65 73 74 41 64 64 72 20 3d 20 73 71 6c 69 74 65  estAddr = sqlite
d4a0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
d4b0: 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 6d 65  P_Integer, 1, me
d4c0: 6d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  m);.    assert( 
d4d0: 74 65 73 74 41 64 64 72 3e 30 20 7c 7c 20 70 50  testAddr>0 || pP
d4e0: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
d4f0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 7d 0a 0a 20  Failed );.  }.. 
d500: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
d510: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
d520: 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 63 68  K_IN: {.      ch
d530: 61 72 20 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  ar affinity;.   
d540: 20 20 20 4b 65 79 49 6e 66 6f 20 6b 65 79 49 6e     KeyInfo keyIn
d550: 66 6f 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  fo;.      int ad
d560: 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 64  dr;        /* Ad
d570: 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e  dress of OP_Open
d580: 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75  Ephemeral instru
d590: 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 20 20  ction */..      
d5a0: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
d5b0: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
d5c0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 0a 20  Expr->pLeft);.. 
d5d0: 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20       /* Whether 
d5e0: 74 68 69 73 20 69 73 20 61 6e 20 27 78 20 49 4e  this is an 'x IN
d5f0: 28 53 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20  (SELECT...)' or 
d600: 61 6e 20 27 78 20 49 4e 28 3c 65 78 70 72 6c 69  an 'x IN(<exprli
d610: 73 74 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20 65  st>)'.      ** e
d620: 78 70 72 65 73 73 69 6f 6e 20 69 74 20 69 73 20  xpression it is 
d630: 68 61 6e 64 6c 65 64 20 74 68 65 20 73 61 6d 65  handled the same
d640: 20 77 61 79 2e 20 41 20 76 69 72 74 75 61 6c 20   way. A virtual 
d650: 74 61 62 6c 65 20 69 73 20 0a 20 20 20 20 20 20  table is .      
d660: 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20 73  ** filled with s
d670: 69 6e 67 6c 65 2d 66 69 65 6c 64 20 69 6e 64 65  ingle-field inde
d680: 78 20 6b 65 79 73 20 72 65 70 72 65 73 65 6e 74  x keys represent
d690: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ing the results.
d6a0: 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68        ** from th
d6b0: 65 20 53 45 4c 45 43 54 20 6f 72 20 74 68 65 20  e SELECT or the 
d6c0: 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20  <exprlist>..    
d6d0: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
d6e0: 20 74 68 65 20 27 78 27 20 65 78 70 72 65 73 73   the 'x' express
d6f0: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  ion is a column 
d700: 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20 53 45  value, or the SE
d710: 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  LECT....      **
d720: 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72   statement retur
d730: 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  ns a column valu
d740: 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69  e, then the affi
d750: 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 20 20 20  nity of that.   
d760: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20     ** column is 
d770: 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68  used to build th
d780: 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66  e index keys. If
d790: 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68   both 'x' and th
d7a0: 65 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43  e.      ** SELEC
d7b0: 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61  T... statement a
d7c0: 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  re columns, then
d7d0: 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
d7e0: 79 20 69 73 20 75 73 65 64 0a 20 20 20 20 20 20  y is used.      
d7f0: 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63 6f 6c  ** if either col
d800: 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49 43 20  umn has NUMERIC 
d810: 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e  or INTEGER affin
d820: 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65 72 0a  ity. If neither.
d830: 20 20 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72        ** 'x' nor
d840: 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73   the SELECT... s
d850: 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c  tatement are col
d860: 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72  umns, then numer
d870: 69 63 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20  ic affinity.    
d880: 20 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20 20    ** is used..  
d890: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78      */.      pEx
d8a0: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61  pr->iTable = pPa
d8b0: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
d8c0: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
d8d0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
d8e0: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
d8f0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b   pExpr->iTable);
d900: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6b  .      memset(&k
d910: 65 79 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  eyInfo, 0, sizeo
d920: 66 28 6b 65 79 49 6e 66 6f 29 29 3b 0a 20 20 20  f(keyInfo));.   
d930: 20 20 20 6b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c     keyInfo.nFiel
d940: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  d = 1;.      sql
d950: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
d960: 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d  , OP_SetNumColum
d970: 6e 73 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  ns, pExpr->iTabl
d980: 65 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 69 66  e, 1);..      if
d990: 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  ( pExpr->pSelect
d9a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
d9b0: 61 73 65 20 31 3a 20 20 20 20 20 65 78 70 72 20  ase 1:     expr 
d9c0: 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a  IN (SELECT ...).
d9d0: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
d9e0: 20 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63     ** Generate c
d9f0: 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ode to write the
da00: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
da10: 73 65 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20  select into the 
da20: 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20  temporary.      
da30: 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63    ** table alloc
da40: 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20  ated and opened 
da50: 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a  above..        *
da60: 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74  /.        Select
da70: 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20  Dest dest;.     
da80: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
da90: 69 73 74 3b 0a 0a 20 20 20 20 20 20 20 20 73 71  ist;..        sq
daa0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
dab0: 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 53  nit(&dest, SRT_S
dac0: 65 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  et, pExpr->iTabl
dad0: 65 29 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74  e);.        dest
dae0: 2e 61 66 66 69 6e 69 74 79 20 3d 20 28 69 6e 74  .affinity = (int
daf0: 29 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20  )affinity;.     
db00: 20 20 20 61 73 73 65 72 74 28 20 28 70 45 78 70     assert( (pExp
db10: 72 2d 3e 69 54 61 62 6c 65 26 30 78 30 30 30 30  r->iTable&0x0000
db20: 46 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54  FFFF)==pExpr->iT
db30: 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20  able );.        
db40: 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
db50: 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
db60: 3e 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 2c  >pSelect, &dest,
db70: 20 30 2c 20 30 2c 20 30 2c 20 30 29 20 29 7b 0a   0, 0, 0, 0) ){.
db80: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
db90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
dba0: 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78      pEList = pEx
dbb0: 70 72 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  pr->pSelect->pEL
dbc0: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ist;.        if(
dbd0: 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
dbe0: 74 2d 3e 6e 45 78 70 72 3e 30 20 29 7b 20 0a 20  t->nExpr>0 ){ . 
dbf0: 20 20 20 20 20 20 20 20 20 6b 65 79 49 6e 66 6f           keyInfo
dc00: 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69  .aColl[0] = sqli
dc10: 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
dc20: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
dc30: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20  pExpr->pLeft,.  
dc40: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 4c 69              pELi
dc50: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  st->a[0].pExpr);
dc60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
dc70: 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70 72   }else if( pExpr
dc80: 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ->pList ){.     
dc90: 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20     /* Case 2:   
dca0: 20 20 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c    expr IN (exprl
dcb0: 69 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ist).        **.
dcc0: 20 20 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 65          ** For e
dcd0: 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  ach expression, 
dce0: 62 75 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b  build an index k
dcf0: 65 79 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c  ey from the eval
dd00: 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20  uation and.     
dd10: 20 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69     ** store it i
dd20: 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  n the temporary 
dd30: 74 61 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e  table. If <expr>
dd40: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68   is a column, th
dd50: 65 6e 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a  en use.        *
dd60: 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61  * that columns a
dd70: 66 66 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69  ffinity when bui
dd80: 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73  lding index keys
dd90: 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e  . If <expr> is n
dda0: 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  ot.        ** a 
ddb0: 63 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65  column, use nume
ddc0: 72 69 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20  ric affinity..  
ddd0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
dde0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
ddf0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
de00: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a  = pExpr->pList;.
de10: 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45          struct E
de20: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
de30: 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  tem;.        int
de40: 20 72 31 2c 20 72 32 3b 0a 0a 20 20 20 20 20 20   r1, r2;..      
de50: 20 20 69 66 28 20 21 61 66 66 69 6e 69 74 79 20    if( !affinity 
de60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66 66  ){.          aff
de70: 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41  inity = SQLITE_A
de80: 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20  FF_NONE;.       
de90: 20 7d 0a 20 20 20 20 20 20 20 20 6b 65 79 49 6e   }.        keyIn
dea0: 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 70 45  fo.aColl[0] = pE
deb0: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c  xpr->pLeft->pCol
dec0: 6c 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c  l;..        /* L
ded0: 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68  oop through each
dee0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c   expression in <
def0: 65 78 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20  exprlist>. */.  
df00: 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
df10: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
df20: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 32  rse);.        r2
df30: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
df40: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
df50: 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4c 69 73        for(i=pLis
df60: 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d  t->nExpr, pItem=
df70: 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69  pList->a; i>0; i
df80: 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
df90: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
dfa0: 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  2 = pItem->pExpr
dfb0: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
dfc0: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
dfd0: 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e  n is not constan
dfe0: 74 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e  t then we will n
dff0: 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20  eed to.         
e000: 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 65 20   ** disable the 
e010: 74 65 73 74 20 74 68 61 74 20 77 61 73 20 67 65  test that was ge
e020: 6e 65 72 61 74 65 64 20 61 62 6f 76 65 20 74 68  nerated above th
e030: 61 74 20 6d 61 6b 65 73 20 73 75 72 65 0a 20 20  at makes sure.  
e040: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
e050: 63 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63 75 74  code only execut
e060: 65 73 20 6f 6e 63 65 2e 20 20 42 65 63 61 75 73  es once.  Becaus
e070: 65 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73  e for a non-cons
e080: 74 61 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a  tant.          *
e090: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 77 65 20  * expression we 
e0a0: 6e 65 65 64 20 74 6f 20 72 65 72 75 6e 20 74 68  need to rerun th
e0b0: 69 73 20 63 6f 64 65 20 65 61 63 68 20 74 69 6d  is code each tim
e0c0: 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
e0d0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 74 65            if( te
e0e0: 73 74 41 64 64 72 20 26 26 20 21 73 71 6c 69 74  stAddr && !sqlit
e0f0: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
e100: 28 70 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20  (pE2) ){.       
e110: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e120: 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
e130: 74 65 73 74 41 64 64 72 2d 31 2c 20 32 29 3b 0a  testAddr-1, 2);.
e140: 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
e150: 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  Addr = 0;.      
e160: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
e170: 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65   /* Evaluate the
e180: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
e190: 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74  insert it into t
e1a0: 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f  he temp table */
e1b0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
e1c0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
e1d0: 65 2c 20 70 45 32 2c 20 72 31 29 3b 0a 20 20 20  e, pE2, r1);.   
e1e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
e1f0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
e200: 61 6b 65 52 65 63 6f 72 64 2c 20 72 31 2c 20 31  akeRecord, r1, 1
e210: 2c 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c  , r2, &affinity,
e220: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   1);.          s
e230: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
e240: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
e250: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
e260: 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   r2);.        }.
e270: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
e280: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
e290: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
e2a0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
e2b0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
e2c0: 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   r2);.      }.  
e2d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
e2e0: 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c  hangeP4(v, addr,
e2f0: 20 28 76 6f 69 64 20 2a 29 26 6b 65 79 49 6e 66   (void *)&keyInf
e300: 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
e310: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e320: 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   }..    case TK_
e330: 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65  EXISTS:.    case
e340: 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20   TK_SELECT: {.  
e350: 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 73 20      /* This has 
e360: 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72 20 53  to be a scalar S
e370: 45 4c 45 43 54 2e 20 20 47 65 6e 65 72 61 74 65  ELECT.  Generate
e380: 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74 68 65   code to put the
e390: 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20  .      ** value 
e3a0: 6f 66 20 74 68 69 73 20 73 65 6c 65 63 74 20 69  of this select i
e3b0: 6e 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  n a memory cell 
e3c0: 61 6e 64 20 72 65 63 6f 72 64 20 74 68 65 20 6e  and record the n
e3d0: 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f  umber.      ** o
e3e0: 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  f the memory cel
e3f0: 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20  l in iColumn..  
e400: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 61      */.      sta
e410: 74 69 63 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20  tic const Token 
e420: 6f 6e 65 20 3d 20 7b 20 28 75 38 2a 29 22 31 22  one = { (u8*)"1"
e430: 2c 20 30 2c 20 31 20 7d 3b 0a 20 20 20 20 20 20  , 0, 1 };.      
e440: 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20  Select *pSel;.  
e450: 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64      SelectDest d
e460: 65 73 74 3b 0a 0a 20 20 20 20 20 20 70 53 65 6c  est;..      pSel
e470: 20 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63   = pExpr->pSelec
e480: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
e490: 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
e4a0: 64 65 73 74 2c 20 30 2c 20 2b 2b 70 50 61 72 73  dest, 0, ++pPars
e4b0: 65 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20  e->nMem);.      
e4c0: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
e4d0: 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20  K_SELECT ){.    
e4e0: 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d      dest.eDest =
e4f0: 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20   SRT_Mem;.      
e500: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e510: 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
e520: 30 2c 20 64 65 73 74 2e 69 50 61 72 6d 29 3b 0a  0, dest.iParm);.
e530: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
e540: 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 73 75  ent((v, "Init su
e550: 62 71 75 65 72 79 20 72 65 73 75 6c 74 22 29 29  bquery result"))
e560: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
e570: 20 20 20 20 20 20 20 64 65 73 74 2e 65 44 65 73         dest.eDes
e580: 74 20 3d 20 53 52 54 5f 45 78 69 73 74 73 3b 0a  t = SRT_Exists;.
e590: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
e5a0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
e5b0: 49 6e 74 65 67 65 72 2c 20 30 2c 20 64 65 73 74  Integer, 0, dest
e5c0: 2e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20  .iParm);.       
e5d0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
e5e0: 20 22 49 6e 69 74 20 45 58 49 53 54 53 20 72 65   "Init EXISTS re
e5f0: 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d  sult"));.      }
e600: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
e610: 70 72 44 65 6c 65 74 65 28 70 53 65 6c 2d 3e 70  prDelete(pSel->p
e620: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 53  Limit);.      pS
e630: 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c  el->pLimit = sql
e640: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
e650: 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c  , TK_INTEGER, 0,
e660: 20 30 2c 20 26 6f 6e 65 29 3b 0a 20 20 20 20 20   0, &one);.     
e670: 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
e680: 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c  ct(pParse, pSel,
e690: 20 26 64 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c   &dest, 0, 0, 0,
e6a0: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72   0) ){.        r
e6b0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
e6c0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
e6d0: 75 6d 6e 20 3d 20 64 65 73 74 2e 69 50 61 72 6d  umn = dest.iParm
e6e0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
e6f0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
e700: 74 65 73 74 41 64 64 72 20 29 7b 0a 20 20 20 20  testAddr ){.    
e710: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
e720: 65 72 65 28 76 2c 20 74 65 73 74 41 64 64 72 2d  ere(v, testAddr-
e730: 31 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  1);.  }..  retur
e740: 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  n;.}.#endif /* S
e750: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
e760: 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 75  ERY */../*.** Du
e770: 70 6c 69 63 61 74 65 20 61 6e 20 38 2d 62 79 74  plicate an 8-byt
e780: 65 20 76 61 6c 75 65 0a 2a 2f 0a 73 74 61 74 69  e value.*/.stati
e790: 63 20 63 68 61 72 20 2a 64 75 70 38 62 79 74 65  c char *dup8byte
e7a0: 73 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74  s(Vdbe *v, const
e7b0: 20 63 68 61 72 20 2a 69 6e 29 7b 0a 20 20 63 68   char *in){.  ch
e7c0: 61 72 20 2a 6f 75 74 20 3d 20 73 71 6c 69 74 65  ar *out = sqlite
e7d0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 73 71 6c  3DbMallocRaw(sql
e7e0: 69 74 65 33 56 64 62 65 44 62 28 76 29 2c 20 38  ite3VdbeDb(v), 8
e7f0: 29 3b 0a 20 20 69 66 28 20 6f 75 74 20 29 7b 0a  );.  if( out ){.
e800: 20 20 20 20 6d 65 6d 63 70 79 28 6f 75 74 2c 20      memcpy(out, 
e810: 69 6e 2c 20 38 29 3b 0a 20 20 7d 0a 20 20 72 65  in, 8);.  }.  re
e820: 74 75 72 6e 20 6f 75 74 3b 0a 7d 0a 0a 2f 2a 0a  turn out;.}../*.
e830: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69  ** Generate an i
e840: 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20  nstruction that 
e850: 77 69 6c 6c 20 70 75 74 20 74 68 65 20 66 6c 6f  will put the flo
e860: 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76  ating point.** v
e870: 61 6c 75 65 20 64 65 73 63 72 69 62 65 64 20 62  alue described b
e880: 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f  y z[0..n-1] into
e890: 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a   register iMem..
e8a0: 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74  **.** The z[] st
e8b0: 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61 62  ring will probab
e8c0: 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74  ly not be zero-t
e8d0: 65 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74 20  erminated.  But 
e8e0: 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61  the .** z[n] cha
e8f0: 72 61 63 74 65 72 20 69 73 20 67 75 61 72 61 6e  racter is guaran
e900: 74 65 65 64 20 74 6f 20 62 65 20 73 6f 6d 65 74  teed to be somet
e910: 68 69 6e 67 20 74 68 61 74 20 64 6f 65 73 20 6e  hing that does n
e920: 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20  ot look.** like 
e930: 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e  the continuation
e940: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a   of the number..
e950: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
e960: 6f 64 65 52 65 61 6c 28 56 64 62 65 20 2a 76 2c  odeReal(Vdbe *v,
e970: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
e980: 69 6e 74 20 6e 2c 20 69 6e 74 20 6e 65 67 61 74  int n, int negat
e990: 65 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29  eFlag, int iMem)
e9a0: 7b 0a 20 20 61 73 73 65 72 74 28 20 7a 20 7c 7c  {.  assert( z ||
e9b0: 20 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33   v==0 || sqlite3
e9c0: 56 64 62 65 44 62 28 76 29 2d 3e 6d 61 6c 6c 6f  VdbeDb(v)->mallo
e9d0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
e9e0: 20 7a 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65   z ){.    double
e9f0: 20 76 61 6c 75 65 3b 0a 20 20 20 20 63 68 61 72   value;.    char
ea00: 20 2a 7a 56 3b 0a 20 20 20 20 61 73 73 65 72 74   *zV;.    assert
ea10: 28 20 21 69 73 64 69 67 69 74 28 7a 5b 6e 5d 29  ( !isdigit(z[n])
ea20: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41   );.    sqlite3A
ea30: 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a  toF(z, &value);.
ea40: 20 20 20 20 69 66 28 20 6e 65 67 61 74 65 46 6c      if( negateFl
ea50: 61 67 20 29 20 76 61 6c 75 65 20 3d 20 2d 76 61  ag ) value = -va
ea60: 6c 75 65 3b 0a 20 20 20 20 7a 56 20 3d 20 64 75  lue;.    zV = du
ea70: 70 38 62 79 74 65 73 28 76 2c 20 28 63 68 61 72  p8bytes(v, (char
ea80: 2a 29 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 73  *)&value);.    s
ea90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
eaa0: 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20  (v, OP_Real, 0, 
eab0: 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f  iMem, 0, zV, P4_
eac0: 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  REAL);.  }.}.../
ead0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e  *.** Generate an
eae0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61   instruction tha
eaf0: 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 69  t will put the i
eb00: 6e 74 65 67 65 72 20 64 65 73 63 72 69 62 65 20  nteger describe 
eb10: 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e  by.** text z[0..
eb20: 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74  n-1] into regist
eb30: 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54  er iMem..**.** T
eb40: 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69  he z[] string wi
eb50: 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20  ll probably not 
eb60: 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74  be zero-terminat
eb70: 65 64 2e 20 20 42 75 74 20 74 68 65 20 0a 2a 2a  ed.  But the .**
eb80: 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65 72 20   z[n] character 
eb90: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
eba0: 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 20 74 68   be something th
ebb0: 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b  at does not look
ebc0: 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e  .** like the con
ebd0: 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65  tinuation of the
ebe0: 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74   number..*/.stat
ebf0: 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65  ic void codeInte
ec00: 67 65 72 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e  ger(Vdbe *v, con
ec10: 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
ec20: 6e 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20  n, int negFlag, 
ec30: 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 61 73 73  int iMem){.  ass
ec40: 65 72 74 28 20 7a 20 7c 7c 20 76 3d 3d 30 20 7c  ert( z || v==0 |
ec50: 7c 20 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  | sqlite3VdbeDb(
ec60: 76 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  v)->mallocFailed
ec70: 20 29 3b 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20   );.  if( z ){. 
ec80: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 61 73     int i;.    as
ec90: 73 65 72 74 28 20 21 69 73 64 69 67 69 74 28 7a  sert( !isdigit(z
eca0: 5b 6e 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20  [n]) );.    if( 
ecb0: 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28  sqlite3GetInt32(
ecc0: 7a 2c 20 26 69 29 20 29 7b 0a 20 20 20 20 20 20  z, &i) ){.      
ecd0: 69 66 28 20 6e 65 67 46 6c 61 67 20 29 20 69 20  if( negFlag ) i 
ece0: 3d 20 2d 69 3b 0a 20 20 20 20 20 20 73 71 6c 69  = -i;.      sqli
ecf0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
ed00: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20   OP_Integer, i, 
ed10: 69 4d 65 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  iMem);.    }else
ed20: 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 74 73   if( sqlite3Fits
ed30: 49 6e 36 34 42 69 74 73 28 7a 2c 20 6e 65 67 46  In64Bits(z, negF
ed40: 6c 61 67 29 20 29 7b 0a 20 20 20 20 20 20 69 36  lag) ){.      i6
ed50: 34 20 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 63  4 value;.      c
ed60: 68 61 72 20 2a 7a 56 3b 0a 20 20 20 20 20 20 73  har *zV;.      s
ed70: 71 6c 69 74 65 33 41 74 6f 69 36 34 28 7a 2c 20  qlite3Atoi64(z, 
ed80: 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 69  &value);.      i
ed90: 66 28 20 6e 65 67 46 6c 61 67 20 29 20 76 61 6c  f( negFlag ) val
eda0: 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20  ue = -value;.   
edb0: 20 20 20 7a 56 20 3d 20 64 75 70 38 62 79 74 65     zV = dup8byte
edc0: 73 28 76 2c 20 28 63 68 61 72 2a 29 26 76 61 6c  s(v, (char*)&val
edd0: 75 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ue);.      sqlit
ede0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
edf0: 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69 4d 65  OP_Int64, 0, iMe
ee00: 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 49 4e 54  m, 0, zV, P4_INT
ee10: 36 34 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  64);.    }else{.
ee20: 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76        codeReal(v
ee30: 2c 20 7a 2c 20 6e 2c 20 6e 65 67 46 6c 61 67 2c  , z, n, negFlag,
ee40: 20 69 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20   iMem);.    }.  
ee50: 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  }.}.../*.** Gene
ee60: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
ee70: 69 6c 6c 20 65 78 74 72 61 63 74 20 74 68 65 20  ill extract the 
ee80: 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d  iColumn-th colum
ee90: 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20  n from.** table 
eea0: 70 54 61 62 20 61 6e 64 20 73 74 6f 72 65 20 74  pTab and store t
eeb0: 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  he column value 
eec0: 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65 67  in register iReg
eed0: 2e 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 61 6e  ..** There is an
eee0: 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 6f 20   open cursor to 
eef0: 70 54 61 62 20 69 6e 20 0a 2a 2a 20 69 54 61 62  pTab in .** iTab
ef00: 6c 65 2e 20 20 49 66 20 69 43 6f 6c 75 6d 6e 3c  le.  If iColumn<
ef10: 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73 20 67  0 then code is g
ef20: 65 6e 65 72 61 74 65 64 20 74 68 61 74 20 65 78  enerated that ex
ef30: 74 72 61 63 74 73 20 74 68 65 20 72 6f 77 69 64  tracts the rowid
ef40: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
ef50: 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
ef60: 6d 6e 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20  mn(.  Vdbe *v,  
ef70: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 4d         /* The VM
ef80: 20 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 2a   being created *
ef90: 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
efa0: 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74       /* Descript
efb0: 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ion of the table
efc0: 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
efd0: 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43  from */.  int iC
efe0: 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e  olumn,     /* In
eff0: 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65  dex of the table
f000: 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74   column */.  int
f010: 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a   iTable,      /*
f020: 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e   The cursor poin
f030: 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61 62 6c  ting to the tabl
f040: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 20  e */.  int iReg 
f050: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65          /* Store
f060: 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
f070: 0a 29 7b 0a 20 20 69 66 28 20 69 43 6f 6c 75 6d  .){.  if( iColum
f080: 6e 3c 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f  n<0 ){.    int o
f090: 70 20 3d 20 28 70 54 61 62 20 26 26 20 49 73 56  p = (pTab && IsV
f0a0: 69 72 74 75 61 6c 28 70 54 61 62 29 29 20 3f 20  irtual(pTab)) ? 
f0b0: 4f 50 5f 56 52 6f 77 69 64 20 3a 20 4f 50 5f 52  OP_VRowid : OP_R
f0c0: 6f 77 69 64 3b 0a 20 20 20 20 73 71 6c 69 74 65  owid;.    sqlite
f0d0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
f0e0: 70 2c 20 69 54 61 62 6c 65 2c 20 69 52 65 67 29  p, iTable, iReg)
f0f0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54  ;.  }else if( pT
f100: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ab==0 ){.    sql
f110: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
f120: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61  , OP_Column, iTa
f130: 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52  ble, iColumn, iR
f140: 65 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  eg);.  }else{.  
f150: 20 20 69 6e 74 20 6f 70 20 3d 20 49 73 56 69 72    int op = IsVir
f160: 74 75 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f  tual(pTab) ? OP_
f170: 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c  VColumn : OP_Col
f180: 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  umn;.    sqlite3
f190: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70  VdbeAddOp3(v, op
f1a0: 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d  , iTable, iColum
f1b0: 6e 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 73 71  n, iReg);.    sq
f1c0: 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75  lite3ColumnDefau
f1d0: 6c 74 28 76 2c 20 70 54 61 62 2c 20 69 43 6f 6c  lt(v, pTab, iCol
f1e0: 75 6d 6e 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  umn);.#ifndef SQ
f1f0: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
f200: 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 69 66 28  NG_POINT.    if(
f210: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
f220: 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53  umn].affinity==S
f230: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 29  QLITE_AFF_REAL )
f240: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
f250: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
f260: 52 65 61 6c 41 66 66 69 6e 69 74 79 2c 20 69 52  RealAffinity, iR
f270: 65 67 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eg);.    }.#endi
f280: 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  f.  }.}../*.** G
f290: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
f2a0: 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 56 64  o the current Vd
f2b0: 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  be to evaluate t
f2c0: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72  he given.** expr
f2d0: 65 73 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74  ession.  Attempt
f2e0: 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65   to store the re
f2f0: 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65  sults in registe
f300: 72 20 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52  r "target"..** R
f310: 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74  eturn the regist
f320: 65 72 20 77 68 65 72 65 20 72 65 73 75 6c 74 73  er where results
f330: 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a   are stored..**.
f340: 2a 2a 20 57 69 74 68 20 74 68 69 73 20 72 6f 75  ** With this rou
f350: 74 69 6e 65 2c 20 74 68 65 72 65 20 69 73 20 6e  tine, there is n
f360: 6f 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61  o guaranteed tha
f370: 74 20 72 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a  t results will.*
f380: 2a 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74  * be stored in t
f390: 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75  arget.  The resu
f3a0: 6c 74 20 6d 69 67 68 74 20 62 65 20 73 74 6f 72  lt might be stor
f3b0: 65 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72  ed in some other
f3c0: 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69 66 20  .** register if 
f3d0: 69 74 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74  it is convenient
f3e0: 20 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68 65 20   to do so.  The 
f3f0: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
f400: 0a 2a 2a 20 6d 75 73 74 20 63 68 65 63 6b 20 74  .** must check t
f410: 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61  he return code a
f420: 6e 64 20 6d 6f 76 65 20 74 68 65 20 72 65 73 75  nd move the resu
f430: 6c 74 73 20 74 6f 20 74 68 65 20 64 65 73 69 72  lts to the desir
f440: 65 64 0a 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a  ed.** register..
f450: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
f460: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
f470: 67 65 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  get(Parse *pPars
f480: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
f490: 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56  int target){.  V
f4a0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
f4b0: 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54 68 65 20  >pVdbe;  /* The 
f4c0: 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  VM under constru
f4d0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f  ction */.  int o
f4e0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
f4f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f       /* The opco
f500: 64 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  de being coded *
f510: 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20  /.  int inReg = 
f520: 74 61 72 67 65 74 3b 20 20 20 20 20 20 20 2f 2a  target;       /*
f530: 20 52 65 73 75 6c 74 73 20 73 74 6f 72 65 64 20   Results stored 
f540: 69 6e 20 72 65 67 69 73 74 65 72 20 69 6e 52 65  in register inRe
f550: 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72  g */.  int regFr
f560: 65 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ee1 = 0;        
f570: 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20   /* If non-zero 
f580: 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72  free this tempor
f590: 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  ary register */.
f5a0: 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d    int regFree2 =
f5b0: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49   0;         /* I
f5c0: 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20  f non-zero free 
f5d0: 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72  this temporary r
f5e0: 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74  egister */.  int
f5f0: 20 72 31 2c 20 72 32 2c 20 72 33 3b 20 20 20 20   r1, r2, r3;    
f600: 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75         /* Variou
f610: 73 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  s register numbe
f620: 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  rs */..  assert(
f630: 20 76 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d   v!=0 || pParse-
f640: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
f650: 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  d );.  assert( t
f660: 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65  arget>0 && targe
f670: 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  t<=pParse->nMem 
f680: 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
f690: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 69 66 28  return 0;..  if(
f6a0: 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20   pExpr==0 ){.   
f6b0: 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20   op = TK_NULL;. 
f6c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d   }else{.    op =
f6d0: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a   pExpr->op;.  }.
f6e0: 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
f6f0: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
f700: 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
f710: 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
f720: 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49  o = pExpr->pAggI
f730: 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63  nfo;.      struc
f740: 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
f750: 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d  Col = &pAggInfo-
f760: 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67  >aCol[pExpr->iAg
f770: 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  g];.      if( !p
f780: 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
f790: 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ode ){.        a
f7a0: 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65  ssert( pCol->iMe
f7b0: 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  m>0 );.        i
f7c0: 6e 52 65 67 20 3d 20 70 43 6f 6c 2d 3e 69 4d 65  nReg = pCol->iMe
f7d0: 6d 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  m;.        break
f7e0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
f7f0: 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53  ( pAggInfo->useS
f800: 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a 20 20 20  ortingIdx ){.   
f810: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f820: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
f830: 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73  umn, pAggInfo->s
f840: 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20 20 20 20  ortingIdx,.     
f850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f860: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
f870: 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74 61  SorterColumn, ta
f880: 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 62  rget);.        b
f890: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
f8a0: 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65      /* Otherwise
f8b0: 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f  , fall thru into
f8c0: 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63   the TK_COLUMN c
f8d0: 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ase */.    }.   
f8e0: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
f8f0: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   {.      if( pEx
f900: 70 72 2d 3e 69 54 61 62 6c 65 3c 30 20 29 7b 0a  pr->iTable<0 ){.
f910: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
f920: 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65  only happens whe
f930: 6e 20 63 6f 64 69 6e 67 20 63 68 65 63 6b 20 63  n coding check c
f940: 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
f950: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
f960: 61 72 73 65 2d 3e 63 6b 42 61 73 65 3e 30 20 29  arse->ckBase>0 )
f970: 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20  ;.        inReg 
f980: 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
f990: 20 2b 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73   + pParse->ckBas
f9a0: 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
f9b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
f9c0: 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
f9d0: 28 76 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c  (v, pExpr->pTab,
f9e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa00: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
fa10: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
fa20: 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
fa30: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
fa40: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
fa50: 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
fa60: 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 76 2c    codeInteger(v,
fa70: 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74   (char*)pExpr->t
fa80: 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74  oken.z, pExpr->t
fa90: 6f 6b 65 6e 2e 6e 2c 20 30 2c 20 74 61 72 67 65  oken.n, 0, targe
faa0: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
fab0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
fac0: 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20  TK_FLOAT: {.    
fad0: 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 28 63    codeReal(v, (c
fae0: 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65  har*)pExpr->toke
faf0: 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  n.z, pExpr->toke
fb00: 6e 2e 6e 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  n.n, 0, target);
fb10: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
fb20: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
fb30: 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20  STRING: {.      
fb40: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 45 78  sqlite3DequoteEx
fb50: 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  pr(pParse->db, p
fb60: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  Expr);.      sql
fb70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
fb80: 2c 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20  ,OP_String8, 0, 
fb90: 74 61 72 67 65 74 2c 20 30 2c 0a 20 20 20 20 20  target, 0,.     
fba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbb0: 20 20 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d     (char*)pExpr-
fbc0: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d  >token.z, pExpr-
fbd0: 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20  >token.n);.     
fbe0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
fbf0: 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20    case TK_NULL: 
fc00: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
fc10: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
fc20: 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29  Null, 0, target)
fc30: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
fc40: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
fc50: 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49  ITE_OMIT_BLOB_LI
fc60: 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54  TERAL.    case T
fc70: 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20  K_BLOB: {.      
fc80: 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e  int n;.      con
fc90: 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20  st char *z;.    
fca0: 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20    char *zBlob;. 
fcb0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
fcc0: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3e 3d 33 20 29  pr->token.n>=3 )
fcd0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
fce0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30  pExpr->token.z[0
fcf0: 5d 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70 72 2d  ]=='x' || pExpr-
fd00: 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d 3d 27 58 27  >token.z[0]=='X'
fd10: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
fd20: 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  ( pExpr->token.z
fd30: 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20  [1]=='\'' );.   
fd40: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
fd50: 2d 3e 74 6f 6b 65 6e 2e 7a 5b 70 45 78 70 72 2d  ->token.z[pExpr-
fd60: 3e 74 6f 6b 65 6e 2e 6e 2d 31 5d 3d 3d 27 5c 27  >token.n-1]=='\'
fd70: 27 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 70  ' );.      n = p
fd80: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 2d 20  Expr->token.n - 
fd90: 33 3b 0a 20 20 20 20 20 20 7a 20 3d 20 28 63 68  3;.      z = (ch
fda0: 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  ar*)pExpr->token
fdb0: 2e 7a 20 2b 20 32 3b 0a 20 20 20 20 20 20 7a 42  .z + 2;.      zB
fdc0: 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 48 65 78  lob = sqlite3Hex
fdd0: 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65 33 56 64  ToBlob(sqlite3Vd
fde0: 62 65 44 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a  beDb(v), z, n);.
fdf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fe00: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c  eAddOp4(v, OP_Bl
fe10: 6f 62 2c 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c  ob, n/2, target,
fe20: 20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59   0, zBlob, P4_DY
fe30: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 62 72  NAMIC);.      br
fe40: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
fe50: 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41  f.    case TK_VA
fe60: 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20  RIABLE: {.      
fe70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fe80: 32 28 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65  2(v, OP_Variable
fe90: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
fea0: 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
feb0: 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  if( pExpr->token
fec0: 2e 6e 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  .n>1 ){.        
fed0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
fee0: 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72  eP4(v, -1, (char
fef0: 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  *)pExpr->token.z
ff00: 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  , pExpr->token.n
ff10: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
ff20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
ff30: 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54    case TK_REGIST
ff40: 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65  ER: {.      inRe
ff50: 67 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  g = pExpr->iTabl
ff60: 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e;.      break;.
ff70: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
ff80: 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20  LITE_OMIT_CAST. 
ff90: 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a     case TK_CAST:
ffa0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72   {.      /* Expr
ffb0: 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66  essions of the f
ffc0: 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66  orm:   CAST(pLef
ffd0: 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20  t AS token) */. 
ffe0: 20 20 20 20 20 69 6e 74 20 61 66 66 2c 20 74 6f       int aff, to
fff0: 5f 6f 70 3b 0a 20 20 20 20 20 20 69 6e 52 65 67  _op;.      inReg
10000 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
10010 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
10020 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74   pExpr->pLeft, t
10030 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 61 66  arget);.      af
10040 66 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e  f = sqlite3Affin
10050 69 74 79 54 79 70 65 28 26 70 45 78 70 72 2d 3e  ityType(&pExpr->
10060 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 74 6f  token);.      to
10070 5f 6f 70 20 3d 20 61 66 66 20 2d 20 53 51 4c 49  _op = aff - SQLI
10080 54 45 5f 41 46 46 5f 54 45 58 54 20 2b 20 4f 50  TE_AFF_TEXT + OP
10090 5f 54 6f 54 65 78 74 3b 0a 20 20 20 20 20 20 61  _ToText;.      a
100a0 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50  ssert( to_op==OP
100b0 5f 54 6f 54 65 78 74 20 20 20 20 7c 7c 20 61 66  _ToText    || af
100c0 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  f!=SQLITE_AFF_TE
100d0 58 54 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61  XT    );.      a
100e0 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50  ssert( to_op==OP
100f0 5f 54 6f 42 6c 6f 62 20 20 20 20 7c 7c 20 61 66  _ToBlob    || af
10100 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  f!=SQLITE_AFF_NO
10110 4e 45 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61  NE    );.      a
10120 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50  ssert( to_op==OP
10130 5f 54 6f 4e 75 6d 65 72 69 63 20 7c 7c 20 61 66  _ToNumeric || af
10140 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f!=SQLITE_AFF_NU
10150 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 20 20 61  MERIC );.      a
10160 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50  ssert( to_op==OP
10170 5f 54 6f 49 6e 74 20 20 20 20 20 7c 7c 20 61 66  _ToInt     || af
10180 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  f!=SQLITE_AFF_IN
10190 54 45 47 45 52 20 29 3b 0a 20 20 20 20 20 20 61  TEGER );.      a
101a0 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50  ssert( to_op==OP
101b0 5f 54 6f 52 65 61 6c 20 20 20 20 7c 7c 20 61 66  _ToReal    || af
101c0 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  f!=SQLITE_AFF_RE
101d0 41 4c 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73  AL    );.      s
101e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
101f0 28 76 2c 20 74 6f 5f 6f 70 2c 20 69 6e 52 65 67  (v, to_op, inReg
10200 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
10210 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
10220 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54  SQLITE_OMIT_CAST
10230 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
10240 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
10250 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
10260 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
10270 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GE:.    case TK_
10280 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
10290 45 51 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  EQ: {.      asse
102a0 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74  rt( TK_LT==OP_Lt
102b0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
102c0 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29  ( TK_LE==OP_Le )
102d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
102e0 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a  TK_GT==OP_Gt );.
102f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
10300 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20  _GE==OP_Ge );.  
10310 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 45      assert( TK_E
10320 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20  Q==OP_Eq );.    
10330 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d    assert( TK_NE=
10340 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20  =OP_Ne );.      
10350 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
10360 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
10370 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
10380 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
10390 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
103a0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
103b0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
103c0 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
103d0 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
103e0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
103f0 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
10400 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
10410 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
10420 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f  , inReg, SQLITE_
10430 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20  STOREP2);.      
10440 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
10450 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20   case TK_AND:.  
10460 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20    case TK_OR:.  
10470 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a    case TK_PLUS:.
10480 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52      case TK_STAR
10490 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49  :.    case TK_MI
104a0 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NUS:.    case TK
104b0 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54  _REM:.    case T
104c0 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61  K_BITAND:.    ca
104d0 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20  se TK_BITOR:.   
104e0 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a   case TK_SLASH:.
104f0 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49      case TK_LSHI
10500 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  FT:.    case TK_
10510 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73  RSHIFT: .    cas
10520 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20  e TK_CONCAT: {. 
10530 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
10540 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 0a 20  AND==OP_And );. 
10550 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
10560 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 0a 20 20 20  OR==OP_Or );.   
10570 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 50 4c     assert( TK_PL
10580 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 0a 20 20  US==OP_Add );.  
10590 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d      assert( TK_M
105a0 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63  INUS==OP_Subtrac
105b0 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
105c0 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65  t( TK_REM==OP_Re
105d0 6d 61 69 6e 64 65 72 20 29 3b 0a 20 20 20 20 20  mainder );.     
105e0 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 41   assert( TK_BITA
105f0 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b  ND==OP_BitAnd );
10600 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
10610 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f  K_BITOR==OP_BitO
10620 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  r );.      asser
10630 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f  t( TK_SLASH==OP_
10640 44 69 76 69 64 65 20 29 3b 0a 20 20 20 20 20 20  Divide );.      
10650 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48 49 46  assert( TK_LSHIF
10660 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20  T==OP_ShiftLeft 
10670 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
10680 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53   TK_RSHIFT==OP_S
10690 68 69 66 74 52 69 67 68 74 20 29 3b 0a 20 20 20  hiftRight );.   
106a0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 43 4f     assert( TK_CO
106b0 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20  NCAT==OP_Concat 
106c0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
106d0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
106e0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
106f0 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
10700 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
10710 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
10720 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
10730 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
10740 65 65 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee2);.      sqli
10750 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
10760 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74 61 72   op, r2, r1, tar
10770 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  get);.      brea
10780 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
10790 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20  e TK_UMINUS: {. 
107a0 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
107b0 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
107c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
107d0 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66  Left );.      if
107e0 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pLeft->op==TK_
107f0 46 4c 4f 41 54 20 7c 7c 20 70 4c 65 66 74 2d 3e  FLOAT || pLeft->
10800 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29  op==TK_INTEGER )
10810 7b 0a 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20  {.        Token 
10820 2a 70 20 3d 20 26 70 4c 65 66 74 2d 3e 74 6f 6b  *p = &pLeft->tok
10830 65 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  en;.        if( 
10840 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c  pLeft->op==TK_FL
10850 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20  OAT ){.         
10860 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 28 63 68   codeReal(v, (ch
10870 61 72 2a 29 70 2d 3e 7a 2c 20 70 2d 3e 6e 2c 20  ar*)p->z, p->n, 
10880 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
10890 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
108a0 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72       codeInteger
108b0 28 76 2c 20 28 63 68 61 72 2a 29 70 2d 3e 7a 2c  (v, (char*)p->z,
108c0 20 70 2d 3e 6e 2c 20 31 2c 20 74 61 72 67 65 74   p->n, 1, target
108d0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
108e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
108f0 20 20 72 65 67 46 72 65 65 31 20 3d 20 72 31 20    regFree1 = r1 
10900 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
10910 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
10920 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10930 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
10940 65 67 65 72 2c 20 30 2c 20 72 31 29 3b 0a 20 20  eger, 0, r1);.  
10950 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
10960 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
10970 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
10980 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a  pLeft, target);.
10990 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
109a0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
109b0 53 75 62 74 72 61 63 74 2c 20 72 32 2c 20 72 31  Subtract, r2, r1
109c0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
109d0 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d   }.      inReg =
109e0 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 62   target;.      b
109f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
10a00 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a  case TK_BITNOT:.
10a10 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
10a20 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
10a30 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42   TK_BITNOT==OP_B
10a40 69 74 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 61  itNot );.      a
10a50 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f  ssert( TK_NOT==O
10a60 50 5f 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 69  P_Not );.      i
10a70 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
10a80 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
10a90 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
10aa0 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  t, target);.    
10ab0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10ac0 4f 70 31 28 76 2c 20 6f 70 2c 20 69 6e 52 65 67  Op1(v, op, inReg
10ad0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
10ae0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
10af0 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61  K_ISNULL:.    ca
10b00 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b  se TK_NOTNULL: {
10b10 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
10b20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
10b30 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e  K_ISNULL==OP_IsN
10b40 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ull );.      ass
10b50 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d  ert( TK_NOTNULL=
10b60 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20  =OP_NotNull );. 
10b70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10b80 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
10b90 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29  eger, 1, target)
10ba0 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
10bb0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
10bc0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
10bd0 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
10be0 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
10bf0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10c00 31 28 76 2c 20 6f 70 2c 20 72 31 29 3b 0a 20 20  1(v, op, r1);.  
10c10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10c20 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
10c30 6d 6d 2c 20 74 61 72 67 65 74 2c 20 2d 31 29 3b  mm, target, -1);
10c40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10c50 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
10c60 64 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  dr);.      break
10c70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
10c80 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
10c90 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66  : {.      AggInf
10ca0 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70 72  o *pInfo = pExpr
10cb0 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20  ->pAggInfo;.    
10cc0 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29    if( pInfo==0 )
10cd0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
10ce0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
10cf0 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67  , "misuse of agg
10d00 72 65 67 61 74 65 3a 20 25 54 22 2c 0a 20 20 20  regate: %T",.   
10d10 20 20 20 20 20 20 20 20 20 26 70 45 78 70 72 2d           &pExpr-
10d20 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d 65  >span);.      }e
10d30 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 52  lse{.        inR
10d40 65 67 20 3d 20 70 49 6e 66 6f 2d 3e 61 46 75 6e  eg = pInfo->aFun
10d50 63 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69  c[pExpr->iAgg].i
10d60 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Mem;.      }.   
10d70 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
10d80 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53      case TK_CONS
10d90 54 5f 46 55 4e 43 3a 0a 20 20 20 20 63 61 73 65  T_FUNC:.    case
10da0 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a   TK_FUNCTION: {.
10db0 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
10dc0 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70  pList = pExpr->p
10dd0 4c 69 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  List;.      int 
10de0 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 20 3f 20  nExpr = pList ? 
10df0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
10e00 3b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20  ;.      FuncDef 
10e10 2a 70 44 65 66 3b 0a 20 20 20 20 20 20 69 6e 74  *pDef;.      int
10e20 20 6e 49 64 3b 0a 20 20 20 20 20 20 63 6f 6e 73   nId;.      cons
10e30 74 20 63 68 61 72 20 2a 7a 49 64 3b 0a 20 20 20  t char *zId;.   
10e40 20 20 20 69 6e 74 20 63 6f 6e 73 74 4d 61 73 6b     int constMask
10e50 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
10e60 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  i;.      sqlite3
10e70 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
10e80 62 3b 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20  b;.      u8 enc 
10e90 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 20  = ENC(db);.     
10ea0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
10eb0 3d 20 30 3b 0a 0a 20 20 20 20 20 20 7a 49 64 20  = 0;..      zId 
10ec0 3d 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e  = (char*)pExpr->
10ed0 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 6e  token.z;.      n
10ee0 49 64 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65  Id = pExpr->toke
10ef0 6e 2e 6e 3b 0a 20 20 20 20 20 20 70 44 65 66 20  n.n;.      pDef 
10f00 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
10f10 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62  ction(pParse->db
10f20 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 45 78 70  , zId, nId, nExp
10f30 72 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20  r, enc, 0);.    
10f40 20 20 61 73 73 65 72 74 28 20 70 44 65 66 21 3d    assert( pDef!=
10f50 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
10f60 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
10f70 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e  nExpr = pList->n
10f80 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 72 31  Expr;.        r1
10f90 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
10fa0 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
10fb0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73  Expr);.        s
10fc0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
10fd0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
10fe0 4c 69 73 74 2c 20 72 31 29 3b 0a 20 20 20 20 20  List, r1);.     
10ff0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11000 6e 45 78 70 72 20 3d 20 72 31 20 3d 20 30 3b 0a  nExpr = r1 = 0;.
11010 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
11020 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
11030 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f  UALTABLE.      /
11040 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c  * Possibly overl
11050 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  oad the function
11060 20 69 66 20 74 68 65 20 66 69 72 73 74 20 61 72   if the first ar
11070 67 75 6d 65 6e 74 20 69 73 0a 20 20 20 20 20 20  gument is.      
11080 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ** a virtual tab
11090 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20  le column..     
110a0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72   **.      ** For
110b0 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73   infix functions
110c0 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45   (LIKE, GLOB, RE
110d0 47 45 58 50 2c 20 61 6e 64 20 4d 41 54 43 48 29  GEXP, and MATCH)
110e0 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 2a   use the.      *
110f0 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  * second argumen
11100 74 2c 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74  t, not the first
11110 2c 20 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e  , as the argumen
11120 74 20 74 6f 20 74 65 73 74 20 74 6f 0a 20 20 20  t to test to.   
11130 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20     ** see if it 
11140 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61  is a column in a
11150 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
11160 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65   This is done be
11170 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74  cause.      ** t
11180 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20  he left operand 
11190 6f 66 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f  of infix functio
111a0 6e 73 20 28 74 68 65 20 6f 70 65 72 61 6e 64 20  ns (the operand 
111b0 77 65 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 20  we want to.     
111c0 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72   ** control over
111d0 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73 20 75 70  loading) ends up
111e0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
111f0 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20  rgument to the. 
11200 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
11210 2e 20 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  .  The expressio
11220 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 69 73 20  n "A glob B" is 
11230 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20  equivalent to . 
11240 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c       ** "glob(B,
11250 41 29 2e 20 20 57 65 20 77 61 6e 74 20 74 6f 20  A).  We want to 
11260 75 73 65 20 74 68 65 20 41 20 69 6e 20 22 41 20  use the A in "A 
11270 67 6c 6f 62 20 42 22 20 74 6f 20 74 65 73 74 0a  glob B" to test.
11280 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e        ** for fun
11290 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e  ction overloadin
112a0 67 2e 20 20 42 75 74 20 77 65 20 75 73 65 20 74  g.  But we use t
112b0 68 65 20 42 20 74 65 72 6d 20 69 6e 20 22 67 6c  he B term in "gl
112c0 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20 20 20 20  ob(B,A)"..      
112d0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78  */.      if( nEx
112e0 70 72 3e 3d 32 20 26 26 20 28 70 45 78 70 72 2d  pr>=2 && (pExpr-
112f0 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 66 69  >flags & EP_Infi
11300 78 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20  xFunc) ){.      
11310 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
11320 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63  VtabOverloadFunc
11330 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e  tion(db, pDef, n
11340 45 78 70 72 2c 20 70 4c 69 73 74 2d 3e 61 5b 31  Expr, pList->a[1
11350 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
11360 7d 65 6c 73 65 20 69 66 28 20 6e 45 78 70 72 3e  }else if( nExpr>
11370 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  0 ){.        pDe
11380 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f  f = sqlite3VtabO
11390 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28  verloadFunction(
113a0 64 62 2c 20 70 44 65 66 2c 20 6e 45 78 70 72 2c  db, pDef, nExpr,
113b0 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78   pList->a[0].pEx
113c0 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  pr);.      }.#en
113d0 64 69 66 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  dif.      for(i=
113e0 30 3b 20 69 3c 6e 45 78 70 72 20 26 26 20 69 3c  0; i<nExpr && i<
113f0 33 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  32; i++){.      
11400 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
11410 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 4c 69 73  rIsConstant(pLis
11420 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  t->a[i].pExpr) )
11430 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  {.          cons
11440 74 4d 61 73 6b 20 7c 3d 20 28 31 3c 3c 69 29 3b  tMask |= (1<<i);
11450 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11460 20 20 20 69 66 28 20 70 44 65 66 2d 3e 6e 65 65     if( pDef->nee
11470 64 43 6f 6c 6c 53 65 71 20 26 26 20 21 70 43 6f  dCollSeq && !pCo
11480 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
11490 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
114a0 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
114b0 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  e, pList->a[i].p
114c0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Expr);.        }
114d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
114e0 66 28 20 70 44 65 66 2d 3e 6e 65 65 64 43 6f 6c  f( pDef->needCol
114f0 6c 53 65 71 20 29 7b 0a 20 20 20 20 20 20 20 20  lSeq ){.        
11500 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
11510 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  ll = pParse->db-
11520 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20  >pDfltColl; .   
11530 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11540 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp4(v, OP_Col
11550 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28  lSeq, 0, 0, 0, (
11560 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34  char *)pColl, P4
11570 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20  _COLLSEQ);.     
11580 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
11590 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
115a0 5f 46 75 6e 63 74 69 6f 6e 2c 20 63 6f 6e 73 74  _Function, const
115b0 4d 61 73 6b 2c 20 72 31 2c 20 74 61 72 67 65 74  Mask, r1, target
115c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
115d0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
115e0 29 70 44 65 66 2c 20 50 34 5f 46 55 4e 43 44 45  )pDef, P4_FUNCDE
115f0 46 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  F);.      sqlite
11600 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
11610 20 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69   nExpr);.      i
11620 66 28 20 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  f( nExpr ){.    
11630 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
11640 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
11650 73 65 2c 20 72 31 2c 20 6e 45 78 70 72 29 3b 0a  se, r1, nExpr);.
11660 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
11670 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
11680 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
11690 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
116a0 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20   TK_EXISTS:.    
116b0 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20  case TK_SELECT: 
116c0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  {.      if( pExp
116d0 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b  r->iColumn==0 ){
116e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
116f0 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
11700 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
11710 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65      }.      inRe
11720 67 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  g = pExpr->iColu
11730 6d 6e 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  mn;.      break;
11740 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
11750 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
11760 6e 74 20 6a 31 2c 20 6a 32 2c 20 6a 33 2c 20 6a  nt j1, j2, j3, j
11770 34 2c 20 6a 35 3b 0a 20 20 20 20 20 20 63 68 61  4, j5;.      cha
11780 72 20 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20  r affinity;.    
11790 20 20 69 6e 74 20 65 54 79 70 65 3b 0a 0a 20 20    int eType;..  
117a0 20 20 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69      eType = sqli
117b0 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70  te3FindInIndex(p
117c0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30 29  Parse, pExpr, 0)
117d0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 67 75  ;..      /* Figu
117e0 72 65 20 6f 75 74 20 74 68 65 20 61 66 66 69 6e  re out the affin
117f0 69 74 79 20 74 6f 20 75 73 65 20 74 6f 20 63 72  ity to use to cr
11800 65 61 74 65 20 61 20 6b 65 79 20 66 72 6f 6d 20  eate a key from 
11810 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20  the results.    
11820 20 20 2a 2a 20 6f 66 20 74 68 65 20 65 78 70 72    ** of the expr
11830 65 73 73 69 6f 6e 2e 20 61 66 66 69 6e 69 74 79  ession. affinity
11840 53 74 72 20 73 74 6f 72 65 73 20 61 20 73 74 61  Str stores a sta
11850 74 69 63 20 73 74 72 69 6e 67 20 73 75 69 74 61  tic string suita
11860 62 6c 65 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a  ble for.      **
11870 20 50 34 20 6f 66 20 4f 50 5f 4d 61 6b 65 52 65   P4 of OP_MakeRe
11880 63 6f 72 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  cord..      */. 
11890 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20       affinity = 
118a0 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69  comparisonAffini
118b0 74 79 28 70 45 78 70 72 29 3b 0a 0a 20 20 20 20  ty(pExpr);..    
118c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
118d0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
118e0 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 0a  r, 1, target);..
118f0 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
11900 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c  e <expr> from "<
11910 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e  expr> IN (...)".
11920 20 54 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   The temporary t
11930 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 70 45  able.      ** pE
11940 78 70 72 2d 3e 69 54 61 62 6c 65 20 63 6f 6e 74  xpr->iTable cont
11950 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 73 20  ains the values 
11960 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65  that make up the
11970 20 28 2e 2e 2e 29 20 73 65 74 2e 0a 20 20 20 20   (...) set..    
11980 20 20 2a 2f 0a 20 20 20 20 20 20 72 31 20 3d 20    */.      r1 = 
11990 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
119a0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
119b0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
119c0 65 65 31 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d  ee1);.      j1 =
119d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
119e0 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  p1(v, OP_NotNull
119f0 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
11a00 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11a10 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61  , OP_Null, 0, ta
11a20 72 67 65 74 29 3b 0a 20 20 20 20 20 20 6a 32 20  rget);.      j2 
11a30 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
11a40 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29  dOp0(v, OP_Goto)
11a50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
11a60 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
11a70 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  1);.      if( eT
11a80 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f  ype==IN_INDEX_RO
11a90 57 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 6a  WID ){.        j
11aa0 33 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  3 = sqlite3VdbeA
11ab0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp3(v, OP_Must
11ac0 42 65 49 6e 74 2c 20 72 31 2c 20 30 2c 20 31 29  BeInt, r1, 0, 1)
11ad0 3b 0a 20 20 20 20 20 20 20 20 6a 34 20 3d 20 73  ;.        j4 = s
11ae0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
11af0 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  (v, OP_NotExists
11b00 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
11b10 20 30 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20   0, r1);.       
11b20 20 6a 35 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j5 = sqlite3Vdb
11b30 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f  eAddOp0(v, OP_Go
11b40 74 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  to);.        sql
11b50 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
11b60 28 76 2c 20 6a 33 29 3b 0a 20 20 20 20 20 20 20  (v, j3);.       
11b70 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
11b80 48 65 72 65 28 76 2c 20 6a 34 29 3b 0a 20 20 20  Here(v, j4);.   
11b90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11ba0 20 20 72 32 20 3d 20 72 65 67 46 72 65 65 32 20    r2 = regFree2 
11bb0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
11bc0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
11bd0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11be0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
11bf0 65 52 65 63 6f 72 64 2c 20 72 31 2c 20 31 2c 20  eRecord, r1, 1, 
11c00 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31  r2, &affinity, 1
11c10 29 3b 0a 20 20 20 20 20 20 20 20 6a 35 20 3d 20  );.        j5 = 
11c20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11c30 33 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70  3(v, OP_Found, p
11c40 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c  Expr->iTable, 0,
11c50 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   r2);.      }.  
11c60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11c70 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
11c80 6d 6d 2c 20 74 61 72 67 65 74 2c 20 2d 31 29 3b  mm, target, -1);
11c90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11ca0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 32  beJumpHere(v, j2
11cb0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11cc0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
11cd0 6a 35 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  j5);.      break
11ce0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
11cf0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20     /*.    **    
11d00 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20  x BETWEEN y AND 
11d10 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  z.    **.    ** 
11d20 54 68 69 73 20 69 73 20 65 71 75 69 76 61 6c 65  This is equivale
11d30 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20  nt to.    **.   
11d40 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20   **    x>=y AND 
11d50 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  x<=z.    **.    
11d60 2a 2a 20 58 20 69 73 20 73 74 6f 72 65 64 20 69  ** X is stored i
11d70 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a  n pExpr->pLeft..
11d80 20 20 20 20 2a 2a 20 59 20 69 73 20 73 74 6f 72      ** Y is stor
11d90 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69  ed in pExpr->pLi
11da0 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a  st->a[0].pExpr..
11db0 20 20 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72      ** Z is stor
11dc0 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69  ed in pExpr->pLi
11dd0 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a  st->a[1].pExpr..
11de0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
11df0 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20  TK_BETWEEN: {.  
11e00 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
11e10 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
11e20 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
11e30 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 49 74  rList_item *pLIt
11e40 65 6d 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  em = pExpr->pLis
11e50 74 2d 3e 61 3b 0a 20 20 20 20 20 20 45 78 70 72  t->a;.      Expr
11e60 20 2a 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65   *pRight = pLIte
11e70 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20 20 20 20  m->pExpr;..     
11e80 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
11e90 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
11ea0 2c 20 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  , pLeft, &regFre
11eb0 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
11ec0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
11ed0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 52 69 67  emp(pParse, pRig
11ee0 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
11ef0 20 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74        r3 = sqlit
11f00 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
11f10 72 73 65 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  rse);.      code
11f20 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
11f30 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f  pLeft, pRight, O
11f40 50 5f 47 65 2c 0a 20 20 20 20 20 20 20 20 20 20  P_Ge,.          
11f50 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
11f60 72 33 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45  r3, SQLITE_STORE
11f70 50 32 29 3b 0a 20 20 20 20 20 20 70 4c 49 74 65  P2);.      pLIte
11f80 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 52 69 67 68  m++;.      pRigh
11f90 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70  t = pLItem->pExp
11fa0 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
11fb0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
11fc0 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
11fd0 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
11fe0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
11ff0 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c  (pParse, pRight,
12000 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
12010 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
12020 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52  Parse, pLeft, pR
12030 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 72 31 2c  ight, OP_Le, r1,
12040 20 72 32 2c 20 72 32 2c 20 53 51 4c 49 54 45 5f   r2, r2, SQLITE_
12050 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20  STOREP2);.      
12060 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12070 33 28 76 2c 20 4f 50 5f 41 6e 64 2c 20 72 33 2c  3(v, OP_And, r3,
12080 20 72 32 2c 20 74 61 72 67 65 74 29 3b 0a 20 20   r2, target);.  
12090 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
120a0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
120b0 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 62 72 65  , r3);.      bre
120c0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
120d0 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20  se TK_UPLUS: {. 
120e0 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
120f0 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
12100 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
12110 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29  ->pLeft, target)
12120 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
12130 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
12140 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a 20 20 20 20   ** Form A:.    
12150 2a 2a 20 20 20 43 41 53 45 20 78 20 57 48 45 4e  **   CASE x WHEN
12160 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e   e1 THEN r1 WHEN
12170 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20   e2 THEN r2 ... 
12180 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20  WHEN eN THEN rN 
12190 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a  ELSE y END.    *
121a0 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 42 3a  *.    ** Form B:
121b0 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57  .    **   CASE W
121c0 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57  HEN e1 THEN r1 W
121d0 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e  HEN e2 THEN r2 .
121e0 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20  .. WHEN eN THEN 
121f0 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20  rN ELSE y END.  
12200 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d    **.    ** Form
12210 20 41 20 69 73 20 63 61 6e 20 62 65 20 74 72 61   A is can be tra
12220 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20 74 68  nsformed into th
12230 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72  e equivalent for
12240 6d 20 42 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  m B as follows:.
12250 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48      **   CASE WH
12260 45 4e 20 78 3d 65 31 20 54 48 45 4e 20 72 31 20  EN x=e1 THEN r1 
12270 57 48 45 4e 20 78 3d 65 32 20 54 48 45 4e 20 72  WHEN x=e2 THEN r
12280 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20  2 ....    **    
12290 20 20 20 20 57 48 45 4e 20 78 3d 65 4e 20 54 48      WHEN x=eN TH
122a0 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44  EN rN ELSE y END
122b0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58  .    **.    ** X
122c0 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20   (if it exists) 
122d0 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65  is in pExpr->pLe
122e0 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20  ft..    ** Y is 
122f0 69 6e 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  in pExpr->pRight
12300 2e 20 20 54 68 65 20 59 20 69 73 20 61 6c 73 6f  .  The Y is also
12310 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74   optional.  If t
12320 68 65 72 65 20 69 73 20 6e 6f 0a 20 20 20 20 2a  here is no.    *
12330 2a 20 45 4c 53 45 20 63 6c 61 75 73 65 20 61 6e  * ELSE clause an
12340 64 20 6e 6f 20 6f 74 68 65 72 20 74 65 72 6d 20  d no other term 
12350 6d 61 74 63 68 65 73 2c 20 74 68 65 6e 20 74 68  matches, then th
12360 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a  e result of the.
12370 20 20 20 20 2a 2a 20 65 78 70 72 73 73 69 6f 6e      ** exprssion
12380 20 69 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a   is NULL..    **
12390 20 45 69 20 69 73 20 69 6e 20 70 45 78 70 72 2d   Ei is in pExpr-
123a0 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61  >pList->a[i*2] a
123b0 6e 64 20 52 69 20 69 73 20 70 45 78 70 72 2d 3e  nd Ri is pExpr->
123c0 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e  pList->a[i*2+1].
123d0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
123e0 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
123f0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
12400 68 65 20 52 69 20 66 6f 72 20 74 68 65 20 66 69  he Ri for the fi
12410 72 73 74 20 6d 61 74 63 68 69 6e 67 20 45 69 2c  rst matching Ei,
12420 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68  .    ** or if th
12430 65 72 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 69  ere is no matchi
12440 6e 67 20 45 69 2c 20 74 68 65 20 45 4c 53 45 20  ng Ei, the ELSE 
12450 74 65 72 6d 20 59 2c 20 6f 72 20 69 66 20 74 68  term Y, or if th
12460 65 72 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f  ere is.    ** no
12470 20 45 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c   ELSE term, NULL
12480 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
12490 65 20 54 4b 5f 43 41 53 45 3a 20 7b 0a 20 20 20  e TK_CASE: {.   
124a0 20 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b     int endLabel;
124b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124c0 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62       /* GOTO lab
124d0 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43 41  el for end of CA
124e0 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20  SE stmt */.     
124f0 20 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20 20   int nextCase;  
12500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12510 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c     /* GOTO label
12520 20 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20 63   for next WHEN c
12530 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69  lause */.      i
12540 6e 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20 20  nt nExpr;       
12550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12560 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f 66   /* 2x number of
12570 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20   WHEN terms */. 
12580 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20       int i;     
12590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125a0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
125b0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
125c0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
125d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
125e0 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48 45    /* List of WHE
125f0 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20  N terms */.     
12600 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
12610 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d  _item *aListelem
12620 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 57  ;  /* Array of W
12630 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  HEN terms */.   
12640 20 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61 72     Expr opCompar
12650 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
12660 20 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45       /* The X==E
12670 69 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  i expression */.
12680 20 20 20 20 20 20 45 78 70 72 20 63 61 63 68 65        Expr cache
12690 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
126a0 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63 68 65          /* Cache
126b0 64 20 65 78 70 72 65 73 73 69 6f 6e 20 58 20 2a  d expression X *
126c0 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58  /.      Expr *pX
126d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
126e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
126f0 20 58 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f   X expression */
12700 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65  .      Expr *pTe
12710 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
12720 20 20 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45           /* X==E
12730 69 20 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75  i (form A) or ju
12740 73 74 20 45 69 20 28 66 6f 72 6d 20 42 29 20 2a  st Ei (form B) *
12750 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  /..      assert(
12760 70 45 78 70 72 2d 3e 70 4c 69 73 74 29 3b 0a 20  pExpr->pList);. 
12770 20 20 20 20 20 61 73 73 65 72 74 28 28 70 45 78       assert((pEx
12780 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pr->pList->nExpr
12790 20 25 20 32 29 20 3d 3d 20 30 29 3b 0a 20 20 20   % 2) == 0);.   
127a0 20 20 20 61 73 73 65 72 74 28 70 45 78 70 72 2d     assert(pExpr-
127b0 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20  >pList->nExpr > 
127c0 30 29 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74  0);.      pEList
127d0 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b   = pExpr->pList;
127e0 0a 20 20 20 20 20 20 61 4c 69 73 74 65 6c 65 6d  .      aListelem
127f0 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20   = pEList->a;.  
12800 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45 4c 69      nExpr = pELi
12810 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  st->nExpr;.     
12820 20 65 6e 64 4c 61 62 65 6c 20 3d 20 73 71 6c 69   endLabel = sqli
12830 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
12840 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  (v);.      if( (
12850 70 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  pX = pExpr->pLef
12860 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  t)!=0 ){.       
12870 20 63 61 63 68 65 58 20 3d 20 2a 70 58 3b 0a 20   cacheX = *pX;. 
12880 20 20 20 20 20 20 20 63 61 63 68 65 58 2e 69 54         cacheX.iT
12890 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 45 78  able = sqlite3Ex
128a0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
128b0 65 2c 20 70 58 2c 20 26 72 65 67 46 72 65 65 31  e, pX, &regFree1
128c0 29 3b 0a 20 20 20 20 20 20 20 20 63 61 63 68 65  );.        cache
128d0 58 2e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54  X.op = TK_REGIST
128e0 45 52 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f  ER;.        opCo
128f0 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b 5f 45 51  mpare.op = TK_EQ
12900 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70  ;.        opComp
12910 61 72 65 2e 70 4c 65 66 74 20 3d 20 26 63 61 63  are.pLeft = &cac
12920 68 65 58 3b 0a 20 20 20 20 20 20 20 20 70 54 65  heX;.        pTe
12930 73 74 20 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b  st = &opCompare;
12940 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
12950 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b  or(i=0; i<nExpr;
12960 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20 20   i=i+2){.       
12970 20 69 66 28 20 70 58 20 29 7b 0a 20 20 20 20 20   if( pX ){.     
12980 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70       opCompare.p
12990 52 69 67 68 74 20 3d 20 61 4c 69 73 74 65 6c 65  Right = aListele
129a0 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  m[i].pExpr;.    
129b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
129c0 20 20 20 20 20 70 54 65 73 74 20 3d 20 61 4c 69       pTest = aLi
129d0 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b  stelem[i].pExpr;
129e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
129f0 20 20 20 6e 65 78 74 43 61 73 65 20 3d 20 73 71     nextCase = sq
12a00 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
12a10 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  el(v);.        s
12a20 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
12a30 65 28 70 50 61 72 73 65 2c 20 70 54 65 73 74 2c  e(pParse, pTest,
12a40 20 6e 65 78 74 43 61 73 65 2c 20 53 51 4c 49 54   nextCase, SQLIT
12a50 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
12a60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
12a70 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61  prCode(pParse, a
12a80 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45  Listelem[i+1].pE
12a90 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
12aa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12ab0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
12ac0 74 6f 2c 20 30 2c 20 65 6e 64 4c 61 62 65 6c 29  to, 0, endLabel)
12ad0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
12ae0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
12af0 6c 28 76 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a  l(v, nextCase);.
12b00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
12b10 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20  ( pExpr->pRight 
12b20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
12b30 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
12b40 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
12b50 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
12b60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12b70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12b80 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
12b90 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
12ba0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
12bb0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
12bc0 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20  v, endLabel);.  
12bd0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
12be0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12bf0 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20  OMIT_TRIGGER.   
12c00 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20   case TK_RAISE: 
12c10 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  {.      if( !pPa
12c20 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 29  rse->trigStack )
12c30 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
12c40 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
12c50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12c60 20 20 20 20 20 20 20 20 20 22 52 41 49 53 45 28           "RAISE(
12c70 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73  ) may only be us
12c80 65 64 20 77 69 74 68 69 6e 20 61 20 74 72 69 67  ed within a trig
12c90 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20  ger-program");. 
12ca0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
12cb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
12cc0 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
12cd0 6e 21 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a  n!=OE_Ignore ){.
12ce0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
12cf0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d   pExpr->iColumn=
12d00 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 7c 7c 0a  =OE_Rollback ||.
12d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
12d30 3d 3d 20 4f 45 5f 41 62 6f 72 74 20 7c 7c 0a 20  == OE_Abort ||. 
12d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d50 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
12d60 3d 20 4f 45 5f 46 61 69 6c 20 29 3b 0a 20 20 20  = OE_Fail );.   
12d70 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71        sqlite3Deq
12d80 75 6f 74 65 45 78 70 72 28 70 50 61 72 73 65 2d  uoteExpr(pParse-
12d90 3e 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  >db, pExpr);.   
12da0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12db0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 48 61  eAddOp4(v, OP_Ha
12dc0 6c 74 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  lt, SQLITE_CONST
12dd0 52 41 49 4e 54 2c 20 70 45 78 70 72 2d 3e 69 43  RAINT, pExpr->iC
12de0 6f 6c 75 6d 6e 2c 20 30 2c 0a 20 20 20 20 20 20  olumn, 0,.      
12df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e00 20 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e    (char*)pExpr->
12e10 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e  token.z, pExpr->
12e20 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20  token.n);.      
12e30 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
12e40 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
12e50 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 49  >iColumn == OE_I
12e60 67 6e 6f 72 65 20 29 3b 0a 20 20 20 20 20 20 20  gnore );.       
12e70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12e80 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 6e 74 65 78  Op2(v, OP_Contex
12e90 74 50 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  tPop, 0, 0);.   
12ea0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12eb0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
12ec0 74 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 74  to, 0, pParse->t
12ed0 72 69 67 53 74 61 63 6b 2d 3e 69 67 6e 6f 72 65  rigStack->ignore
12ee0 4a 75 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20  Jump);.         
12ef0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
12f00 22 72 61 69 73 65 28 49 47 4e 4f 52 45 29 22 29  "raise(IGNORE)")
12f10 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
12f20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
12f30 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ndif.  }.  sqlit
12f40 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
12f50 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
12f60 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  1);.  sqlite3Rel
12f70 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
12f80 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20  se, regFree2);. 
12f90 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d   return inReg;.}
12fa0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
12fb0 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74   code to evaluat
12fc0 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
12fd0 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
12fe0 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 61 20  sults.** into a 
12ff0 72 65 67 69 73 74 65 72 2e 20 20 52 65 74 75 72  register.  Retur
13000 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e  n the register n
13010 75 6d 62 65 72 20 77 68 65 72 65 20 74 68 65 20  umber where the 
13020 72 65 73 75 6c 74 73 0a 2a 2a 20 61 72 65 20 73  results.** are s
13030 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tored..**.** If 
13040 74 68 65 20 72 65 67 69 73 74 65 72 20 69 73 20  the register is 
13050 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  a temporary regi
13060 73 74 65 72 20 74 68 61 74 20 63 61 6e 20 62 65  ster that can be
13070 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a   deallocated,.**
13080 20 74 68 65 6e 20 77 72 69 74 65 20 69 74 73 20   then write its 
13090 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 52 65  number into *pRe
130a0 67 2e 20 20 49 66 20 74 68 65 20 72 65 73 75 6c  g.  If the resul
130b0 74 20 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f  t register is no
130c0 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 2c  .** a temporary,
130d0 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 67 20   then set *pReg 
130e0 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 69 6e 74 20  to zero..*/.int 
130f0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
13100 65 6d 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  emp(Parse *pPars
13110 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
13120 69 6e 74 20 2a 70 52 65 67 29 7b 0a 20 20 69 6e  int *pReg){.  in
13130 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
13140 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
13150 3b 0a 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c  ;.  int r2 = sql
13160 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
13170 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
13180 2c 20 72 31 29 3b 0a 20 20 69 66 28 20 72 32 3d  , r1);.  if( r2=
13190 3d 72 31 20 29 7b 0a 20 20 20 20 2a 70 52 65 67  =r1 ){.    *pReg
131a0 20 3d 20 72 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = r1;.  }else{.
131b0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
131c0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
131d0 2c 20 72 31 29 3b 0a 20 20 20 20 2a 70 52 65 67  , r1);.    *pReg
131e0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
131f0 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn r2;.}../*.** 
13200 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
13210 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65  at will evaluate
13220 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
13230 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a  r and store the.
13240 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65  ** results in re
13250 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 20 20  gister target.  
13260 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
13270 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70  guaranteed to ap
13280 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73  pear.** in regis
13290 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2f 0a 69  ter target..*/.i
132a0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
132b0 64 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  de(Parse *pParse
132c0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
132d0 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69 6e  nt target){.  in
132e0 74 20 69 6e 52 65 67 3b 0a 0a 20 20 61 73 73 65  t inReg;..  asse
132f0 72 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20  rt( target>0 && 
13300 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e  target<=pParse->
13310 6e 4d 65 6d 20 29 3b 0a 20 20 69 6e 52 65 67 20  nMem );.  inReg 
13320 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
13330 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
13340 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
13350 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
13360 2d 3e 70 56 64 62 65 20 7c 7c 20 70 50 61 72 73  ->pVdbe || pPars
13370 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
13380 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 69 6e 52  led );.  if( inR
13390 65 67 21 3d 74 61 72 67 65 74 20 26 26 20 70 50  eg!=target && pP
133a0 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20  arse->pVdbe ){. 
133b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
133c0 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp2(pParse->pVd
133d0 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e  be, OP_SCopy, in
133e0 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  Reg, target);.  
133f0 7d 0a 20 20 72 65 74 75 72 6e 20 74 61 72 67 65  }.  return targe
13400 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  t;.}../*.** Gene
13410 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 65  rate code that e
13420 76 61 6c 75 74 65 73 20 74 68 65 20 67 69 76 65  valutes the give
13430 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  n expression and
13440 20 70 75 74 73 20 74 68 65 20 72 65 73 75 6c 74   puts the result
13450 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20  .** in register 
13460 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c  target..**.** Al
13470 73 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f  so make a copy o
13480 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
13490 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 6e   results into an
134a0 6f 74 68 65 72 20 22 63 61 63 68 65 22 20 72 65  other "cache" re
134b0 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f  gister.** and mo
134c0 64 69 66 79 20 74 68 65 20 65 78 70 72 65 73 73  dify the express
134d0 69 6f 6e 20 73 6f 20 74 68 61 74 20 74 68 65 20  ion so that the 
134e0 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69 73 20  next time it is 
134f0 65 76 61 6c 75 61 74 65 64 2c 0a 2a 2a 20 74 68  evaluated,.** th
13500 65 20 72 65 73 75 6c 74 20 69 73 20 61 20 63 6f  e result is a co
13510 70 79 20 6f 66 20 74 68 65 20 63 61 63 68 65 20  py of the cache 
13520 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  register..**.** 
13530 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
13540 75 73 65 64 20 66 6f 72 20 65 78 70 72 65 73 73  used for express
13550 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 75 73  ions that are us
13560 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20  ed multiple .** 
13570 74 69 6d 65 73 2e 20 20 54 68 65 79 20 61 72 65  times.  They are
13580 20 65 76 61 6c 75 61 74 65 64 20 6f 6e 63 65 20   evaluated once 
13590 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 73 20  and the results 
135a0 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
135b0 6e 0a 2a 2a 20 61 72 65 20 72 65 75 73 65 64 2e  n.** are reused.
135c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
135d0 78 70 72 43 6f 64 65 41 6e 64 43 61 63 68 65 28  xprCodeAndCache(
135e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
135f0 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
13600 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20  target){.  Vdbe 
13610 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
13620 62 65 3b 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b  be;.  int inReg;
13630 0a 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74  .  inReg = sqlit
13640 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
13650 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
13660 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 61 72  );.  assert( tar
13670 67 65 74 3e 30 20 29 3b 0a 20 20 69 66 28 20 70  get>0 );.  if( p
13680 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47  Expr->op!=TK_REG
13690 49 53 54 45 52 20 29 7b 20 20 0a 20 20 20 20 69  ISTER ){  .    i
136a0 6e 74 20 69 4d 65 6d 3b 0a 20 20 20 20 69 4d 65  nt iMem;.    iMe
136b0 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  m = ++pParse->nM
136c0 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  em;.    sqlite3V
136d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
136e0 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 69 4d 65  Copy, inReg, iMe
136f0 6d 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69  m);.    pExpr->i
13700 54 61 62 6c 65 20 3d 20 69 4d 65 6d 3b 0a 20 20  Table = iMem;.  
13710 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
13720 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 7d 0a 20  _REGISTER;.  }. 
13730 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d   return inReg;.}
13740 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
13750 65 20 63 6f 64 65 20 74 68 61 74 20 70 75 73 68  e code that push
13760 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  es the value of 
13770 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66  every element of
13780 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78   the given.** ex
13790 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 69 6e  pression list in
137a0 74 6f 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  to a sequence of
137b0 20 72 65 67 69 73 74 65 72 73 20 62 65 67 69 6e   registers begin
137c0 6e 69 6e 67 20 61 74 20 74 61 72 67 65 74 2e 0a  ning at target..
137d0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
137e0 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   number of eleme
137f0 6e 74 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a  nts evaluated..*
13800 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
13810 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20  rCodeExprList(. 
13820 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
13830 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
13840 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
13850 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f  List *pList,   /
13860 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
13870 20 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65   list to be code
13880 64 20 2a 2f 0a 20 20 69 6e 74 20 74 61 72 67 65  d */.  int targe
13890 74 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65  t         /* Whe
138a0 72 65 20 74 6f 20 77 72 69 74 65 20 72 65 73 75  re to write resu
138b0 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  lts */.){.  stru
138c0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
138d0 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
138e0 2c 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  , n;.  assert( p
138f0 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50 61 72 73  List!=0 || pPars
13900 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
13910 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 4c 69  led );.  if( pLi
13920 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  st==0 ){.    ret
13930 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  urn 0;.  }.  ass
13940 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b  ert( target>0 );
13950 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  .  n = pList->nE
13960 78 70 72 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d  xpr;.  for(pItem
13970 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 6e 3b 20  =pList->a, i=n; 
13980 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b  i>0; i--, pItem+
13990 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  +){.    sqlite3E
139a0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
139b0 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 74 61  pItem->pExpr, ta
139c0 72 67 65 74 29 3b 0a 20 20 20 20 74 61 72 67 65  rget);.    targe
139d0 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  t++;.  }.  retur
139e0 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  n n;.}../*.** Ge
139f0 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
13a00 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73  a boolean expres
13a10 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  sion such that a
13a20 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a   jump is made.**
13a30 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64   to the label "d
13a40 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72  est" if the expr
13a50 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62  ession is true b
13a60 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20  ut execution.** 
13a70 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67  continues straig
13a80 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65  ht thru if the e
13a90 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c  xpression is fal
13aa0 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
13ab0 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c   expression eval
13ac0 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e  uates to NULL (n
13ad0 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20  either true nor 
13ae0 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20  false), then.** 
13af0 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66  take the jump if
13b00 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   the jumpIfNull 
13b10 66 6c 61 67 20 69 73 20 53 51 4c 49 54 45 5f 4a  flag is SQLITE_J
13b20 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  UMPIFNULL..**.**
13b30 20 54 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e   This code depen
13b40 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74  ds on the fact t
13b50 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b 65  hat certain toke
13b60 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54 4b  n values (ex: TK
13b70 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65 20  _EQ).** are the 
13b80 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20 76  same as opcode v
13b90 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45 71  alues (ex: OP_Eq
13ba0 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  ) that implement
13bb0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
13bc0 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e  ng.** operation.
13bd0 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e    Special commen
13be0 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e 64  ts in vdbe.c and
13bf0 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61   the mkopcodeh.a
13c00 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20  wk script in.** 
13c10 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73 73  the make process
13c20 20 63 61 75 73 65 20 74 68 65 73 65 20 76 61 6c   cause these val
13c30 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41  ues to align.  A
13c40 73 73 65 72 74 28 29 73 20 69 6e 20 74 68 65 20  ssert()s in the 
13c50 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65  code.** below ve
13c60 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e 75  rify that the nu
13c70 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e 65  mbers are aligne
13c80 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a  d correctly..*/.
13c90 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
13ca0 49 66 54 72 75 65 28 50 61 72 73 65 20 2a 70 50  IfTrue(Parse *pP
13cb0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
13cc0 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74  r, int dest, int
13cd0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20   jumpIfNull){.  
13ce0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
13cf0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f  ->pVdbe;.  int o
13d00 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67  p = 0;.  int reg
13d10 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74  Free1 = 0;.  int
13d20 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20   regFree2 = 0;. 
13d30 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20   int r1, r2;..  
13d40 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75  assert( jumpIfNu
13d50 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ll==SQLITE_JUMPI
13d60 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e  FNULL || jumpIfN
13d70 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ull==0 );.  if( 
13d80 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30  v==0 || pExpr==0
13d90 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6f 70 20   ) return;.  op 
13da0 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73  = pExpr->op;.  s
13db0 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
13dc0 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a   case TK_AND: {.
13dd0 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73        int d2 = s
13de0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
13df0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71  bel(v);.      sq
13e00 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
13e10 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
13e20 70 4c 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49 66  pLeft, d2,jumpIf
13e30 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50  Null^SQLITE_JUMP
13e40 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
13e50 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
13e60 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
13e70 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
13e80 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
13e90 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
13ea0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b  lveLabel(v, d2);
13eb0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
13ec0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
13ed0 4f 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  OR: {.      sqli
13ee0 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
13ef0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
13f00 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
13f10 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
13f20 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
13f30 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
13f40 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
13f50 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
13f60 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
13f70 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20  case TK_NOT: {. 
13f80 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
13f90 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
13fa0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
13fb0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
13fc0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
13fd0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
13fe0 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
13ff0 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
14000 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
14010 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GE:.    case TK_
14020 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
14030 45 51 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  EQ: {.      asse
14040 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74  rt( TK_LT==OP_Lt
14050 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
14060 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29  ( TK_LE==OP_Le )
14070 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14080 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a  TK_GT==OP_Gt );.
14090 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
140a0 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20  _GE==OP_Ge );.  
140b0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 45      assert( TK_E
140c0 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20  Q==OP_Eq );.    
140d0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d    assert( TK_NE=
140e0 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20  =OP_Ne );.      
140f0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
14100 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
14110 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
14120 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
14130 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
14140 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
14150 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
14160 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
14170 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
14180 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
14190 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
141a0 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
141b0 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
141c0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
141d0 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
141e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
141f0 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
14200 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
14210 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
14220 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49   TK_ISNULL==OP_I
14230 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61  sNull );.      a
14240 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c  ssert( TK_NOTNUL
14250 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  L==OP_NotNull );
14260 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
14270 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
14280 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
14290 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
142a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
142b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c  dbeAddOp2(v, op,
142c0 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20   r1, dest);.    
142d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
142e0 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
142f0 45 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 20  EN: {.      /*  
14300 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e    x BETWEEN y AN
14310 44 20 7a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  D z.      **.   
14320 20 20 20 2a 2a 20 49 73 20 65 71 75 69 76 61 6c     ** Is equival
14330 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  ent to .      **
14340 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d  .      **    x>=
14350 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 20  y AND x<=z.     
14360 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 43 6f 64   **.      ** Cod
14370 65 20 69 74 20 61 73 20 73 75 63 68 2c 20 74 61  e it as such, ta
14380 6b 69 6e 67 20 63 61 72 65 20 74 6f 20 64 6f 20  king care to do 
14390 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78  the common subex
143a0 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 20 20 2a  pression.      *
143b0 2a 20 65 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  * elementation o
143c0 66 20 78 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  f x..      */.  
143d0 20 20 20 20 45 78 70 72 20 65 78 70 72 41 6e 64      Expr exprAnd
143e0 3b 0a 20 20 20 20 20 20 45 78 70 72 20 63 6f 6d  ;.      Expr com
143f0 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 45 78 70  pLeft;.      Exp
14400 72 20 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 20  r compRight;.   
14410 20 20 20 45 78 70 72 20 65 78 70 72 58 3b 0a 0a     Expr exprX;..
14420 20 20 20 20 20 20 65 78 70 72 58 20 3d 20 2a 70        exprX = *p
14430 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
14440 20 20 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20     exprAnd.op = 
14450 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 65 78  TK_AND;.      ex
14460 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63  prAnd.pLeft = &c
14470 6f 6d 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 65  ompLeft;.      e
14480 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20  xprAnd.pRight = 
14490 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 20 20  &compRight;.    
144a0 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20    compLeft.op = 
144b0 54 4b 5f 47 45 3b 0a 20 20 20 20 20 20 63 6f 6d  TK_GE;.      com
144c0 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65  pLeft.pLeft = &e
144d0 78 70 72 58 3b 0a 20 20 20 20 20 20 63 6f 6d 70  xprX;.      comp
144e0 4c 65 66 74 2e 70 52 69 67 68 74 20 3d 20 70 45  Left.pRight = pE
144f0 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d  xpr->pList->a[0]
14500 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 63 6f  .pExpr;.      co
14510 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b 5f  mpRight.op = TK_
14520 4c 45 3b 0a 20 20 20 20 20 20 63 6f 6d 70 52 69  LE;.      compRi
14530 67 68 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70  ght.pLeft = &exp
14540 72 58 3b 0a 20 20 20 20 20 20 63 6f 6d 70 52 69  rX;.      compRi
14550 67 68 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78  ght.pRight = pEx
14560 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  pr->pList->a[1].
14570 70 45 78 70 72 3b 0a 20 20 20 20 20 20 65 78 70  pExpr;.      exp
14580 72 58 2e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69  rX.iTable = sqli
14590 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
145a0 70 50 61 72 73 65 2c 20 26 65 78 70 72 58 2c 20  pParse, &exprX, 
145b0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
145c0 20 20 65 78 70 72 58 2e 6f 70 20 3d 20 54 4b 5f    exprX.op = TK_
145d0 52 45 47 49 53 54 45 52 3b 0a 20 20 20 20 20 20  REGISTER;.      
145e0 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
145f0 65 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41  e(pParse, &exprA
14600 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  nd, dest, jumpIf
14610 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
14620 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
14630 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72  fault: {.      r
14640 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
14650 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
14660 70 45 78 70 72 2c 20 26 72 65 67 46 72 65 65 31  pExpr, &regFree1
14670 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14680 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
14690 5f 49 66 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a  _If, r1, dest, j
146a0 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20  umpIfNull!=0);. 
146b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
146c0 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  }.  }.  sqlite3R
146d0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
146e0 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b  arse, regFree1);
146f0 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
14700 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
14710 20 72 65 67 46 72 65 65 32 29 3b 20 20 0a 7d 0a   regFree2);  .}.
14720 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
14730 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65  code for a boole
14740 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75  an expression su
14750 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69  ch that a jump i
14760 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65  s made.** to the
14770 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66   label "dest" if
14780 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
14790 69 73 20 66 61 6c 73 65 20 62 75 74 20 65 78 65  is false but exe
147a0 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e  cution.** contin
147b0 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72  ues straight thr
147c0 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  u if the express
147d0 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a  ion is true..**.
147e0 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
147f0 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74  sion evaluates t
14800 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20  o NULL (neither 
14810 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 20  true nor false) 
14820 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20  then.** jump if 
14830 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 53 51  jumpIfNull is SQ
14840 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20  LITE_JUMPIFNULL 
14850 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  or fall through 
14860 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a  if jumpIfNull.**
14870 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73   is 0..*/.void s
14880 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
14890 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
148a0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
148b0 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70  t dest, int jump
148c0 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20  IfNull){.  Vdbe 
148d0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
148e0 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30  be;.  int op = 0
148f0 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31  ;.  int regFree1
14900 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46   = 0;.  int regF
14910 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ree2 = 0;.  int 
14920 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72  r1, r2;..  asser
14930 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53  t( jumpIfNull==S
14940 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
14950 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   || jumpIfNull==
14960 30 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  0 );.  if( v==0 
14970 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  || pExpr==0 ) re
14980 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  turn;..  /* The 
14990 76 61 6c 75 65 20 6f 66 20 70 45 78 70 72 2d 3e  value of pExpr->
149a0 6f 70 20 61 6e 64 20 6f 70 20 61 72 65 20 72 65  op and op are re
149b0 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  lated as follows
149c0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
149d0 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20 20 20    pExpr->op     
149e0 20 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20         op.  **  
149f0 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20       ---------  
14a00 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d          --------
14a10 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  --.  **       TK
14a20 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20 20 20 20  _ISNULL         
14a30 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a   OP_NotNull.  **
14a40 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c         TK_NOTNUL
14a50 4c 20 20 20 20 20 20 20 20 20 4f 50 5f 49 73 4e  L         OP_IsN
14a60 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  ull.  **       T
14a70 4b 5f 4e 45 20 20 20 20 20 20 20 20 20 20 20 20  K_NE            
14a80 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20    OP_Eq.  **    
14a90 20 20 20 54 4b 5f 45 51 20 20 20 20 20 20 20 20     TK_EQ        
14aa0 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a        OP_Ne.  **
14ab0 20 20 20 20 20 20 20 54 4b 5f 47 54 20 20 20 20         TK_GT    
14ac0 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a            OP_Le.
14ad0 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45    **       TK_LE
14ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
14af0 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Gt.  **       T
14b00 4b 5f 47 45 20 20 20 20 20 20 20 20 20 20 20 20  K_GE            
14b10 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20    OP_Lt.  **    
14b20 20 20 20 54 4b 5f 4c 54 20 20 20 20 20 20 20 20     TK_LT        
14b30 20 20 20 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a        OP_Ge.  **
14b40 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20  .  ** For other 
14b50 76 61 6c 75 65 73 20 6f 66 20 70 45 78 70 72 2d  values of pExpr-
14b60 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64 65 66  >op, op is undef
14b70 69 6e 65 64 20 61 6e 64 20 75 6e 75 73 65 64 2e  ined and unused.
14b80 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  .  ** The value 
14b90 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63  of TK_ and OP_ c
14ba0 6f 6e 73 74 61 6e 74 73 20 61 72 65 20 61 72 72  onstants are arr
14bb0 61 6e 67 65 64 20 73 75 63 68 20 74 68 61 74 20  anged such that 
14bc0 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70  we.  ** can comp
14bd0 75 74 65 20 74 68 65 20 6d 61 70 70 69 6e 67 20  ute the mapping 
14be0 61 62 6f 76 65 20 75 73 69 6e 67 20 74 68 65 20  above using the 
14bf0 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65 73  following expres
14c00 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72  sion..  ** Asser
14c10 74 28 29 73 20 76 65 72 69 66 79 20 74 68 61 74  t()s verify that
14c20 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e   the computation
14c30 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a   is correct..  *
14c40 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45 78 70 72  /.  op = ((pExpr
14c50 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26  ->op+(TK_ISNULL&
14c60 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c  1))^1)-(TK_ISNUL
14c70 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69  L&1);..  /* Veri
14c80 66 79 20 63 6f 72 72 65 63 74 20 61 6c 69 67 6e  fy correct align
14c90 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20  ment of TK_ and 
14ca0 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20  OP_ constants.  
14cb0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  */.  assert( pEx
14cc0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c  pr->op!=TK_ISNUL
14cd0 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e  L || op==OP_NotN
14ce0 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ull );.  assert(
14cf0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e   pExpr->op!=TK_N
14d00 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50  OTNULL || op==OP
14d10 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73  _IsNull );.  ass
14d20 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
14d30 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_NE || op==OP_
14d40 45 71 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Eq );.  assert( 
14d50 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51  pExpr->op!=TK_EQ
14d60 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b   || op==OP_Ne );
14d70 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
14d80 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f  ->op!=TK_LT || o
14d90 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73  p==OP_Ge );.  as
14da0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
14db0 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_LE || op==OP
14dc0 5f 47 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Gt );.  assert(
14dd0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47   pExpr->op!=TK_G
14de0 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29  T || op==OP_Le )
14df0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
14e00 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20  r->op!=TK_GE || 
14e10 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20  op==OP_Lt );..  
14e20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
14e30 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
14e40 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 73 71  _AND: {.      sq
14e50 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
14e60 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
14e70 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
14e80 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
14e90 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
14ea0 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
14eb0 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
14ec0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
14ed0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
14ee0 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20      case TK_OR: 
14ef0 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d  {.      int d2 =
14f00 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
14f10 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
14f20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
14f30 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
14f40 3e 70 4c 65 66 74 2c 20 64 32 2c 20 6a 75 6d 70  >pLeft, d2, jump
14f50 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55  IfNull^SQLITE_JU
14f60 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
14f70 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
14f80 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
14f90 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
14fa0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
14fb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
14fc0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
14fd0 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  2);.      break;
14fe0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
14ff0 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_NOT: {.      
15000 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
15010 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
15020 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
15030 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
15040 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
15050 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
15060 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
15070 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
15080 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
15090 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
150a0 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a    case TK_EQ: {.
150b0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
150c0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
150d0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
150e0 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
150f0 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
15100 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
15110 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
15120 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
15130 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
15140 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
15150 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
15160 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
15170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15180 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75  r1, r2, dest, ju
15190 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
151a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
151b0 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
151c0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
151d0 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 72  TNULL: {.      r
151e0 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
151f0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
15200 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
15210 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
15220 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15230 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73  2(v, op, r1, des
15240 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
15250 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
15260 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20  TK_BETWEEN: {.  
15270 20 20 20 20 2f 2a 20 20 20 20 78 20 42 45 54 57      /*    x BETW
15280 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20  EEN y AND z.    
15290 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 73    **.      ** Is
152a0 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a   equivalent to .
152b0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
152c0 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c  *    x>=y AND x<
152d0 3d 7a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  =z.      **.    
152e0 20 20 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20    ** Code it as 
152f0 73 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72  such, taking car
15300 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d  e to do the comm
15310 6f 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  on subexpression
15320 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e  .      ** elemen
15330 74 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 20 20 20  tation of x..   
15340 20 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72     */.      Expr
15350 20 65 78 70 72 41 6e 64 3b 0a 20 20 20 20 20 20   exprAnd;.      
15360 45 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b 0a 20  Expr compLeft;. 
15370 20 20 20 20 20 45 78 70 72 20 63 6f 6d 70 52 69       Expr compRi
15380 67 68 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  ght;.      Expr 
15390 65 78 70 72 58 3b 0a 0a 20 20 20 20 20 20 65 78  exprX;..      ex
153a0 70 72 58 20 3d 20 2a 70 45 78 70 72 2d 3e 70 4c  prX = *pExpr->pL
153b0 65 66 74 3b 0a 20 20 20 20 20 20 65 78 70 72 41  eft;.      exprA
153c0 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a  nd.op = TK_AND;.
153d0 20 20 20 20 20 20 65 78 70 72 41 6e 64 2e 70 4c        exprAnd.pL
153e0 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b  eft = &compLeft;
153f0 0a 20 20 20 20 20 20 65 78 70 72 41 6e 64 2e 70  .      exprAnd.p
15400 52 69 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67  Right = &compRig
15410 68 74 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65  ht;.      compLe
15420 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a 20  ft.op = TK_GE;. 
15430 20 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c       compLeft.pL
15440 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20  eft = &exprX;.  
15450 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69      compLeft.pRi
15460 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  ght = pExpr->pLi
15470 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
15480 20 20 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e        compRight.
15490 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 20 20  op = TK_LE;.    
154a0 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66    compRight.pLef
154b0 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 20 20  t = &exprX;.    
154c0 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52 69 67    compRight.pRig
154d0 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  ht = pExpr->pLis
154e0 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
154f0 20 20 20 20 20 65 78 70 72 58 2e 69 54 61 62 6c       exprX.iTabl
15500 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  e = sqlite3ExprC
15510 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
15520 26 65 78 70 72 58 2c 20 26 72 65 67 46 72 65 65  &exprX, &regFree
15530 31 29 3b 0a 20 20 20 20 20 20 65 78 70 72 58 2e  1);.      exprX.
15540 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52  op = TK_REGISTER
15550 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
15560 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
15570 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73  e, &exprAnd, des
15580 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
15590 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
155a0 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
155b0 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  {.      r1 = sql
155c0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
155d0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
155e0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
155f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15600 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op3(v, OP_IfNot,
15610 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49   r1, dest, jumpI
15620 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20  fNull!=0);.     
15630 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
15640 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
15650 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
15660 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73  , regFree1);.  s
15670 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
15680 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
15690 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Free2);.}../*.**
156a0 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61   Do a deep compa
156b0 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70  rison of two exp
156c0 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20  ression trees.  
156d0 52 65 74 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e  Return TRUE (non
156e0 2d 7a 65 72 6f 29 0a 2a 2a 20 69 66 20 74 68 65  -zero).** if the
156f0 79 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 20  y are identical 
15700 61 6e 64 20 72 65 74 75 72 6e 20 46 41 4c 53 45  and return FALSE
15710 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72 20   if they differ 
15720 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a  in any way..**.*
15730 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 69 73  * Sometimes this
15740 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
15750 74 75 72 6e 20 46 41 4c 53 45 20 65 76 65 6e 20  turn FALSE even 
15760 69 66 20 74 68 65 20 74 77 6f 20 65 78 70 72 65  if the two expre
15770 73 73 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79  ssions.** really
15780 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 2e   are equivalent.
15790 20 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 70    If we cannot p
157a0 72 6f 76 65 20 74 68 61 74 20 74 68 65 20 65 78  rove that the ex
157b0 70 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a  pressions are.**
157c0 20 69 64 65 6e 74 69 63 61 6c 2c 20 77 65 20 72   identical, we r
157d0 65 74 75 72 6e 20 46 41 4c 53 45 20 6a 75 73 74  eturn FALSE just
157e0 20 74 6f 20 62 65 20 73 61 66 65 2e 20 20 53 6f   to be safe.  So
157f0 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
15800 0a 2a 2a 20 72 65 74 75 72 6e 73 20 66 61 6c 73  .** returns fals
15810 65 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e  e, then you do n
15820 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66  ot really know f
15830 6f 72 20 63 65 72 74 61 69 6e 20 69 66 20 74 68  or certain if th
15840 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73  e two.** express
15850 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d  ions are the sam
15860 65 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20 67  e.  But if you g
15870 65 74 20 61 20 54 52 55 45 20 72 65 74 75 72 6e  et a TRUE return
15880 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63 61  , then you.** ca
15890 6e 20 62 65 20 73 75 72 65 20 74 68 65 20 65 78  n be sure the ex
158a0 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68  pressions are th
158b0 65 20 73 61 6d 65 2e 20 20 49 6e 20 74 68 65 20  e same.  In the 
158c0 70 6c 61 63 65 73 20 77 68 65 72 65 0a 2a 2a 20  places where.** 
158d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
158e0 75 73 65 64 2c 20 69 74 20 64 6f 65 73 20 6e 6f  used, it does no
158f0 74 20 68 75 72 74 20 74 6f 20 67 65 74 20 61 6e  t hurt to get an
15900 20 65 78 74 72 61 20 46 41 4c 53 45 20 2d 20 74   extra FALSE - t
15910 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68  hat.** just migh
15920 74 20 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65  t result in some
15930 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72   slightly slower
15940 20 63 6f 64 65 2e 20 20 42 75 74 20 72 65 74 75   code.  But retu
15950 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f  rning.** an inco
15960 72 72 65 63 74 20 54 52 55 45 20 63 6f 75 6c 64  rrect TRUE could
15970 20 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75   lead to a malfu
15980 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  nction..*/.int s
15990 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
159a0 65 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72  e(Expr *pA, Expr
159b0 20 2a 70 42 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   *pB){.  int i;.
159c0 20 20 69 66 28 20 70 41 3d 3d 30 7c 7c 70 42 3d    if( pA==0||pB=
159d0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
159e0 20 70 42 3d 3d 70 41 3b 0a 20 20 7d 0a 20 20 69   pB==pA;.  }.  i
159f0 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f  f( pA->op!=pB->o
15a00 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  p ) return 0;.  
15a10 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26  if( (pA->flags &
15a20 20 45 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28   EP_Distinct)!=(
15a30 70 42 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44  pB->flags & EP_D
15a40 69 73 74 69 6e 63 74 29 20 29 20 72 65 74 75 72  istinct) ) retur
15a50 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  n 0;.  if( !sqli
15a60 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
15a70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c  A->pLeft, pB->pL
15a80 65 66 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b  eft) ) return 0;
15a90 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45  .  if( !sqlite3E
15aa0 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70  xprCompare(pA->p
15ab0 52 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68  Right, pB->pRigh
15ac0 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  t) ) return 0;. 
15ad0 20 69 66 28 20 70 41 2d 3e 70 4c 69 73 74 20 29   if( pA->pList )
15ae0 7b 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 70 4c  {.    if( pB->pL
15af0 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
15b00 30 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 70  0;.    if( pA->p
15b10 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 42 2d  List->nExpr!=pB-
15b20 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 20  >pList->nExpr ) 
15b30 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f  return 0;.    fo
15b40 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 70 4c 69  r(i=0; i<pA->pLi
15b50 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
15b60 0a 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69  .      if( !sqli
15b70 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
15b80 41 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  A->pList->a[i].p
15b90 45 78 70 72 2c 20 70 42 2d 3e 70 4c 69 73 74 2d  Expr, pB->pList-
15ba0 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[i].pExpr) ){.
15bb0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
15bc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15bd0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 2d 3e    }else if( pB->
15be0 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 72 65 74  pList ){.    ret
15bf0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
15c00 20 70 41 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20   pA->pSelect || 
15c10 70 42 2d 3e 70 53 65 6c 65 63 74 20 29 20 72 65  pB->pSelect ) re
15c20 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41  turn 0;.  if( pA
15c30 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54  ->iTable!=pB->iT
15c40 61 62 6c 65 20 7c 7c 20 70 41 2d 3e 69 43 6f 6c  able || pA->iCol
15c50 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e  umn!=pB->iColumn
15c60 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
15c70 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  f( pA->op!=TK_CO
15c80 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 74 6f 6b 65  LUMN && pA->toke
15c90 6e 2e 7a 20 29 7b 0a 20 20 20 20 69 66 28 20 70  n.z ){.    if( p
15ca0 42 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 20  B->token.z==0 ) 
15cb0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66  return 0;.    if
15cc0 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 70  ( pB->token.n!=p
15cd0 41 2d 3e 74 6f 6b 65 6e 2e 6e 20 29 20 72 65 74  A->token.n ) ret
15ce0 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 73  urn 0;.    if( s
15cf0 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28  qlite3StrNICmp((
15d00 63 68 61 72 2a 29 70 41 2d 3e 74 6f 6b 65 6e 2e  char*)pA->token.
15d10 7a 2c 28 63 68 61 72 2a 29 70 42 2d 3e 74 6f 6b  z,(char*)pB->tok
15d20 65 6e 2e 7a 2c 70 42 2d 3e 74 6f 6b 65 6e 2e 6e  en.z,pB->token.n
15d30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )!=0 ){.      re
15d40 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
15d50 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
15d60 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
15d70 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
15d80 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
15d90 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e  ] array.  Return
15da0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a   the index of.**
15db0 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74   the new element
15dc0 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61  .  Return a nega
15dd0 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d  tive number if m
15de0 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a  alloc fails..*/.
15df0 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67  static int addAg
15e00 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69  gInfoColumn(sqli
15e10 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f  te3 *db, AggInfo
15e20 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20   *pInfo){.  int 
15e30 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c  i;.  pInfo->aCol
15e40 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41   = sqlite3ArrayA
15e50 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20  llocate(.       
15e60 64 62 2c 0a 20 20 20 20 20 20 20 70 49 6e 66 6f  db,.       pInfo
15e70 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73  ->aCol,.       s
15e80 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f  izeof(pInfo->aCo
15e90 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 33 2c  l[0]),.       3,
15ea0 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e  .       &pInfo->
15eb0 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20  nColumn,.       
15ec0 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 41  &pInfo->nColumnA
15ed0 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 20 26 69 0a  lloc,.       &i.
15ee0 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b    );.  return i;
15ef0 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64  .}    ../*.** Ad
15f00 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
15f10 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d  to the pAggInfo-
15f20 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20  >aFunc[] array. 
15f30 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
15f40 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  x of.** the new 
15f50 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  element.  Return
15f60 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62   a negative numb
15f70 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69  er if malloc fai
15f80 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
15f90 74 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63  t addAggInfoFunc
15fa0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67  (sqlite3 *db, Ag
15fb0 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20  gInfo *pInfo){. 
15fc0 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d   int i;.  pInfo-
15fd0 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33  >aFunc = sqlite3
15fe0 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20  ArrayAllocate(. 
15ff0 20 20 20 20 20 20 64 62 2c 20 0a 20 20 20 20 20        db, .     
16000 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a    pInfo->aFunc,.
16010 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49         sizeof(pI
16020 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a  nfo->aFunc[0]),.
16030 20 20 20 20 20 20 20 33 2c 0a 20 20 20 20 20 20         3,.      
16040 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a   &pInfo->nFunc,.
16050 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e         &pInfo->n
16060 46 75 6e 63 41 6c 6c 6f 63 2c 0a 20 20 20 20 20  FuncAlloc,.     
16070 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75    &i.  );.  retu
16080 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a  rn i;.}    ../*.
16090 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 78 46  ** This is an xF
160a0 75 6e 63 20 66 6f 72 20 77 61 6c 6b 45 78 70 72  unc for walkExpr
160b0 54 72 65 65 28 29 20 75 73 65 64 20 74 6f 20 69  Tree() used to i
160c0 6d 70 6c 65 6d 65 6e 74 20 0a 2a 2a 20 73 71 6c  mplement .** sql
160d0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
160e0 67 67 72 65 67 61 74 65 73 28 29 2e 20 20 53 65  ggregates().  Se
160f0 65 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  e sqlite3ExprAna
16100 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 0a 2a  lyzeAggregates.*
16110 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  * for additional
16120 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a   information..**
16130 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
16140 20 61 6e 61 6c 79 7a 65 73 20 74 68 65 20 61 67   analyzes the ag
16150 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
16160 20 61 74 20 70 45 78 70 72 2e 0a 2a 2f 0a 73 74   at pExpr..*/.st
16170 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65  atic int analyze
16180 41 67 67 72 65 67 61 74 65 28 76 6f 69 64 20 2a  Aggregate(void *
16190 70 41 72 67 2c 20 45 78 70 72 20 2a 70 45 78 70  pArg, Expr *pExp
161a0 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e  r){.  int i;.  N
161b0 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20  ameContext *pNC 
161c0 3d 20 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  = (NameContext *
161d0 29 70 41 72 67 3b 0a 20 20 50 61 72 73 65 20 2a  )pArg;.  Parse *
161e0 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
161f0 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20  arse;.  SrcList 
16200 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d  *pSrcList = pNC-
16210 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 41 67 67  >pSrcList;.  Agg
16220 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d  Info *pAggInfo =
16230 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a   pNC->pAggInfo;.
16240 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
16250 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
16260 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a   TK_AGG_COLUMN:.
16270 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
16280 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 43  MN: {.      /* C
16290 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
162a0 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20  he column is in 
162b0 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  one of the table
162c0 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20  s in the FROM.  
162d0 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66      ** clause of
162e0 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71   the aggregate q
162f0 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 66  uery */.      if
16300 28 20 70 53 72 63 4c 69 73 74 20 29 7b 0a 20 20  ( pSrcList ){.  
16310 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
16320 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
16330 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a   = pSrcList->a;.
16340 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
16350 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72   i<pSrcList->nSr
16360 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
16370 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75  {.          stru
16380 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
16390 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  pCol;.          
163a0 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  if( pExpr->iTabl
163b0 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  e==pItem->iCurso
163c0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  r ){.           
163d0 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
163e0 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d  this point, it m
163f0 65 61 6e 73 20 74 68 61 74 20 70 45 78 70 72 20  eans that pExpr 
16400 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c  refers to a tabl
16410 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
16420 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20   that is in the 
16430 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
16440 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65  he aggregate que
16450 72 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20  ry.  .          
16460 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20    **.           
16470 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72   ** Make an entr
16480 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  y for the column
16490 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   in pAggInfo->aC
164a0 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20 20  ol[] if there.  
164b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20            ** is 
164c0 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68 65  not an entry the
164d0 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  re already..    
164e0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
164f0 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20         int k;.  
16500 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d            pCol =
16510 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b   pAggInfo->aCol;
16520 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
16530 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f  (k=0; k<pAggInfo
16540 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20  ->nColumn; k++, 
16550 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  pCol++){.       
16560 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d         if( pCol-
16570 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e  >iTable==pExpr->
16580 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20  iTable &&.      
16590 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
165a0 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72  ->iColumn==pExpr
165b0 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->iColumn ){.   
165c0 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
165d0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
165e0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
165f0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
16600 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e  ( (k>=pAggInfo->
16610 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20  nColumn).       
16620 20 20 20 20 20 20 26 26 20 28 6b 20 3d 20 61 64        && (k = ad
16630 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70  dAggInfoColumn(p
16640 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49  Parse->db, pAggI
16650 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20 20  nfo))>=0 .      
16660 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
16670 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70         pCol = &p
16680 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d  AggInfo->aCol[k]
16690 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
166a0 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78  pCol->pTab = pEx
166b0 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  pr->pTab;.      
166c0 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54          pCol->iT
166d0 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54  able = pExpr->iT
166e0 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20  able;.          
166f0 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d      pCol->iColum
16700 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  n = pExpr->iColu
16710 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  mn;.            
16720 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b    pCol->iMem = +
16730 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
16740 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
16750 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
16760 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
16770 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72       pCol->pExpr
16780 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20   = pExpr;.      
16790 20 20 20 20 20 20 20 20 69 66 28 20 70 41 67 67          if( pAgg
167a0 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29  Info->pGroupBy )
167b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
167c0 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20    int j, n;.    
167d0 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
167e0 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67 67  List *pGB = pAgg
167f0 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a  Info->pGroupBy;.
16800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16810 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
16820 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47  item *pTerm = pG
16830 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20 20  B->a;.          
16840 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e        n = pGB->n
16850 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
16860 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
16870 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b  <n; j++, pTerm++
16880 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
16890 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20       Expr *pE = 
168a0 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
168b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168c0 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43  if( pE->op==TK_C
168d0 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61  OLUMN && pE->iTa
168e0 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  ble==pExpr->iTab
168f0 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  le &&.          
16900 20 20 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e              pE->
16910 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e  iColumn==pExpr->
16920 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
16930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
16940 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
16950 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  mn = j;.        
16960 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
16970 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
16980 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
16990 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
169a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
169b0 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d         if( pCol-
169c0 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30  >iSorterColumn<0
169d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
169e0 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65      pCol->iSorte
169f0 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e  rColumn = pAggIn
16a00 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  fo->nSortingColu
16a10 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  mn++;.          
16a20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
16a30 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
16a40 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77 20  /* There is now 
16a50 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45 78  an entry for pEx
16a60 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e  pr in pAggInfo->
16a70 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20  aCol[] (either. 
16a80 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65             ** be
16a90 63 61 75 73 65 20 69 74 20 77 61 73 20 74 68 65  cause it was the
16aa0 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65 63  re before or bec
16ab0 61 75 73 65 20 77 65 20 6a 75 73 74 20 63 72 65  ause we just cre
16ac0 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20 20  ated it)..      
16ad0 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74        ** Convert
16ae0 20 74 68 65 20 70 45 78 70 72 20 74 6f 20 62 65   the pExpr to be
16af0 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e   a TK_AGG_COLUMN
16b00 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74 68   referring to th
16b10 61 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  at.            *
16b20 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  * pAggInfo->aCol
16b30 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20 20  [] entry..      
16b40 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
16b50 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67       pExpr->pAgg
16b60 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b  Info = pAggInfo;
16b70 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
16b80 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f  pr->op = TK_AGG_
16b90 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20  COLUMN;.        
16ba0 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20      pExpr->iAgg 
16bb0 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = k;.           
16bc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
16bd0 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45 78    } /* endif pEx
16be0 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65  pr->iTable==pIte
16bf0 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20 20  m->iCursor */.  
16c00 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 6c        } /* end l
16c10 6f 6f 70 20 6f 76 65 72 20 70 53 72 63 4c 69 73  oop over pSrcLis
16c20 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  t */.      }.   
16c30 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
16c40 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
16c50 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  GG_FUNCTION: {. 
16c60 20 20 20 20 20 2f 2a 20 54 68 65 20 70 4e 43 2d       /* The pNC-
16c70 3e 6e 44 65 70 74 68 3d 3d 30 20 74 65 73 74 20  >nDepth==0 test 
16c80 63 61 75 73 65 73 20 61 67 67 72 65 67 61 74 65  causes aggregate
16c90 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 73 75   functions in su
16ca0 62 71 75 65 72 69 65 73 0a 20 20 20 20 20 20 2a  bqueries.      *
16cb0 2a 20 74 6f 20 62 65 20 69 67 6e 6f 72 65 64 20  * to be ignored 
16cc0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4e 43  */.      if( pNC
16cd0 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 29 7b 0a 20  ->nDepth==0 ){. 
16ce0 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20         /* Check 
16cf0 74 6f 20 73 65 65 20 69 66 20 70 45 78 70 72 20  to see if pExpr 
16d00 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f  is a duplicate o
16d10 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65 67  f another aggreg
16d20 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ate .        ** 
16d30 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73  function that is
16d40 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
16d50 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75  pAggInfo structu
16d60 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  re.        */.  
16d70 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
16d80 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d  Info_func *pItem
16d90 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75   = pAggInfo->aFu
16da0 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  nc;.        for(
16db0 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
16dc0 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74  >nFunc; i++, pIt
16dd0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  em++){.         
16de0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
16df0 43 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70  Compare(pItem->p
16e00 45 78 70 72 2c 20 70 45 78 70 72 29 20 29 7b 0a  Expr, pExpr) ){.
16e10 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
16e20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
16e30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16e40 20 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f   if( i>=pAggInfo
16e50 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20 20  ->nFunc ){.     
16e60 20 20 20 20 20 2f 2a 20 70 45 78 70 72 20 69 73       /* pExpr is
16e70 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65   original.  Make
16e80 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20   a new entry in 
16e90 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
16ea0 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ].          */. 
16eb0 20 20 20 20 20 20 20 20 20 75 38 20 65 6e 63 20           u8 enc 
16ec0 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62  = ENC(pParse->db
16ed0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d  );.          i =
16ee0 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28   addAggInfoFunc(
16ef0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67  pParse->db, pAgg
16f00 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  Info);.         
16f10 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20   if( i>=0 ){.   
16f20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 20 3d           pItem =
16f30 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e   &pAggInfo->aFun
16f40 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  c[i];.          
16f50 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d    pItem->pExpr =
16f60 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20   pExpr;.        
16f70 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20      pItem->iMem 
16f80 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
16f90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
16fa0 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c  tem->pFunc = sql
16fb0 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
16fc0 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20  (pParse->db,.   
16fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fe0 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f  (char*)pExpr->to
16ff0 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f  ken.z, pExpr->to
17000 6b 65 6e 2e 6e 2c 0a 20 20 20 20 20 20 20 20 20  ken.n,.         
17010 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
17020 3e 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e  >pList ? pExpr->
17030 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
17040 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  , enc, 0);.     
17050 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
17060 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73  ->flags & EP_Dis
17070 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 20  tinct ){.       
17080 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44         pItem->iD
17090 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65  istinct = pParse
170a0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
170b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
170c0 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
170d0 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31  ->iDistinct = -1
170e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
170f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
17100 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
17110 20 4d 61 6b 65 20 70 45 78 70 72 20 70 6f 69 6e   Make pExpr poin
17120 74 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72  t to the appropr
17130 69 61 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61  iate pAggInfo->a
17140 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20  Func[] entry.   
17150 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
17160 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 69 3b  pExpr->iAgg = i;
17170 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
17180 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49  pAggInfo = pAggI
17190 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74  nfo;.        ret
171a0 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
171b0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
171c0 65 63 75 72 73 69 76 65 6c 79 20 77 61 6c 6b 20  ecursively walk 
171d0 73 75 62 71 75 65 72 69 65 73 20 6c 6f 6f 6b 69  subqueries looki
171e0 6e 67 20 66 6f 72 20 54 4b 5f 43 4f 4c 55 4d 4e  ng for TK_COLUMN
171f0 20 6e 6f 64 65 73 20 74 68 61 74 20 6e 65 65 64   nodes that need
17200 0a 20 20 2a 2a 20 74 6f 20 62 65 20 63 68 61 6e  .  ** to be chan
17210 67 65 64 20 74 6f 20 54 4b 5f 41 47 47 5f 43 4f  ged to TK_AGG_CO
17220 4c 55 4d 4e 2e 20 20 42 75 74 20 69 6e 63 72 65  LUMN.  But incre
17230 6d 65 6e 74 20 6e 44 65 70 74 68 20 73 6f 20 74  ment nDepth so t
17240 68 61 74 0a 20 20 2a 2a 20 54 4b 5f 41 47 47 5f  hat.  ** TK_AGG_
17250 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69  FUNCTION nodes i
17260 6e 20 73 75 62 71 75 65 72 69 65 73 20 77 69 6c  n subqueries wil
17270 6c 20 62 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a  l be unchanged..
17280 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72    */.  if( pExpr
17290 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
172a0 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2b 2b 3b 0a   pNC->nDepth++;.
172b0 20 20 20 20 77 61 6c 6b 53 65 6c 65 63 74 45 78      walkSelectEx
172c0 70 72 28 70 45 78 70 72 2d 3e 70 53 65 6c 65 63  pr(pExpr->pSelec
172d0 74 2c 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67  t, analyzeAggreg
172e0 61 74 65 2c 20 70 4e 43 29 3b 0a 20 20 20 20 70  ate, pNC);.    p
172f0 4e 43 2d 3e 6e 44 65 70 74 68 2d 2d 3b 0a 20 20  NC->nDepth--;.  
17300 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
17310 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74  ./*.** Analyze t
17320 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
17330 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ion looking for 
17340 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
17350 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76  ons and.** for v
17360 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65  ariables that ne
17370 65 64 20 74 6f 20 62 65 20 61 64 64 65 64 20 74  ed to be added t
17380 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41  o the pParse->aA
17390 67 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 20 4d  gg[] array..** M
173a0 61 6b 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 65  ake additional e
173b0 6e 74 72 69 65 73 20 74 6f 20 74 68 65 20 70 50  ntries to the pP
173c0 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72  arse->aAgg[] arr
173d0 61 79 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  ay as necessary.
173e0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
173f0 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ine should only 
17400 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  be called after 
17410 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68  the expression h
17420 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79  as been.** analy
17430 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 45 78  zed by sqlite3Ex
17440 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29  prResolveNames()
17450 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
17460 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
17470 65 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65  egates(NameConte
17480 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70  xt *pNC, Expr *p
17490 45 78 70 72 29 7b 0a 20 20 77 61 6c 6b 45 78 70  Expr){.  walkExp
174a0 72 54 72 65 65 28 70 45 78 70 72 2c 20 61 6e 61  rTree(pExpr, ana
174b0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 2c 20 70  lyzeAggregate, p
174c0 4e 43 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61  NC);.}../*.** Ca
174d0 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  ll sqlite3ExprAn
174e0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
174f0 29 20 66 6f 72 20 65 76 65 72 79 20 65 78 70 72  ) for every expr
17500 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20  ession in an.** 
17510 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
17520 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
17530 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a  ber of errors..*
17540 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
17550 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 20 61   is found, the a
17560 6e 61 6c 79 73 69 73 20 69 73 20 63 75 74 20 73  nalysis is cut s
17570 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  hort..*/.void sq
17580 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
17590 41 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74  AggList(NameCont
175a0 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69  ext *pNC, ExprLi
175b0 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74  st *pList){.  st
175c0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
175d0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74  em *pItem;.  int
175e0 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20   i;.  if( pList 
175f0 29 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d  ){.    for(pItem
17600 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20  =pList->a, i=0; 
17610 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
17620 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
17630 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
17640 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
17650 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45  s(pNC, pItem->pE
17660 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  xpr);.    }.  }.
17670 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
17680 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 20  e or deallocate 
17690 74 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65  temporary use re
176a0 67 69 73 74 65 72 73 20 64 75 72 69 6e 67 20 63  gisters during c
176b0 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 0a  ode generation..
176c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65  */.int sqlite3Ge
176d0 74 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a  tTempReg(Parse *
176e0 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70  pParse){.  if( p
176f0 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20  Parse->nTempReg 
17700 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50  ){.    return pP
17710 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 2d  arse->aTempReg[-
17720 2d 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65  -pParse->nTempRe
17730 67 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  g];.  }else{.   
17740 20 72 65 74 75 72 6e 20 2b 2b 70 50 61 72 73 65   return ++pParse
17750 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 7d 0a 76 6f  ->nMem;.  }.}.vo
17760 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  id sqlite3Releas
17770 65 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a  eTempReg(Parse *
17780 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
17790 29 7b 0a 20 20 69 66 28 20 69 52 65 67 20 26 26  ){.  if( iReg &&
177a0 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
177b0 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72  g<ArraySize(pPar
177c0 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b  se->aTempReg) ){
177d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 52 65  .    assert( iRe
177e0 67 3e 30 20 29 3b 0a 20 20 20 20 70 50 61 72 73  g>0 );.    pPars
177f0 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72  e->aTempReg[pPar
17800 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20  se->nTempReg++] 
17810 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = iReg;.  }.}../
17820 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72  *.** Allocate or
17830 20 64 65 61 6c 6c 6f 63 61 74 65 20 61 20 62 6c   deallocate a bl
17840 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e 73  ock of nReg cons
17850 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72  ecutive register
17860 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  s.*/.int sqlite3
17870 47 65 74 54 65 6d 70 52 61 6e 67 65 28 50 61 72  GetTempRange(Par
17880 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
17890 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  nReg){.  int i;.
178a0 20 20 69 66 28 20 6e 52 65 67 3c 3d 70 50 61 72    if( nReg<=pPar
178b0 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 29 7b  se->nRangeReg ){
178c0 0a 20 20 20 20 69 20 20 3d 20 70 50 61 72 73 65  .    i  = pParse
178d0 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20 20 20  ->iRangeReg;.   
178e0 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52   pParse->iRangeR
178f0 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20  eg += nReg;.    
17900 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
17910 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65 6c  g -= nReg;.  }el
17920 73 65 7b 0a 20 20 20 20 69 20 3d 20 70 50 61 72  se{.    i = pPar
17930 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
17940 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
17950 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nReg;.  }.  retu
17960 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  rn i;.}.void sql
17970 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
17980 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72  ange(Parse *pPar
17990 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e  se, int iReg, in
179a0 74 20 6e 52 65 67 29 7b 0a 20 20 69 66 28 20 6e  t nReg){.  if( n
179b0 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e  Reg>pParse->nRan
179c0 67 65 52 65 67 20 29 7b 0a 20 20 20 20 70 50 61  geReg ){.    pPa
179d0 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d  rse->nRangeReg =
179e0 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73   nReg;.    pPars
179f0 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d 20 69  e->iRangeReg = i
17a00 52 65 67 3b 0a 20 20 7d 0a 7d 0a                 Reg;.  }.}.