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

Artifact 335d3008417050a6992ecf2c78819f2911a7cb18:


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 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t.h"../*.** Retu
0220: 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74 79  rn the 'affinity
0230: 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  ' of the express
0240: 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e 79  ion pExpr if any
0250: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ..**.** If pExpr
0260: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61 20   is a column, a 
0270: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 63  reference to a c
0280: 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41 53  olumn via an 'AS
0290: 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20 61  ' alias,.** or a
02a0: 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74 68   sub-select with
02b0: 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65   a column as the
02c0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20 74   return value, t
02d0: 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66 69  hen the .** affi
02e0: 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f 6c  nity of that col
02f0: 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  umn is returned.
0300: 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30 30   Otherwise, 0x00
0310: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a   is returned,.**
0320: 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 61   indicating no a
0330: 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65 20  ffinity for the 
0340: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
0350: 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52 45  * i.e. the WHERE
0360: 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 73   clause expresss
0370: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0380: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0390: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
03a0: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
03b0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
03c0: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
03d0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
03e0: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
03f0: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0400: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
0410: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
0420: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
0430: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
0440: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
0450: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
0460: 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
0470: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45  .  if( op==TK_SE
0480: 4c 45 43 54 20 29 7b 0a 20 20 20 20 61 73 73 65  LECT ){.    asse
0490: 72 74 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  rt( pExpr->flags
04a0: 26 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 3b  &EP_xIsSelect );
04b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
04c0: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
04d0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
04e0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
04f0: 45 78 70 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  Expr);.  }.#ifnd
0500: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
0510: 41 53 54 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  AST.  if( op==TK
0520: 5f 43 41 53 54 20 29 7b 0a 20 20 20 20 61 73 73  _CAST ){.    ass
0530: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
0540: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
0550: 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
0560: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41   return sqlite3A
0570: 66 66 69 6e 69 74 79 54 79 70 65 28 70 45 78 70  ffinityType(pExp
0580: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
0590: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 28  }.#endif.  if( (
05a0: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
05b0: 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  N || op==TK_COLU
05c0: 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47  MN || op==TK_REG
05d0: 49 53 54 45 52 29 20 0a 20 20 20 26 26 20 70 45  ISTER) .   && pE
05e0: 78 70 72 2d 3e 70 54 61 62 21 3d 30 0a 20 20 29  xpr->pTab!=0.  )
05f0: 7b 0a 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f  {.    /* op==TK_
0600: 52 45 47 49 53 54 45 52 20 26 26 20 70 45 78 70  REGISTER && pExp
0610: 72 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65  r->pTab!=0 happe
0620: 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61  ns when pExpr wa
0630: 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20  s originally.   
0640: 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20   ** a TK_COLUMN 
0650: 62 75 74 20 77 61 73 20 70 72 65 76 69 6f 75 73  but was previous
0660: 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  ly evaluated and
0670: 20 63 61 63 68 65 64 20 69 6e 20 61 20 72 65 67   cached in a reg
0680: 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  ister */.    int
0690: 20 6a 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c   j = pExpr->iCol
06a0: 75 6d 6e 3b 0a 20 20 20 20 69 66 28 20 6a 3c 30  umn;.    if( j<0
06b0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
06c0: 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20  _AFF_INTEGER;.  
06d0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
06e0: 3e 70 54 61 62 20 26 26 20 6a 3c 70 45 78 70 72  >pTab && j<pExpr
06f0: 2d 3e 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  ->pTab->nCol );.
0700: 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72      return pExpr
0710: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ->pTab->aCol[j].
0720: 61 66 66 69 6e 69 74 79 3b 0a 20 20 7d 0a 20 20  affinity;.  }.  
0730: 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 61 66  return pExpr->af
0740: 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  finity;.}../*.**
0750: 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69   Set the collati
0760: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
0770: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
0780: 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c 61   to be the colla
0790: 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
07a0: 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e   named by pToken
07b0: 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .   Return a poi
07c0: 6e 74 65 72 20 74 6f 20 74 68 65 20 72 65 76 69  nter to the revi
07d0: 73 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  sed expression..
07e0: 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ** The collating
07f0: 20 73 65 71 75 65 6e 63 65 20 69 73 20 6d 61 72   sequence is mar
0800: 6b 65 64 20 61 73 20 22 65 78 70 6c 69 63 69 74  ked as "explicit
0810: 22 20 75 73 69 6e 67 20 74 68 65 20 45 50 5f 45  " using the EP_E
0820: 78 70 43 6f 6c 6c 61 74 65 0a 2a 2a 20 66 6c 61  xpCollate.** fla
0830: 67 2e 20 20 41 6e 20 65 78 70 6c 69 63 69 74 20  g.  An explicit 
0840: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
0850: 63 65 20 77 69 6c 6c 20 6f 76 65 72 72 69 64 65  ce will override
0860: 20 69 6d 70 6c 69 63 69 74 0a 2a 2a 20 63 6f 6c   implicit.** col
0870: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
0880: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
0890: 65 33 45 78 70 72 53 65 74 43 6f 6c 6c 28 50 61  e3ExprSetColl(Pa
08a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
08b0: 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20  r *pExpr, Token 
08c0: 2a 70 43 6f 6c 6c 4e 61 6d 65 29 7b 0a 20 20 63  *pCollName){.  c
08d0: 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 30 3b 20  har *zColl = 0; 
08e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
08f0: 71 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20 63  quoted name of c
0900: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
0910: 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  e */.  CollSeq *
0920: 70 43 6f 6c 6c 3b 0a 20 20 73 71 6c 69 74 65 33  pColl;.  sqlite3
0930: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
0940: 62 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c  b;.  zColl = sql
0950: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
0960: 6e 28 64 62 2c 20 70 43 6f 6c 6c 4e 61 6d 65 29  n(db, pCollName)
0970: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20 26 26  ;.  if( pExpr &&
0980: 20 7a 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 70 43   zColl ){.    pC
0990: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  oll = sqlite3Loc
09a0: 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
09b0: 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 69  e, zColl);.    i
09c0: 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  f( pColl ){.    
09d0: 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d    pExpr->pColl =
09e0: 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 45   pColl;.      pE
09f0: 78 70 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  xpr->flags |= EP
0a00: 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20  _ExpCollate;.   
0a10: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
0a20: 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c  DbFree(db, zColl
0a30: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70  );.  return pExp
0a40: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  r;.}../*.** Retu
0a50: 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74 20 63  rn the default c
0a60: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
0a70: 65 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73  e for the expres
0a80: 73 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a 2a  sion pExpr. If.*
0a90: 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65  * there is no de
0aa0: 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20  fault collation 
0ab0: 74 79 70 65 2c 20 72 65 74 75 72 6e 20 30 2e 0a  type, return 0..
0ac0: 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69  */.CollSeq *sqli
0ad0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 50  te3ExprCollSeq(P
0ae0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
0af0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 43 6f  pr *pExpr){.  Co
0b00: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30  llSeq *pColl = 0
0b10: 3b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45  ;.  Expr *p = pE
0b20: 78 70 72 3b 0a 20 20 77 68 69 6c 65 28 20 41 4c  xpr;.  while( AL
0b30: 57 41 59 53 28 70 29 20 29 7b 0a 20 20 20 20 69  WAYS(p) ){.    i
0b40: 6e 74 20 6f 70 3b 0a 20 20 20 20 70 43 6f 6c 6c  nt op;.    pColl
0b50: 20 3d 20 70 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20   = p->pColl;.   
0b60: 20 69 66 28 20 70 43 6f 6c 6c 20 29 20 62 72 65   if( pColl ) bre
0b70: 61 6b 3b 0a 20 20 20 20 6f 70 20 3d 20 70 2d 3e  ak;.    op = p->
0b80: 6f 70 3b 0a 20 20 20 20 69 66 28 20 28 6f 70 3d  op;.    if( (op=
0b90: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c  =TK_AGG_COLUMN |
0ba0: 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  | op==TK_COLUMN 
0bb0: 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  || op==TK_REGIST
0bc0: 45 52 29 20 26 26 20 70 2d 3e 70 54 61 62 21 3d  ER) && p->pTab!=
0bd0: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 70  0 ){.      /* op
0be0: 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26  ==TK_REGISTER &&
0bf0: 20 70 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70   p->pTab!=0 happ
0c00: 65 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20 77  ens when pExpr w
0c10: 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20  as originally.  
0c20: 20 20 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55      ** a TK_COLU
0c30: 4d 4e 20 62 75 74 20 77 61 73 20 70 72 65 76 69  MN but was previ
0c40: 6f 75 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20  ously evaluated 
0c50: 61 6e 64 20 63 61 63 68 65 64 20 69 6e 20 61 20  and cached in a 
0c60: 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20  register */.    
0c70: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
0c80: 6f 6c 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  oll;.      int j
0c90: 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20   = p->iColumn;. 
0ca0: 20 20 20 20 20 69 66 28 20 6a 3e 3d 30 20 29 7b       if( j>=0 ){
0cb0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
0cc0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
0cd0: 62 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c  b;.        zColl
0ce0: 20 3d 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c   = p->pTab->aCol
0cf0: 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20  [j].zColl;.     
0d00: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
0d10: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
0d20: 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c  , ENC(db), zColl
0d30: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 45  , 0);.        pE
0d40: 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f  xpr->pColl = pCo
0d50: 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
0d60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
0d70: 20 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 43 41     if( op!=TK_CA
0d80: 53 54 20 26 26 20 6f 70 21 3d 54 4b 5f 55 50 4c  ST && op!=TK_UPL
0d90: 55 53 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61  US ){.      brea
0da0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d  k;.    }.    p =
0db0: 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 7d 0a 20   p->pLeft;.  }. 
0dc0: 20 69 66 28 20 73 71 6c 69 74 65 33 43 68 65 63   if( sqlite3Chec
0dd0: 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  kCollSeq(pParse,
0de0: 20 70 43 6f 6c 6c 29 20 29 7b 20 0a 20 20 20 20   pColl) ){ .    
0df0: 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20  pColl = 0;.  }. 
0e00: 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d   return pColl;.}
0e10: 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73  ../*.** pExpr is
0e20: 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66 20 61   an operand of a
0e30: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
0e40: 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73 20 74  ator.  aff2 is t
0e50: 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66 69 6e  he.** type affin
0e60: 69 74 79 20 6f 66 20 74 68 65 20 6f 74 68 65 72  ity of the other
0e70: 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73 20   operand.  This 
0e80: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
0e90: 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66 69  the.** type affi
0ea0: 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64  nity that should
0eb0: 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65   be used for the
0ec0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
0ed0: 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20 73 71  ator..*/.char sq
0ee0: 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
0ef0: 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78 70 72  nity(Expr *pExpr
0f00: 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a 20 20  , char aff2){.  
0f10: 63 68 61 72 20 61 66 66 31 20 3d 20 73 71 6c 69  char aff1 = sqli
0f20: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
0f30: 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 61 66  pExpr);.  if( af
0f40: 66 31 20 26 26 20 61 66 66 32 20 29 7b 0a 20 20  f1 && aff2 ){.  
0f50: 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65 73 20    /* Both sides 
0f60: 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  of the compariso
0f70: 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e 20 49  n are columns. I
0f80: 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65 72 69  f one has numeri
0f90: 63 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e 69 74  c.    ** affinit
0fa0: 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f 74 68  y, use that. Oth
0fb0: 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20 61 66  erwise use no af
0fc0: 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f 0a 20  finity..    */. 
0fd0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73     if( sqlite3Is
0fe0: 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28  NumericAffinity(
0ff0: 61 66 66 31 29 20 7c 7c 20 73 71 6c 69 74 65 33  aff1) || sqlite3
1000: 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
1010: 79 28 61 66 66 32 29 20 29 7b 0a 20 20 20 20 20  y(aff2) ){.     
1020: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
1030: 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20  FF_NUMERIC;.    
1040: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
1050: 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  urn SQLITE_AFF_N
1060: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ONE;.    }.  }el
1070: 73 65 20 69 66 28 20 21 61 66 66 31 20 26 26 20  se if( !aff1 && 
1080: 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20  !aff2 ){.    /* 
1090: 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20  Neither side of 
10a0: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  the comparison i
10b0: 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f 6d  s a column.  Com
10c0: 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  pare the.    ** 
10d0: 72 65 73 75 6c 74 73 20 64 69 72 65 63 74 6c 79  results directly
10e0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74  ..    */.    ret
10f0: 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  urn SQLITE_AFF_N
1100: 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ONE;.  }else{.  
1110: 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20 69 73    /* One side is
1120: 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 6f   a column, the o
1130: 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55 73 65  ther is not. Use
1140: 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61 66 66   the columns aff
1150: 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 61 73  inity. */.    as
1160: 73 65 72 74 28 20 61 66 66 31 3d 3d 30 20 7c 7c  sert( aff1==0 ||
1170: 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20 20 20   aff2==0 );.    
1180: 72 65 74 75 72 6e 20 28 61 66 66 31 20 2b 20 61  return (aff1 + a
1190: 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ff2);.  }.}../*.
11a0: 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63 6f  ** pExpr is a co
11b0: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
11c0: 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 74  r.  Return the t
11d0: 79 70 65 20 61 66 66 69 6e 69 74 79 20 74 68 61  ype affinity tha
11e0: 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 61  t should.** be a
11f0: 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68 20 6f  pplied to both o
1200: 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20 74 6f  perands prior to
1210: 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70 61   doing the compa
1220: 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  rison..*/.static
1230: 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73 6f 6e   char comparison
1240: 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70  Affinity(Expr *p
1250: 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20 61 66  Expr){.  char af
1260: 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  f;.  assert( pEx
1270: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c  pr->op==TK_EQ ||
1280: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
1290: 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  N || pExpr->op==
12a0: 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20 20  TK_LT ||.       
12b0: 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b     pExpr->op==TK
12c0: 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _GT || pExpr->op
12d0: 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70 72  ==TK_GE || pExpr
12e0: 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a 20  ->op==TK_LE ||. 
12f0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
1300: 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 61  op==TK_NE );.  a
1310: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
1320: 65 66 74 20 29 3b 0a 20 20 61 66 66 20 3d 20 73  eft );.  aff = s
1330: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
1340: 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  ty(pExpr->pLeft)
1350: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70  ;.  if( pExpr->p
1360: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 61 66 66  Right ){.    aff
1370: 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72   = sqlite3Compar
1380: 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d  eAffinity(pExpr-
1390: 3e 70 52 69 67 68 74 2c 20 61 66 66 29 3b 0a 20  >pRight, aff);. 
13a0: 20 7d 65 6c 73 65 20 69 66 28 20 45 78 70 72 48   }else if( ExprH
13b0: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
13c0: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
13d0: 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c  ){.    aff = sql
13e0: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
13f0: 69 74 79 28 70 45 78 70 72 2d 3e 78 2e 70 53 65  ity(pExpr->x.pSe
1400: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  lect->pEList->a[
1410: 30 5d 2e 70 45 78 70 72 2c 20 61 66 66 29 3b 0a  0].pExpr, aff);.
1420: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 61 66 66    }else if( !aff
1430: 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 53 51   ){.    aff = SQ
1440: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
1450: 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b   }.  return aff;
1460: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20  .}../*.** pExpr 
1470: 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  is a comparison 
1480: 65 78 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e 20  expression, eg. 
1490: 27 3d 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e  '=', '<', IN(...
14a0: 29 20 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61 66  ) etc..** idx_af
14b0: 66 69 6e 69 74 79 20 69 73 20 74 68 65 20 61 66  finity is the af
14c0: 66 69 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e 64  finity of an ind
14d0: 65 78 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65 74  exed column. Ret
14e0: 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 74  urn true.** if t
14f0: 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 61 66  he index with af
1500: 66 69 6e 69 74 79 20 69 64 78 5f 61 66 66 69 6e  finity idx_affin
1510: 69 74 79 20 6d 61 79 20 62 65 20 75 73 65 64 20  ity may be used 
1520: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20  to implement.** 
1530: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  the comparison i
1540: 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20  n pExpr..*/.int 
1550: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
1560: 6e 69 74 79 4f 6b 28 45 78 70 72 20 2a 70 45 78  nityOk(Expr *pEx
1570: 70 72 2c 20 63 68 61 72 20 69 64 78 5f 61 66 66  pr, char idx_aff
1580: 69 6e 69 74 79 29 7b 0a 20 20 63 68 61 72 20 61  inity){.  char a
1590: 66 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41  ff = comparisonA
15a0: 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a  ffinity(pExpr);.
15b0: 20 20 73 77 69 74 63 68 28 20 61 66 66 20 29 7b    switch( aff ){
15c0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
15d0: 5f 41 46 46 5f 4e 4f 4e 45 3a 0a 20 20 20 20 20  _AFF_NONE:.     
15e0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 63   return 1;.    c
15f0: 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  ase SQLITE_AFF_T
1600: 45 58 54 3a 0a 20 20 20 20 20 20 72 65 74 75 72  EXT:.      retur
1610: 6e 20 69 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d  n idx_affinity==
1620: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b  SQLITE_AFF_TEXT;
1630: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
1640: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
1650: 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e  e3IsNumericAffin
1660: 69 74 79 28 69 64 78 5f 61 66 66 69 6e 69 74 79  ity(idx_affinity
1670: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1680: 52 65 74 75 72 6e 20 74 68 65 20 50 35 20 76 61  Return the P5 va
1690: 6c 75 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  lue that should 
16a0: 62 65 20 75 73 65 64 20 66 6f 72 20 61 20 62 69  be used for a bi
16b0: 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 0a  nary comparison.
16c0: 2a 2a 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45 71  ** opcode (OP_Eq
16d0: 2c 20 4f 50 5f 47 65 20 65 74 63 2e 29 20 75 73  , OP_Ge etc.) us
16e0: 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 70 45  ed to compare pE
16f0: 78 70 72 31 20 61 6e 64 20 70 45 78 70 72 32 2e  xpr1 and pExpr2.
1700: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 62 69  .*/.static u8 bi
1710: 6e 61 72 79 43 6f 6d 70 61 72 65 50 35 28 45 78  naryCompareP5(Ex
1720: 70 72 20 2a 70 45 78 70 72 31 2c 20 45 78 70 72  pr *pExpr1, Expr
1730: 20 2a 70 45 78 70 72 32 2c 20 69 6e 74 20 6a 75   *pExpr2, int ju
1740: 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38 20  mpIfNull){.  u8 
1750: 61 66 66 20 3d 20 28 63 68 61 72 29 73 71 6c 69  aff = (char)sqli
1760: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
1770: 70 45 78 70 72 32 29 3b 0a 20 20 61 66 66 20 3d  pExpr2);.  aff =
1780: 20 28 75 38 29 73 71 6c 69 74 65 33 43 6f 6d 70   (u8)sqlite3Comp
1790: 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70  areAffinity(pExp
17a0: 72 31 2c 20 61 66 66 29 20 7c 20 28 75 38 29 6a  r1, aff) | (u8)j
17b0: 75 6d 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74  umpIfNull;.  ret
17c0: 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn aff;.}../*.*
17d0: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
17e0: 65 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74  er to the collat
17f0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61  ion sequence tha
1800: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
1810: 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20   by.** a binary 
1820: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
1830: 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c  tor comparing pL
1840: 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a  eft and pRight..
1850: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66  **.** If the lef
1860: 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f  t hand expressio
1870: 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e  n has a collatin
1880: 67 20 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c  g sequence type,
1890: 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75   then it is.** u
18a0: 73 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74  sed. Otherwise t
18b0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
18c0: 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69  uence for the ri
18d0: 67 68 74 20 68 61 6e 64 20 65 78 70 72 65 73 73  ght hand express
18e0: 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20  ion.** is used, 
18f0: 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20 28  or the default (
1900: 42 49 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68  BINARY) if neith
1910: 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61  er expression ha
1920: 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a  s a collating.**
1930: 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67   type..**.** Arg
1940: 75 6d 65 6e 74 20 70 52 69 67 68 74 20 28 62 75  ument pRight (bu
1950: 74 20 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61 79  t not pLeft) may
1960: 20 62 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74   be a null point
1970: 65 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  er. In this case
1980: 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 63  ,.** it is not c
1990: 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f  onsidered..*/.Co
19a0: 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 42 69  llSeq *sqlite3Bi
19b0: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
19c0: 65 71 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  eq(.  Parse *pPa
19d0: 72 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c  rse, .  Expr *pL
19e0: 65 66 74 2c 20 0a 20 20 45 78 70 72 20 2a 70 52  eft, .  Expr *pR
19f0: 69 67 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65  ight.){.  CollSe
1a00: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65  q *pColl;.  asse
1a10: 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 69  rt( pLeft );.  i
1a20: 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20  f( pLeft->flags 
1a30: 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20  & EP_ExpCollate 
1a40: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1a50: 4c 65 66 74 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20  Left->pColl );. 
1a60: 20 20 20 70 43 6f 6c 6c 20 3d 20 70 4c 65 66 74     pColl = pLeft
1a70: 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 7d 65 6c 73 65  ->pColl;.  }else
1a80: 20 69 66 28 20 70 52 69 67 68 74 20 26 26 20 70   if( pRight && p
1a90: 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45  Right->flags & E
1aa0: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b 0a  P_ExpCollate ){.
1ab0: 20 20 20 20 61 73 73 65 72 74 28 20 70 52 69 67      assert( pRig
1ac0: 68 74 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20 20  ht->pColl );.   
1ad0: 20 70 43 6f 6c 6c 20 3d 20 70 52 69 67 68 74 2d   pColl = pRight-
1ae0: 3e 70 43 6f 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b  >pColl;.  }else{
1af0: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
1b00: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
1b10: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a  pParse, pLeft);.
1b20: 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
1b30: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20  {.      pColl = 
1b40: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1b50: 65 71 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  eq(pParse, pRigh
1b60: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
1b70: 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a  return pColl;.}.
1b80: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1b90: 74 68 65 20 6f 70 65 72 61 6e 64 73 20 66 6f 72  the operands for
1ba0: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
1bb0: 65 72 61 74 69 6f 6e 2e 20 20 42 65 66 6f 72 65  eration.  Before
1bc0: 0a 2a 2a 20 67 65 6e 65 72 61 74 69 6e 67 20 74  .** generating t
1bd0: 68 65 20 63 6f 64 65 20 66 6f 72 20 65 61 63 68  he code for each
1be0: 20 6f 70 65 72 61 6e 64 2c 20 73 65 74 20 74 68   operand, set th
1bf0: 65 20 45 50 5f 41 6e 79 41 66 66 0a 2a 2a 20 66  e EP_AnyAff.** f
1c00: 6c 61 67 20 6f 6e 20 74 68 65 20 65 78 70 72 65  lag on the expre
1c10: 73 73 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 74  ssion so that it
1c20: 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f   will be able to
1c30: 20 75 73 65 64 20 61 0a 2a 2a 20 63 61 63 68 65   used a.** cache
1c40: 64 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 74  d column value t
1c50: 68 61 74 20 68 61 73 20 70 72 65 76 69 6f 75 73  hat has previous
1c60: 6c 79 20 75 6e 64 65 72 67 6f 6e 65 20 61 6e 0a  ly undergone an.
1c70: 2a 2a 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e  ** affinity chan
1c80: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
1c90: 69 64 20 63 6f 64 65 43 6f 6d 70 61 72 65 4f 70  id codeCompareOp
1ca0: 65 72 61 6e 64 73 28 0a 20 20 50 61 72 73 65 20  erands(.  Parse 
1cb0: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
1cc0: 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
1cd0: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
1ce0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  xt */.  Expr *pL
1cf0: 65 66 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  eft,      /* The
1d00: 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   left operand */
1d10: 0a 20 20 69 6e 74 20 2a 70 52 65 67 4c 65 66 74  .  int *pRegLeft
1d20: 2c 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72  ,    /* Register
1d30: 20 77 68 65 72 65 20 6c 65 66 74 20 6f 70 65 72   where left oper
1d40: 61 6e 64 20 69 73 20 73 74 6f 72 65 64 20 2a 2f  and is stored */
1d50: 0a 20 20 69 6e 74 20 2a 70 46 72 65 65 4c 65 66  .  int *pFreeLef
1d60: 74 2c 20 20 20 2f 2a 20 46 72 65 65 20 74 68 69  t,   /* Free thi
1d70: 73 20 72 65 67 69 73 74 65 72 20 77 68 65 6e 20  s register when 
1d80: 64 6f 6e 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  done */.  Expr *
1d90: 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20 54  pRight,     /* T
1da0: 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
1db0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 67 52   */.  int *pRegR
1dc0: 69 67 68 74 2c 20 20 20 2f 2a 20 52 65 67 69 73  ight,   /* Regis
1dd0: 74 65 72 20 77 68 65 72 65 20 72 69 67 68 74 20  ter where right 
1de0: 6f 70 65 72 61 6e 64 20 69 73 20 73 74 6f 72 65  operand is store
1df0: 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 46 72 65  d */.  int *pFre
1e00: 65 52 69 67 68 74 20 20 20 2f 2a 20 57 72 69 74  eRight   /* Writ
1e10: 65 20 74 65 6d 70 20 72 65 67 69 73 74 65 72 20  e temp register 
1e20: 66 6f 72 20 72 69 67 68 74 20 6f 70 65 72 61 6e  for right operan
1e30: 64 20 74 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  d there */.){.  
1e40: 77 68 69 6c 65 28 20 70 4c 65 66 74 2d 3e 6f 70  while( pLeft->op
1e50: 3d 3d 54 4b 5f 55 50 4c 55 53 20 29 20 70 4c 65  ==TK_UPLUS ) pLe
1e60: 66 74 20 3d 20 70 4c 65 66 74 2d 3e 70 4c 65 66  ft = pLeft->pLef
1e70: 74 3b 0a 20 20 70 4c 65 66 74 2d 3e 66 6c 61 67  t;.  pLeft->flag
1e80: 73 20 7c 3d 20 45 50 5f 41 6e 79 41 66 66 3b 0a  s |= EP_AnyAff;.
1e90: 20 20 2a 70 52 65 67 4c 65 66 74 20 3d 20 73 71    *pRegLeft = sq
1ea0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1eb0: 70 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  p(pParse, pLeft,
1ec0: 20 70 46 72 65 65 4c 65 66 74 29 3b 0a 20 20 77   pFreeLeft);.  w
1ed0: 68 69 6c 65 28 20 70 52 69 67 68 74 2d 3e 6f 70  hile( pRight->op
1ee0: 3d 3d 54 4b 5f 55 50 4c 55 53 20 29 20 70 52 69  ==TK_UPLUS ) pRi
1ef0: 67 68 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 4c  ght = pRight->pL
1f00: 65 66 74 3b 0a 20 20 70 52 69 67 68 74 2d 3e 66  eft;.  pRight->f
1f10: 6c 61 67 73 20 7c 3d 20 45 50 5f 41 6e 79 41 66  lags |= EP_AnyAf
1f20: 66 3b 0a 20 20 2a 70 52 65 67 52 69 67 68 74 20  f;.  *pRegRight 
1f30: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1f40: 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 52  eTemp(pParse, pR
1f50: 69 67 68 74 2c 20 70 46 72 65 65 52 69 67 68 74  ight, pFreeRight
1f60: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
1f70: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
1f80: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
1f90: 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tor..*/.static i
1fa0: 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 0a  nt codeCompare(.
1fb0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1fc0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
1fd0: 6e 67 20 28 61 6e 64 20 63 6f 64 65 20 67 65 6e  ng (and code gen
1fe0: 65 72 61 74 69 6e 67 29 20 63 6f 6e 74 65 78 74  erating) context
1ff0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66   */.  Expr *pLef
2000: 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c  t,      /* The l
2010: 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  eft operand */. 
2020: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 20   Expr *pRight,  
2030: 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20     /* The right 
2040: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
2050: 20 6f 70 63 6f 64 65 2c 20 20 20 20 20 20 20 2f   opcode,       /
2060: 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  * The comparison
2070: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74   opcode */.  int
2080: 20 69 6e 31 2c 20 69 6e 74 20 69 6e 32 2c 20 2f   in1, int in2, /
2090: 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
20a0: 6e 67 20 6f 70 65 72 61 6e 64 73 20 2a 2f 0a 20  ng operands */. 
20b0: 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20   int dest,      
20c0: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
20d0: 69 66 20 74 72 75 65 2e 20 20 2a 2f 0a 20 20 69  if true.  */.  i
20e0: 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20  nt jumpIfNull   
20f0: 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 6a 75 6d   /* If true, jum
2100: 70 20 69 66 20 65 69 74 68 65 72 20 6f 70 65 72  p if either oper
2110: 61 6e 64 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29  and is NULL */.)
2120: 7b 0a 20 20 69 6e 74 20 70 35 3b 0a 20 20 69 6e  {.  int p5;.  in
2130: 74 20 61 64 64 72 3b 0a 20 20 43 6f 6c 6c 53 65  t addr;.  CollSe
2140: 71 20 2a 70 34 3b 0a 0a 20 20 70 34 20 3d 20 73  q *p4;..  p4 = s
2150: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
2160: 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
2170: 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
2180: 29 3b 0a 20 20 70 35 20 3d 20 62 69 6e 61 72 79  );.  p5 = binary
2190: 43 6f 6d 70 61 72 65 50 35 28 70 4c 65 66 74 2c  CompareP5(pLeft,
21a0: 20 70 52 69 67 68 74 2c 20 6a 75 6d 70 49 66 4e   pRight, jumpIfN
21b0: 75 6c 6c 29 3b 0a 20 20 61 64 64 72 20 3d 20 73  ull);.  addr = s
21c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
21d0: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
21e0: 6f 70 63 6f 64 65 2c 20 69 6e 32 2c 20 64 65 73  opcode, in2, des
21f0: 74 2c 20 69 6e 31 2c 0a 20 20 20 20 20 20 20 20  t, in1,.        
2200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2210: 20 20 20 28 76 6f 69 64 2a 29 70 34 2c 20 50 34     (void*)p4, P4
2220: 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 73 71 6c  _COLLSEQ);.  sql
2230: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
2240: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
2250: 28 75 38 29 70 35 29 3b 0a 20 20 69 66 28 20 28  (u8)p5);.  if( (
2260: 70 35 20 26 20 53 51 4c 49 54 45 5f 41 46 46 5f  p5 & SQLITE_AFF_
2270: 4d 41 53 4b 29 21 3d 53 51 4c 49 54 45 5f 41 46  MASK)!=SQLITE_AF
2280: 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 73 71  F_NONE ){.    sq
2290: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
22a0: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
22b0: 72 73 65 2c 20 69 6e 31 2c 20 31 29 3b 0a 20 20  rse, in1, 1);.  
22c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
22d0: 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
22e0: 28 70 50 61 72 73 65 2c 20 69 6e 32 2c 20 31 29  (pParse, in2, 1)
22f0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61  ;.  }.  return a
2300: 64 64 72 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  ddr;.}..#if SQLI
2310: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
2320: 48 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  H>0./*.** Check 
2330: 74 68 61 74 20 61 72 67 75 6d 65 6e 74 20 6e 48  that argument nH
2340: 65 69 67 68 74 20 69 73 20 6c 65 73 73 20 74 68  eight is less th
2350: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
2360: 68 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 65 78  he maximum.** ex
2370: 70 72 65 73 73 69 6f 6e 20 64 65 70 74 68 20 61  pression depth a
2380: 6c 6c 6f 77 65 64 2e 20 49 66 20 69 74 20 69 73  llowed. If it is
2390: 20 6e 6f 74 2c 20 6c 65 61 76 65 20 61 6e 20 65   not, leave an e
23a0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 0a  rror message in.
23b0: 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 69 6e  ** pParse..*/.in
23c0: 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65  t sqlite3ExprChe
23d0: 63 6b 48 65 69 67 68 74 28 50 61 72 73 65 20 2a  ckHeight(Parse *
23e0: 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 48 65 69  pParse, int nHei
23f0: 67 68 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ght){.  int rc =
2400: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
2410: 74 20 6d 78 48 65 69 67 68 74 20 3d 20 70 50 61  t mxHeight = pPa
2420: 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  rse->db->aLimit[
2430: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50  SQLITE_LIMIT_EXP
2440: 52 5f 44 45 50 54 48 5d 3b 0a 20 20 69 66 28 20  R_DEPTH];.  if( 
2450: 6e 48 65 69 67 68 74 3e 6d 78 48 65 69 67 68 74  nHeight>mxHeight
2460: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
2470: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2480: 0a 20 20 20 20 20 20 20 22 45 78 70 72 65 73 73  .       "Express
2490: 69 6f 6e 20 74 72 65 65 20 69 73 20 74 6f 6f 20  ion tree is too 
24a0: 6c 61 72 67 65 20 28 6d 61 78 69 6d 75 6d 20 64  large (maximum d
24b0: 65 70 74 68 20 25 64 29 22 2c 20 6d 78 48 65 69  epth %d)", mxHei
24c0: 67 68 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 72  ght.    );.    r
24d0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
24e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
24f0: 63 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c  c;.}../* The fol
2500: 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 66 75 6e  lowing three fun
2510: 63 74 69 6f 6e 73 2c 20 68 65 69 67 68 74 4f 66  ctions, heightOf
2520: 45 78 70 72 28 29 2c 20 68 65 69 67 68 74 4f 66  Expr(), heightOf
2530: 45 78 70 72 4c 69 73 74 28 29 0a 2a 2a 20 61 6e  ExprList().** an
2540: 64 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74  d heightOfSelect
2550: 28 29 2c 20 61 72 65 20 75 73 65 64 20 74 6f 20  (), are used to 
2560: 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 61  determine the ma
2570: 78 69 6d 75 6d 20 68 65 69 67 68 74 0a 2a 2a 20  ximum height.** 
2580: 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  of any expressio
2590: 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65  n tree reference
25a0: 64 20 62 79 20 74 68 65 20 73 74 72 75 63 74 75  d by the structu
25b0: 72 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  re passed as the
25c0: 0a 2a 2a 20 66 69 72 73 74 20 61 72 67 75 6d 65  .** first argume
25d0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  nt..**.** If thi
25e0: 73 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74  s maximum height
25f0: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
2600: 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
2610: 75 65 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f  ue pointed.** to
2620: 20 62 79 20 70 6e 48 65 69 67 68 74 2c 20 74 68   by pnHeight, th
2630: 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
2640: 65 72 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 6e  er, then set *pn
2650: 48 65 69 67 68 74 20 74 6f 20 74 68 61 74 0a 2a  Height to that.*
2660: 2a 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74  * value..*/.stat
2670: 69 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66  ic void heightOf
2680: 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e  Expr(Expr *p, in
2690: 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20  t *pnHeight){.  
26a0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  if( p ){.    if(
26b0: 20 70 2d 3e 6e 48 65 69 67 68 74 3e 2a 70 6e 48   p->nHeight>*pnH
26c0: 65 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2a  eight ){.      *
26d0: 70 6e 48 65 69 67 68 74 20 3d 20 70 2d 3e 6e 48  pnHeight = p->nH
26e0: 65 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  eight;.    }.  }
26f0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68  .}.static void h
2700: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
2710: 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74  ExprList *p, int
2720: 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69   *pnHeight){.  i
2730: 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20  f( p ){.    int 
2740: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
2750: 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  i<p->nExpr; i++)
2760: 7b 0a 20 20 20 20 20 20 68 65 69 67 68 74 4f 66  {.      heightOf
2770: 45 78 70 72 28 70 2d 3e 61 5b 69 5d 2e 70 45 78  Expr(p->a[i].pEx
2780: 70 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  pr, pnHeight);. 
2790: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69     }.  }.}.stati
27a0: 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 53  c void heightOfS
27b0: 65 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c  elect(Select *p,
27c0: 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b   int *pnHeight){
27d0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
27e0: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
27f0: 70 57 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74  pWhere, pnHeight
2800: 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  );.    heightOfE
2810: 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20  xpr(p->pHaving, 
2820: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
2830: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
2840: 4c 69 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29  Limit, pnHeight)
2850: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
2860: 70 72 28 70 2d 3e 70 4f 66 66 73 65 74 2c 20 70  pr(p->pOffset, p
2870: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
2880: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70  ightOfExprList(p
2890: 2d 3e 70 45 4c 69 73 74 2c 20 70 6e 48 65 69 67  ->pEList, pnHeig
28a0: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
28b0: 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72  fExprList(p->pGr
28c0: 6f 75 70 42 79 2c 20 70 6e 48 65 69 67 68 74 29  oupBy, pnHeight)
28d0: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
28e0: 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72  prList(p->pOrder
28f0: 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  By, pnHeight);. 
2900: 20 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63     heightOfSelec
2910: 74 28 70 2d 3e 70 50 72 69 6f 72 2c 20 70 6e 48  t(p->pPrior, pnH
2920: 65 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  eight);.  }.}../
2930: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70  *.** Set the Exp
2940: 72 2e 6e 48 65 69 67 68 74 20 76 61 72 69 61 62  r.nHeight variab
2950: 6c 65 20 69 6e 20 74 68 65 20 73 74 72 75 63 74  le in the struct
2960: 75 72 65 20 70 61 73 73 65 64 20 61 73 20 61 6e  ure passed as an
2970: 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41   .** argument. A
2980: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74  n expression wit
2990: 68 20 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45  h no children, E
29a0: 78 70 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a  xpr.pList or .**
29b0: 20 45 78 70 72 2e 70 53 65 6c 65 63 74 20 6d 65   Expr.pSelect me
29c0: 6d 62 65 72 20 68 61 73 20 61 20 68 65 69 67 68  mber has a heigh
29d0: 74 20 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68 65  t of 1. Any othe
29e0: 72 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  r expression.** 
29f0: 68 61 73 20 61 20 68 65 69 67 68 74 20 65 71 75  has a height equ
2a00: 61 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75  al to the maximu
2a10: 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20  m height of any 
2a20: 6f 74 68 65 72 20 0a 2a 2a 20 72 65 66 65 72 65  other .** refere
2a30: 6e 63 65 64 20 45 78 70 72 20 70 6c 75 73 20 6f  nced Expr plus o
2a40: 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ne..*/.static vo
2a50: 69 64 20 65 78 70 72 53 65 74 48 65 69 67 68 74  id exprSetHeight
2a60: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74  (Expr *p){.  int
2a70: 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20   nHeight = 0;.  
2a80: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
2a90: 70 4c 65 66 74 2c 20 26 6e 48 65 69 67 68 74 29  pLeft, &nHeight)
2aa0: 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70 72  ;.  heightOfExpr
2ab0: 28 70 2d 3e 70 52 69 67 68 74 2c 20 26 6e 48 65  (p->pRight, &nHe
2ac0: 69 67 68 74 29 3b 0a 20 20 69 66 28 20 45 78 70  ight);.  if( Exp
2ad0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
2ae0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
2af0: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 53 65 6c  .    heightOfSel
2b00: 65 63 74 28 70 2d 3e 78 2e 70 53 65 6c 65 63 74  ect(p->x.pSelect
2b10: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d  , &nHeight);.  }
2b20: 65 6c 73 65 7b 0a 20 20 20 20 68 65 69 67 68 74  else{.    height
2b30: 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e  OfExprList(p->x.
2b40: 70 4c 69 73 74 2c 20 26 6e 48 65 69 67 68 74 29  pList, &nHeight)
2b50: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67  ;.  }.  p->nHeig
2b60: 68 74 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31  ht = nHeight + 1
2b70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
2b80: 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20  he Expr.nHeight 
2b90: 76 61 72 69 61 62 6c 65 20 75 73 69 6e 67 20 74  variable using t
2ba0: 68 65 20 65 78 70 72 53 65 74 48 65 69 67 68 74  he exprSetHeight
2bb0: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a  () function. If.
2bc0: 2a 2a 20 74 68 65 20 68 65 69 67 68 74 20 69 73  ** the height is
2bd0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
2be0: 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65  e maximum allowe
2bf0: 64 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70  d expression dep
2c00: 74 68 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20  th,.** leave an 
2c10: 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e  error in pParse.
2c20: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2c30: 45 78 70 72 53 65 74 48 65 69 67 68 74 28 50 61  ExprSetHeight(Pa
2c40: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
2c50: 72 20 2a 70 29 7b 0a 20 20 65 78 70 72 53 65 74  r *p){.  exprSet
2c60: 48 65 69 67 68 74 28 70 29 3b 0a 20 20 73 71 6c  Height(p);.  sql
2c70: 69 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69  ite3ExprCheckHei
2c80: 67 68 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e  ght(pParse, p->n
2c90: 48 65 69 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Height);.}../*.*
2ca0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 61 78  * Return the max
2cb0: 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61  imum height of a
2cc0: 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  ny expression tr
2cd0: 65 65 20 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a  ee referenced.**
2ce0: 20 62 79 20 74 68 65 20 73 65 6c 65 63 74 20 73   by the select s
2cf0: 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20  tatement passed 
2d00: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a  as an argument..
2d10: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
2d20: 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28 53  lectExprHeight(S
2d30: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74  elect *p){.  int
2d40: 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20   nHeight = 0;.  
2d50: 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70  heightOfSelect(p
2d60: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 72  , &nHeight);.  r
2d70: 65 74 75 72 6e 20 6e 48 65 69 67 68 74 3b 0a 7d  eturn nHeight;.}
2d80: 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65  .#else.  #define
2d90: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 79   exprSetHeight(y
2da0: 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ).#endif /* SQLI
2db0: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
2dc0: 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  H>0 */../*.** Th
2dd0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
2de0: 65 20 63 6f 72 65 20 61 6c 6c 6f 63 61 74 6f 72  e core allocator
2df0: 20 66 6f 72 20 45 78 70 72 20 6e 6f 64 65 73 2e   for Expr nodes.
2e00: 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74  .**.** Construct
2e10: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
2e20: 6e 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72  n node and retur
2e30: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  n a pointer to i
2e40: 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f  t.  Memory.** fo
2e50: 72 20 74 68 69 73 20 6e 6f 64 65 20 61 6e 64 20  r this node and 
2e60: 66 6f 72 20 74 68 65 20 70 54 6f 6b 65 6e 20 61  for the pToken a
2e70: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 73 69 6e  rgument is a sin
2e80: 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  gle allocation.*
2e90: 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  * obtained from 
2ea0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28  sqlite3DbMalloc(
2eb0: 29 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  ).  The calling 
2ec0: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72  function.** is r
2ed0: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d  esponsible for m
2ee0: 61 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e  aking sure the n
2ef0: 6f 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67  ode eventually g
2f00: 65 74 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a  ets freed..**.**
2f10: 20 49 66 20 64 65 71 75 6f 74 65 20 69 73 20 74   If dequote is t
2f20: 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 74 6f  rue, then the to
2f30: 6b 65 6e 20 28 69 66 20 69 74 20 65 78 69 73 74  ken (if it exist
2f40: 73 29 20 69 73 20 64 65 71 75 6f 74 65 64 2e 0a  s) is dequoted..
2f50: 2a 2a 20 49 66 20 64 65 71 75 6f 74 65 20 69 73  ** If dequote is
2f60: 20 66 61 6c 73 65 2c 20 6e 6f 20 64 65 71 75 6f   false, no dequo
2f70: 74 69 6e 67 20 69 73 20 70 65 72 66 6f 72 6d 61  ting is performa
2f80: 6e 63 65 2e 20 20 54 68 65 20 64 65 51 75 6f 74  nce.  The deQuot
2f90: 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  e.** parameter i
2fa0: 73 20 69 67 6e 6f 72 65 64 20 69 66 20 70 54 6f  s ignored if pTo
2fb0: 6b 65 6e 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69  ken is NULL or i
2fc0: 66 20 74 68 65 20 74 6f 6b 65 6e 20 64 6f 65 73  f the token does
2fd0: 20 6e 6f 74 0a 2a 2a 20 61 70 70 65 61 72 20 74   not.** appear t
2fe0: 6f 20 62 65 20 71 75 6f 74 65 64 2e 20 20 49 66  o be quoted.  If
2ff0: 20 74 68 65 20 71 75 6f 74 65 73 20 77 65 72 65   the quotes were
3000: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 2e 2e   of the form "..
3010: 2e 22 20 28 64 6f 75 62 6c 65 2d 71 75 6f 74 65  ." (double-quote
3020: 73 29 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 45  s).** then the E
3030: 50 5f 44 62 6c 51 75 6f 74 65 64 20 66 6c 61 67  P_DblQuoted flag
3040: 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20 65   is set on the e
3050: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 2e 0a  xpression node..
3060: 2a 2a 0a 2a 2a 20 53 70 65 63 69 61 6c 20 63 61  **.** Special ca
3070: 73 65 3a 20 20 49 66 20 6f 70 3d 3d 54 4b 5f 49  se:  If op==TK_I
3080: 4e 54 45 47 45 52 20 61 6e 64 20 70 54 6f 6b 65  NTEGER and pToke
3090: 6e 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74  n points to a st
30a0: 72 69 6e 67 20 74 68 61 74 0a 2a 2a 20 63 61 6e  ring that.** can
30b0: 20 62 65 20 74 72 61 6e 73 6c 61 74 65 64 20 69   be translated i
30c0: 6e 74 6f 20 61 20 33 32 2d 62 69 74 20 69 6e 74  nto a 32-bit int
30d0: 65 67 65 72 2c 20 74 68 65 6e 20 74 68 65 20 74  eger, then the t
30e0: 6f 6b 65 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 73  oken is not.** s
30f0: 74 6f 72 65 64 20 69 6e 20 75 2e 7a 54 6f 6b 65  tored in u.zToke
3100: 6e 2e 20 20 49 6e 73 74 65 61 64 2c 20 74 68 65  n.  Instead, the
3110: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20   integer values 
3120: 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e  is written.** in
3130: 74 6f 20 75 2e 69 56 61 6c 75 65 20 61 6e 64 20  to u.iValue and 
3140: 74 68 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20  the EP_IntValue 
3150: 66 6c 61 67 20 69 73 20 73 65 74 2e 20 20 4e 6f  flag is set.  No
3160: 20 65 78 74 72 61 20 73 74 6f 72 61 67 65 0a 2a   extra storage.*
3170: 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 74  * is allocated t
3180: 6f 20 68 6f 6c 64 20 74 68 65 20 69 6e 74 65 67  o hold the integ
3190: 65 72 20 74 65 78 74 20 61 6e 64 20 74 68 65 20  er text and the 
31a0: 64 65 71 75 6f 74 65 20 66 6c 61 67 20 69 73 20  dequote flag is 
31b0: 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 45 78 70 72  ignored..*/.Expr
31c0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c   *sqlite3ExprAll
31d0: 6f 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  oc(.  sqlite3 *d
31e0: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b,            /*
31f0: 20 48 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69   Handle for sqli
3200: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
3210: 29 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20  ) (may be null) 
3220: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
3230: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3240: 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64  Expression opcod
3250: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b  e */.  const Tok
3260: 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 2f  en *pToken,    /
3270: 2a 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74  * Token argument
3280: 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  .  Might be NULL
3290: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74   */.  int dequot
32a0: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e             /*
32b0: 20 54 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65   True to dequote
32c0: 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
32d0: 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72  New;.  int nExtr
32e0: 61 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56 61  a = 0;.  int iVa
32f0: 6c 75 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  lue = 0;..  if( 
3300: 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66  pToken ){.    if
3310: 28 20 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52  ( op!=TK_INTEGER
3320: 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30   || pToken->z==0
3330: 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71  .          || sq
3340: 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 70 54  lite3GetInt32(pT
3350: 6f 6b 65 6e 2d 3e 7a 2c 20 26 69 56 61 6c 75 65  oken->z, &iValue
3360: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 45  )==0 ){.      nE
3370: 78 74 72 61 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e  xtra = pToken->n
3380: 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  +1;.    }.  }.  
3390: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
33a0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
33b0: 69 7a 65 6f 66 28 45 78 70 72 29 2b 6e 45 78 74  izeof(Expr)+nExt
33c0: 72 61 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20  ra);.  if( pNew 
33d0: 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20  ){.    pNew->op 
33e0: 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e  = (u8)op;.    pN
33f0: 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20  ew->iAgg = -1;. 
3400: 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b     if( pToken ){
3410: 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78 74 72  .      if( nExtr
3420: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  a==0 ){.        
3430: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  pNew->flags |= E
3440: 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20  P_IntValue;.    
3450: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c      pNew->u.iVal
3460: 75 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20  ue = iValue;.   
3470: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3480: 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20    int c;.       
3490: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   pNew->u.zToken 
34a0: 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31  = (char*)&pNew[1
34b0: 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ];.        memcp
34c0: 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e  y(pNew->u.zToken
34d0: 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f  , pToken->z, pTo
34e0: 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20  ken->n);.       
34f0: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b   pNew->u.zToken[
3500: 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a  pToken->n] = 0;.
3510: 20 20 20 20 20 20 20 20 69 66 28 20 64 65 71 75          if( dequ
3520: 6f 74 65 20 26 26 20 6e 45 78 74 72 61 3e 3d 33  ote && nExtra>=3
3530: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26   .             &
3540: 26 20 28 28 63 20 3d 20 70 54 6f 6b 65 6e 2d 3e  & ((c = pToken->
3550: 7a 5b 30 5d 29 3d 3d 27 5c 27 27 20 7c 7c 20 63  z[0])=='\'' || c
3560: 3d 3d 27 22 27 20 7c 7c 20 63 3d 3d 27 5b 27 20  =='"' || c=='[' 
3570: 7c 7c 20 63 3d 3d 27 60 27 29 20 29 7b 0a 20 20  || c=='`') ){.  
3580: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
3590: 65 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a  equote(pNew->u.z
35a0: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  Token);.        
35b0: 20 20 69 66 28 20 63 3d 3d 27 22 27 20 29 20 70    if( c=='"' ) p
35c0: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
35d0: 5f 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20  _DblQuoted;.    
35e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
35f0: 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d    }.#if SQLITE_M
3600: 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a  AX_EXPR_DEPTH>0.
3610: 20 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67 68      pNew->nHeigh
3620: 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20 0a  t = 1;.#endif  .
3630: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
3640: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  w;.}../*.** Allo
3650: 63 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65  cate a new expre
3660: 73 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d 20  ssion node from 
3670: 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  a zero-terminate
3680: 64 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 61 73  d token that has
3690: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e  .** already been
36a0: 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78   dequoted..*/.Ex
36b0: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 28  pr *sqlite3Expr(
36c0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
36d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
36e0: 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  ndle for sqlite3
36f0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28  DbMallocZero() (
3700: 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a  may be null) */.
3710: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
3720: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
3730: 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ression opcode *
3740: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
3750: 7a 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20 54  zToken      /* T
3760: 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20  oken argument.  
3770: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
3780: 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a 20  .){.  Token x;. 
3790: 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20   x.z = zToken;. 
37a0: 20 78 2e 6e 20 3d 20 7a 54 6f 6b 65 6e 20 3f 20   x.n = zToken ? 
37b0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
37c0: 7a 54 6f 6b 65 6e 29 20 3a 20 30 3b 0a 20 20 72  zToken) : 0;.  r
37d0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
37e0: 72 41 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26  rAlloc(db, op, &
37f0: 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  x, 0);.}../*.** 
3800: 41 74 74 61 63 68 20 73 75 62 74 72 65 65 73 20  Attach subtrees 
3810: 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74  pLeft and pRight
3820: 20 74 6f 20 74 68 65 20 45 78 70 72 20 6e 6f 64   to the Expr nod
3830: 65 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49  e pRoot..**.** I
3840: 66 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68  f pRoot==NULL th
3850: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 20  at means that a 
3860: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
3870: 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
3880: 72 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74  rred..** In that
3890: 20 63 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68   case, delete th
38a0: 65 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74  e subtrees pLeft
38b0: 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a   and pRight..*/.
38c0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
38d0: 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28 0a  AttachSubtrees(.
38e0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
38f0: 20 45 78 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20   Expr *pRoot,.  
3900: 45 78 70 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45  Expr *pLeft,.  E
3910: 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20  xpr *pRight.){. 
3920: 20 69 66 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b   if( pRoot==0 ){
3930: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
3940: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
3950: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
3960: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74  Delete(db, pLeft
3970: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
3980: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69  prDelete(db, pRi
3990: 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ght);.  }else{. 
39a0: 20 20 20 69 66 28 20 70 52 69 67 68 74 20 29 7b     if( pRight ){
39b0: 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 52  .      pRoot->pR
39c0: 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20  ight = pRight;. 
39d0: 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d       if( pRight-
39e0: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
39f0: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20  ollate ){.      
3a00: 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c    pRoot->flags |
3a10: 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b  = EP_ExpCollate;
3a20: 0a 20 20 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e  .        pRoot->
3a30: 70 43 6f 6c 6c 20 3d 20 70 52 69 67 68 74 2d 3e  pColl = pRight->
3a40: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  pColl;.      }. 
3a50: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65     }.    if( pLe
3a60: 66 74 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f  ft ){.      pRoo
3a70: 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66 74  t->pLeft = pLeft
3a80: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66  ;.      if( pLef
3a90: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78  t->flags & EP_Ex
3aa0: 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20  pCollate ){.    
3ab0: 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73      pRoot->flags
3ac0: 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74   |= EP_ExpCollat
3ad0: 65 3b 0a 20 20 20 20 20 20 20 20 70 52 6f 6f 74  e;.        pRoot
3ae0: 2d 3e 70 43 6f 6c 6c 20 3d 20 70 4c 65 66 74 2d  ->pColl = pLeft-
3af0: 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  >pColl;.      }.
3b00: 20 20 20 20 7d 0a 20 20 20 20 65 78 70 72 53 65      }.    exprSe
3b10: 74 48 65 69 67 68 74 28 70 52 6f 6f 74 29 3b 0a  tHeight(pRoot);.
3b20: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
3b30: 6f 63 61 74 65 20 61 20 45 78 70 72 20 6e 6f 64  ocate a Expr nod
3b40: 65 20 77 68 69 63 68 20 6a 6f 69 6e 73 20 61 73  e which joins as
3b50: 20 6d 61 6e 79 20 61 73 20 74 77 6f 20 73 75 62   many as two sub
3b60: 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65  trees..**.** One
3b70: 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20   or both of the 
3b80: 73 75 62 74 72 65 65 73 20 63 61 6e 20 62 65 20  subtrees can be 
3b90: 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 20 61 20  NULL.  Return a 
3ba0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e  pointer to the n
3bb0: 65 77 0a 2a 2a 20 45 78 70 72 20 6e 6f 64 65 2e  ew.** Expr node.
3bc0: 20 20 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d 20    Or, if an OOM 
3bd0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
3be0: 74 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  t pParse->db->ma
3bf0: 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a 20 66  llocFailed,.** f
3c00: 72 65 65 20 74 68 65 20 73 75 62 74 72 65 65 73  ree the subtrees
3c10: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
3c20: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
3c30: 65 33 50 45 78 70 72 28 0a 20 20 50 61 72 73 65  e3PExpr(.  Parse
3c40: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
3c50: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
3c60: 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f  ntext */.  int o
3c70: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
3c80: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
3c90: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70   opcode */.  Exp
3ca0: 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20  r *pLeft,       
3cb0: 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65       /* Left ope
3cc0: 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  rand */.  Expr *
3cd0: 70 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  pRight,         
3ce0: 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65 72 61    /* Right opera
3cf0: 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f  nd */.  const To
3d00: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 20 20 20 20  ken *pToken     
3d10: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 6b 65  /* Argument toke
3d20: 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  n */.){.  Expr *
3d30: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  p = sqlite3ExprA
3d40: 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  lloc(pParse->db,
3d50: 20 6f 70 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b   op, pToken, 1);
3d60: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74  .  sqlite3ExprAt
3d70: 74 61 63 68 53 75 62 74 72 65 65 73 28 70 50 61  tachSubtrees(pPa
3d80: 72 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65 66  rse->db, p, pLef
3d90: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 72 65  t, pRight);.  re
3da0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
3db0: 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73   Join two expres
3dc0: 73 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41  sions using an A
3dd0: 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66  ND operator.  If
3de0: 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69   either expressi
3df0: 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74  on is.** NULL, t
3e00: 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
3e10: 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73  the other expres
3e20: 73 69 6f 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  sion..*/.Expr *s
3e30: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 73 71  qlite3ExprAnd(sq
3e40: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
3e50: 2a 70 4c 65 66 74 2c 20 45 78 70 72 20 2a 70 52  *pLeft, Expr *pR
3e60: 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 4c 65  ight){.  if( pLe
3e70: 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ft==0 ){.    ret
3e80: 75 72 6e 20 70 52 69 67 68 74 3b 0a 20 20 7d 65  urn pRight;.  }e
3e90: 6c 73 65 20 69 66 28 20 70 52 69 67 68 74 3d 3d  lse if( pRight==
3ea0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
3eb0: 70 4c 65 66 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pLeft;.  }else{.
3ec0: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d      Expr *pNew =
3ed0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
3ee0: 63 28 64 62 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c  c(db, TK_AND, 0,
3ef0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
3f00: 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72 65  ExprAttachSubtre
3f10: 65 73 28 64 62 2c 20 70 4e 65 77 2c 20 70 4c 65  es(db, pNew, pLe
3f20: 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  ft, pRight);.   
3f30: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 20 20   return pNew;.  
3f40: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  }.}../*.** Const
3f50: 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65  ruct a new expre
3f60: 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61  ssion node for a
3f70: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d   function with m
3f80: 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d  ultiple.** argum
3f90: 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  ents..*/.Expr *s
3fa0: 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74 69  qlite3ExprFuncti
3fb0: 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
3fc0: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
3fd0: 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
3fe0: 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b  ){.  Expr *pNew;
3ff0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
4000: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
4010: 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b  ssert( pToken );
4020: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
4030: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
4040: 4b 5f 46 55 4e 43 54 49 4f 4e 2c 20 70 54 6f 6b  K_FUNCTION, pTok
4050: 65 6e 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 4e  en, 1);.  if( pN
4060: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ew==0 ){.    sql
4070: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
4080: 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 20 2f  te(db, pList); /
4090: 2a 20 41 76 6f 69 64 20 6d 65 6d 6f 72 79 20 6c  * Avoid memory l
40a0: 65 61 6b 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20  eak when malloc 
40b0: 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74  fails */.    ret
40c0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65  urn 0;.  }.  pNe
40d0: 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69  w->x.pList = pLi
40e0: 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45  st;.  assert( !E
40f0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
4100: 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  New, EP_xIsSelec
4110: 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  t) );.  sqlite3E
4120: 78 70 72 53 65 74 48 65 69 67 68 74 28 70 50 61  xprSetHeight(pPa
4130: 72 73 65 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65  rse, pNew);.  re
4140: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
4150: 0a 2a 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72  .** Assign a var
4160: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20  iable number to 
4170: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  an expression th
4180: 61 74 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c  at encodes a wil
4190: 64 63 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20  dcard.** in the 
41a0: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61  original SQL sta
41b0: 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20  tement.  .**.** 
41c0: 57 69 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73  Wildcards consis
41d0: 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65  ting of a single
41e0: 20 22 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65   "?" are assigne
41f0: 64 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65  d the next seque
4200: 6e 74 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c  ntial.** variabl
4210: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
4220: 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65  Wildcards of the
4230: 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65   form "?nnn" are
4240: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75   assigned the nu
4250: 6d 62 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20  mber "nnn".  We 
4260: 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e  make.** sure "nn
4270: 6e 22 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65  n" is not too be
4280: 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69   to avoid a deni
4290: 61 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61 74  al of service at
42a0: 74 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65  tack when.** the
42b0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63   SQL statement c
42c0: 6f 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74  omes from an ext
42d0: 65 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a  ernal source..**
42e0: 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66  .** Wildcards of
42f0: 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22   the form ":aaa"
4300: 2c 20 22 40 61 61 61 22 2c 20 6f 72 20 22 24 61  , "@aaa", or "$a
4310: 61 61 22 20 61 72 65 20 61 73 73 69 67 6e 65 64  aa" are assigned
4320: 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
4330: 0a 2a 2a 20 61 73 20 74 68 65 20 70 72 65 76 69  .** as the previ
4340: 6f 75 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ous instance of 
4350: 74 68 65 20 73 61 6d 65 20 77 69 6c 64 63 61 72  the same wildcar
4360: 64 2e 20 20 4f 72 20 69 66 20 74 68 69 73 20 69  d.  Or if this i
4370: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69  s the first.** i
4380: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 77  nstance of the w
4390: 69 6c 64 63 61 72 64 2c 20 74 68 65 20 6e 65 78  ildcard, the nex
43a0: 74 20 73 65 71 75 65 6e 69 61 6c 20 76 61 72 69  t sequenial vari
43b0: 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a  able number is.*
43c0: 2a 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76  * assigned..*/.v
43d0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
43e0: 73 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50  ssignVarNumber(P
43f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
4400: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 73 71  pr *pExpr){.  sq
4410: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
4420: 73 65 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74 20  se->db;.  const 
4430: 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20  char *z;..  if( 
4440: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
4450: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45 78  n;.  assert( !Ex
4460: 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
4470: 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
4480: 6c 75 65 7c 45 50 5f 52 65 64 75 63 65 64 7c 45  lue|EP_Reduced|E
4490: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 3b 0a  P_TokenOnly) );.
44a0: 20 20 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a    z = pExpr->u.z
44b0: 54 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28  Token;.  assert(
44c0: 20 7a 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   z!=0 );.  asser
44d0: 74 28 20 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20  t( z[0]!=0 );.  
44e0: 69 66 28 20 7a 5b 31 5d 3d 3d 30 20 29 7b 0a 20  if( z[1]==0 ){. 
44f0: 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f     /* Wildcard o
4500: 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 22 2e 20  f the form "?". 
4510: 20 41 73 73 69 67 6e 20 74 68 65 20 6e 65 78 74   Assign the next
4520: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
4530: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
4540: 7a 5b 30 5d 3d 3d 27 3f 27 20 29 3b 0a 20 20 20  z[0]=='?' );.   
4550: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
4560: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b   ++pParse->nVar;
4570: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 30  .  }else if( z[0
4580: 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 2f 2a  ]=='?' ){.    /*
4590: 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65   Wildcard of the
45a0: 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43   form "?nnn".  C
45b0: 6f 6e 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20  onvert "nnn" to 
45c0: 61 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 0a 20  an integer and. 
45d0: 20 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20     ** use it as 
45e0: 74 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  the variable num
45f0: 62 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ber */.    int i
4600: 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61  ;.    pExpr->iTa
4610: 62 6c 65 20 3d 20 69 20 3d 20 61 74 6f 69 28 28  ble = i = atoi((
4620: 63 68 61 72 2a 29 26 7a 5b 31 5d 29 3b 0a 20 20  char*)&z[1]);.  
4630: 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 30    testcase( i==0
4640: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
4650: 28 20 69 3d 3d 31 20 29 3b 0a 20 20 20 20 74 65  ( i==1 );.    te
4660: 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61  stcase( i==db->a
4670: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
4680: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
4690: 45 52 5d 2d 31 20 29 3b 0a 20 20 20 20 74 65 73  ER]-1 );.    tes
46a0: 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c  tcase( i==db->aL
46b0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
46c0: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
46d0: 52 5d 20 29 3b 0a 20 20 20 20 69 66 28 20 69 3c  R] );.    if( i<
46e0: 31 20 7c 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d 69  1 || i>db->aLimi
46f0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
4700: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20  ARIABLE_NUMBER] 
4710: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4720: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
4730: 20 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65   "variable numbe
4740: 72 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65  r must be betwee
4750: 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a 20  n ?1 and ?%d",. 
4760: 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 4c 69           db->aLi
4770: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
4780: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
4790: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ]);.    }.    if
47a0: 28 20 69 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72  ( i>pParse->nVar
47b0: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
47c0: 2d 3e 6e 56 61 72 20 3d 20 69 3b 0a 20 20 20 20  ->nVar = i;.    
47d0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
47e0: 2a 20 57 69 6c 64 63 61 72 64 73 20 6c 69 6b 65  * Wildcards like
47f0: 20 22 3a 61 61 61 22 2c 20 22 24 61 61 61 22 20   ":aaa", "$aaa" 
4800: 6f 72 20 22 40 61 61 61 22 2e 20 20 52 65 75 73  or "@aaa".  Reus
4810: 65 20 74 68 65 20 73 61 6d 65 20 76 61 72 69 61  e the same varia
4820: 62 6c 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65  ble.    ** numbe
4830: 72 20 61 73 20 74 68 65 20 70 72 69 6f 72 20 61  r as the prior a
4840: 70 70 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65  ppearance of the
4850: 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69   same name, or i
4860: 66 20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 2a  f the name.    *
4870: 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70 70 65  * has never appe
4880: 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72 65 75  ared before, reu
4890: 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72 69  se the same vari
48a0: 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20 20  able number.    
48b0: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  */.    int i;.  
48c0: 20 20 75 33 32 20 6e 3b 0a 20 20 20 20 6e 20 3d    u32 n;.    n =
48d0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
48e0: 28 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  (z);.    for(i=0
48f0: 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 61 72  ; i<pParse->nVar
4900: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
4910: 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 50 61    Expr *pE = pPa
4920: 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 69  rse->apVarExpr[i
4930: 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ];.      assert(
4940: 20 70 45 21 3d 30 20 29 3b 0a 20 20 20 20 20 20   pE!=0 );.      
4950: 69 66 28 20 6d 65 6d 63 6d 70 28 70 45 2d 3e 75  if( memcmp(pE->u
4960: 2e 7a 54 6f 6b 65 6e 2c 20 7a 2c 20 6e 29 3d 3d  .zToken, z, n)==
4970: 30 20 26 26 20 70 45 2d 3e 75 2e 7a 54 6f 6b 65  0 && pE->u.zToke
4980: 6e 5b 6e 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  n[n]==0 ){.     
4990: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
49a0: 20 3d 20 70 45 2d 3e 69 54 61 62 6c 65 3b 0a 20   = pE->iTable;. 
49b0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
49c0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
49d0: 69 66 28 20 69 3e 3d 70 50 61 72 73 65 2d 3e 6e  if( i>=pParse->n
49e0: 56 61 72 45 78 70 72 20 29 7b 0a 20 20 20 20 20  VarExpr ){.     
49f0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
4a00: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b   ++pParse->nVar;
4a10: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73  .      if( pPars
4a20: 65 2d 3e 6e 56 61 72 45 78 70 72 3e 3d 70 50 61  e->nVarExpr>=pPa
4a30: 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c  rse->nVarExprAll
4a40: 6f 63 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  oc-1 ){.        
4a50: 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72  pParse->nVarExpr
4a60: 41 6c 6c 6f 63 20 2b 3d 20 70 50 61 72 73 65 2d  Alloc += pParse-
4a70: 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 20 2b  >nVarExprAlloc +
4a80: 20 31 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61   10;.        pPa
4a90: 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 20 3d  rse->apVarExpr =
4aa0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
4ab0: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
4ac0: 72 65 65 28 0a 20 20 20 20 20 20 20 20 20 20 20  ree(.           
4ad0: 20 20 20 64 62 2c 0a 20 20 20 20 20 20 20 20 20     db,.         
4ae0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 70 56       pParse->apV
4af0: 61 72 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  arExpr,.        
4b00: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56        pParse->nV
4b10: 61 72 45 78 70 72 41 6c 6c 6f 63 2a 73 69 7a 65  arExprAlloc*size
4b20: 6f 66 28 70 50 61 72 73 65 2d 3e 61 70 56 61 72  of(pParse->apVar
4b30: 45 78 70 72 5b 30 5d 29 0a 20 20 20 20 20 20 20  Expr[0]).       
4b40: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
4b50: 20 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d        if( !db->m
4b60: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
4b70: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
4b80: 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72  Parse->apVarExpr
4b90: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  !=0 );.        p
4ba0: 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72  Parse->apVarExpr
4bb0: 5b 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70  [pParse->nVarExp
4bc0: 72 2b 2b 5d 20 3d 20 70 45 78 70 72 3b 0a 20 20  r++] = pExpr;.  
4bd0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20      }.    }.  } 
4be0: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
4bf0: 6e 45 72 72 20 26 26 20 70 50 61 72 73 65 2d 3e  nErr && pParse->
4c00: 6e 56 61 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  nVar>db->aLimit[
4c10: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
4c20: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b  IABLE_NUMBER] ){
4c30: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
4c40: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
4c50: 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61 72 69 61  o many SQL varia
4c60: 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  bles");.  }.}../
4c70: 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 6e 20 65 78  *.** Clear an ex
4c80: 70 72 65 73 73 69 6f 6e 20 73 74 72 75 63 74 75  pression structu
4c90: 72 65 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74  re without delet
4ca0: 69 6e 67 20 74 68 65 20 73 74 72 75 63 74 75 72  ing the structur
4cb0: 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 20 53 75 62  e itself..** Sub
4cc0: 73 74 72 75 63 74 75 72 65 20 69 73 20 64 65 6c  structure is del
4cd0: 65 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eted..*/.void sq
4ce0: 6c 69 74 65 33 45 78 70 72 43 6c 65 61 72 28 73  lite3ExprClear(s
4cf0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
4d00: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
4d10: 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 45  p!=0 );.  if( !E
4d20: 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74  xprHasAnyPropert
4d30: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
4d40: 79 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  y) ){.    sqlite
4d50: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
4d60: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 73  p->pLeft);.    s
4d70: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
4d80: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b  (db, p->pRight);
4d90: 0a 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61  .    if( !ExprHa
4da0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
4db0: 52 65 64 75 63 65 64 29 20 26 26 20 28 70 2d 3e  Reduced) && (p->
4dc0: 66 6c 61 67 73 32 20 26 20 45 50 32 5f 4d 61 6c  flags2 & EP2_Mal
4dd0: 6c 6f 63 65 64 54 6f 6b 65 6e 29 21 3d 30 20 29  locedToken)!=0 )
4de0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
4df0: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 7a  bFree(db, p->u.z
4e00: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  Token);.    }.  
4e10: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
4e20: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
4e30: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
4e40: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
4e50: 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65  ete(db, p->x.pSe
4e60: 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lect);.    }else
4e70: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
4e80: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
4e90: 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  , p->x.pList);. 
4ea0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
4eb0: 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 64 65  * Recursively de
4ec0: 6c 65 74 65 20 61 6e 20 65 78 70 72 65 73 73 69  lete an expressi
4ed0: 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64  on tree..*/.void
4ee0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
4ef0: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
4f00: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
4f10: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
4f20: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6c 65 61   sqlite3ExprClea
4f30: 72 28 64 62 2c 20 70 29 3b 0a 20 20 69 66 28 20  r(db, p);.  if( 
4f40: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
4f50: 28 70 2c 20 45 50 5f 53 74 61 74 69 63 29 20 29  (p, EP_Static) )
4f60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
4f70: 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a  ree(db, p);.  }.
4f80: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
4f90: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
4fa0: 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  tes allocated fo
4fb0: 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
4fc0: 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 70   structure .** p
4fd0: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
4fe0: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69  st argument. Thi
4ff0: 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20  s is always one 
5000: 6f 66 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45  of EXPR_FULLSIZE
5010: 2c 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55 43 45  ,.** EXPR_REDUCE
5020: 44 53 49 5a 45 20 6f 72 20 45 58 50 52 5f 54 4f  DSIZE or EXPR_TO
5030: 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a 2f 0a  KENONLYSIZE..*/.
5040: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 53  static int exprS
5050: 74 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a  tructSize(Expr *
5060: 70 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61  p){.  if( ExprHa
5070: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
5080: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72 65 74  TokenOnly) ) ret
5090: 75 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e  urn EXPR_TOKENON
50a0: 4c 59 53 49 5a 45 3b 0a 20 20 69 66 28 20 45 78  LYSIZE;.  if( Ex
50b0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
50c0: 20 45 50 5f 52 65 64 75 63 65 64 29 20 29 20 72   EP_Reduced) ) r
50d0: 65 74 75 72 6e 20 45 58 50 52 5f 52 45 44 55 43  eturn EXPR_REDUC
50e0: 45 44 53 49 5a 45 3b 0a 20 20 72 65 74 75 72 6e  EDSIZE;.  return
50f0: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a   EXPR_FULLSIZE;.
5100: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 75 70  }../*.** The dup
5110: 65 64 45 78 70 72 2a 53 69 7a 65 28 29 20 72 6f  edExpr*Size() ro
5120: 75 74 69 6e 65 73 20 65 61 63 68 20 72 65 74 75  utines each retu
5130: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
5140: 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 0a   bytes required.
5150: 2a 2a 20 74 6f 20 73 74 6f 72 65 20 61 20 63 6f  ** to store a co
5160: 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  py of an express
5170: 69 6f 6e 20 6f 72 20 65 78 70 72 65 73 73 69 6f  ion or expressio
5180: 6e 20 74 72 65 65 2e 20 20 54 68 65 79 20 64 69  n tree.  They di
5190: 66 66 65 72 20 69 6e 0a 2a 2a 20 68 6f 77 20 6d  ffer in.** how m
51a0: 75 63 68 20 6f 66 20 74 68 65 20 74 72 65 65 20  uch of the tree 
51b0: 69 73 20 6d 65 61 73 75 72 65 64 2e 0a 2a 2a 0a  is measured..**.
51c0: 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70 72  **     dupedExpr
51d0: 53 74 72 75 63 74 53 69 7a 65 28 29 20 20 20 20  StructSize()    
51e0: 20 53 69 7a 65 20 6f 66 20 6f 6e 6c 79 20 74 68   Size of only th
51f0: 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  e Expr structure
5200: 20 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78   .**     dupedEx
5210: 70 72 4e 6f 64 65 53 69 7a 65 28 29 20 20 20 20  prNodeSize()    
5220: 20 20 20 53 69 7a 65 20 6f 66 20 45 78 70 72 20     Size of Expr 
5230: 2b 20 73 70 61 63 65 20 66 6f 72 20 74 6f 6b 65  + space for toke
5240: 6e 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78  n.**     dupedEx
5250: 70 72 53 69 7a 65 28 29 20 20 20 20 20 20 20 20  prSize()        
5260: 20 20 20 45 78 70 72 20 2b 20 74 6f 6b 65 6e 20     Expr + token 
5270: 2b 20 73 75 62 74 72 65 65 20 63 6f 6d 70 6f 6e  + subtree compon
5280: 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ents.**.********
5290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
52a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
52b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
52c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
52d0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 75  ***.**.** The du
52e0: 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a  pedExprStructSiz
52f0: 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  e() function ret
5300: 75 72 6e 73 20 74 77 6f 20 76 61 6c 75 65 73 20  urns two values 
5310: 4f 52 2d 65 64 20 74 6f 67 65 74 68 65 72 3a 20  OR-ed together: 
5320: 20 0a 2a 2a 20 28 31 29 20 74 68 65 20 73 70 61   .** (1) the spa
5330: 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ce required for 
5340: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78  a copy of the Ex
5350: 70 72 20 73 74 72 75 63 74 75 72 65 20 6f 6e 6c  pr structure onl
5360: 79 20 61 6e 64 20 0a 2a 2a 20 28 32 29 20 74 68  y and .** (2) th
5370: 65 20 45 50 5f 78 78 78 20 66 6c 61 67 73 20 74  e EP_xxx flags t
5380: 68 61 74 20 69 6e 64 69 63 61 74 65 20 77 68 61  hat indicate wha
5390: 74 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  t the structure 
53a0: 73 69 7a 65 20 73 68 6f 75 6c 64 20 62 65 2e 0a  size should be..
53b0: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
53c0: 6c 75 65 73 20 69 73 20 61 6c 77 61 79 73 20 6f  lues is always o
53d0: 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ne of:.**.**    
53e0: 20 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 0a    EXPR_FULLSIZE.
53f0: 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 52 45 44  **      EXPR_RED
5400: 55 43 45 44 53 49 5a 45 20 20 20 7c 20 45 50 5f  UCEDSIZE   | EP_
5410: 52 65 64 75 63 65 64 0a 2a 2a 20 20 20 20 20 20  Reduced.**      
5420: 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49  EXPR_TOKENONLYSI
5430: 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  ZE | EP_TokenOnl
5440: 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65  y.**.** The size
5450: 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72   of the structur
5460: 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62  e can be found b
5470: 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 20 72 65  y masking the re
5480: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 6f 66  turn value.** of
5490: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
54a0: 74 68 20 30 78 66 66 66 2e 20 20 54 68 65 20 66  th 0xfff.  The f
54b0: 6c 61 67 73 20 63 61 6e 20 62 65 20 66 6f 75 6e  lags can be foun
54c0: 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65  d by masking the
54d0: 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65  .** return value
54e0: 20 77 69 74 68 20 45 50 5f 52 65 64 75 63 65 64   with EP_Reduced
54f0: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a  |EP_TokenOnly..*
5500: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77  *.** Note that w
5510: 69 74 68 20 66 6c 61 67 73 3d 3d 45 58 50 52 44  ith flags==EXPRD
5520: 55 50 5f 52 45 44 55 43 45 2c 20 74 68 69 73 20  UP_REDUCE, this 
5530: 72 6f 75 74 69 6e 65 73 20 77 6f 72 6b 73 20 6f  routines works o
5540: 6e 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a 20 28  n full-size.** (
5550: 75 6e 72 65 64 75 63 65 64 29 20 45 78 70 72 20  unreduced) Expr 
5560: 6f 62 6a 65 63 74 73 20 61 73 20 74 68 65 79 20  objects as they 
5570: 6f 72 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f  or originally co
5580: 6e 73 74 72 75 63 74 65 64 20 62 79 20 74 68 65  nstructed by the
5590: 20 70 61 72 73 65 72 2e 0a 2a 2a 20 44 75 72 69   parser..** Duri
55a0: 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  ng expression an
55b0: 61 6c 79 73 69 73 2c 20 65 78 74 72 61 20 69 6e  alysis, extra in
55c0: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 63 6f 6d  formation is com
55d0: 70 75 74 65 64 20 61 6e 64 20 6d 6f 76 65 64 20  puted and moved 
55e0: 69 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72 20 70 61  into.** later pa
55f0: 72 74 73 20 6f 66 20 74 65 68 20 45 78 70 72 20  rts of teh Expr 
5600: 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 61 74 20  object and that 
5610: 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f  extra informatio
5620: 6e 20 6d 69 67 68 74 20 67 65 74 20 63 68 6f 70  n might get chop
5630: 70 65 64 0a 2a 2a 20 6f 66 66 20 69 66 20 74 68  ped.** off if th
5640: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
5650: 72 65 64 75 63 65 64 2e 20 20 4e 6f 74 65 20 61  reduced.  Note a
5660: 6c 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73  lso that it does
5670: 20 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a 2a 20   not work to.** 
5680: 6d 61 6b 65 20 61 20 45 58 50 52 44 55 50 5f 52  make a EXPRDUP_R
5690: 45 44 55 43 45 20 63 6f 70 79 20 6f 66 20 61 20  EDUCE copy of a 
56a0: 72 65 64 75 63 65 64 20 65 78 70 72 65 73 73 69  reduced expressi
56b0: 6f 6e 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20  on.  It is only 
56c0: 6c 65 67 61 6c 0a 2a 2a 20 74 6f 20 72 65 64 75  legal.** to redu
56d0: 63 65 20 61 20 70 72 69 73 74 69 6e 65 20 65 78  ce a pristine ex
56e0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 66 72  pression tree fr
56f0: 6f 6d 20 74 68 65 20 70 61 72 73 65 72 2e 20 20  om the parser.  
5700: 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
5710: 6f 6e 0a 2a 2a 20 6f 66 20 64 75 70 65 64 45 78  on.** of dupedEx
5720: 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 63  prStructSize() c
5730: 6f 6e 74 61 69 6e 20 6d 75 6c 74 69 70 6c 65 20  ontain multiple 
5740: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
5750: 6e 74 73 20 74 68 61 74 20 61 74 74 65 6d 70 74  nts that attempt
5760: 0a 2a 2a 20 74 6f 20 65 6e 66 6f 72 63 65 20 74  .** to enforce t
5770: 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a  his constraint..
5780: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75  */.static int du
5790: 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a  pedExprStructSiz
57a0: 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  e(Expr *p, int f
57b0: 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 53 69  lags){.  int nSi
57c0: 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c  ze;.  assert( fl
57d0: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
57e0: 55 43 45 20 7c 7c 20 66 6c 61 67 73 3d 3d 30 20  UCE || flags==0 
57f0: 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 66  ); /* Only one f
5800: 6c 61 67 20 76 61 6c 75 65 20 61 6c 6c 6f 77 65  lag value allowe
5810: 64 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 28 66  d */.  if( 0==(f
5820: 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52 45 44  lags&EXPRDUP_RED
5830: 55 43 45 29 20 29 7b 0a 20 20 20 20 6e 53 69 7a  UCE) ){.    nSiz
5840: 65 20 3d 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a  e = EXPR_FULLSIZ
5850: 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
5860: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
5870: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45  AnyProperty(p, E
5880: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
5890: 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 61  educed) );.    a
58a0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
58b0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
58c0: 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20 20 20 20  omJoin) ); .    
58d0: 61 73 73 65 72 74 28 20 28 70 2d 3e 66 6c 61 67  assert( (p->flag
58e0: 73 32 20 26 20 45 50 32 5f 4d 61 6c 6c 6f 63 65  s2 & EP2_Malloce
58f0: 64 54 6f 6b 65 6e 29 3d 3d 30 20 29 3b 0a 20 20  dToken)==0 );.  
5900: 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 66 6c    assert( (p->fl
5910: 61 67 73 32 20 26 20 45 50 32 5f 49 72 72 65 64  ags2 & EP2_Irred
5920: 75 63 69 62 6c 65 29 3d 3d 30 20 29 3b 0a 20 20  ucible)==0 );.  
5930: 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 7c    if( p->pLeft |
5940: 7c 20 70 2d 3e 70 52 69 67 68 74 20 7c 7c 20 70  | p->pRight || p
5950: 2d 3e 70 43 6f 6c 6c 20 7c 7c 20 70 2d 3e 78 2e  ->pColl || p->x.
5960: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e  pList ){.      n
5970: 53 69 7a 65 20 3d 20 45 58 50 52 5f 52 45 44 55  Size = EXPR_REDU
5980: 43 45 44 53 49 5a 45 20 7c 20 45 50 5f 52 65 64  CEDSIZE | EP_Red
5990: 75 63 65 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  uced;.    }else{
59a0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45  .      nSize = E
59b0: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
59c0: 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  E | EP_TokenOnly
59d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
59e0: 74 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f  turn nSize;.}../
59f0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
5a00: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  on returns the s
5a10: 70 61 63 65 20 69 6e 20 62 79 74 65 73 20 72 65  pace in bytes re
5a20: 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20  quired to store 
5a30: 74 68 65 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20  the copy .** of 
5a40: 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75  the Expr structu
5a50: 72 65 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66  re and a copy of
5a60: 20 74 68 65 20 45 78 70 72 2e 75 2e 7a 54 6f 6b   the Expr.u.zTok
5a70: 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20 74 68  en string (if th
5a80: 61 74 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73 20  at.** string is 
5a90: 64 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61  defined.).*/.sta
5aa0: 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78 70  tic int dupedExp
5ab0: 72 4e 6f 64 65 53 69 7a 65 28 45 78 70 72 20 2a  rNodeSize(Expr *
5ac0: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
5ad0: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 64 75 70   int nByte = dup
5ae0: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
5af0: 28 70 2c 20 66 6c 61 67 73 29 20 26 20 30 78 66  (p, flags) & 0xf
5b00: 66 66 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48  ff;.  if( !ExprH
5b10: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
5b20: 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d  _IntValue) && p-
5b30: 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  >u.zToken ){.   
5b40: 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65   nByte += sqlite
5b50: 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a  3Strlen30(p->u.z
5b60: 54 6f 6b 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20  Token)+1;.  }.  
5b70: 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 6e 42  return ROUND8(nB
5b80: 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  yte);.}../*.** R
5b90: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
5ba0: 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72   of bytes requir
5bb0: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 64  ed to create a d
5bc0: 75 70 6c 69 63 61 74 65 20 6f 66 20 74 68 65 20  uplicate of the 
5bd0: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70  .** expression p
5be0: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
5bf0: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  st argument. The
5c00: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
5c10: 20 69 73 20 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f   is a.** mask co
5c20: 6e 74 61 69 6e 69 6e 67 20 45 58 50 52 44 55 50  ntaining EXPRDUP
5c30: 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a  _XXX flags..**.*
5c40: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
5c50: 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 73 70  rned includes sp
5c60: 61 63 65 20 74 6f 20 63 72 65 61 74 65 20 61 20  ace to create a 
5c70: 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72  copy of the Expr
5c80: 20 73 74 72 75 63 74 0a 2a 2a 20 69 74 73 65 6c   struct.** itsel
5c90: 66 20 61 6e 64 20 74 68 65 20 62 75 66 66 65 72  f and the buffer
5ca0: 20 72 65 66 65 72 72 65 64 20 74 6f 20 62 79 20   referred to by 
5cb0: 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69  Expr.u.zToken, i
5cc0: 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f any..**.** If 
5cd0: 74 68 65 20 45 58 50 52 44 55 50 5f 52 45 44 55  the EXPRDUP_REDU
5ce0: 43 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  CE flag is set, 
5cf0: 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20  then the return 
5d00: 76 61 6c 75 65 20 69 6e 63 6c 75 64 65 73 20 0a  value includes .
5d10: 2a 2a 20 73 70 61 63 65 20 74 6f 20 64 75 70 6c  ** space to dupl
5d20: 69 63 61 74 65 20 61 6c 6c 20 45 78 70 72 20 6e  icate all Expr n
5d30: 6f 64 65 73 20 69 6e 20 74 68 65 20 74 72 65 65  odes in the tree
5d40: 20 66 6f 72 6d 65 64 20 62 79 20 45 78 70 72 2e   formed by Expr.
5d50: 70 4c 65 66 74 20 0a 2a 2a 20 61 6e 64 20 45 78  pLeft .** and Ex
5d60: 70 72 2e 70 52 69 67 68 74 20 76 61 72 69 61 62  pr.pRight variab
5d70: 6c 65 73 20 28 62 75 74 20 6e 6f 74 20 66 6f 72  les (but not for
5d80: 20 61 6e 79 20 73 74 72 75 63 74 75 72 65 73 20   any structures 
5d90: 70 6f 69 6e 74 65 64 20 74 6f 20 6f 72 20 0a 2a  pointed to or .*
5da0: 2a 20 64 65 73 63 65 6e 64 65 64 20 66 72 6f 6d  * descended from
5db0: 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73   the Expr.x.pLis
5dc0: 74 20 6f 72 20 45 78 70 72 2e 78 2e 70 53 65 6c  t or Expr.x.pSel
5dd0: 65 63 74 20 76 61 72 69 61 62 6c 65 73 29 2e 0a  ect variables)..
5de0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75  */.static int du
5df0: 70 65 64 45 78 70 72 53 69 7a 65 28 45 78 70 72  pedExprSize(Expr
5e00: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
5e10: 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 30  .  int nByte = 0
5e20: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
5e30: 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45 78   nByte = dupedEx
5e40: 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c  prNodeSize(p, fl
5e50: 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 66 6c  ags);.    if( fl
5e60: 61 67 73 26 45 58 50 52 44 55 50 5f 52 45 44 55  ags&EXPRDUP_REDU
5e70: 43 45 20 29 7b 0a 20 20 20 20 20 20 6e 42 79 74  CE ){.      nByt
5e80: 65 20 2b 3d 20 64 75 70 65 64 45 78 70 72 53 69  e += dupedExprSi
5e90: 7a 65 28 70 2d 3e 70 4c 65 66 74 2c 20 66 6c 61  ze(p->pLeft, fla
5ea0: 67 73 29 20 2b 20 64 75 70 65 64 45 78 70 72 53  gs) + dupedExprS
5eb0: 69 7a 65 28 70 2d 3e 70 52 69 67 68 74 2c 20 66  ize(p->pRight, f
5ec0: 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  lags);.    }.  }
5ed0: 0a 20 20 72 65 74 75 72 6e 20 6e 42 79 74 65 3b  .  return nByte;
5ee0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
5ef0: 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c  unction is simil
5f00: 61 72 20 74 6f 20 73 71 6c 69 74 65 33 45 78 70  ar to sqlite3Exp
5f10: 72 44 75 70 28 29 2c 20 65 78 63 65 70 74 20 74  rDup(), except t
5f20: 68 61 74 20 69 66 20 70 7a 42 75 66 66 65 72 20  hat if pzBuffer 
5f30: 0a 2a 2a 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  .** is not NULL 
5f40: 74 68 65 6e 20 2a 70 7a 42 75 66 66 65 72 20 69  then *pzBuffer i
5f50: 73 20 61 73 73 75 6d 65 64 20 74 6f 20 70 6f 69  s assumed to poi
5f60: 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6c  nt to a buffer l
5f70: 61 72 67 65 20 65 6e 6f 75 67 68 20 0a 2a 2a 20  arge enough .** 
5f80: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70  to store the cop
5f90: 79 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20  y of expression 
5fa0: 70 2c 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66  p, the copies of
5fb0: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20   p->u.zToken.** 
5fc0: 28 69 66 20 61 70 70 6c 69 63 61 62 6c 65 29 2c  (if applicable),
5fd0: 20 61 6e 64 20 74 68 65 20 63 6f 70 69 65 73 20   and the copies 
5fe0: 6f 66 20 74 68 65 20 70 2d 3e 70 4c 65 66 74 20  of the p->pLeft 
5ff0: 61 6e 64 20 70 2d 3e 70 52 69 67 68 74 20 65 78  and p->pRight ex
6000: 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66  pressions,.** if
6010: 20 61 6e 79 2e 20 42 65 66 6f 72 65 20 72 65 74   any. Before ret
6020: 75 72 6e 69 6e 67 2c 20 2a 70 7a 42 75 66 66 65  urning, *pzBuffe
6030: 72 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  r is set to the 
6040: 66 69 72 73 74 20 62 79 74 65 20 70 61 73 73 65  first byte passe
6050: 64 20 74 68 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e  d the.** portion
6060: 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 63   of the buffer c
6070: 6f 70 69 65 64 20 69 6e 74 6f 20 62 79 20 74 68  opied into by th
6080: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
6090: 73 74 61 74 69 63 20 45 78 70 72 20 2a 65 78 70  static Expr *exp
60a0: 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  rDup(sqlite3 *db
60b0: 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  , Expr *p, int f
60c0: 6c 61 67 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66  lags, u8 **pzBuf
60d0: 66 65 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e  fer){.  Expr *pN
60e0: 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ew = 0;         
60f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6100: 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
6110: 2a 2f 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  */.  if( p ){.  
6120: 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 52 65    const int isRe
6130: 64 75 63 65 64 20 3d 20 28 66 6c 61 67 73 26 45  duced = (flags&E
6140: 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a  XPRDUP_REDUCE);.
6150: 20 20 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 0a      u8 *zAlloc;.
6160: 20 20 20 20 75 33 32 20 73 74 61 74 69 63 46 6c      u32 staticFl
6170: 61 67 20 3d 20 30 3b 0a 0a 20 20 20 20 61 73 73  ag = 0;..    ass
6180: 65 72 74 28 20 70 7a 42 75 66 66 65 72 3d 3d 30  ert( pzBuffer==0
6190: 20 7c 7c 20 69 73 52 65 64 75 63 65 64 20 29 3b   || isReduced );
61a0: 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  ..    /* Figure 
61b0: 6f 75 74 20 77 68 65 72 65 20 74 6f 20 77 72 69  out where to wri
61c0: 74 65 20 74 68 65 20 6e 65 77 20 45 78 70 72 20  te the new Expr 
61d0: 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20  structure. */.  
61e0: 20 20 69 66 28 20 70 7a 42 75 66 66 65 72 20 29    if( pzBuffer )
61f0: 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 3d  {.      zAlloc =
6200: 20 2a 70 7a 42 75 66 66 65 72 3b 0a 20 20 20 20   *pzBuffer;.    
6210: 20 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20 45    staticFlag = E
6220: 50 5f 53 74 61 74 69 63 3b 0a 20 20 20 20 7d 65  P_Static;.    }e
6230: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f  lse{.      zAllo
6240: 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  c = sqlite3DbMal
6250: 6c 6f 63 52 61 77 28 64 62 2c 20 64 75 70 65 64  locRaw(db, duped
6260: 45 78 70 72 53 69 7a 65 28 70 2c 20 66 6c 61 67  ExprSize(p, flag
6270: 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  s));.    }.    p
6280: 4e 65 77 20 3d 20 28 45 78 70 72 20 2a 29 7a 41  New = (Expr *)zA
6290: 6c 6c 6f 63 3b 0a 0a 20 20 20 20 69 66 28 20 70  lloc;..    if( p
62a0: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  New ){.      /* 
62b0: 53 65 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20  Set nNewSize to 
62c0: 74 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74  the size allocat
62d0: 65 64 20 66 6f 72 20 74 68 65 20 73 74 72 75 63  ed for the struc
62e0: 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a  ture pointed to.
62f0: 20 20 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77        ** by pNew
6300: 2e 20 54 68 69 73 20 69 73 20 65 69 74 68 65 72  . This is either
6310: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20   EXPR_FULLSIZE, 
6320: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
6330: 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 45 58 50   or.      ** EXP
6340: 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e  R_TOKENONLYSIZE.
6350: 20 6e 54 6f 6b 65 6e 20 69 73 20 73 65 74 20 74   nToken is set t
6360: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
6370: 62 79 74 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20  bytes consumed. 
6380: 20 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 63       ** by the c
6390: 6f 70 79 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e  opy of the p->u.
63a0: 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69  zToken string (i
63b0: 66 20 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f  f any)..      */
63c0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  .      const uns
63d0: 69 67 6e 65 64 20 6e 53 74 72 75 63 74 53 69 7a  igned nStructSiz
63e0: 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72  e = dupedExprStr
63f0: 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  uctSize(p, flags
6400: 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69  );.      const i
6410: 6e 74 20 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53  nt nNewSize = nS
6420: 74 72 75 63 74 53 69 7a 65 20 26 20 30 78 66 66  tructSize & 0xff
6430: 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f  f;.      int nTo
6440: 6b 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ken;.      if( !
6450: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
6460: 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  p, EP_IntValue) 
6470: 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29  && p->u.zToken )
6480: 7b 0a 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e  {.        nToken
6490: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
64a0: 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20  30(p->u.zToken) 
64b0: 2b 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  + 1;.      }else
64c0: 7b 0a 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e  {.        nToken
64d0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
64e0: 20 20 20 20 69 66 28 20 69 73 52 65 64 75 63 65      if( isReduce
64f0: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  d ){.        ass
6500: 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70  ert( ExprHasProp
6510: 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63  erty(p, EP_Reduc
6520: 65 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ed)==0 );.      
6530: 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c    memcpy(zAlloc,
6540: 20 70 2c 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20   p, nNewSize);. 
6550: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6560: 20 20 20 20 69 6e 74 20 6e 53 69 7a 65 20 3d 20      int nSize = 
6570: 65 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70  exprStructSize(p
6580: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
6590: 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69  y(zAlloc, p, nSi
65a0: 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ze);.        mem
65b0: 73 65 74 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a  set(&zAlloc[nSiz
65c0: 65 5d 2c 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c  e], 0, EXPR_FULL
65d0: 53 49 5a 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20  SIZE-nSize);.   
65e0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53     }..      /* S
65f0: 65 74 20 74 68 65 20 45 50 5f 52 65 64 75 63 65  et the EP_Reduce
6600: 64 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c  d, EP_TokenOnly,
6610: 20 61 6e 64 20 45 50 5f 53 74 61 74 69 63 20 66   and EP_Static f
6620: 6c 61 67 73 20 61 70 70 72 6f 70 72 69 61 74 65  lags appropriate
6630: 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  ly. */.      pNe
6640: 77 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 45 50  w->flags &= ~(EP
6650: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
6660: 6e 4f 6e 6c 79 7c 45 50 5f 53 74 61 74 69 63 29  nOnly|EP_Static)
6670: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c  ;.      pNew->fl
6680: 61 67 73 20 7c 3d 20 6e 53 74 72 75 63 74 53 69  ags |= nStructSi
6690: 7a 65 20 26 20 28 45 50 5f 52 65 64 75 63 65 64  ze & (EP_Reduced
66a0: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a  |EP_TokenOnly);.
66b0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67        pNew->flag
66c0: 73 20 7c 3d 20 73 74 61 74 69 63 46 6c 61 67 3b  s |= staticFlag;
66d0: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20  ..      /* Copy 
66e0: 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20  the p->u.zToken 
66f0: 73 74 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20  string, if any. 
6700: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 54 6f  */.      if( nTo
6710: 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ken ){.        c
6720: 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e  har *zToken = pN
6730: 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28  ew->u.zToken = (
6740: 63 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e  char*)&zAlloc[nN
6750: 65 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20  ewSize];.       
6760: 20 6d 65 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20   memcpy(zToken, 
6770: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f  p->u.zToken, nTo
6780: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  ken);.      }.. 
6790: 20 20 20 20 20 69 66 28 20 30 3d 3d 28 28 70 2d       if( 0==((p-
67a0: 3e 66 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c 61  >flags|pNew->fla
67b0: 67 73 29 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e  gs) & EP_TokenOn
67c0: 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ly) ){.        /
67d0: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 4e  * Fill in the pN
67e0: 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 6f 72  ew->x.pSelect or
67f0: 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 6d   pNew->x.pList m
6800: 65 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  ember. */.      
6810: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
6820: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
6830: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
6840: 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c      pNew->x.pSel
6850: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
6860: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e  ectDup(db, p->x.
6870: 70 53 65 6c 65 63 74 2c 20 69 73 52 65 64 75 63  pSelect, isReduc
6880: 65 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ed);.        }el
6890: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  se{.          pN
68a0: 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73 71  ew->x.pList = sq
68b0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
68c0: 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2c  (db, p->x.pList,
68d0: 20 69 73 52 65 64 75 63 65 64 29 3b 0a 20 20 20   isReduced);.   
68e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
68f0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
6900: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 61 6e 64   pNew->pLeft and
6910: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 2e 20 2a   pNew->pRight. *
6920: 2f 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  /.      if( Expr
6930: 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
6940: 4e 65 77 2c 20 45 50 5f 52 65 64 75 63 65 64 7c  New, EP_Reduced|
6950: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b  EP_TokenOnly) ){
6960: 0a 20 20 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20  .        zAlloc 
6970: 2b 3d 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65  += dupedExprNode
6980: 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a  Size(p, flags);.
6990: 20 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72          if( Expr
69a0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77  HasProperty(pNew
69b0: 2c 20 45 50 5f 52 65 64 75 63 65 64 29 20 29 7b  , EP_Reduced) ){
69c0: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
69d0: 3e 70 4c 65 66 74 20 3d 20 65 78 70 72 44 75 70  >pLeft = exprDup
69e0: 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45  (db, p->pLeft, E
69f0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26  XPRDUP_REDUCE, &
6a00: 7a 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20  zAlloc);.       
6a10: 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20     pNew->pRight 
6a20: 3d 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d  = exprDup(db, p-
6a30: 3e 70 52 69 67 68 74 2c 20 45 58 50 52 44 55 50  >pRight, EXPRDUP
6a40: 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63  _REDUCE, &zAlloc
6a50: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
6a60: 20 20 20 20 20 69 66 28 20 70 7a 42 75 66 66 65       if( pzBuffe
6a70: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  r ){.          *
6a80: 70 7a 42 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f  pzBuffer = zAllo
6a90: 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
6aa0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6ab0: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 32 20 3d    pNew->flags2 =
6ac0: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
6ad0: 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65  !ExprHasAnyPrope
6ae0: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
6af0: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nly) ){.        
6b00: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
6b10: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
6b20: 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b  b, p->pLeft, 0);
6b30: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
6b40: 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  >pRight = sqlite
6b50: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
6b60: 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20  pRight, 0);.    
6b70: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
6b80: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
6b90: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
6ba0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
6bb0: 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73  roup of routines
6bc0: 20 6d 61 6b 65 20 64 65 65 70 20 63 6f 70 69 65   make deep copie
6bd0: 73 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  s of expressions
6be0: 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  ,.** expression 
6bf0: 6c 69 73 74 73 2c 20 49 44 20 6c 69 73 74 73 2c  lists, ID lists,
6c00: 20 61 6e 64 20 73 65 6c 65 63 74 20 73 74 61 74   and select stat
6c10: 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 63 6f 70  ements.  The cop
6c20: 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64 65  ies can.** be de
6c30: 6c 65 74 65 64 20 28 62 79 20 62 65 69 6e 67 20  leted (by being 
6c40: 70 61 73 73 65 64 20 74 6f 20 74 68 65 69 72 20  passed to their 
6c50: 72 65 73 70 65 63 74 69 76 65 20 2e 2e 2e 44 65  respective ...De
6c60: 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65 73 29  lete() routines)
6c70: 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65 66 66 65  .** without effe
6c80: 63 74 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e  cting the origin
6c90: 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65  als..**.** The e
6ca0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20  xpression list, 
6cb0: 49 44 2c 20 61 6e 64 20 73 6f 75 72 63 65 20 6c  ID, and source l
6cc0: 69 73 74 73 20 72 65 74 75 72 6e 20 62 79 20 73  ists return by s
6cd0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
6ce0: 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 49  p(),.** sqlite3I
6cf0: 64 4c 69 73 74 44 75 70 28 29 2c 20 61 6e 64 20  dListDup(), and 
6d00: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75  sqlite3SrcListDu
6d10: 70 28 29 20 63 61 6e 20 6e 6f 74 20 62 65 20 66  p() can not be f
6d20: 75 72 74 68 65 72 20 65 78 70 61 6e 64 65 64 20  urther expanded 
6d30: 0a 2a 2a 20 62 79 20 73 75 62 73 65 71 75 65 6e  .** by subsequen
6d40: 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  t calls to sqlit
6d50: 65 2a 4c 69 73 74 41 70 70 65 6e 64 28 29 20 72  e*ListAppend() r
6d60: 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41  outines..**.** A
6d70: 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74 20 74  ny tables that t
6d80: 68 65 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74  he SrcList might
6d90: 20 70 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e 6f   point to are no
6da0: 74 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2a  t duplicated..**
6db0: 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61  .** The flags pa
6dc0: 72 61 6d 65 74 65 72 20 63 6f 6e 74 61 69 6e 73  rameter contains
6dd0: 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f   a combination o
6de0: 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 58 58  f the EXPRDUP_XX
6df0: 58 20 66 6c 61 67 73 2e 0a 2a 2a 20 49 66 20 74  X flags..** If t
6e00: 68 65 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  he EXPRDUP_REDUC
6e10: 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  E flag is set, t
6e20: 68 65 6e 20 74 68 65 20 73 74 72 75 63 74 75 72  hen the structur
6e30: 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 0a  e returned is a.
6e40: 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 76 65 72  ** truncated ver
6e50: 73 69 6f 6e 20 6f 66 20 74 68 65 20 75 73 75 61  sion of the usua
6e60: 6c 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  l Expr structure
6e70: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 73 74   that will be st
6e80: 6f 72 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20  ored as.** part 
6e90: 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  of the in-memory
6ea0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
6eb0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
6ec0: 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78 70 72 20  schema..*/.Expr 
6ed0: 2a 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28  *sqlite3ExprDup(
6ee0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
6ef0: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
6f00: 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 44  {.  return exprD
6f10: 75 70 28 64 62 2c 20 70 2c 20 66 6c 61 67 73 2c  up(db, p, flags,
6f20: 20 30 29 3b 0a 7d 0a 45 78 70 72 4c 69 73 74 20   0);.}.ExprList 
6f30: 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  *sqlite3ExprList
6f40: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
6f50: 20 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e   ExprList *p, in
6f60: 74 20 66 6c 61 67 73 29 7b 0a 20 20 45 78 70 72  t flags){.  Expr
6f70: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 73 74  List *pNew;.  st
6f80: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
6f90: 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c 64  em *pItem, *pOld
6fa0: 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Item;.  int i;. 
6fb0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
6fc0: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
6fd0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
6fe0: 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e  w(db, sizeof(*pN
6ff0: 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  ew) );.  if( pNe
7000: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
7010: 0a 20 20 70 4e 65 77 2d 3e 69 45 43 75 72 73 6f  .  pNew->iECurso
7020: 72 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  r = 0;.  pNew->n
7030: 45 78 70 72 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c  Expr = pNew->nAl
7040: 6c 6f 63 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a  loc = p->nExpr;.
7050: 20 20 70 4e 65 77 2d 3e 61 20 3d 20 70 49 74 65    pNew->a = pIte
7060: 6d 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  m = sqlite3DbMal
7070: 6c 6f 63 52 61 77 28 64 62 2c 20 20 70 2d 3e 6e  locRaw(db,  p->n
7080: 45 78 70 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  Expr*sizeof(p->a
7090: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 49  [0]) );.  if( pI
70a0: 74 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  tem==0 ){.    sq
70b0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
70c0: 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72  pNew);.    retur
70d0: 6e 20 30 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c 64  n 0;.  } .  pOld
70e0: 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66  Item = p->a;.  f
70f0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78  or(i=0; i<p->nEx
7100: 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
7110: 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20  , pOldItem++){. 
7120: 20 20 20 45 78 70 72 20 2a 70 4f 6c 64 45 78 70     Expr *pOldExp
7130: 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45  r = pOldItem->pE
7140: 78 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  xpr;.    pItem->
7150: 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
7160: 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 45  xprDup(db, pOldE
7170: 78 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  xpr, flags);.   
7180: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20   pItem->zName = 
7190: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
71a0: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e  db, pOldItem->zN
71b0: 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  ame);.    pItem-
71c0: 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33  >zSpan = sqlite3
71d0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
71e0: 64 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20  dItem->zSpan);. 
71f0: 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72     pItem->sortOr
7200: 64 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  der = pOldItem->
7210: 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 70  sortOrder;.    p
7220: 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a  Item->done = 0;.
7230: 20 20 20 20 70 49 74 65 6d 2d 3e 69 43 6f 6c 20      pItem->iCol 
7240: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 6f 6c  = pOldItem->iCol
7250: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 69 41 6c  ;.    pItem->iAl
7260: 69 61 73 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  ias = pOldItem->
7270: 69 41 6c 69 61 73 3b 0a 20 20 7d 0a 20 20 72 65  iAlias;.  }.  re
7280: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
7290: 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 73 2c 20  .** If cursors, 
72a0: 74 72 69 67 67 65 72 73 2c 20 76 69 65 77 73 20  triggers, views 
72b0: 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 20 61  and subqueries a
72c0: 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66  re all omitted f
72d0: 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64  rom.** the build
72e0: 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74  , then none of t
72f0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
7300: 74 69 6e 65 73 2c 20 65 78 63 65 70 74 20 66 6f  tines, except fo
7310: 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c  r .** sqlite3Sel
7320: 65 63 74 44 75 70 28 29 2c 20 63 61 6e 20 62 65  ectDup(), can be
7330: 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33   called. sqlite3
7340: 53 65 6c 65 63 74 44 75 70 28 29 20 69 73 20 73  SelectDup() is s
7350: 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c  ometimes.** call
7360: 65 64 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 61  ed with a NULL a
7370: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20  rgument..*/.#if 
7380: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
7390: 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
73a0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
73b0: 49 54 5f 54 52 49 47 47 45 52 29 20 5c 0a 20 7c  IT_TRIGGER) \. |
73c0: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
73d0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
73e0: 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65  .SrcList *sqlite
73f0: 33 53 72 63 4c 69 73 74 44 75 70 28 73 71 6c 69  3SrcListDup(sqli
7400: 74 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74  te3 *db, SrcList
7410: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
7420: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77  .  SrcList *pNew
7430: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
7440: 20 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 70 3d   nByte;.  if( p=
7450: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
7460: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
7470: 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30  *p) + (p->nSrc>0
7480: 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30   ? sizeof(p->a[0
7490: 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29  ]) * (p->nSrc-1)
74a0: 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20   : 0);.  pNew = 
74b0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
74c0: 61 77 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a  aw(db, nByte );.
74d0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
74e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
74f0: 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e  ->nSrc = pNew->n
7500: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b  Alloc = p->nSrc;
7510: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
7520: 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
7530: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
7540: 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d  item *pNewItem =
7550: 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20   &pNew->a[i];.  
7560: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
7570: 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20  _item *pOldItem 
7580: 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  = &p->a[i];.    
7590: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
75a0: 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61   pNewItem->zData
75b0: 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62  base = sqlite3Db
75c0: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
75d0: 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  tem->zDatabase);
75e0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a  .    pNewItem->z
75f0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
7600: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
7610: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
7620: 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61   pNewItem->zAlia
7630: 73 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  s = sqlite3DbStr
7640: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
7650: 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70  ->zAlias);.    p
7660: 4e 65 77 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  NewItem->jointyp
7670: 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 6a 6f  e = pOldItem->jo
7680: 69 6e 74 79 70 65 3b 0a 20 20 20 20 70 4e 65 77  intype;.    pNew
7690: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20  Item->iCursor = 
76a0: 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pOldItem->iCurso
76b0: 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  r;.    pNewItem-
76c0: 3e 69 73 50 6f 70 75 6c 61 74 65 64 20 3d 20 70  >isPopulated = p
76d0: 4f 6c 64 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c  OldItem->isPopul
76e0: 61 74 65 64 3b 0a 20 20 20 20 70 4e 65 77 49 74  ated;.    pNewIt
76f0: 65 6d 2d 3e 7a 49 6e 64 65 78 20 3d 20 73 71 6c  em->zIndex = sql
7700: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
7710: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 49 6e 64 65   pOldItem->zInde
7720: 78 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  x);.    pNewItem
7730: 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20 70  ->notIndexed = p
7740: 4f 6c 64 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65  OldItem->notInde
7750: 78 65 64 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  xed;.    pNewIte
7760: 6d 2d 3e 70 49 6e 64 65 78 20 3d 20 70 4f 6c 64  m->pIndex = pOld
7770: 49 74 65 6d 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  Item->pIndex;.  
7780: 20 20 70 54 61 62 20 3d 20 70 4e 65 77 49 74 65    pTab = pNewIte
7790: 6d 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49 74  m->pTab = pOldIt
77a0: 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66  em->pTab;.    if
77b0: 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ( pTab ){.      
77c0: 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  pTab->nRef++;.  
77d0: 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d    }.    pNewItem
77e0: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
77f0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
7800: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65   pOldItem->pSele
7810: 63 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  ct, flags);.    
7820: 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20  pNewItem->pOn = 
7830: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
7840: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e  b, pOldItem->pOn
7850: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
7860: 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d  ewItem->pUsing =
7870: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75   sqlite3IdListDu
7880: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
7890: 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e 65  pUsing);.    pNe
78a0: 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d  wItem->colUsed =
78b0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55 73   pOldItem->colUs
78c0: 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ed;.  }.  return
78d0: 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20   pNew;.}.IdList 
78e0: 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75  *sqlite3IdListDu
78f0: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  p(sqlite3 *db, I
7900: 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c  dList *p){.  IdL
7910: 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  ist *pNew;.  int
7920: 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   i;.  if( p==0 )
7930: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
7940: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
7950: 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
7960: 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
7970: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
7980: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49  rn 0;.  pNew->nI
7990: 64 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63  d = pNew->nAlloc
79a0: 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65   = p->nId;.  pNe
79b0: 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62  w->a = sqlite3Db
79c0: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 70 2d  MallocRaw(db, p-
79d0: 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  >nId*sizeof(p->a
79e0: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  [0]) );.  if( pN
79f0: 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20  ew->a==0 ){.    
7a00: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
7a10: 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74  , pNew);.    ret
7a20: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72  urn 0;.  }.  for
7a30: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20  (i=0; i<p->nId; 
7a40: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
7a50: 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e   IdList_item *pN
7a60: 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e  ewItem = &pNew->
7a70: 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74  a[i];.    struct
7a80: 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f   IdList_item *pO
7a90: 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69  ldItem = &p->a[i
7aa0: 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  ];.    pNewItem-
7ab0: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
7ac0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
7ad0: 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  dItem->zName);. 
7ae0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78     pNewItem->idx
7af0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78   = pOldItem->idx
7b00: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
7b10: 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73  New;.}.Select *s
7b20: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
7b30: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c  sqlite3 *db, Sel
7b40: 65 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  ect *p, int flag
7b50: 73 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e  s){.  Select *pN
7b60: 65 77 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  ew;.  if( p==0 )
7b70: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
7b80: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
7b90: 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
7ba0: 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
7bb0: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
7bc0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73  0;.  pNew->pELis
7bd0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
7be0: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45  istDup(db, p->pE
7bf0: 4c 69 73 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  List, flags);.  
7c00: 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c  pNew->pSrc = sql
7c10: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 64  ite3SrcListDup(d
7c20: 62 2c 20 70 2d 3e 70 53 72 63 2c 20 66 6c 61 67  b, p->pSrc, flag
7c30: 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65  s);.  pNew->pWhe
7c40: 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
7c50: 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 68 65 72  Dup(db, p->pWher
7c60: 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  e, flags);.  pNe
7c70: 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  w->pGroupBy = sq
7c80: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
7c90: 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  (db, p->pGroupBy
7ca0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
7cb0: 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69  ->pHaving = sqli
7cc0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
7cd0: 2d 3e 70 48 61 76 69 6e 67 2c 20 66 6c 61 67 73  ->pHaving, flags
7ce0: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  );.  pNew->pOrde
7cf0: 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
7d00: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
7d10: 70 4f 72 64 65 72 42 79 2c 20 66 6c 61 67 73 29  pOrderBy, flags)
7d20: 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70  ;.  pNew->op = p
7d30: 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 50  ->op;.  pNew->pP
7d40: 72 69 6f 72 20 3d 20 73 71 6c 69 74 65 33 53 65  rior = sqlite3Se
7d50: 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  lectDup(db, p->p
7d60: 50 72 69 6f 72 2c 20 66 6c 61 67 73 29 3b 0a 20  Prior, flags);. 
7d70: 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20   pNew->pLimit = 
7d80: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
7d90: 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c  b, p->pLimit, fl
7da0: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f  ags);.  pNew->pO
7db0: 66 66 73 65 74 20 3d 20 73 71 6c 69 74 65 33 45  ffset = sqlite3E
7dc0: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f  xprDup(db, p->pO
7dd0: 66 66 73 65 74 2c 20 66 6c 61 67 73 29 3b 0a 20  ffset, flags);. 
7de0: 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20   pNew->iLimit = 
7df0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73  0;.  pNew->iOffs
7e00: 65 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  et = 0;.  pNew->
7e10: 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65  selFlags = p->se
7e20: 6c 46 6c 61 67 73 20 26 20 7e 53 46 5f 55 73 65  lFlags & ~SF_Use
7e30: 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 70 4e  sEphemeral;.  pN
7e40: 65 77 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d  ew->pRightmost =
7e50: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72   0;.  pNew->addr
7e60: 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31  OpenEphm[0] = -1
7e70: 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70  ;.  pNew->addrOp
7e80: 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a  enEphm[1] = -1;.
7e90: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
7ea0: 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[2] = -1;.  
7eb0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23  return pNew;.}.#
7ec0: 65 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c  else.Select *sql
7ed0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71  ite3SelectDup(sq
7ee0: 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63  lite3 *db, Selec
7ef0: 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  t *p, int flags)
7f00: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  {.  assert( p==0
7f10: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   );.  return 0;.
7f20: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
7f30: 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65   Add a new eleme
7f40: 6e 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  nt to the end of
7f50: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
7f60: 69 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69  ist.  If pList i
7f70: 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e  s.** initially N
7f80: 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65  ULL, then create
7f90: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
7fa0: 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  n list..**.** If
7fb0: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
7fc0: 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  tion error occur
7fd0: 73 2c 20 74 68 65 20 65 6e 74 69 72 65 20 6c 69  s, the entire li
7fe0: 73 74 20 69 73 20 66 72 65 65 64 20 61 6e 64 0a  st is freed and.
7ff0: 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  ** NULL is retur
8000: 6e 65 64 2e 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c  ned.  If non-NUL
8010: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  L is returned, t
8020: 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e  hen it is guaran
8030: 74 65 65 64 0a 2a 2a 20 74 68 61 74 20 74 68 65  teed.** that the
8040: 20 6e 65 77 20 65 6e 74 72 79 20 77 61 73 20 73   new entry was s
8050: 75 63 63 65 73 73 66 75 6c 6c 79 20 61 70 70 65  uccessfully appe
8060: 6e 64 65 64 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73  nded..*/.ExprLis
8070: 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t *sqlite3ExprLi
8080: 73 74 41 70 70 65 6e 64 28 0a 20 20 50 61 72 73  stAppend(.  Pars
8090: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
80a0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
80b0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
80c0: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
80d0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77      /* List to w
80e0: 68 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20  hich to append. 
80f0: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
8100: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20  .  Expr *pExpr  
8110: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
8120: 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61  pression to be a
8130: 70 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20 62  ppended. Might b
8140: 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73  e NULL */.){.  s
8150: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
8160: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  rse->db;.  if( p
8170: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
8180: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62  List = sqlite3Db
8190: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
81a0: 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20  izeof(ExprList) 
81b0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
81c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
81d0: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a  o no_mem;.    }.
81e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
81f0: 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a  t->nAlloc==0 );.
8200: 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d    }.  if( pList-
8210: 3e 6e 41 6c 6c 6f 63 3c 3d 70 4c 69 73 74 2d 3e  >nAlloc<=pList->
8220: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 74 72  nExpr ){.    str
8230: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
8240: 6d 20 2a 61 3b 0a 20 20 20 20 69 6e 74 20 6e 20  m *a;.    int n 
8250: 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a  = pList->nAlloc*
8260: 32 20 2b 20 34 3b 0a 20 20 20 20 61 20 3d 20 73  2 + 4;.    a = s
8270: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
8280: 64 62 2c 20 70 4c 69 73 74 2d 3e 61 2c 20 6e 2a  db, pList->a, n*
8290: 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
82a0: 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 3d  0]));.    if( a=
82b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
82c0: 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20   no_mem;.    }. 
82d0: 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b     pList->a = a;
82e0: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  .    pList->nAll
82f0: 6f 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  oc = sqlite3DbMa
8300: 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20 61 29 2f  llocSize(db, a)/
8310: 73 69 7a 65 6f 66 28 61 5b 30 5d 29 3b 0a 20 20  sizeof(a[0]);.  
8320: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  }.  assert( pLis
8330: 74 2d 3e 61 21 3d 30 20 29 3b 0a 20 20 69 66 28  t->a!=0 );.  if(
8340: 20 31 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74   1 ){.    struct
8350: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
8360: 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e  pItem = &pList->
8370: 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b  a[pList->nExpr++
8380: 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49  ];.    memset(pI
8390: 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  tem, 0, sizeof(*
83a0: 70 49 74 65 6d 29 29 3b 0a 20 20 20 20 70 49 74  pItem));.    pIt
83b0: 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70  em->pExpr = pExp
83c0: 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  r;.  }.  return 
83d0: 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20  pList;..no_mem: 
83e0: 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20      .  /* Avoid 
83f0: 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69  leaking memory i
8400: 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69  f malloc has fai
8410: 6c 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  led. */.  sqlite
8420: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
8430: 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65  pExpr);.  sqlite
8440: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
8450: 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65  db, pList);.  re
8460: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
8470: 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69 73   Set the ExprLis
8480: 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d  t.a[].zName elem
8490: 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ent of the most 
84a0: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69  recently added i
84b0: 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78  tem.** on the ex
84c0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
84d0: 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74  *.** pList might
84e0: 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69   be NULL followi
84f0: 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  ng an OOM error.
8500: 20 20 42 75 74 20 70 4e 61 6d 65 20 73 68 6f 75    But pName shou
8510: 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e  ld never be.** N
8520: 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72  ULL.  If a memor
8530: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
8540: 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e  ls, the pParse->
8550: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8560: 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e   flag.** is set.
8570: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
8580: 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28  ExprListSetName(
8590: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
85a0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
85b0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
85c0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
85d0: 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  st,        /* Li
85e0: 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61  st to which to a
85f0: 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a  dd the span. */.
8600: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20    Token *pName, 
8610: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
8620: 65 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f  e to be added */
8630: 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20  .  int dequote  
8640: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
8650: 75 65 20 74 6f 20 63 61 75 73 65 20 74 68 65 20  ue to cause the 
8660: 6e 61 6d 65 20 74 6f 20 62 65 20 64 65 71 75 6f  name to be dequo
8670: 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  ted */.){.  asse
8680: 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20  rt( pList!=0 || 
8690: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
86a0: 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20  ocFailed!=0 );. 
86b0: 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
86c0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
86d0: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
86e0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
86f0: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20  ->nExpr>0 );.   
8700: 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d   pItem = &pList-
8710: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  >a[pList->nExpr-
8720: 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1];.    assert( 
8730: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20  pItem->zName==0 
8740: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e  );.    pItem->zN
8750: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
8760: 74 72 4e 44 75 70 28 70 50 61 72 73 65 2d 3e 64  trNDup(pParse->d
8770: 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61  b, pName->z, pNa
8780: 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20  me->n);.    if( 
8790: 64 65 71 75 6f 74 65 20 26 26 20 70 49 74 65 6d  dequote && pItem
87a0: 2d 3e 7a 4e 61 6d 65 20 29 20 73 71 6c 69 74 65  ->zName ) sqlite
87b0: 33 44 65 71 75 6f 74 65 28 70 49 74 65 6d 2d 3e  3Dequote(pItem->
87c0: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  zName);.  }.}../
87d0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70  *.** Set the Exp
87e0: 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20  rList.a[].zSpan 
87f0: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d  element of the m
8800: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
8810: 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68  ed item.** on th
8820: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
8830: 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d  t..**.** pList m
8840: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c  ight be NULL fol
8850: 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72  lowing an OOM er
8860: 72 6f 72 2e 20 20 42 75 74 20 70 53 70 61 6e 20  ror.  But pSpan 
8870: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a  should never be.
8880: 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d  ** NULL.  If a m
8890: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
88a0: 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72   fails, the pPar
88b0: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
88c0: 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20  iled flag.** is 
88d0: 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
88e0: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53  ite3ExprListSetS
88f0: 70 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  pan(.  Parse *pP
8900: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
8910: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
8920: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
8930: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f  *pList,        /
8940: 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20  * List to which 
8950: 74 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e  to add the span.
8960: 20 2a 2f 0a 20 20 45 78 70 72 53 70 61 6e 20 2a   */.  ExprSpan *
8970: 70 53 70 61 6e 20 20 20 20 20 20 20 20 20 2f 2a  pSpan         /*
8980: 20 54 68 65 20 73 70 61 6e 20 74 6f 20 62 65 20   The span to be 
8990: 61 64 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 71  added */.){.  sq
89a0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
89b0: 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  se->db;.  assert
89c0: 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62  ( pList!=0 || db
89d0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d  ->mallocFailed!=
89e0: 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  0 );.  if( pList
89f0: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
8a00: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
8a10: 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  tem = &pList->a[
8a20: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b  pList->nExpr-1];
8a30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
8a40: 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
8a50: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
8a60: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70  allocFailed || p
8a70: 49 74 65 6d 2d 3e 70 45 78 70 72 3d 3d 70 53 70  Item->pExpr==pSp
8a80: 61 6e 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20  an->pExpr );.   
8a90: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
8aa0: 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29  b, pItem->zSpan)
8ab0: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70  ;.    pItem->zSp
8ac0: 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  an = sqlite3DbSt
8ad0: 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a  rNDup(db, (char*
8ae0: 29 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a  )pSpan->zStart,.
8af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b10: 20 20 20 20 28 69 6e 74 29 28 70 53 70 61 6e 2d      (int)(pSpan-
8b20: 3e 7a 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a  >zEnd - pSpan->z
8b30: 53 74 61 72 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  Start));.  }.}..
8b40: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
8b50: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c  ression list pEL
8b60: 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72  ist contains mor
8b70: 65 20 74 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c  e than iLimit el
8b80: 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65  ements,.** leave
8b90: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
8ba0: 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  e in pParse..*/.
8bb0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
8bc0: 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28  ListCheckLength(
8bd0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
8be0: 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ,.  ExprList *pE
8bf0: 4c 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68  List,.  const ch
8c00: 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20  ar *zObject.){. 
8c10: 20 69 6e 74 20 6d 78 20 3d 20 70 50 61 72 73 65   int mx = pParse
8c20: 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ->db->aLimit[SQL
8c30: 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
8c40: 5d 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  ];.  testcase( p
8c50: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
8c60: 3e 6e 45 78 70 72 3d 3d 6d 78 20 29 3b 0a 20 20  >nExpr==mx );.  
8c70: 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74  testcase( pEList
8c80: 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
8c90: 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20 69 66 28  r==mx+1 );.  if(
8ca0: 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
8cb0: 74 2d 3e 6e 45 78 70 72 3e 6d 78 20 29 7b 0a 20  t->nExpr>mx ){. 
8cc0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
8cd0: 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
8ce0: 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  many columns in 
8cf0: 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20  %s", zObject);. 
8d00: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
8d10: 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70  te an entire exp
8d20: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f  ression list..*/
8d30: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
8d40: 72 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69  rListDelete(sqli
8d50: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73  te3 *db, ExprLis
8d60: 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
8d70: 20 69 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70   i;.  struct Exp
8d80: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
8d90: 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  m;.  if( pList==
8da0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
8db0: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d  sert( pList->a!=
8dc0: 30 20 7c 7c 20 28 70 4c 69 73 74 2d 3e 6e 45 78  0 || (pList->nEx
8dd0: 70 72 3d 3d 30 20 26 26 20 70 4c 69 73 74 2d 3e  pr==0 && pList->
8de0: 6e 41 6c 6c 6f 63 3d 3d 30 29 20 29 3b 0a 20 20  nAlloc==0) );.  
8df0: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
8e00: 45 78 70 72 3c 3d 70 4c 69 73 74 2d 3e 6e 41 6c  Expr<=pList->nAl
8e10: 6c 6f 63 20 29 3b 0a 20 20 66 6f 72 28 70 49 74  loc );.  for(pIt
8e20: 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
8e30: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
8e40: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
8e50: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
8e60: 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d  Delete(db, pItem
8e70: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71  ->pExpr);.    sq
8e80: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
8e90: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
8ea0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
8eb0: 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61  (db, pItem->zSpa
8ec0: 6e 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  n);.  }.  sqlite
8ed0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
8ee0: 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  t->a);.  sqlite3
8ef0: 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74  DbFree(db, pList
8f00: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73  );.}../*.** Thes
8f10: 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 57  e routines are W
8f20: 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73 2e  alker callbacks.
8f30: 20 20 57 61 6c 6b 65 72 2e 75 2e 70 69 20 69 73    Walker.u.pi is
8f40: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
8f50: 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 54 68   an integer.  Th
8f60: 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
8f70: 20 63 68 65 63 6b 69 6e 67 20 61 6e 20 65 78 70   checking an exp
8f80: 72 65 73 73 69 6f 6e 20 74 6f 20 73 65 65 0a 2a  ression to see.*
8f90: 2a 20 69 66 20 69 74 20 69 73 20 61 20 63 6f 6e  * if it is a con
8fa0: 73 74 61 6e 74 2e 20 20 53 65 74 20 2a 57 61 6c  stant.  Set *Wal
8fb0: 6b 65 72 2e 75 2e 70 69 20 74 6f 20 30 20 69 66  ker.u.pi to 0 if
8fc0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
8fd0: 69 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 73 74 61  is.** not consta
8fe0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  nt..**.** These 
8ff0: 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65  callback routine
9000: 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 69 6d  s are used to im
9010: 70 6c 65 6d 65 6e 74 20 74 68 65 20 66 6f 6c 6c  plement the foll
9020: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
9030: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
9040: 6e 73 74 61 6e 74 28 29 0a 2a 2a 20 20 20 20 20  nstant().**     
9050: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
9060: 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 0a 2a  stantNotJoin().*
9070: 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  *     sqlite3Exp
9080: 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e  rIsConstantOrFun
9090: 63 74 69 6f 6e 28 29 0a 2a 2a 0a 2a 2f 0a 73 74  ction().**.*/.st
90a0: 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64  atic int exprNod
90b0: 65 49 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b  eIsConstant(Walk
90c0: 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
90d0: 72 20 2a 70 45 78 70 72 29 7b 0a 0a 20 20 2f 2a  r *pExpr){..  /*
90e0: 20 49 66 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69   If pWalker->u.i
90f0: 20 69 73 20 33 20 74 68 65 6e 20 61 6e 79 20 74   is 3 then any t
9100: 65 72 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65  erm of the expre
9110: 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73  ssion that comes
9120: 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f   from.  ** the O
9130: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
9140: 65 73 20 6f 66 20 61 20 6a 6f 69 6e 20 64 69 73  es of a join dis
9150: 71 75 61 6c 69 66 69 65 73 20 74 68 65 20 65 78  qualifies the ex
9160: 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 66 72  pression.  ** fr
9170: 6f 6d 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65  om being conside
9180: 72 65 64 20 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f  red constant. */
9190: 0a 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e  .  if( pWalker->
91a0: 75 2e 69 3d 3d 33 20 26 26 20 45 78 70 72 48 61  u.i==3 && ExprHa
91b0: 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78  sAnyProperty(pEx
91c0: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
91d0: 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d   ){.    pWalker-
91e0: 3e 75 2e 69 20 3d 20 30 3b 0a 20 20 20 20 72 65  >u.i = 0;.    re
91f0: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
9200: 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70    }..  switch( p
9210: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
9220: 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66 75 6e 63  /* Consider func
9230: 74 69 6f 6e 73 20 74 6f 20 62 65 20 63 6f 6e 73  tions to be cons
9240: 74 61 6e 74 20 69 66 20 61 6c 6c 20 74 68 65 69  tant if all thei
9250: 72 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20  r arguments are 
9260: 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 2a 2a 20  constant.    ** 
9270: 61 6e 64 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69  and pWalker->u.i
9280: 3d 3d 32 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ==2 */.    case 
9290: 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  TK_FUNCTION:.   
92a0: 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e     if( pWalker->
92b0: 75 2e 69 3d 3d 32 20 29 20 72 65 74 75 72 6e 20  u.i==2 ) return 
92c0: 30 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c  0;.      /* Fall
92d0: 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20   through */.    
92e0: 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20  case TK_ID:.    
92f0: 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a  case TK_COLUMN:.
9300: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
9310: 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61  FUNCTION:.    ca
9320: 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
9330: 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
9340: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
9350: 49 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ID );.      test
9360: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
9370: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
9380: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
9390: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
93a0: 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20  FUNCTION );.    
93b0: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
93c0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  r->op==TK_AGG_CO
93d0: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 70 57  LUMN );.      pW
93e0: 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a  alker->u.i = 0;.
93f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
9400: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 64 65 66 61  _Abort;.    defa
9410: 75 6c 74 3a 0a 20 20 20 20 20 20 74 65 73 74 63  ult:.      testc
9420: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
9430: 54 4b 5f 53 45 4c 45 43 54 20 29 3b 20 2f 2a 20  TK_SELECT ); /* 
9440: 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73  selectNodeIsCons
9450: 74 61 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c  tant will disall
9460: 6f 77 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  ow */.      test
9470: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
9480: 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 20 2f 2a  =TK_EXISTS ); /*
9490: 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e   selectNodeIsCon
94a0: 73 74 61 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c  stant will disal
94b0: 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  low */.      ret
94c0: 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
94d0: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 69  ;.  }.}.static i
94e0: 6e 74 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43  nt selectNodeIsC
94f0: 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a  onstant(Walker *
9500: 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
9510: 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55  *NotUsed){.  UNU
9520: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
9530: 74 55 73 65 64 29 3b 0a 20 20 70 57 61 6c 6b 65  tUsed);.  pWalke
9540: 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20 20 72 65  r->u.i = 0;.  re
9550: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
9560: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  }.static int exp
9570: 72 49 73 43 6f 6e 73 74 28 45 78 70 72 20 2a 70  rIsConst(Expr *p
9580: 2c 20 69 6e 74 20 69 6e 69 74 46 6c 61 67 29 7b  , int initFlag){
9590: 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77  .  Walker w;.  w
95a0: 2e 75 2e 69 20 3d 20 69 6e 69 74 46 6c 61 67 3b  .u.i = initFlag;
95b0: 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
95c0: 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73 43  ck = exprNodeIsC
95d0: 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 78 53 65  onstant;.  w.xSe
95e0: 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73  lectCallback = s
95f0: 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74  electNodeIsConst
9600: 61 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  ant;.  sqlite3Wa
9610: 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20  lkExpr(&w, p);. 
9620: 20 72 65 74 75 72 6e 20 77 2e 75 2e 69 3b 0a 7d   return w.u.i;.}
9630: 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  ../*.** Walk an 
9640: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
9650: 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
9660: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
9670: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20  constant.** and 
9680: 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73  0 if it involves
9690: 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75   variables or fu
96a0: 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a  nction calls..**
96b0: 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70  .** For the purp
96c0: 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e  oses of this fun
96d0: 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d  ction, a double-
96e0: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
96f0: 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20  x: "abc").** is 
9700: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72  considered a var
9710: 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67  iable but a sing
9720: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
9730: 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a   (ex: 'abc') is.
9740: 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a  ** a constant..*
9750: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
9760: 72 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72  rIsConstant(Expr
9770: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65   *p){.  return e
9780: 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 31 29  xprIsConst(p, 1)
9790: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  ;.}../*.** Walk 
97a0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
97b0: 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66  ee.  Return 1 if
97c0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
97d0: 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74  is constant.** t
97e0: 68 61 74 20 64 6f 65 73 20 6e 6f 20 6f 72 69 67  hat does no orig
97f0: 69 6e 61 74 65 20 66 72 6f 6d 20 74 68 65 20 4f  inate from the O
9800: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
9810: 65 73 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  es of a join..**
9820: 20 52 65 74 75 72 6e 20 30 20 69 66 20 69 74 20   Return 0 if it 
9830: 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c  involves variabl
9840: 65 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63  es or function c
9850: 61 6c 6c 73 20 6f 72 20 74 65 72 6d 73 20 66 72  alls or terms fr
9860: 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72 20 55  om.** an ON or U
9870: 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a  SING clause..*/.
9880: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
9890: 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e  sConstantNotJoin
98a0: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74  (Expr *p){.  ret
98b0: 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28  urn exprIsConst(
98c0: 70 2c 20 33 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p, 3);.}../*.** 
98d0: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
98e0: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
98f0: 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73   1 if the expres
9900: 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
9910: 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74 69 6f  .** or a functio
9920: 6e 20 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e 73  n call with cons
9930: 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20  tant arguments. 
9940: 20 52 65 74 75 72 6e 20 61 6e 64 20 30 20 69 66   Return and 0 if
9950: 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 61 6e   there.** are an
9960: 79 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a  y variables..**.
9970: 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
9980: 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ses of this func
9990: 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71  tion, a double-q
99a0: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
99b0: 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63  : "abc").** is c
99c0: 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69  onsidered a vari
99d0: 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c  able but a singl
99e0: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
99f0: 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a  (ex: 'abc') is.*
9a00: 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f  * a constant..*/
9a10: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
9a20: 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63  IsConstantOrFunc
9a30: 74 69 6f 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20  tion(Expr *p){. 
9a40: 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f   return exprIsCo
9a50: 6e 73 74 28 70 2c 20 32 29 3b 0a 7d 0a 0a 2f 2a  nst(p, 2);.}../*
9a60: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
9a70: 73 73 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20  ssion p codes a 
9a80: 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72  constant integer
9a90: 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65   that is small e
9aa0: 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20  nough.** to fit 
9ab0: 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  in a 32-bit inte
9ac0: 67 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e  ger, return 1 an
9ad0: 64 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 20  d put the value 
9ae0: 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a  of the integer.*
9af0: 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49  * in *pValue.  I
9b00: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
9b10: 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67   is not an integ
9b20: 65 72 20 6f 72 20 69 66 20 69 74 20 69 73 20 74  er or if it is t
9b30: 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74  oo big.** to fit
9b40: 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d   in a signed 32-
9b50: 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74  bit integer, ret
9b60: 75 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20  urn 0 and leave 
9b70: 2a 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65  *pValue unchange
9b80: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
9b90: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 45  3ExprIsInteger(E
9ba0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61  xpr *p, int *pVa
9bb0: 6c 75 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  lue){.  int rc =
9bc0: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61   0;.  if( p->fla
9bd0: 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs & EP_IntValue
9be0: 20 29 7b 0a 20 20 20 20 2a 70 56 61 6c 75 65 20   ){.    *pValue 
9bf0: 3d 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20  = p->u.iValue;. 
9c00: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
9c10: 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70  .  switch( p->op
9c20: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
9c30: 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
9c40: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 47 65 74   rc = sqlite3Get
9c50: 49 6e 74 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65  Int32(p->u.zToke
9c60: 6e 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20  n, pValue);.    
9c70: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 30 20    assert( rc==0 
9c80: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
9c90: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
9ca0: 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20  K_UPLUS: {.     
9cb0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70   rc = sqlite3Exp
9cc0: 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c  rIsInteger(p->pL
9cd0: 65 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20  eft, pValue);.  
9ce0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9cf0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49  .    case TK_UMI
9d00: 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  NUS: {.      int
9d10: 20 76 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71   v;.      if( sq
9d20: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
9d30: 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29  er(p->pLeft, &v)
9d40: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 56 61   ){.        *pVa
9d50: 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20  lue = -v;.      
9d60: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
9d70: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
9d80: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
9d90: 3a 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69  : break;.  }.  i
9da0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 61 73 73  f( rc ){.    ass
9db0: 65 72 74 28 20 45 78 70 72 48 61 73 41 6e 79 50  ert( ExprHasAnyP
9dc0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65  roperty(p, EP_Re
9dd0: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
9de0: 6c 79 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ly).            
9df0: 20 20 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73 32     || (p->flags2
9e00: 20 26 20 45 50 32 5f 4d 61 6c 6c 6f 63 65 64 54   & EP2_MallocedT
9e10: 6f 6b 65 6e 29 3d 3d 30 20 29 3b 0a 20 20 20 20  oken)==0 );.    
9e20: 70 2d 3e 6f 70 20 3d 20 54 4b 5f 49 4e 54 45 47  p->op = TK_INTEG
9e30: 45 52 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73  ER;.    p->flags
9e40: 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b   |= EP_IntValue;
9e50: 0a 20 20 20 20 70 2d 3e 75 2e 69 56 61 6c 75 65  .    p->u.iValue
9e60: 20 3d 20 2a 70 56 61 6c 75 65 3b 0a 20 20 7d 0a   = *pValue;.  }.
9e70: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
9e80: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
9e90: 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 73  E if the given s
9ea0: 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d 69  tring is a row-i
9eb0: 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a  d column name..*
9ec0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73 52  /.int sqlite3IsR
9ed0: 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72 20  owid(const char 
9ee0: 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  *z){.  if( sqlit
9ef0: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52  e3StrICmp(z, "_R
9f00: 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65 74  OWID_")==0 ) ret
9f10: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c  urn 1;.  if( sql
9f20: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
9f30: 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65 74  ROWID")==0 ) ret
9f40: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c  urn 1;.  if( sql
9f50: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
9f60: 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72  OID")==0 ) retur
9f70: 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  n 1;.  return 0;
9f80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
9f90: 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20   true if we are 
9fa0: 61 62 6c 65 20 74 6f 20 74 68 65 20 49 4e 20 6f  able to the IN o
9fb0: 70 65 72 61 74 6f 72 20 6f 70 74 69 6d 69 7a 61  perator optimiza
9fc0: 74 69 6f 6e 20 6f 6e 20 61 0a 2a 2a 20 71 75 65  tion on a.** que
9fd0: 72 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a  ry of the form.*
9fe0: 2a 0a 2a 2a 20 20 20 20 20 20 20 78 20 49 4e 20  *.**       x IN 
9ff0: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a  (SELECT ...).**.
a000: 2a 2a 20 57 68 65 72 65 20 74 68 65 20 53 45 4c  ** Where the SEL
a010: 45 43 54 2e 2e 2e 20 63 6c 61 75 73 65 20 69 73  ECT... clause is
a020: 20 61 73 20 73 70 65 63 69 66 69 65 64 20 62 79   as specified by
a030: 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 74   the parameter t
a040: 6f 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  o this.** routin
a050: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 65 6c  e..**.** The Sel
a060: 65 63 74 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ect object passe
a070: 64 20 69 6e 20 68 61 73 20 61 6c 72 65 61 64 79  d in has already
a080: 20 62 65 65 6e 20 70 72 65 70 72 6f 63 65 73 73   been preprocess
a090: 65 64 20 61 6e 64 20 6e 6f 0a 2a 2a 20 65 72 72  ed and no.** err
a0a0: 6f 72 73 20 68 61 76 65 20 62 65 65 6e 20 66 6f  ors have been fo
a0b0: 75 6e 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  und..*/.#ifndef 
a0c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
a0d0: 55 45 52 59 0a 73 74 61 74 69 63 20 69 6e 74 20  UERY.static int 
a0e0: 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e  isCandidateForIn
a0f0: 4f 70 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  Opt(Select *p){.
a100: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
a110: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
a120: 69 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ist;.  Table *pT
a130: 61 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  ab;.  if( p==0 )
a140: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
a150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a160: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
a170: 6f 66 20 49 4e 20 69 73 20 53 45 4c 45 43 54 20  of IN is SELECT 
a180: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
a190: 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  or ) return 0;  
a1a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
a1b0: 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  ot a compound SE
a1c0: 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d  LECT */.  if( p-
a1d0: 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
a1e0: 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
a1f0: 65 67 61 74 65 29 20 29 7b 0a 20 20 20 20 74 65  egate) ){.    te
a200: 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46  stcase( (p->selF
a210: 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
a220: 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
a230: 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20  ))==SF_Distinct 
a240: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
a250: 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
a260: 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
a270: 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
a280: 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20  Aggregate );.   
a290: 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f   return 0; /* No
a2a0: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
a2b0: 64 20 61 6e 64 20 6e 6f 20 61 67 67 72 65 67 61  d and no aggrega
a2c0: 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
a2d0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
a2e0: 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20  >pGroupBy==0 ); 
a2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a300: 48 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  Has no GROUP BY 
a310: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20  clause */.  if( 
a320: 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
a330: 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
a340: 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d     /* Has no LIM
a350: 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 61  IT clause */.  a
a360: 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65  ssert( p->pOffse
a370: 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  t==0 );         
a380: 20 20 20 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49        /* No LIMI
a390: 54 20 6d 65 61 6e 73 20 6e 6f 20 4f 46 46 53 45  T means no OFFSE
a3a0: 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57  T */.  if( p->pW
a3b0: 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b  here ) return 0;
a3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a3d0: 20 48 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c   Has no WHERE cl
a3e0: 61 75 73 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d  ause */.  pSrc =
a3f0: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65   p->pSrc;.  asse
a400: 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20  rt( pSrc!=0 );. 
a410: 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21   if( pSrc->nSrc!
a420: 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =1 ) return 0;  
a430: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c          /* Singl
a440: 65 20 74 65 72 6d 20 69 6e 20 46 52 4f 4d 20 63  e term in FROM c
a450: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70  lause */.  if( p
a460: 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
a470: 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
a480: 20 20 2f 2a 20 46 52 4f 4d 20 69 73 20 6e 6f 74    /* FROM is not
a490: 20 61 20 73 75 62 71 75 65 72 79 20 6f 72 20 76   a subquery or v
a4a0: 69 65 77 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20  iew */.  pTab = 
a4b0: 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  pSrc->a[0].pTab;
a4c0: 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 54 61  .  if( NEVER(pTa
a4d0: 62 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30  b==0) ) return 0
a4e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
a4f0: 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20  ->pSelect==0 ); 
a500: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52             /* FR
a510: 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74  OM clause is not
a520: 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 69 66 28   a view */.  if(
a530: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
a540: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
a550: 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
a560: 73 65 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c  se not a virtual
a570: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69   table */.  pELi
a580: 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
a590: 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45    if( pEList->nE
a5a0: 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20  xpr!=1 ) return 
a5b0: 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  0;       /* One 
a5c0: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65  column in the re
a5d0: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 66  sult set */.  if
a5e0: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ( pEList->a[0].p
a5f0: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
a600: 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 20  UMN ) return 0; 
a610: 2f 2a 20 52 65 73 75 6c 74 20 69 73 20 61 20 63  /* Result is a c
a620: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 72 65 74 75 72  olumn */.  retur
a630: 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
a640: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
a650: 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  QUERY */../*.** 
a660: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
a670: 20 75 73 65 64 20 62 79 20 74 68 65 20 69 6d 70   used by the imp
a680: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
a690: 68 65 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72  he IN (...) oper
a6a0: 61 74 6f 72 2e 0a 2a 2a 20 49 74 27 73 20 6a 6f  ator..** It's jo
a6b0: 62 20 69 73 20 74 6f 20 66 69 6e 64 20 6f 72 20  b is to find or 
a6c0: 63 72 65 61 74 65 20 61 20 62 2d 74 72 65 65 20  create a b-tree 
a6d0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 6d  structure that m
a6e0: 61 79 20 62 65 20 75 73 65 64 0a 2a 2a 20 65 69  ay be used.** ei
a6f0: 74 68 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72  ther to test for
a700: 20 6d 65 6d 62 65 72 73 68 69 70 20 6f 66 20 74   membership of t
a710: 68 65 20 28 2e 2e 2e 29 20 73 65 74 20 6f 72 20  he (...) set or 
a720: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
a730: 67 68 0a 2a 2a 20 69 74 73 20 6d 65 6d 62 65 72  gh.** its member
a740: 73 2c 20 73 6b 69 70 70 69 6e 67 20 64 75 70 6c  s, skipping dupl
a750: 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  icates..**.** Th
a760: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63  e index of the c
a770: 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 6f 6e 20  ursor opened on 
a780: 74 68 65 20 62 2d 74 72 65 65 20 28 64 61 74 61  the b-tree (data
a790: 62 61 73 65 20 74 61 62 6c 65 2c 20 64 61 74 61  base table, data
a7a0: 62 61 73 65 20 69 6e 64 65 78 20 0a 2a 2a 20 6f  base index .** o
a7b0: 72 20 65 70 68 65 72 6d 61 6c 20 74 61 62 6c 65  r ephermal table
a7c0: 29 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  ) is stored in p
a7d0: 58 2d 3e 69 54 61 62 6c 65 20 62 65 66 6f 72 65  X->iTable before
a7e0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
a7f0: 65 74 75 72 6e 73 2e 0a 2a 2a 20 54 68 65 20 72  eturns..** The r
a800: 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6f 66  eturned value of
a810: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
a820: 6e 64 69 63 61 74 65 73 20 74 68 65 20 62 2d 74  ndicates the b-t
a830: 72 65 65 20 74 79 70 65 2c 20 61 73 20 66 6f 6c  ree type, as fol
a840: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e  lows:.**.**   IN
a850: 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 2d 20 54  _INDEX_ROWID - T
a860: 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
a870: 65 6e 65 64 20 6f 6e 20 61 20 64 61 74 61 62 61  ened on a databa
a880: 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49  se table..**   I
a890: 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 20 2d 20  N_INDEX_INDEX - 
a8a0: 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f  The cursor was o
a8b0: 70 65 6e 65 64 20 6f 6e 20 61 20 64 61 74 61 62  pened on a datab
a8c0: 61 73 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20  ase index..**   
a8d0: 49 4e 5f 49 4e 44 45 58 5f 45 50 48 20 2d 20 20  IN_INDEX_EPH -  
a8e0: 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20   The cursor was 
a8f0: 6f 70 65 6e 65 64 20 6f 6e 20 61 20 73 70 65 63  opened on a spec
a900: 69 61 6c 6c 79 20 63 72 65 61 74 65 64 20 61 6e  ially created an
a910: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
a920: 20 20 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65          populate
a930: 64 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c  d epheremal tabl
a940: 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73  e..**.** An exis
a950: 74 69 6e 67 20 62 2d 74 72 65 65 20 6d 61 79 20  ting b-tree may 
a960: 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 69 66 20  only be used if 
a970: 74 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66  the SELECT is of
a980: 20 74 68 65 20 73 69 6d 70 6c 65 0a 2a 2a 20 66   the simple.** f
a990: 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  orm:.**.**     S
a9a0: 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46  ELECT <column> F
a9b0: 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a  ROM <table>.**.*
a9c0: 2a 20 49 66 20 74 68 65 20 70 72 4e 6f 74 46 6f  * If the prNotFo
a9d0: 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  und parameter is
a9e0: 20 30 2c 20 74 68 65 6e 20 74 68 65 20 62 2d 74   0, then the b-t
a9f0: 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ree will be used
aa00: 20 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74   to iterate.** t
aa10: 68 72 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d  hrough the set m
aa20: 65 6d 62 65 72 73 2c 20 73 6b 69 70 70 69 6e 67  embers, skipping
aa30: 20 61 6e 79 20 64 75 70 6c 69 63 61 74 65 73 2e   any duplicates.
aa40: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e   In this case an
aa50: 0a 2a 2a 20 65 70 68 65 72 65 6d 61 6c 20 74 61  .** epheremal ta
aa60: 62 6c 65 20 6d 75 73 74 20 62 65 20 75 73 65 64  ble must be used
aa70: 20 75 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65   unless the sele
aa80: 63 74 65 64 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73  cted <column> is
aa90: 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74   guaranteed.** t
aaa0: 6f 20 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69  o be unique - ei
aab0: 74 68 65 72 20 62 65 63 61 75 73 65 20 69 74 20  ther because it 
aac0: 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  is an INTEGER PR
aad0: 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 69 74 0a  IMARY KEY or it.
aae0: 2a 2a 20 68 61 73 20 61 20 55 4e 49 51 55 45 20  ** has a UNIQUE 
aaf0: 63 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20 55 4e  constraint or UN
ab00: 49 51 55 45 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a  IQUE index..**.*
ab10: 2a 20 49 66 20 74 68 65 20 70 72 4e 6f 74 46 6f  * If the prNotFo
ab20: 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  und parameter is
ab30: 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 74 68 65   not 0, then the
ab40: 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20   b-tree will be 
ab50: 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73  used .** for fas
ab60: 74 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70  t set membership
ab70: 20 74 65 73 74 73 2e 20 49 6e 20 74 68 69 73 20   tests. In this 
ab80: 63 61 73 65 20 61 6e 20 65 70 68 65 72 65 6d 61  case an epherema
ab90: 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a 2a  l table must .**
aba0: 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20   be used unless 
abb0: 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 61 6e 20 49  <column> is an I
abc0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
abd0: 45 59 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 63  EY or an index c
abe0: 61 6e 20 0a 2a 2a 20 62 65 20 66 6f 75 6e 64 20  an .** be found 
abf0: 77 69 74 68 20 3c 63 6f 6c 75 6d 6e 3e 20 61 73  with <column> as
ac00: 20 69 74 73 20 6c 65 66 74 2d 6d 6f 73 74 20 63   its left-most c
ac10: 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  olumn..**.** Whe
ac20: 6e 20 74 68 65 20 62 2d 74 72 65 65 20 69 73 20  n the b-tree is 
ac30: 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 6d  being used for m
ac40: 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 2c  embership tests,
ac50: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
ac60: 63 74 69 6f 6e 0a 2a 2a 20 6e 65 65 64 73 20 74  ction.** needs t
ac70: 6f 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f  o know whether o
ac80: 72 20 6e 6f 74 20 74 68 65 20 73 74 72 75 63 74  r not the struct
ac90: 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  ure contains an 
aca0: 53 51 4c 20 4e 55 4c 4c 20 0a 2a 2a 20 76 61 6c  SQL NULL .** val
acb0: 75 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  ue in order to c
acc0: 6f 72 72 65 63 74 6c 79 20 65 76 61 6c 75 61 74  orrectly evaluat
acd0: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 69  e expressions li
ace0: 6b 65 20 22 58 20 49 4e 20 28 59 2c 20 5a 29 22  ke "X IN (Y, Z)"
acf0: 2e 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73  ..** If there is
ad00: 20 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74   a chance that t
ad10: 68 65 20 62 2d 74 72 65 65 20 6d 69 67 68 74 20  he b-tree might 
ad20: 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20 76  contain a NULL v
ad30: 61 6c 75 65 20 61 74 0a 2a 2a 20 72 75 6e 74 69  alue at.** runti
ad40: 6d 65 2c 20 74 68 65 6e 20 61 20 72 65 67 69 73  me, then a regis
ad50: 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ter is allocated
ad60: 20 61 6e 64 20 74 68 65 20 72 65 67 69 73 74 65   and the registe
ad70: 72 20 6e 75 6d 62 65 72 20 77 72 69 74 74 65 6e  r number written
ad80: 0a 2a 2a 20 74 6f 20 2a 70 72 4e 6f 74 46 6f 75  .** to *prNotFou
ad90: 6e 64 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  nd. If there is 
ada0: 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74  no chance that t
adb0: 68 65 20 62 2d 74 72 65 65 20 63 6f 6e 74 61 69  he b-tree contai
adc0: 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c  ns a.** NULL val
add0: 75 65 2c 20 74 68 65 6e 20 2a 70 72 4e 6f 74 46  ue, then *prNotF
ade0: 6f 75 6e 64 20 69 73 20 6c 65 66 74 20 75 6e 63  ound is left unc
adf0: 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  hanged..**.** If
ae00: 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20 61   a register is a
ae10: 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 74 73  llocated and its
ae20: 20 6c 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65 64   location stored
ae30: 20 69 6e 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 2c   in *prNotFound,
ae40: 20 74 68 65 6e 0a 2a 2a 20 69 74 73 20 69 6e 69   then.** its ini
ae50: 74 69 61 6c 20 76 61 6c 75 65 20 69 73 20 4e 55  tial value is NU
ae60: 4c 4c 2e 20 49 66 20 74 68 65 20 62 2d 74 72 65  LL. If the b-tre
ae70: 65 20 64 6f 65 73 20 6e 6f 74 20 72 65 6d 61 69  e does not remai
ae80: 6e 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f  n constant.** fo
ae90: 72 20 74 68 65 20 64 75 72 61 74 69 6f 6e 20 6f  r the duration o
aea0: 66 20 74 68 65 20 71 75 65 72 79 20 28 69 2e 65  f the query (i.e
aeb0: 2e 20 74 68 65 20 53 45 4c 45 43 54 20 74 68 61  . the SELECT tha
aec0: 74 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20  t generates the 
aed0: 62 2d 74 72 65 65 0a 2a 2a 20 69 73 20 61 20 63  b-tree.** is a c
aee0: 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65  orrelated subque
aef0: 72 79 29 20 74 68 65 6e 20 74 68 65 20 76 61 6c  ry) then the val
af00: 75 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61  ue of the alloca
af10: 74 65 64 20 72 65 67 69 73 74 65 72 20 69 73 0a  ted register is.
af20: 2a 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c  ** reset to NULL
af30: 20 65 61 63 68 20 74 69 6d 65 20 74 68 65 20 62   each time the b
af40: 2d 74 72 65 65 20 69 73 20 72 65 70 6f 70 75 6c  -tree is repopul
af50: 61 74 65 64 2e 20 54 68 69 73 20 61 6c 6c 6f 77  ated. This allow
af60: 73 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20  s the.** caller 
af70: 74 6f 20 75 73 65 20 76 64 62 65 20 63 6f 64 65  to use vdbe code
af80: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74   equivalent to t
af90: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
afa0: 0a 2a 2a 20 20 20 69 66 28 20 72 65 67 69 73 74  .**   if( regist
afb0: 65 72 3d 3d 4e 55 4c 4c 20 29 7b 0a 2a 2a 20 20  er==NULL ){.**  
afc0: 20 20 20 68 61 73 5f 6e 75 6c 6c 20 3d 20 3c 74     has_null = <t
afd0: 65 73 74 20 69 66 20 64 61 74 61 20 73 74 72 75  est if data stru
afe0: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 6e  cture contains n
aff0: 75 6c 6c 3e 0a 2a 2a 20 20 20 20 20 72 65 67 69  ull>.**     regi
b000: 73 74 65 72 20 3d 20 31 0a 2a 2a 20 20 20 7d 0a  ster = 1.**   }.
b010: 2a 2a 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  **.** in order t
b020: 6f 20 61 76 6f 69 64 20 72 75 6e 6e 69 6e 67 20  o avoid running 
b030: 74 68 65 20 3c 74 65 73 74 20 69 66 20 64 61 74  the <test if dat
b040: 61 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  a structure cont
b050: 61 69 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a 20 74 65  ains null>.** te
b060: 73 74 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68  st more often th
b070: 61 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e  an is necessary.
b080: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
b090: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
b0a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64  .int sqlite3Find
b0b0: 49 6e 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  InIndex(Parse *p
b0c0: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 58 2c  Parse, Expr *pX,
b0d0: 20 69 6e 74 20 2a 70 72 4e 6f 74 46 6f 75 6e 64   int *prNotFound
b0e0: 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 20  ){.  Select *p; 
b0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b100: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45             /* SE
b110: 4c 45 43 54 20 74 6f 20 74 68 65 20 72 69 67 68  LECT to the righ
b120: 74 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72  t of IN operator
b130: 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20   */.  int eType 
b140: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
b150: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
b160: 79 70 65 20 6f 66 20 52 48 53 20 74 61 62 6c 65  ype of RHS table
b170: 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a  . IN_INDEX_* */.
b180: 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61    int iTab = pPa
b190: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20  rse->nTab++;    
b1a0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
b1b0: 72 20 6f 66 20 74 68 65 20 52 48 53 20 74 61 62  r of the RHS tab
b1c0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74  le */.  int must
b1d0: 42 65 55 6e 69 71 75 65 20 3d 20 28 70 72 4e 6f  BeUnique = (prNo
b1e0: 74 46 6f 75 6e 64 3d 3d 30 29 3b 20 20 20 2f 2a  tFound==0);   /*
b1f0: 20 54 72 75 65 20 69 66 20 52 48 53 20 6d 75 73   True if RHS mus
b200: 74 20 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a 0a  t be unique */..
b210: 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
b220: 65 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67  e if an existing
b230: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
b240: 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 0a 20  can be used to. 
b250: 20 2a 2a 20 73 61 74 69 73 66 79 20 74 68 65 20   ** satisfy the 
b260: 71 75 65 72 79 2e 20 20 54 68 69 73 20 69 73 20  query.  This is 
b270: 70 72 65 66 65 72 61 62 6c 65 20 74 6f 20 67 65  preferable to ge
b280: 6e 65 72 61 74 69 6e 67 20 61 20 6e 65 77 20 0a  nerating a new .
b290: 20 20 2a 2a 20 65 70 68 65 6d 65 72 61 6c 20 74    ** ephemeral t
b2a0: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d  able..  */.  p =
b2b0: 20 28 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   (ExprHasPropert
b2c0: 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65  y(pX, EP_xIsSele
b2d0: 63 74 29 20 3f 20 70 58 2d 3e 78 2e 70 53 65 6c  ct) ? pX->x.pSel
b2e0: 65 63 74 20 3a 20 30 29 3b 0a 20 20 69 66 28 20  ect : 0);.  if( 
b2f0: 41 4c 57 41 59 53 28 70 50 61 72 73 65 2d 3e 6e  ALWAYS(pParse->n
b300: 45 72 72 3d 3d 30 29 20 26 26 20 69 73 43 61 6e  Err==0) && isCan
b310: 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
b320: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
b330: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
b340: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
b350: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
b360: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 45 78  ection */.    Ex
b370: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 2d 3e 70  pr *pExpr = p->p
b380: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
b390: 72 3b 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69  r;   /* Expressi
b3a0: 6f 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20  on <column> */. 
b3b0: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45     int iCol = pE
b3c0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 20  xpr->iColumn;   
b3d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
b3e0: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 3c 63 6f  ex of column <co
b3f0: 6c 75 6d 6e 3e 20 2a 2f 0a 20 20 20 20 56 64 62  lumn> */.    Vdb
b400: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
b410: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 20 20  tVdbe(pParse);  
b420: 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d      /* Virtual m
b430: 61 63 68 69 6e 65 20 62 65 69 6e 67 20 63 6f 64  achine being cod
b440: 65 64 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20  ed */.    Table 
b450: 2a 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d  *pTab = p->pSrc-
b460: 3e 61 5b 30 5d 2e 70 54 61 62 3b 20 20 20 20 20  >a[0].pTab;     
b470: 20 2f 2a 20 54 61 62 6c 65 20 3c 74 61 62 6c 65   /* Table <table
b480: 3e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44  >. */.    int iD
b490: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
b4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4b0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 64 78   /* Database idx
b4c0: 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 20   for pTab */.   
b4d0: 0a 20 20 20 20 2f 2a 20 43 6f 64 65 20 61 6e 20  .    /* Code an 
b4e0: 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 20  OP_VerifyCookie 
b4f0: 61 6e 64 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b  and OP_TableLock
b500: 20 66 6f 72 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f   for <table>. */
b510: 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
b520: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
b530: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
b540: 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  a);.    sqlite3C
b550: 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
b560: 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
b570: 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
b580: 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
b590: 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70  pTab->tnum, 0, p
b5a0: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20  Tab->zName);..  
b5b0: 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
b5c0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  on is only calle
b5d0: 64 20 66 72 6f 6d 20 74 77 6f 20 70 6c 61 63 65  d from two place
b5e0: 73 2e 20 49 6e 20 62 6f 74 68 20 63 61 73 65 73  s. In both cases
b5f0: 20 74 68 65 20 76 64 62 65 0a 20 20 20 20 2a 2a   the vdbe.    **
b600: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
b610: 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 20 53 6f 20  n allocated. So 
b620: 61 73 73 75 6d 65 20 73 71 6c 69 74 65 33 47 65  assume sqlite3Ge
b630: 74 56 64 62 65 28 29 20 69 73 20 61 6c 77 61 79  tVdbe() is alway
b640: 73 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73  s.    ** success
b650: 66 75 6c 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f  ful here..    */
b660: 0a 20 20 20 20 61 73 73 65 72 74 28 76 29 3b 0a  .    assert(v);.
b670: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
b680: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4d 65 6d  {.      int iMem
b690: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
b6a0: 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 41 64  m;.      int iAd
b6b0: 64 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  dr;.      sqlite
b6c0: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76  3VdbeUsesBtree(v
b6d0: 2c 20 69 44 62 29 3b 0a 0a 20 20 20 20 20 20 69  , iDb);..      i
b6e0: 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
b6f0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
b700: 66 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  f, iMem);.      
b710: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b720: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
b730: 20 31 2c 20 69 4d 65 6d 29 3b 0a 0a 20 20 20 20   1, iMem);..    
b740: 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
b750: 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c  le(pParse, iTab,
b760: 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f   iDb, pTab, OP_O
b770: 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20  penRead);.      
b780: 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
b790: 5f 52 4f 57 49 44 3b 0a 0a 20 20 20 20 20 20 73  _ROWID;..      s
b7a0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
b7b0: 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20  re(v, iAddr);.  
b7c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49    }else{.      I
b7d0: 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
b7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7f0: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
b800: 76 61 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 20  variable */..   
b810: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74     /* The collat
b820: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73 65  ion sequence use
b830: 64 20 62 79 20 74 68 65 20 63 6f 6d 70 61 72 69  d by the compari
b840: 73 6f 6e 2e 20 49 66 20 61 6e 20 69 6e 64 65 78  son. If an index
b850: 20 69 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20   is to.      ** 
b860: 62 65 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65  be used in place
b870: 20 6f 66 20 61 20 74 65 6d 70 2d 74 61 62 6c 65   of a temp-table
b880: 2c 20 69 74 20 6d 75 73 74 20 62 65 20 6f 72 64  , it must be ord
b890: 65 72 65 64 20 61 63 63 6f 72 64 69 6e 67 0a 20  ered according. 
b8a0: 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 69 73 20       ** to this 
b8b0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
b8c0: 63 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 43 6f  ce.  */.      Co
b8d0: 6c 6c 53 65 71 20 2a 70 52 65 71 20 3d 20 73 71  llSeq *pReq = sq
b8e0: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
b8f0: 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  reCollSeq(pParse
b900: 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 45 78  , pX->pLeft, pEx
b910: 70 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  pr);..      /* C
b920: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 61 66  heck that the af
b930: 66 69 6e 69 74 79 20 74 68 61 74 20 77 69 6c 6c  finity that will
b940: 20 62 65 20 75 73 65 64 20 74 6f 20 70 65 72 66   be used to perf
b950: 6f 72 6d 20 74 68 65 20 0a 20 20 20 20 20 20 2a  orm the .      *
b960: 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  * comparison is 
b970: 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
b980: 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20  affinity of the 
b990: 63 6f 6c 75 6d 6e 2e 20 49 66 0a 20 20 20 20 20  column. If.     
b9a0: 20 2a 2a 20 69 74 20 69 73 20 6e 6f 74 2c 20 69   ** it is not, i
b9b0: 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
b9c0: 65 20 74 6f 20 75 73 65 20 61 6e 79 20 69 6e 64  e to use any ind
b9d0: 65 78 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ex..      */.   
b9e0: 20 20 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f     char aff = co
b9f0: 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79  mparisonAffinity
ba00: 28 70 58 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  (pX);.      int 
ba10: 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 28 70  affinity_ok = (p
ba20: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
ba30: 61 66 66 69 6e 69 74 79 3d 3d 61 66 66 7c 7c 61  affinity==aff||a
ba40: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
ba50: 4f 4e 45 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72  ONE);..      for
ba60: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
ba70: 65 78 3b 20 70 49 64 78 20 26 26 20 65 54 79 70  ex; pIdx && eTyp
ba80: 65 3d 3d 30 20 26 26 20 61 66 66 69 6e 69 74 79  e==0 && affinity
ba90: 5f 6f 6b 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  _ok; pIdx=pIdx->
baa0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
bab0: 69 66 28 20 28 70 49 64 78 2d 3e 61 69 43 6f 6c  if( (pIdx->aiCol
bac0: 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 29 0a 20 20  umn[0]==iCol).  
bad0: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
bae0: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
baf0: 20 45 4e 43 28 64 62 29 2c 20 70 49 64 78 2d 3e   ENC(db), pIdx->
bb00: 61 7a 43 6f 6c 6c 5b 30 5d 2c 20 30 29 3d 3d 70  azColl[0], 0)==p
bb10: 52 65 71 0a 20 20 20 20 20 20 20 20 20 26 26 20  Req.         && 
bb20: 28 21 6d 75 73 74 42 65 55 6e 69 71 75 65 20 7c  (!mustBeUnique |
bb30: 7c 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  | (pIdx->nColumn
bb40: 3d 3d 31 20 26 26 20 70 49 64 78 2d 3e 6f 6e 45  ==1 && pIdx->onE
bb50: 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 29 29 0a  rror!=OE_None)).
bb60: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
bb70: 20 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20       int iMem = 
bb80: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
bb90: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 41            int iA
bba0: 64 64 72 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ddr;.          c
bbb0: 68 61 72 20 2a 70 4b 65 79 3b 0a 20 20 0a 20 20  har *pKey;.  .  
bbc0: 20 20 20 20 20 20 20 20 70 4b 65 79 20 3d 20 28          pKey = (
bbd0: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 49 6e  char *)sqlite3In
bbe0: 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73  dexKeyinfo(pPars
bbf0: 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  e, pIdx);.      
bc00: 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
bc10: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
bc20: 62 2c 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61  b, pIdx->pSchema
bc30: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
bc40: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
bc50: 65 28 76 2c 20 69 44 62 29 3b 0a 0a 20 20 20 20  e(v, iDb);..    
bc60: 20 20 20 20 20 20 69 41 64 64 72 20 3d 20 73 71        iAddr = sq
bc70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
bc80: 76 2c 20 4f 50 5f 49 66 2c 20 69 4d 65 6d 29 3b  v, OP_If, iMem);
bc90: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
bca0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
bcb0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69  OP_Integer, 1, i
bcc0: 4d 65 6d 29 3b 0a 20 20 0a 20 20 20 20 20 20 20  Mem);.  .       
bcd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
bce0: 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  dOp4(v, OP_OpenR
bcf0: 65 61 64 2c 20 69 54 61 62 2c 20 70 49 64 78 2d  ead, iTab, pIdx-
bd00: 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a 20 20 20 20  >tnum, iDb,.    
bd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd20: 20 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 2c             pKey,
bd30: 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
bd40: 46 46 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56  FF);.          V
bd50: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
bd60: 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  %s", pIdx->zName
bd70: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 54  ));.          eT
bd80: 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49  ype = IN_INDEX_I
bd90: 4e 44 45 58 3b 0a 0a 20 20 20 20 20 20 20 20 20  NDEX;..         
bda0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
bdb0: 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a  Here(v, iAddr);.
bdc0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 72            if( pr
bdd0: 4e 6f 74 46 6f 75 6e 64 20 26 26 20 21 70 54 61  NotFound && !pTa
bde0: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f  b->aCol[iCol].no
bdf0: 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  tNull ){.       
be00: 20 20 20 20 20 2a 70 72 4e 6f 74 46 6f 75 6e 64       *prNotFound
be10: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
be20: 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  m;.          }. 
be30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
be40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
be50: 28 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20  ( eType==0 ){.  
be60: 20 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f 74 20 66    /* Could not f
be70: 6f 75 6e 64 20 61 6e 20 65 78 69 73 74 69 6e 67  ound an existing
be80: 20 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74   able or index t
be90: 6f 20 75 73 65 20 61 73 20 74 68 65 20 52 48 53  o use as the RHS
bea0: 20 62 2d 74 72 65 65 2e 0a 20 20 20 20 2a 2a 20   b-tree..    ** 
beb0: 57 65 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20  We will have to 
bec0: 67 65 6e 65 72 61 74 65 20 61 6e 20 65 70 68 65  generate an ephe
bed0: 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 6f 20 64  meral table to d
bee0: 6f 20 74 68 65 20 6a 6f 62 2e 0a 20 20 20 20 2a  o the job..    *
bef0: 2f 0a 20 20 20 20 69 6e 74 20 72 4d 61 79 48 61  /.    int rMayHa
bf00: 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  veNull = 0;.    
bf10: 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
bf20: 5f 45 50 48 3b 0a 20 20 20 20 69 66 28 20 70 72  _EPH;.    if( pr
bf30: 4e 6f 74 46 6f 75 6e 64 20 29 7b 0a 20 20 20 20  NotFound ){.    
bf40: 20 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 20 3d 20    *prNotFound = 
bf50: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b  rMayHaveNull = +
bf60: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
bf70: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 58 2d     }else if( pX-
bf80: 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3c  >pLeft->iColumn<
bf90: 30 20 26 26 20 21 45 78 70 72 48 61 73 41 6e 79  0 && !ExprHasAny
bfa0: 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f  Property(pX, EP_
bfb0: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
bfc0: 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
bfd0: 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 20 20 20 20  NDEX_ROWID;.    
bfe0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  }.    sqlite3Cod
bff0: 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73  eSubselect(pPars
c000: 65 2c 20 70 58 2c 20 72 4d 61 79 48 61 76 65 4e  e, pX, rMayHaveN
c010: 75 6c 6c 2c 20 65 54 79 70 65 3d 3d 49 4e 5f 49  ull, eType==IN_I
c020: 4e 44 45 58 5f 52 4f 57 49 44 29 3b 0a 20 20 7d  NDEX_ROWID);.  }
c030: 65 6c 73 65 7b 0a 20 20 20 20 70 58 2d 3e 69 54  else{.    pX->iT
c040: 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 7d  able = iTab;.  }
c050: 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70 65 3b  .  return eType;
c060: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
c070: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
c080: 6f 72 20 73 63 61 6c 61 72 20 73 75 62 71 75 65  or scalar subque
c090: 72 69 65 73 20 75 73 65 64 20 61 73 20 61 6e 20  ries used as an 
c0a0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 6e  expression.** an
c0b0: 64 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e 20  d IN operators. 
c0c0: 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a   Examples:.**.**
c0d0: 20 20 20 20 20 28 53 45 4c 45 43 54 20 61 20 46       (SELECT a F
c0e0: 52 4f 4d 20 62 29 20 20 20 20 20 20 20 20 20 20  ROM b)          
c0f0: 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20  -- subquery.**  
c100: 20 20 20 45 58 49 53 54 53 20 28 53 45 4c 45 43     EXISTS (SELEC
c110: 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d  T a FROM b)   --
c120: 20 45 58 49 53 54 53 20 73 75 62 71 75 65 72 79   EXISTS subquery
c130: 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 34 2c  .**     x IN (4,
c140: 35 2c 31 31 29 20 20 20 20 20 20 20 20 20 20 20  5,11)           
c150: 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f     -- IN operato
c160: 72 20 77 69 74 68 20 6c 69 73 74 20 6f 6e 20 72  r with list on r
c170: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a  ight-hand side.*
c180: 2a 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45  *     x IN (SELE
c190: 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20  CT a FROM b)    
c1a0: 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   -- IN operator 
c1b0: 77 69 74 68 20 73 75 62 71 75 65 72 79 20 6f 6e  with subquery on
c1c0: 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a   the right.**.**
c1d0: 20 54 68 65 20 70 45 78 70 72 20 70 61 72 61 6d   The pExpr param
c1e0: 65 74 65 72 20 64 65 73 63 72 69 62 65 73 20 74  eter describes t
c1f0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
c200: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
c210: 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 6f  IN.** operator o
c220: 72 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a  r subquery..**.*
c230: 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69  * If parameter i
c240: 73 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a 65  sRowid is non-ze
c250: 72 6f 2c 20 74 68 65 6e 20 65 78 70 72 65 73 73  ro, then express
c260: 69 6f 6e 20 70 45 78 70 72 20 69 73 20 67 75 61  ion pExpr is gua
c270: 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ranteed.** to be
c280: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 72   of the form "<r
c290: 6f 77 69 64 3e 20 49 4e 20 28 3f 2c 20 3f 2c 20  owid> IN (?, ?, 
c2a0: 3f 29 22 2c 20 77 68 65 72 65 20 3c 72 6f 77 69  ?)", where <rowi
c2b0: 64 3e 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  d> is a referenc
c2c0: 65 0a 2a 2a 20 74 6f 20 73 6f 6d 65 20 69 6e 74  e.** to some int
c2d0: 65 67 65 72 20 6b 65 79 20 63 6f 6c 75 6d 6e 20  eger key column 
c2e0: 6f 66 20 61 20 74 61 62 6c 65 20 42 2d 54 72 65  of a table B-Tre
c2f0: 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  e. In this case,
c300: 20 75 73 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65   use an.** intke
c310: 79 20 42 2d 54 72 65 65 20 74 6f 20 73 74 6f 72  y B-Tree to stor
c320: 65 20 74 68 65 20 73 65 74 20 6f 66 20 49 4e 28  e the set of IN(
c330: 2e 2e 2e 29 20 76 61 6c 75 65 73 20 69 6e 73 74  ...) values inst
c340: 65 61 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c  ead of the usual
c350: 0a 2a 2a 20 28 73 6c 6f 77 65 72 29 20 76 61 72  .** (slower) var
c360: 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79  iable length key
c370: 73 20 42 2d 54 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  s B-Tree..**.** 
c380: 49 66 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20  If rMayHaveNull 
c390: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 61  is non-zero, tha
c3a0: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
c3b0: 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 6e   operation is an
c3c0: 20 49 4e 0a 2a 2a 20 28 6e 6f 74 20 61 20 53 45   IN.** (not a SE
c3d0: 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53 29 20  LECT or EXISTS) 
c3e0: 61 6e 64 20 74 68 61 74 20 74 68 65 20 52 48 53  and that the RHS
c3f0: 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 73 20   might contains 
c400: 4e 55 4c 4c 73 2e 0a 2a 2a 20 46 75 72 74 68 65  NULLs..** Furthe
c410: 72 6d 6f 72 65 2c 20 74 68 65 20 49 4e 20 69 73  rmore, the IN is
c420: 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c 61 75   in a WHERE clau
c430: 73 65 20 61 6e 64 20 74 68 61 74 20 77 65 20 72  se and that we r
c440: 65 61 6c 6c 79 20 77 61 6e 74 0a 2a 2a 20 74 6f  eally want.** to
c450: 20 69 74 65 72 61 74 65 20 6f 76 65 72 20 74 68   iterate over th
c460: 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
c470: 6f 70 65 72 61 74 6f 72 20 69 6e 20 6f 72 64 65  operator in orde
c480: 72 20 74 6f 20 71 75 69 63 6b 6c 79 20 6c 6f 63  r to quickly loc
c490: 61 74 65 0a 2a 2a 20 61 6c 6c 20 63 6f 72 72 65  ate.** all corre
c4a0: 73 70 6f 6e 64 69 6e 67 20 4c 48 53 20 65 6c 65  sponding LHS ele
c4b0: 6d 65 6e 74 73 2e 20 20 41 6c 6c 20 74 68 69 73  ments.  All this
c4c0: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 69 73   routine does is
c4d0: 20 69 6e 69 74 69 61 6c 69 7a 65 0a 2a 2a 20 74   initialize.** t
c4e0: 68 65 20 72 65 67 69 73 74 65 72 20 67 69 76 65  he register give
c4f0: 6e 20 62 79 20 72 4d 61 79 48 61 76 65 4e 75 6c  n by rMayHaveNul
c500: 6c 20 74 6f 20 4e 55 4c 4c 2e 20 20 43 61 6c 6c  l to NULL.  Call
c510: 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 77 69 6c  ing routines wil
c520: 6c 20 74 61 6b 65 0a 2a 2a 20 63 61 72 65 20 6f  l take.** care o
c530: 66 20 63 68 61 6e 67 69 6e 67 20 74 68 69 73 20  f changing this 
c540: 72 65 67 69 73 74 65 72 20 76 61 6c 75 65 20 74  register value t
c550: 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20 74 68  o non-NULL if th
c560: 65 20 52 48 53 20 69 73 20 4e 55 4c 4c 2d 66 72  e RHS is NULL-fr
c570: 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61  ee..**.** If rMa
c580: 79 48 61 76 65 4e 75 6c 6c 20 69 73 20 7a 65 72  yHaveNull is zer
c590: 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  o, that means th
c5a0: 61 74 20 74 68 65 20 73 75 62 71 75 65 72 79 20  at the subquery 
c5b0: 69 73 20 62 65 69 6e 67 20 75 73 65 64 0a 2a 2a  is being used.**
c5c0: 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20   for membership 
c5d0: 74 65 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 54  testing only.  T
c5e0: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
c5f0: 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 6e  to initialize an
c600: 79 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 74  y.** registers t
c610: 6f 20 69 6e 64 69 63 61 74 65 20 74 68 65 20 70  o indicate the p
c620: 72 65 73 65 6e 73 65 20 6f 72 20 61 62 73 65 6e  resense or absen
c630: 63 65 20 6f 66 20 4e 55 4c 4c 73 20 6f 6e 20 74  ce of NULLs on t
c640: 68 65 20 52 48 53 2e 0a 2a 2f 0a 23 69 66 6e 64  he RHS..*/.#ifnd
c650: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
c660: 55 42 51 55 45 52 59 0a 76 6f 69 64 20 73 71 6c  UBQUERY.void sql
c670: 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
c680: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
c690: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
c6a0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
c6b0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
c6c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
c6d0: 54 68 65 20 49 4e 2c 20 53 45 4c 45 43 54 2c 20  The IN, SELECT, 
c6e0: 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72 61 74  or EXISTS operat
c6f0: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72 4d 61 79  or */.  int rMay
c700: 48 61 76 65 4e 75 6c 6c 2c 20 20 20 20 20 20 20  HaveNull,       
c710: 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 61 74  /* Register that
c720: 20 72 65 63 6f 72 64 73 20 77 68 65 74 68 65 72   records whether
c730: 20 4e 55 4c 4c 73 20 65 78 69 73 74 20 69 6e 20   NULLs exist in 
c740: 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52  RHS */.  int isR
c750: 6f 77 69 64 20 20 20 20 20 20 20 20 20 20 20 20  owid            
c760: 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 4c 48 53   /* If true, LHS
c770: 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   of IN operator 
c780: 69 73 20 61 20 72 6f 77 69 64 20 2a 2f 0a 29 7b  is a rowid */.){
c790: 0a 20 20 69 6e 74 20 74 65 73 74 41 64 64 72 20  .  int testAddr 
c7a0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
c7b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
c7c0: 65 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64 72  e-time test addr
c7d0: 65 73 73 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ess */.  Vdbe *v
c7e0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
c7f0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
c800: 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72   NEVER(v==0) ) r
c810: 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
c820: 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
c830: 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  arse);..  /* Thi
c840: 73 20 63 6f 64 65 20 6d 75 73 74 20 62 65 20 72  s code must be r
c850: 75 6e 20 69 6e 20 69 74 73 20 65 6e 74 69 72 65  un in its entire
c860: 74 79 20 65 76 65 72 79 20 74 69 6d 65 20 69 74  ty every time it
c870: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a   is encountered.
c880: 20 20 2a 2a 20 69 66 20 61 6e 79 20 6f 66 20 74    ** if any of t
c890: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  he following is 
c8a0: 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  true:.  **.  ** 
c8b0: 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d     *  The right-
c8c0: 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 20 63  hand side is a c
c8d0: 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65  orrelated subque
c8e0: 72 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68  ry.  **    *  Th
c8f0: 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
c900: 65 20 69 73 20 61 6e 20 65 78 70 72 65 73 73 69  e is an expressi
c910: 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69  on list containi
c920: 6e 67 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a  ng variables.  *
c930: 2a 20 20 20 20 2a 20 20 57 65 20 61 72 65 20 69  *    *  We are i
c940: 6e 73 69 64 65 20 61 20 74 72 69 67 67 65 72 0a  nside a trigger.
c950: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c    **.  ** If all
c960: 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61 72   of the above ar
c970: 65 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65  e false, then we
c980: 20 63 61 6e 20 72 75 6e 20 74 68 69 73 20 63 6f   can run this co
c990: 64 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a  de just once.  *
c9a0: 2a 20 73 61 76 65 20 74 68 65 20 72 65 73 75 6c  * save the resul
c9b0: 74 73 2c 20 61 6e 64 20 72 65 75 73 65 20 74 68  ts, and reuse th
c9c0: 65 20 73 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e  e same result on
c9d0: 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f   subsequent invo
c9e0: 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  cations..  */.  
c9f0: 69 66 28 20 21 45 78 70 72 48 61 73 41 6e 79 50  if( !ExprHasAnyP
ca00: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
ca10: 50 5f 56 61 72 53 65 6c 65 63 74 29 20 26 26 20  P_VarSelect) && 
ca20: 21 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61  !pParse->trigSta
ca30: 63 6b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 65  ck ){.    int me
ca40: 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  m = ++pParse->nM
ca50: 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  em;.    sqlite3V
ca60: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
ca70: 49 66 2c 20 6d 65 6d 29 3b 0a 20 20 20 20 74 65  If, mem);.    te
ca80: 73 74 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33  stAddr = sqlite3
ca90: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
caa0: 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 6d 65 6d  _Integer, 1, mem
cab0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 74  );.    assert( t
cac0: 65 73 74 41 64 64 72 3e 30 20 7c 7c 20 70 50 61  estAddr>0 || pPa
cad0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
cae0: 61 69 6c 65 64 20 29 3b 0a 20 20 7d 0a 0a 20 20  ailed );.  }..  
caf0: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
cb00: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
cb10: 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 63 68 61  _IN: {.      cha
cb20: 72 20 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20  r affinity;.    
cb30: 20 20 4b 65 79 49 6e 66 6f 20 6b 65 79 49 6e 66    KeyInfo keyInf
cb40: 6f 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  o;.      int add
cb50: 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  r;        /* Add
cb60: 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45  ress of OP_OpenE
cb70: 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63  phemeral instruc
cb80: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78  tion */.      Ex
cb90: 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
cba0: 72 2d 3e 70 4c 65 66 74 3b 0a 0a 20 20 20 20 20  r->pLeft;..     
cbb0: 20 69 66 28 20 72 4d 61 79 48 61 76 65 4e 75 6c   if( rMayHaveNul
cbc0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l ){.        sql
cbd0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
cbe0: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 4d  , OP_Null, 0, rM
cbf0: 61 79 48 61 76 65 4e 75 6c 6c 29 3b 0a 20 20 20  ayHaveNull);.   
cc00: 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 66 66 69     }..      affi
cc10: 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78  nity = sqlite3Ex
cc20: 70 72 41 66 66 69 6e 69 74 79 28 70 4c 65 66 74  prAffinity(pLeft
cc30: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65  );..      /* Whe
cc40: 74 68 65 72 20 74 68 69 73 20 69 73 20 61 6e 20  ther this is an 
cc50: 27 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29  'x IN(SELECT...)
cc60: 27 20 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c 65  ' or an 'x IN(<e
cc70: 78 70 72 6c 69 73 74 3e 29 27 0a 20 20 20 20 20  xprlist>)'.     
cc80: 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69   ** expression i
cc90: 74 20 69 73 20 68 61 6e 64 6c 65 64 20 74 68 65  t is handled the
cca0: 20 73 61 6d 65 20 77 61 79 2e 20 41 20 76 69 72   same way. A vir
ccb0: 74 75 61 6c 20 74 61 62 6c 65 20 69 73 20 0a 20  tual table is . 
ccc0: 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77       ** filled w
ccd0: 69 74 68 20 73 69 6e 67 6c 65 2d 66 69 65 6c 64  ith single-field
cce0: 20 69 6e 64 65 78 20 6b 65 79 73 20 72 65 70 72   index keys repr
ccf0: 65 73 65 6e 74 69 6e 67 20 74 68 65 20 72 65 73  esenting the res
cd00: 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 66 72  ults.      ** fr
cd10: 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20 6f 72  om the SELECT or
cd20: 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e   the <exprlist>.
cd30: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
cd40: 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20 65 78  ** If the 'x' ex
cd50: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
cd60: 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74  lumn value, or t
cd70: 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20  he SELECT....   
cd80: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
cd90: 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e  returns a column
cda0: 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65   value, then the
cdb0: 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 61   affinity of tha
cdc0: 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d  t.      ** colum
cdd0: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62 75 69  n is used to bui
cde0: 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79  ld the index key
cdf0: 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27 20 61  s. If both 'x' a
ce00: 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  nd the.      ** 
ce10: 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d  SELECT... statem
ce20: 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c  ent are columns,
ce30: 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66   then numeric af
ce40: 66 69 6e 69 74 79 20 69 73 20 75 73 65 64 0a 20  finity is used. 
ce50: 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74 68 65       ** if eithe
ce60: 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d  r column has NUM
ce70: 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45 52 20  ERIC or INTEGER 
ce80: 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e 65 69  affinity. If nei
ce90: 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 27 78  ther.      ** 'x
cea0: 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45 43 54  ' nor the SELECT
ceb0: 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72  ... statement ar
cec0: 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  e columns, then 
ced0: 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
cee0: 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73 65  .      ** is use
cef0: 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
cf00: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
cf10: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
cf20: 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
cf30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
cf40: 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
cf50: 65 72 61 6c 2c 20 70 45 78 70 72 2d 3e 69 54 61  eral, pExpr->iTa
cf60: 62 6c 65 2c 20 21 69 73 52 6f 77 69 64 29 3b 0a  ble, !isRowid);.
cf70: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6b 65        memset(&ke
cf80: 79 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  yInfo, 0, sizeof
cf90: 28 6b 65 79 49 6e 66 6f 29 29 3b 0a 20 20 20 20  (keyInfo));.    
cfa0: 20 20 6b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64    keyInfo.nField
cfb0: 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 69 66 28   = 1;..      if(
cfc0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
cfd0: 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
cfe0: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
cff0: 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20   /* Case 1:     
d000: 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
d010: 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ...).        **.
d020: 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e 65 72          ** Gener
d030: 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74  ate code to writ
d040: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  e the results of
d050: 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f   the select into
d060: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20   the temporary. 
d070: 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20         ** table 
d080: 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f 70  allocated and op
d090: 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20 20 20  ened above..    
d0a0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 53      */.        S
d0b0: 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a  electDest dest;.
d0c0: 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
d0d0: 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 20 20 20   *pEList;..     
d0e0: 20 20 20 61 73 73 65 72 74 28 20 21 69 73 52 6f     assert( !isRo
d0f0: 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20 73  wid );.        s
d100: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
d110: 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f  Init(&dest, SRT_
d120: 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  Set, pExpr->iTab
d130: 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 64 65 73  le);.        des
d140: 74 2e 61 66 66 69 6e 69 74 79 20 3d 20 28 75 38  t.affinity = (u8
d150: 29 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20  )affinity;.     
d160: 20 20 20 61 73 73 65 72 74 28 20 28 70 45 78 70     assert( (pExp
d170: 72 2d 3e 69 54 61 62 6c 65 26 30 78 30 30 30 30  r->iTable&0x0000
d180: 46 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54  FFFF)==pExpr->iT
d190: 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20  able );.        
d1a0: 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
d1b0: 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
d1c0: 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26 64 65 73  >x.pSelect, &des
d1d0: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
d1e0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
d1f0: 7d 0a 20 20 20 20 20 20 20 20 70 45 4c 69 73 74  }.        pEList
d200: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c   = pExpr->x.pSel
d210: 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  ect->pEList;.   
d220: 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
d230: 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 4c  pEList!=0 && pEL
d240: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 29 20 29 7b  ist->nExpr>0) ){
d250: 20 0a 20 20 20 20 20 20 20 20 20 20 6b 65 79 49   .          keyI
d260: 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73  nfo.aColl[0] = s
d270: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
d280: 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
d290: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
d2a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
d2b0: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
d2c0: 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
d2d0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45      }else if( pE
d2e0: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 20  xpr->x.pList!=0 
d2f0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61  ){.        /* Ca
d300: 73 65 20 32 3a 20 20 20 20 20 65 78 70 72 20 49  se 2:     expr I
d310: 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20  N (exprlist).   
d320: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
d330: 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70 72  ** For each expr
d340: 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e  ession, build an
d350: 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20   index key from 
d360: 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61  the evaluation a
d370: 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  nd.        ** st
d380: 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20 74 65  ore it in the te
d390: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 49  mporary table. I
d3a0: 66 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f  f <expr> is a co
d3b0: 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20  lumn, then use. 
d3c0: 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63         ** that c
d3d0: 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20  olumns affinity 
d3e0: 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e  when building in
d3f0: 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78  dex keys. If <ex
d400: 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 20  pr> is not.     
d410: 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20     ** a column, 
d420: 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69  use numeric affi
d430: 6e 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f  nity..        */
d440: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
d450: 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
d460: 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
d470: 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  >x.pList;.      
d480: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
d490: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
d4a0: 20 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72         int r1, r
d4b0: 32 2c 20 72 33 3b 0a 0a 20 20 20 20 20 20 20 20  2, r3;..        
d4c0: 69 66 28 20 21 61 66 66 69 6e 69 74 79 20 29 7b  if( !affinity ){
d4d0: 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 69 6e  .          affin
d4e0: 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  ity = SQLITE_AFF
d4f0: 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d  _NONE;.        }
d500: 0a 20 20 20 20 20 20 20 20 6b 65 79 49 6e 66 6f  .        keyInfo
d510: 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69  .aColl[0] = sqli
d520: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
d530: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
d540: 65 66 74 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  eft);..        /
d550: 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65  * Loop through e
d560: 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ach expression i
d570: 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a 2f  n <exprlist>. */
d580: 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71  .        r1 = sq
d590: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
d5a0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
d5b0: 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r2 = sqlite3Get
d5c0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
d5d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d5e0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
d5f0: 5f 4e 75 6c 6c 2c 20 30 2c 20 72 32 29 3b 0a 20  _Null, 0, r2);. 
d600: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4c 69         for(i=pLi
d610: 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d  st->nExpr, pItem
d620: 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20  =pList->a; i>0; 
d630: 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i--, pItem++){. 
d640: 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
d650: 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70  E2 = pItem->pExp
d660: 72 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  r;..          /*
d670: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
d680: 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61  on is not consta
d690: 6e 74 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  nt then we will 
d6a0: 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20  need to.        
d6b0: 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 65    ** disable the
d6c0: 20 74 65 73 74 20 74 68 61 74 20 77 61 73 20 67   test that was g
d6d0: 65 6e 65 72 61 74 65 64 20 61 62 6f 76 65 20 74  enerated above t
d6e0: 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65 0a 20  hat makes sure. 
d6f0: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73           ** this
d700: 20 63 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63 75   code only execu
d710: 74 65 73 20 6f 6e 63 65 2e 20 20 42 65 63 61 75  tes once.  Becau
d720: 73 65 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e  se for a non-con
d730: 73 74 61 6e 74 0a 20 20 20 20 20 20 20 20 20 20  stant.          
d740: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 77 65  ** expression we
d750: 20 6e 65 65 64 20 74 6f 20 72 65 72 75 6e 20 74   need to rerun t
d760: 68 69 73 20 63 6f 64 65 20 65 61 63 68 20 74 69  his code each ti
d770: 6d 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  me..          */
d780: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 74  .          if( t
d790: 65 73 74 41 64 64 72 20 26 26 20 21 73 71 6c 69  estAddr && !sqli
d7a0: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
d7b0: 74 28 70 45 32 29 20 29 7b 0a 20 20 20 20 20 20  t(pE2) ){.      
d7c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d7d0: 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
d7e0: 20 74 65 73 74 41 64 64 72 2d 31 2c 20 32 29 3b   testAddr-1, 2);
d7f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
d800: 74 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20  tAddr = 0;.     
d810: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
d820: 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68    /* Evaluate th
d830: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  e expression and
d840: 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20   insert it into 
d850: 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20 2a  the temp table *
d860: 2f 0a 20 20 20 20 20 20 20 20 20 20 72 33 20 3d  /.          r3 =
d870: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
d880: 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
d890: 45 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  E2, r1);.       
d8a0: 20 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 29     if( isRowid )
d8b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
d8c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
d8d0: 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
d8e0: 20 72 33 2c 20 73 71 6c 69 74 65 33 56 64 62 65   r3, sqlite3Vdbe
d8f0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32  CurrentAddr(v)+2
d900: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
d910: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
d920: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70  (v, OP_Insert, p
d930: 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32  Expr->iTable, r2
d940: 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20 20  , r3);.         
d950: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d960: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d970: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
d980: 52 65 63 6f 72 64 2c 20 72 33 2c 20 31 2c 20 72  Record, r3, 1, r
d990: 32 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29  2, &affinity, 1)
d9a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
d9b0: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
d9c0: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
d9d0: 72 73 65 2c 20 72 33 2c 20 31 29 3b 0a 20 20 20  rse, r3, 1);.   
d9e0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d9f0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
da00: 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 45 78 70  _IdxInsert, pExp
da10: 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 29 3b 0a  r->iTable, r2);.
da20: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
da30: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
da40: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
da50: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
da60: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
da70: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
da80: 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20  Parse, r2);.    
da90: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 69    }.      if( !i
daa0: 73 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  sRowid ){.      
dab0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
dac0: 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28  ngeP4(v, addr, (
dad0: 76 6f 69 64 20 2a 29 26 6b 65 79 49 6e 66 6f 2c  void *)&keyInfo,
dae0: 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
daf0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
db00: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  k;.    }..    ca
db10: 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20  se TK_EXISTS:.  
db20: 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
db30: 3a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  :.    default: {
db40: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69  .      /* If thi
db50: 73 20 68 61 73 20 74 6f 20 62 65 20 61 20 73 63  s has to be a sc
db60: 61 6c 61 72 20 53 45 4c 45 43 54 2e 20 20 47 65  alar SELECT.  Ge
db70: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70  nerate code to p
db80: 75 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  ut the.      ** 
db90: 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 73 65  value of this se
dba0: 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d 6f 72 79  lect in a memory
dbb0: 20 63 65 6c 6c 20 61 6e 64 20 72 65 63 6f 72 64   cell and record
dbc0: 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20 20 20   the number.    
dbd0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 65 6d 6f    ** of the memo
dbe0: 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75  ry cell in iColu
dbf0: 6d 6e 2e 20 20 49 66 20 74 68 69 73 20 69 73 20  mn.  If this is 
dc00: 61 6e 20 45 58 49 53 54 53 2c 20 77 72 69 74 65  an EXISTS, write
dc10: 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74  .      ** an int
dc20: 65 67 65 72 20 30 20 28 6e 6f 74 20 65 78 69 73  eger 0 (not exis
dc30: 74 73 29 20 6f 72 20 31 20 28 65 78 69 73 74 73  ts) or 1 (exists
dc40: 29 20 69 6e 74 6f 20 61 20 6d 65 6d 6f 72 79 20  ) into a memory 
dc50: 63 65 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 6e  cell.      ** an
dc60: 64 20 72 65 63 6f 72 64 20 74 68 61 74 20 6d 65  d record that me
dc70: 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f  mory cell in iCo
dc80: 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lumn..      */. 
dc90: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
dca0: 74 20 54 6f 6b 65 6e 20 6f 6e 65 20 3d 20 7b 20  t Token one = { 
dcb0: 22 31 22 2c 20 31 20 7d 3b 20 20 2f 2a 20 54 6f  "1", 1 };  /* To
dcc0: 6b 65 6e 20 66 6f 72 20 6c 69 74 65 72 61 6c 20  ken for literal 
dcd0: 76 61 6c 75 65 20 31 20 2a 2f 0a 20 20 20 20 20  value 1 */.     
dce0: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20   Select *pSel;  
dcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd00: 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54         /* SELECT
dd10: 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 6e   statement to en
dd20: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 53 65  code */.      Se
dd30: 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20 20  lectDest dest;  
dd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd50: 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 65      /* How to de
dd60: 61 6c 20 77 69 74 68 20 53 45 4c 45 43 74 20 72  al with SELECt r
dd70: 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 20 20 20 20  esult */..      
dd80: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
dd90: 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29  >op==TK_EXISTS )
dda0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
ddb0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
ddc0: 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20  SELECT );.      
ddd0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
dde0: 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 7c 7c 20  p==TK_EXISTS || 
ddf0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
de00: 4c 45 43 54 20 29 3b 0a 0a 20 20 20 20 20 20 61  LECT );..      a
de10: 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50 72  ssert( ExprHasPr
de20: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
de30: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
de40: 20 20 20 20 20 70 53 65 6c 20 3d 20 70 45 78 70       pSel = pExp
de50: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20  r->x.pSelect;.  
de60: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
de70: 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
de80: 20 30 2c 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d   0, ++pParse->nM
de90: 65 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  em);.      if( p
dea0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
deb0: 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20 64  ECT ){.        d
dec0: 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f  est.eDest = SRT_
ded0: 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Mem;.        sql
dee0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
def0: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65  , OP_Null, 0, de
df00: 73 74 2e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  st.iParm);.     
df10: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
df20: 76 2c 20 22 49 6e 69 74 20 73 75 62 71 75 65 72  v, "Init subquer
df30: 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20  y result"));.   
df40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
df50: 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53    dest.eDest = S
df60: 52 54 5f 45 78 69 73 74 73 3b 0a 20 20 20 20 20  RT_Exists;.     
df70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
df80: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
df90: 65 72 2c 20 30 2c 20 64 65 73 74 2e 69 50 61 72  er, 0, dest.iPar
dfa0: 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  m);.        Vdbe
dfb0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69  Comment((v, "Ini
dfc0: 74 20 45 58 49 53 54 53 20 72 65 73 75 6c 74 22  t EXISTS result"
dfd0: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
dfe0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
dff0: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
e000: 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  pSel->pLimit);. 
e010: 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69       pSel->pLimi
e020: 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  t = sqlite3PExpr
e030: 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 54 45  (pParse, TK_INTE
e040: 47 45 52 2c 20 30 2c 20 30 2c 20 26 6f 6e 65 29  GER, 0, 0, &one)
e050: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
e060: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
e070: 2c 20 70 53 65 6c 2c 20 26 64 65 73 74 29 20 29  , pSel, &dest) )
e080: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
e090: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e0a0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
e0b0: 20 28 69 31 36 29 64 65 73 74 2e 69 50 61 72 6d   (i16)dest.iParm
e0c0: 3b 0a 20 20 20 20 20 20 45 78 70 72 53 65 74 49  ;.      ExprSetI
e0d0: 72 72 65 64 75 63 69 62 6c 65 28 70 45 78 70 72  rreducible(pExpr
e0e0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
e0f0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
e100: 20 74 65 73 74 41 64 64 72 20 29 7b 0a 20 20 20   testAddr ){.   
e110: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
e120: 48 65 72 65 28 76 2c 20 74 65 73 74 41 64 64 72  Here(v, testAddr
e130: 2d 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  -1);.  }.  sqlit
e140: 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
e150: 50 61 72 73 65 2c 20 31 29 3b 0a 0a 20 20 72 65  Parse, 1);..  re
e160: 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  turn;.}.#endif /
e170: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
e180: 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  BQUERY */../*.**
e190: 20 44 75 70 6c 69 63 61 74 65 20 61 6e 20 38 2d   Duplicate an 8-
e1a0: 62 79 74 65 20 76 61 6c 75 65 0a 2a 2f 0a 73 74  byte value.*/.st
e1b0: 61 74 69 63 20 63 68 61 72 20 2a 64 75 70 38 62  atic char *dup8b
e1c0: 79 74 65 73 28 56 64 62 65 20 2a 76 2c 20 63 6f  ytes(Vdbe *v, co
e1d0: 6e 73 74 20 63 68 61 72 20 2a 69 6e 29 7b 0a 20  nst char *in){. 
e1e0: 20 63 68 61 72 20 2a 6f 75 74 20 3d 20 73 71 6c   char *out = sql
e1f0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
e200: 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 76 29  sqlite3VdbeDb(v)
e210: 2c 20 38 29 3b 0a 20 20 69 66 28 20 6f 75 74 20  , 8);.  if( out 
e220: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 6f 75  ){.    memcpy(ou
e230: 74 2c 20 69 6e 2c 20 38 29 3b 0a 20 20 7d 0a 20  t, in, 8);.  }. 
e240: 20 72 65 74 75 72 6e 20 6f 75 74 3b 0a 7d 0a 0a   return out;.}..
e250: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
e260: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  n instruction th
e270: 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20  at will put the 
e280: 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a  floating point.*
e290: 2a 20 76 61 6c 75 65 20 64 65 73 63 72 69 62 65  * value describe
e2a0: 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69  d by z[0..n-1] i
e2b0: 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65  nto register iMe
e2c0: 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d  m..**.** The z[]
e2d0: 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f   string will pro
e2e0: 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72  bably not be zer
e2f0: 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42  o-terminated.  B
e300: 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20  ut the .** z[n] 
e310: 63 68 61 72 61 63 74 65 72 20 69 73 20 67 75 61  character is gua
e320: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73 6f  ranteed to be so
e330: 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65  mething that doe
e340: 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69  s not look.** li
e350: 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74  ke the continuat
e360: 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ion of the numbe
e370: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
e380: 64 20 63 6f 64 65 52 65 61 6c 28 56 64 62 65 20  d codeReal(Vdbe 
e390: 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *v, const char *
e3a0: 7a 2c 20 69 6e 74 20 6e 65 67 61 74 65 46 6c 61  z, int negateFla
e3b0: 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20  g, int iMem){.  
e3c0: 69 66 28 20 41 4c 57 41 59 53 28 7a 21 3d 30 29  if( ALWAYS(z!=0)
e3d0: 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76   ){.    double v
e3e0: 61 6c 75 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  alue;.    char *
e3f0: 7a 56 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41  zV;.    sqlite3A
e400: 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a  toF(z, &value);.
e410: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
e420: 73 4e 61 4e 28 76 61 6c 75 65 29 20 29 7b 0a 20  sNaN(value) ){. 
e430: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e440: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
e450: 6c 2c 20 30 2c 20 69 4d 65 6d 29 3b 0a 20 20 20  l, 0, iMem);.   
e460: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
e470: 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29 20 76  ( negateFlag ) v
e480: 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20  alue = -value;. 
e490: 20 20 20 20 20 7a 56 20 3d 20 64 75 70 38 62 79       zV = dup8by
e4a0: 74 65 73 28 76 2c 20 28 63 68 61 72 2a 29 26 76  tes(v, (char*)&v
e4b0: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  alue);.      sql
e4c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
e4d0: 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d  , OP_Real, 0, iM
e4e0: 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 52 45  em, 0, zV, P4_RE
e4f0: 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  AL);.    }.  }.}
e500: 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
e510: 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  e an instruction
e520: 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74   that will put t
e530: 68 65 20 69 6e 74 65 67 65 72 20 64 65 73 63 72  he integer descr
e540: 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a  ibe by.** text z
e550: 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65  [0..n-1] into re
e560: 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a  gister iMem..**.
e570: 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e  ** The z[] strin
e580: 67 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20  g will probably 
e590: 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d  not be zero-term
e5a0: 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74 68 65  inated.  But the
e5b0: 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63   .** z[n] charac
e5c0: 74 65 72 20 69 73 20 67 75 61 72 61 6e 74 65 65  ter is guarantee
e5d0: 64 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e  d to be somethin
e5e0: 67 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  g that does not 
e5f0: 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65  look.** like the
e600: 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66   continuation of
e610: 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a   the number..*/.
e620: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
e630: 49 6e 74 65 67 65 72 28 56 64 62 65 20 2a 76 2c  Integer(Vdbe *v,
e640: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
e650: 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74 20 69  t negFlag, int i
e660: 4d 65 6d 29 7b 0a 20 20 69 66 28 20 70 45 78 70  Mem){.  if( pExp
e670: 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  r->flags & EP_In
e680: 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e  tValue ){.    in
e690: 74 20 69 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69  t i = pExpr->u.i
e6a0: 56 61 6c 75 65 3b 0a 20 20 20 20 69 66 28 20 6e  Value;.    if( n
e6b0: 65 67 46 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b  egFlag ) i = -i;
e6c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
e6d0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
e6e0: 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a  eger, i, iMem);.
e6f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e    }else{.    con
e700: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 78  st char *z = pEx
e710: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
e720: 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29    assert( z!=0 )
e730: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
e740: 33 46 69 74 73 49 6e 36 34 42 69 74 73 28 7a 2c  3FitsIn64Bits(z,
e750: 20 6e 65 67 46 6c 61 67 29 20 29 7b 0a 20 20 20   negFlag) ){.   
e760: 20 20 20 69 36 34 20 76 61 6c 75 65 3b 0a 20 20     i64 value;.  
e770: 20 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20 20      char *zV;.  
e780: 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f 69 36      sqlite3Atoi6
e790: 34 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20  4(z, &value);.  
e7a0: 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20      if( negFlag 
e7b0: 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65  ) value = -value
e7c0: 3b 0a 20 20 20 20 20 20 7a 56 20 3d 20 64 75 70  ;.      zV = dup
e7d0: 38 62 79 74 65 73 28 76 2c 20 28 63 68 61 72 2a  8bytes(v, (char*
e7e0: 29 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  )&value);.      
e7f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e800: 34 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30  4(v, OP_Int64, 0
e810: 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50  , iMem, 0, zV, P
e820: 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65  4_INT64);.    }e
e830: 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 64 65 52  lse{.      codeR
e840: 65 61 6c 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61  eal(v, z, negFla
e850: 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a  g, iMem);.    }.
e860: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65    }.}../*.** Cle
e870: 61 72 20 61 20 63 61 63 68 65 20 65 6e 74 72 79  ar a cache entry
e880: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
e890: 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72   cacheEntryClear
e8a0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
e8b0: 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
e8c0: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 74   *p){.  if( p->t
e8d0: 65 6d 70 52 65 67 20 29 7b 0a 20 20 20 20 69 66  empReg ){.    if
e8e0: 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  ( pParse->nTempR
e8f0: 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61  eg<ArraySize(pPa
e900: 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29  rse->aTempReg) )
e910: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
e920: 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d  aTempReg[pParse-
e930: 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70  >nTempReg++] = p
e940: 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20  ->iReg;.    }.  
e950: 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30    p->tempReg = 0
e960: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
e970: 52 65 63 6f 72 64 20 69 6e 20 74 68 65 20 63 6f  Record in the co
e980: 6c 75 6d 6e 20 63 61 63 68 65 20 74 68 61 74 20  lumn cache that 
e990: 61 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6c  a particular col
e9a0: 75 6d 6e 20 66 72 6f 6d 20 61 0a 2a 2a 20 70 61  umn from a.** pa
e9b0: 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65 20 69  rticular table i
e9c0: 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20 70 61  s stored in a pa
e9d0: 72 74 69 63 75 6c 61 72 20 72 65 67 69 73 74 65  rticular registe
e9e0: 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  r..*/.void sqlit
e9f0: 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65  e3ExprCacheStore
ea00: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
ea10: 69 6e 74 20 69 54 61 62 2c 20 69 6e 74 20 69 43  int iTab, int iC
ea20: 6f 6c 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20  ol, int iReg){. 
ea30: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d 69   int i;.  int mi
ea40: 6e 4c 72 75 3b 0a 20 20 69 6e 74 20 69 64 78 4c  nLru;.  int idxL
ea50: 72 75 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f  ru;.  struct yCo
ea60: 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 61 73  lCache *p;..  as
ea70: 73 65 72 74 28 20 69 52 65 67 3e 30 20 29 3b 20  sert( iReg>0 ); 
ea80: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 6e 75 6d   /* Register num
ea90: 62 65 72 73 20 61 72 65 20 61 6c 77 61 79 73 20  bers are always 
eaa0: 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 61 73  positive */.  as
eab0: 73 65 72 74 28 20 69 43 6f 6c 3e 3d 2d 31 20 26  sert( iCol>=-1 &
eac0: 26 20 69 43 6f 6c 3c 33 32 37 36 38 20 29 3b 20  & iCol<32768 ); 
ead0: 20 2f 2a 20 46 69 6e 69 74 65 20 63 6f 6c 75 6d   /* Finite colum
eae0: 6e 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20  n numbers */..  
eaf0: 2f 2a 20 46 69 72 73 74 20 72 65 70 6c 61 63 65  /* First replace
eb00: 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6e   any existing en
eb10: 74 72 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  try */.  for(i=0
eb20: 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
eb30: 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
eb40: 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
eb50: 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   p++){.    if( p
eb60: 2d 3e 69 52 65 67 20 26 26 20 70 2d 3e 69 54 61  ->iReg && p->iTa
eb70: 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 2d 3e  ble==iTab && p->
eb80: 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 20 29 7b  iColumn==iCol ){
eb90: 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72  .      cacheEntr
eba0: 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70  yClear(pParse, p
ebb0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 65 76  );.      p->iLev
ebc0: 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  el = pParse->iCa
ebd0: 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 20 20  cheLevel;.      
ebe0: 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b 0a  p->iReg = iReg;.
ebf0: 20 20 20 20 20 20 70 2d 3e 61 66 66 43 68 61 6e        p->affChan
ec00: 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  ge = 0;.      p-
ec10: 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69  >lru = pParse->i
ec20: 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20  CacheCnt++;.    
ec30: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
ec40: 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61    }..  /* Find a
ec50: 6e 20 65 6d 70 74 79 20 73 6c 6f 74 20 61 6e 64  n empty slot and
ec60: 20 72 65 70 6c 61 63 65 20 69 74 20 2a 2f 0a 20   replace it */. 
ec70: 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
ec80: 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
ec90: 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
eca0: 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
ecb0: 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d     if( p->iReg==
ecc0: 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4c  0 ){.      p->iL
ecd0: 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69  evel = pParse->i
ece0: 43 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20  CacheLevel;.    
ecf0: 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54    p->iTable = iT
ed00: 61 62 3b 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f  ab;.      p->iCo
ed10: 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  lumn = iCol;.   
ed20: 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65     p->iReg = iRe
ed30: 67 3b 0a 20 20 20 20 20 20 70 2d 3e 61 66 66 43  g;.      p->affC
ed40: 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  hange = 0;.     
ed50: 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b   p->tempReg = 0;
ed60: 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20  .      p->lru = 
ed70: 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e  pParse->iCacheCn
ed80: 74 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72  t++;.      retur
ed90: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  n;.    }.  }..  
eda0: 2f 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 6c  /* Replace the l
edb0: 61 73 74 20 72 65 63 65 6e 74 6c 79 20 75 73 65  ast recently use
edc0: 64 20 2a 2f 0a 20 20 6d 69 6e 4c 72 75 20 3d 20  d */.  minLru = 
edd0: 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20 69 64  0x7fffffff;.  id
ede0: 78 4c 72 75 20 3d 20 2d 31 3b 0a 20 20 66 6f 72  xLru = -1;.  for
edf0: 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
ee00: 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
ee10: 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
ee20: 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
ee30: 66 28 20 70 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75  f( p->lru<minLru
ee40: 20 29 7b 0a 20 20 20 20 20 20 69 64 78 4c 72 75   ){.      idxLru
ee50: 20 3d 20 69 3b 0a 20 20 20 20 20 20 6d 69 6e 4c   = i;.      minL
ee60: 72 75 20 3d 20 70 2d 3e 6c 72 75 3b 0a 20 20 20  ru = p->lru;.   
ee70: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 41 4c 57   }.  }.  if( ALW
ee80: 41 59 53 28 69 64 78 4c 72 75 3e 3d 30 29 20 29  AYS(idxLru>=0) )
ee90: 7b 0a 20 20 20 20 70 20 3d 20 26 70 50 61 72 73  {.    p = &pPars
eea0: 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 64 78  e->aColCache[idx
eeb0: 4c 72 75 5d 3b 0a 20 20 20 20 70 2d 3e 69 4c 65  Lru];.    p->iLe
eec0: 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43  vel = pParse->iC
eed0: 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 70  acheLevel;.    p
eee0: 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b  ->iTable = iTab;
eef0: 0a 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20  .    p->iColumn 
ef00: 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 69  = iCol;.    p->i
ef10: 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20  Reg = iReg;.    
ef20: 70 2d 3e 61 66 66 43 68 61 6e 67 65 20 3d 20 30  p->affChange = 0
ef30: 3b 0a 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67  ;.    p->tempReg
ef40: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6c 72 75   = 0;.    p->lru
ef50: 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68   = pParse->iCach
ef60: 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75  eCnt++;.    retu
ef70: 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn;.  }.}../*.**
ef80: 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 61   Indicate that a
ef90: 20 72 65 67 69 73 74 65 72 20 69 73 20 62 65 69   register is bei
efa0: 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20  ng overwritten. 
efb0: 20 50 75 72 67 65 20 74 68 65 20 72 65 67 69 73   Purge the regis
efc0: 74 65 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ter.** from the 
efd0: 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f  column cache..*/
efe0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
eff0: 72 43 61 63 68 65 52 65 6d 6f 76 65 28 50 61 72  rCacheRemove(Par
f000: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
f010: 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  iReg){.  int i;.
f020: 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
f030: 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30  he *p;.  for(i=0
f040: 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
f050: 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
f060: 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
f070: 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   p++){.    if( p
f080: 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a  ->iReg==iReg ){.
f090: 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79        cacheEntry
f0a0: 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70 29  Clear(pParse, p)
f0b0: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20  ;.      p->iReg 
f0c0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
f0d0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72  ../*.** Remember
f0e0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6c   the current col
f0f0: 75 6d 6e 20 63 61 63 68 65 20 63 6f 6e 74 65 78  umn cache contex
f100: 74 2e 20 20 41 6e 79 20 6e 65 77 20 65 6e 74 72  t.  Any new entr
f110: 69 65 73 20 61 64 64 65 64 0a 2a 2a 20 61 64 64  ies added.** add
f120: 65 64 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e  ed to the column
f130: 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69   cache after thi
f140: 73 20 63 61 6c 6c 20 61 72 65 20 72 65 6d 6f 76  s call are remov
f150: 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 63  ed when the.** c
f160: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 70  orresponding pop
f170: 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64   occurs..*/.void
f180: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
f190: 65 50 75 73 68 28 50 61 72 73 65 20 2a 70 50 61  ePush(Parse *pPa
f1a0: 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e  rse){.  pParse->
f1b0: 69 43 61 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a 7d  iCacheLevel++;.}
f1c0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 66  ../*.** Remove f
f1d0: 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  rom the column c
f1e0: 61 63 68 65 20 61 6e 79 20 65 6e 74 72 69 65 73  ache any entries
f1f0: 20 74 68 61 74 20 77 65 72 65 20 61 64 64 65 64   that were added
f200: 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 74 68   since the.** th
f210: 65 20 70 72 65 76 69 6f 75 73 20 4e 20 50 75 73  e previous N Pus
f220: 68 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20 49  h operations.  I
f230: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72  n other words, r
f240: 65 73 74 6f 72 65 20 74 68 65 20 63 61 63 68 65  estore the cache
f250: 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 74 65  .** to the state
f260: 20 69 74 20 77 61 73 20 69 6e 20 4e 20 50 75 73   it was in N Pus
f270: 68 65 73 20 61 67 6f 2e 0a 2a 2f 0a 76 6f 69 64  hes ago..*/.void
f280: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
f290: 65 50 6f 70 28 50 61 72 73 65 20 2a 70 50 61 72  ePop(Parse *pPar
f2a0: 73 65 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 6e  se, int N){.  in
f2b0: 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
f2c0: 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 61 73  olCache *p;.  as
f2d0: 73 65 72 74 28 20 4e 3e 30 20 29 3b 0a 20 20 61  sert( N>0 );.  a
f2e0: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 69  ssert( pParse->i
f2f0: 43 61 63 68 65 4c 65 76 65 6c 3e 3d 4e 20 29 3b  CacheLevel>=N );
f300: 0a 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  .  pParse->iCach
f310: 65 4c 65 76 65 6c 20 2d 3d 20 4e 3b 0a 20 20 66  eLevel -= N;.  f
f320: 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
f330: 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
f340: 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
f350: 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
f360: 20 69 66 28 20 70 2d 3e 69 52 65 67 20 26 26 20   if( p->iReg && 
f370: 70 2d 3e 69 4c 65 76 65 6c 3e 70 50 61 72 73 65  p->iLevel>pParse
f380: 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 29 7b  ->iCacheLevel ){
f390: 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72  .      cacheEntr
f3a0: 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70  yClear(pParse, p
f3b0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67  );.      p->iReg
f3c0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
f3d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61 20  }../*.** When a 
f3e0: 63 61 63 68 65 64 20 63 6f 6c 75 6d 6e 20 69 73  cached column is
f3f0: 20 72 65 75 73 65 64 2c 20 6d 61 6b 65 20 73 75   reused, make su
f400: 72 65 20 74 68 61 74 20 69 74 73 20 72 65 67 69  re that its regi
f410: 73 74 65 72 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f  ster is.** no lo
f420: 6e 67 65 72 20 61 76 61 69 6c 61 62 6c 65 20 61  nger available a
f430: 73 20 61 20 74 65 6d 70 20 72 65 67 69 73 74 65  s a temp registe
f440: 72 2e 20 20 74 69 63 6b 65 74 20 23 33 38 37 39  r.  ticket #3879
f450: 3a 20 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20  :  that same.** 
f460: 72 65 67 69 73 74 65 72 20 6d 69 67 68 74 20 62  register might b
f470: 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 69  e in the cache i
f480: 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65  n multiple place
f490: 73 2c 20 73 6f 20 62 65 20 73 75 72 65 20 74 6f  s, so be sure to
f4a0: 0a 2a 2a 20 67 65 74 20 74 68 65 6d 20 61 6c 6c  .** get them all
f4b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
f4c0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
f4d0: 65 50 69 6e 52 65 67 69 73 74 65 72 28 50 61 72  ePinRegister(Par
f4e0: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
f4f0: 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  iReg){.  int i;.
f500: 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
f510: 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30  he *p;.  for(i=0
f520: 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
f530: 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
f540: 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
f550: 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   p++){.    if( p
f560: 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a  ->iReg==iReg ){.
f570: 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67        p->tempReg
f580: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
f590: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
f5a0: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
f5b0: 20 65 78 74 72 61 63 74 20 74 68 65 20 69 43 6f   extract the iCo
f5c0: 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66  lumn-th column f
f5d0: 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61  rom.** table pTa
f5e0: 62 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  b and store the 
f5f0: 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20  column value in 
f600: 61 20 72 65 67 69 73 74 65 72 2e 20 20 41 6e 20  a register.  An 
f610: 65 66 66 6f 72 74 0a 2a 2a 20 69 73 20 6d 61 64  effort.** is mad
f620: 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63  e to store the c
f630: 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72  olumn value in r
f640: 65 67 69 73 74 65 72 20 69 52 65 67 2c 20 62 75  egister iReg, bu
f650: 74 20 74 68 69 73 20 69 73 0a 2a 2a 20 6e 6f 74  t this is.** not
f660: 20 67 75 61 72 61 6e 74 65 65 64 2e 20 20 54 68   guaranteed.  Th
f670: 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  e location of th
f680: 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69  e column value i
f690: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
f6a0: 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20  * There must be 
f6b0: 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74  an open cursor t
f6c0: 6f 20 70 54 61 62 20 69 6e 20 69 54 61 62 6c 65  o pTab in iTable
f6d0: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
f6e0: 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e  ne.** is called.
f6f0: 20 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74    If iColumn<0 t
f700: 68 65 6e 20 63 6f 64 65 20 69 73 20 67 65 6e 65  hen code is gene
f710: 72 61 74 65 64 20 74 68 61 74 20 65 78 74 72 61  rated that extra
f720: 63 74 73 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a  cts the rowid..*
f730: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
f740: 65 20 6d 69 67 68 74 20 61 74 74 65 6d 70 74 20  e might attempt 
f750: 74 6f 20 72 65 75 73 65 20 74 68 65 20 76 61 6c  to reuse the val
f760: 75 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ue of the column
f770: 20 74 68 61 74 0a 2a 2a 20 68 61 73 20 61 6c 72   that.** has alr
f780: 65 61 64 79 20 62 65 65 6e 20 6c 6f 61 64 65 64  eady been loaded
f790: 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72   into a register
f7a0: 2e 20 20 54 68 65 20 76 61 6c 75 65 20 77 69 6c  .  The value wil
f7b0: 6c 20 61 6c 77 61 79 73 0a 2a 2a 20 62 65 20 75  l always.** be u
f7c0: 73 65 64 20 69 66 20 69 74 20 68 61 73 20 6e 6f  sed if it has no
f7d0: 74 20 75 6e 64 65 72 67 6f 6e 65 20 61 6e 79 20  t undergone any 
f7e0: 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65 73  affinity changes
f7f0: 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 61 6e 20  .  But if.** an 
f800: 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65 20  affinity change 
f810: 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 74 68  has occurred, th
f820: 65 6e 20 74 68 65 20 63 61 63 68 65 64 20 76 61  en the cached va
f830: 6c 75 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65  lue will only be
f840: 0a 2a 2a 20 75 73 65 64 20 69 66 20 61 6c 6c 6f  .** used if allo
f850: 77 41 66 66 43 68 6e 67 20 69 73 20 74 72 75 65  wAffChng is true
f860: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
f870: 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
f880: 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
f890: 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  se,   /* Parsing
f8a0: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
f8b0: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
f8c0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
f8d0: 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f     /* Descriptio
f8e0: 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77  n of the table w
f8f0: 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 66 72  e are reading fr
f900: 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  om */.  int iCol
f910: 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65  umn,     /* Inde
f920: 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63  x of the table c
f930: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  olumn */.  int i
f940: 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54  Table,      /* T
f950: 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69  he cursor pointi
f960: 6e 67 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ng to the table 
f970: 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 2c 20 20  */.  int iReg,  
f980: 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 72        /* Store r
f990: 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20  esults here */. 
f9a0: 20 69 6e 74 20 61 6c 6c 6f 77 41 66 66 43 68 6e   int allowAffChn
f9b0: 67 20 2f 2a 20 54 72 75 65 20 69 66 20 70 72 69  g /* True if pri
f9c0: 6f 72 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e  or affinity chan
f9d0: 67 65 73 20 61 72 65 20 4f 4b 20 2a 2f 0a 29 7b  ges are OK */.){
f9e0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
f9f0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
fa00: 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
fa10: 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66  olCache *p;..  f
fa20: 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
fa30: 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
fa40: 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
fa50: 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
fa60: 20 69 66 28 20 70 2d 3e 69 52 65 67 3e 30 20 26   if( p->iReg>0 &
fa70: 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  & p->iTable==iTa
fa80: 62 6c 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d  ble && p->iColum
fa90: 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20  n==iColumn.     
faa0: 20 20 20 20 20 20 26 26 20 28 21 70 2d 3e 61 66        && (!p->af
fab0: 66 43 68 61 6e 67 65 20 7c 7c 20 61 6c 6c 6f 77  fChange || allow
fac0: 41 66 66 43 68 6e 67 29 20 29 7b 0a 20 20 20 20  AffChng) ){.    
fad0: 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73    p->lru = pPars
fae0: 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a  e->iCacheCnt++;.
faf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
fb00: 72 43 61 63 68 65 50 69 6e 52 65 67 69 73 74 65  rCachePinRegiste
fb10: 72 28 70 50 61 72 73 65 2c 20 70 2d 3e 69 52 65  r(pParse, p->iRe
fb20: 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  g);.      return
fb30: 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a   p->iReg;.    }.
fb40: 20 20 7d 20 20 0a 20 20 61 73 73 65 72 74 28 20    }  .  assert( 
fb50: 76 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 43  v!=0 );.  if( iC
fb60: 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 73  olumn<0 ){.    s
fb70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
fb80: 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54  (v, OP_Rowid, iT
fb90: 61 62 6c 65 2c 20 69 52 65 67 29 3b 0a 20 20 7d  able, iReg);.  }
fba0: 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28  else if( ALWAYS(
fbb0: 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20  pTab!=0) ){.    
fbc0: 69 6e 74 20 6f 70 20 3d 20 49 73 56 69 72 74 75  int op = IsVirtu
fbd0: 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f 56 43  al(pTab) ? OP_VC
fbe0: 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d  olumn : OP_Colum
fbf0: 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  n;.    sqlite3Vd
fc00: 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20  beAddOp3(v, op, 
fc10: 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c  iTable, iColumn,
fc20: 20 69 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69   iReg);.    sqli
fc30: 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74  te3ColumnDefault
fc40: 28 76 2c 20 70 54 61 62 2c 20 69 43 6f 6c 75 6d  (v, pTab, iColum
fc50: 6e 2c 20 69 52 65 67 29 3b 0a 20 20 7d 0a 20 20  n, iReg);.  }.  
fc60: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
fc70: 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 54  Store(pParse, iT
fc80: 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69  able, iColumn, i
fc90: 52 65 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  Reg);.  return i
fca0: 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  Reg;.}../*.** Cl
fcb0: 65 61 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63  ear all column c
fcc0: 61 63 68 65 20 65 6e 74 72 69 65 73 2e 0a 2a 2f  ache entries..*/
fcd0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
fce0: 72 43 61 63 68 65 43 6c 65 61 72 28 50 61 72 73  rCacheClear(Pars
fcf0: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e  e *pParse){.  in
fd00: 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
fd10: 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66  olCache *p;..  f
fd20: 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
fd30: 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
fd40: 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
fd50: 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
fd60: 20 69 66 28 20 70 2d 3e 69 52 65 67 20 29 7b 0a   if( p->iReg ){.
fd70: 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79        cacheEntry
fd80: 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70 29  Clear(pParse, p)
fd90: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20  ;.      p->iReg 
fda0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
fdb0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74  ../*.** Record t
fdc0: 68 65 20 66 61 63 74 20 74 68 61 74 20 61 6e 20  he fact that an 
fdd0: 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65 20  affinity change 
fde0: 68 61 73 20 6f 63 63 75 72 72 65 64 20 6f 6e 20  has occurred on 
fdf0: 69 43 6f 75 6e 74 0a 2a 2a 20 72 65 67 69 73 74  iCount.** regist
fe00: 65 72 73 20 73 74 61 72 74 69 6e 67 20 77 69 74  ers starting wit
fe10: 68 20 69 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69  h iStart..*/.voi
fe20: 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
fe30: 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
fe40: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
fe50: 69 6e 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20  int iStart, int 
fe60: 69 43 6f 75 6e 74 29 7b 0a 20 20 69 6e 74 20 69  iCount){.  int i
fe70: 45 6e 64 20 3d 20 69 53 74 61 72 74 20 2b 20 69  End = iStart + i
fe80: 43 6f 75 6e 74 20 2d 20 31 3b 0a 20 20 69 6e 74  Count - 1;.  int
fe90: 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
fea0: 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72  lCache *p;.  for
feb0: 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
fec0: 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
fed0: 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
fee0: 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
fef0: 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a  nt r = p->iReg;.
ff00: 20 20 20 20 69 66 28 20 72 3e 3d 69 53 74 61 72      if( r>=iStar
ff10: 74 20 26 26 20 72 3c 3d 69 45 6e 64 20 29 7b 0a  t && r<=iEnd ){.
ff20: 20 20 20 20 20 20 70 2d 3e 61 66 66 43 68 61 6e        p->affChan
ff30: 67 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ge = 1;.    }.  
ff40: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
ff50: 61 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 76 65  ate code to move
ff60: 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72 65   content from re
ff70: 67 69 73 74 65 72 73 20 69 46 72 6f 6d 2e 2e 2e  gisters iFrom...
ff80: 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20  iFrom+nReg-1.** 
ff90: 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69 54 6f  over to iTo..iTo
ffa0: 2b 6e 52 65 67 2d 31 2e 20 4b 65 65 70 20 74 68  +nReg-1. Keep th
ffb0: 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 75  e column cache u
ffc0: 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 76 6f  p-to-date..*/.vo
ffd0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
ffe0: 64 65 4d 6f 76 65 28 50 61 72 73 65 20 2a 70 50  deMove(Parse *pP
fff0: 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c  arse, int iFrom,
10000 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e 52   int iTo, int nR
10010 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  eg){.  int i;.  
10020 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
10030 20 2a 70 3b 0a 20 20 69 66 28 20 4e 45 56 45 52   *p;.  if( NEVER
10040 28 69 46 72 6f 6d 3d 3d 69 54 6f 29 20 29 20 72  (iFrom==iTo) ) r
10050 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
10060 56 64 62 65 41 64 64 4f 70 33 28 70 50 61 72 73  VdbeAddOp3(pPars
10070 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f 76  e->pVdbe, OP_Mov
10080 65 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e  e, iFrom, iTo, n
10090 52 65 67 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  Reg);.  for(i=0,
100a0 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
100b0 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
100c0 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
100d0 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 78 20  p++){.    int x 
100e0 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69  = p->iReg;.    i
100f0 66 28 20 78 3e 3d 69 46 72 6f 6d 20 26 26 20 78  f( x>=iFrom && x
10100 3c 69 46 72 6f 6d 2b 6e 52 65 67 20 29 7b 0a 20  <iFrom+nReg ){. 
10110 20 20 20 20 20 70 2d 3e 69 52 65 67 20 2b 3d 20       p->iReg += 
10120 69 54 6f 2d 69 46 72 6f 6d 3b 0a 20 20 20 20 7d  iTo-iFrom;.    }
10130 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
10140 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63  nerate code to c
10150 6f 70 79 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  opy content from
10160 20 72 65 67 69 73 74 65 72 73 20 69 46 72 6f 6d   registers iFrom
10170 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a  ...iFrom+nReg-1.
10180 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e  ** over to iTo..
10190 69 54 6f 2b 6e 52 65 67 2d 31 2e 0a 2a 2f 0a 76  iTo+nReg-1..*/.v
101a0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
101b0 6f 64 65 43 6f 70 79 28 50 61 72 73 65 20 2a 70  odeCopy(Parse *p
101c0 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d  Parse, int iFrom
101d0 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e  , int iTo, int n
101e0 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Reg){.  int i;. 
101f0 20 69 66 28 20 4e 45 56 45 52 28 69 46 72 6f 6d   if( NEVER(iFrom
10200 3d 3d 69 54 6f 29 20 29 20 72 65 74 75 72 6e 3b  ==iTo) ) return;
10210 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52  .  for(i=0; i<nR
10220 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  eg; i++){.    sq
10230 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
10240 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
10250 50 5f 43 6f 70 79 2c 20 69 46 72 6f 6d 2b 69 2c  P_Copy, iFrom+i,
10260 20 69 54 6f 2b 69 29 3b 0a 20 20 7d 0a 7d 0a 0a   iTo+i);.  }.}..
10270 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
10280 65 20 69 66 20 61 6e 79 20 72 65 67 69 73 74 65  e if any registe
10290 72 20 69 6e 20 74 68 65 20 72 61 6e 67 65 20 69  r in the range i
102a0 46 72 6f 6d 2e 2e 69 54 6f 20 28 69 6e 63 6c 75  From..iTo (inclu
102b0 73 69 76 65 29 0a 2a 2a 20 69 73 20 75 73 65 64  sive).** is used
102c0 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
102d0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f  column cache..*/
102e0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 73 65 64  .static int used
102f0 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 50 61  AsColumnCache(Pa
10300 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
10310 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29   iFrom, int iTo)
10320 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
10330 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
10340 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  ;.  for(i=0, p=p
10350 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
10360 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
10370 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
10380 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d 20 70 2d  {.    int r = p-
10390 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20 72  >iReg;.    if( r
103a0 3e 3d 69 46 72 6f 6d 20 26 26 20 72 3c 3d 69 54  >=iFrom && r<=iT
103b0 6f 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  o ) return 1;.  
103c0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
103d0 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 61  ./*.** If the la
103e0 73 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 63  st instruction c
103f0 6f 64 65 64 20 69 73 20 61 6e 20 65 70 68 65 6d  oded is an ephem
10400 65 72 61 6c 20 63 6f 70 79 20 6f 66 20 61 6e 79  eral copy of any
10410 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 67 69 73   of.** the regis
10420 74 65 72 73 20 69 6e 20 74 68 65 20 6e 52 65 67  ters in the nReg
10430 20 72 65 67 69 73 74 65 72 73 20 62 65 67 69 6e   registers begin
10440 6e 69 6e 67 20 77 69 74 68 20 69 52 65 67 2c 20  ning with iReg, 
10450 74 68 65 6e 0a 2a 2a 20 63 6f 6e 76 65 72 74 20  then.** convert 
10460 74 68 65 20 6c 61 73 74 20 69 6e 73 74 72 75 63  the last instruc
10470 74 69 6f 6e 20 66 72 6f 6d 20 4f 50 5f 53 43 6f  tion from OP_SCo
10480 70 79 20 74 6f 20 4f 50 5f 43 6f 70 79 2e 0a 2a  py to OP_Copy..*
10490 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
104a0 70 72 48 61 72 64 43 6f 70 79 28 50 61 72 73 65  prHardCopy(Parse
104b0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52   *pParse, int iR
104c0 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20  eg, int nReg){. 
104d0 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
104e0 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73 73 65  Vdbe *v;..  asse
104f0 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  rt( pParse->db->
10500 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
10510 29 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  );.  v = pParse-
10520 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
10530 28 20 76 21 3d 30 20 29 3b 0a 20 20 70 4f 70 20  ( v!=0 );.  pOp 
10540 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
10550 4f 70 28 76 2c 20 2d 31 29 3b 0a 20 20 61 73 73  Op(v, -1);.  ass
10560 65 72 74 28 20 70 4f 70 21 3d 30 20 29 3b 0a 20  ert( pOp!=0 );. 
10570 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
10580 3d 3d 4f 50 5f 53 43 6f 70 79 20 26 26 20 70 4f  ==OP_SCopy && pO
10590 70 2d 3e 70 31 3e 3d 69 52 65 67 20 26 26 20 70  p->p1>=iReg && p
105a0 4f 70 2d 3e 70 31 3c 69 52 65 67 2b 6e 52 65 67  Op->p1<iReg+nReg
105b0 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 6f 70 63   ){.    pOp->opc
105c0 6f 64 65 20 3d 20 4f 50 5f 43 6f 70 79 3b 0a 20  ode = OP_Copy;. 
105d0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
105e0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 74 6f  rate code to sto
105f0 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  re the value of 
10600 74 68 65 20 69 41 6c 69 61 73 2d 74 68 20 61 6c  the iAlias-th al
10610 69 61 73 20 69 6e 20 72 65 67 69 73 74 65 72 0a  ias in register.
10620 2a 2a 20 74 61 72 67 65 74 2e 20 20 54 68 65 20  ** target.  The 
10630 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20  first time this 
10640 69 73 20 63 61 6c 6c 65 64 2c 20 70 45 78 70 72  is called, pExpr
10650 20 69 73 20 65 76 61 6c 75 61 74 65 64 20 74 6f   is evaluated to
10660 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20   compute.** the 
10670 76 61 6c 75 65 20 6f 66 20 74 68 65 20 61 6c 69  value of the ali
10680 61 73 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69  as.  The value i
10690 73 20 73 74 6f 72 65 64 20 69 6e 20 61 6e 20 61  s stored in an a
106a0 75 78 69 6c 69 61 72 79 20 72 65 67 69 73 74 65  uxiliary registe
106b0 72 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 75 6d  r.** and the num
106c0 62 65 72 20 6f 66 20 74 68 61 74 20 72 65 67 69  ber of that regi
106d0 73 74 65 72 20 69 73 20 72 65 74 75 72 6e 65 64  ster is returned
106e0 2e 20 20 4f 6e 20 73 75 62 73 65 71 75 65 6e 74  .  On subsequent
106f0 20 63 61 6c 6c 73 2c 0a 2a 2a 20 74 68 65 20 72   calls,.** the r
10700 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 69  egister number i
10710 73 20 72 65 74 75 72 6e 65 64 20 77 69 74 68 6f  s returned witho
10720 75 74 20 67 65 6e 65 72 61 74 69 6e 67 20 61 6e  ut generating an
10730 79 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  y code..**.** No
10740 74 65 20 74 68 61 74 20 69 6e 20 6f 72 64 65 72  te that in order
10750 20 66 6f 72 20 74 68 69 73 20 74 6f 20 77 6f 72   for this to wor
10760 6b 2c 20 63 6f 64 65 20 6d 75 73 74 20 62 65 20  k, code must be 
10770 67 65 6e 65 72 61 74 65 64 20 69 6e 20 74 68 65  generated in the
10780 0a 2a 2a 20 73 61 6d 65 20 6f 72 64 65 72 20 74  .** same order t
10790 68 61 74 20 69 74 20 69 73 20 65 78 65 63 75 74  hat it is execut
107a0 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6c 69 61 73 65  ed..**.** Aliase
107b0 73 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73  s are numbered s
107c0 74 61 72 74 69 6e 67 20 77 69 74 68 20 31 2e 20  tarting with 1. 
107d0 20 53 6f 20 69 41 6c 69 61 73 20 69 73 20 69 6e   So iAlias is in
107e0 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 6f 66   the range.** of
107f0 20 31 20 74 6f 20 70 50 61 72 73 65 2d 3e 6e 41   1 to pParse->nA
10800 6c 69 61 73 20 69 6e 63 6c 75 73 69 76 65 2e 20  lias inclusive. 
10810 20 0a 2a 2a 0a 2a 2a 20 70 50 61 72 73 65 2d 3e   .**.** pParse->
10820 61 41 6c 69 61 73 5b 69 41 6c 69 61 73 2d 31 5d  aAlias[iAlias-1]
10830 20 72 65 63 6f 72 64 73 20 74 68 65 20 72 65 67   records the reg
10840 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 68 65  ister number whe
10850 72 65 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20  re the value.** 
10860 6f 66 20 74 68 65 20 69 41 6c 69 61 73 2d 74 68  of the iAlias-th
10870 20 61 6c 69 61 73 20 69 73 20 73 74 6f 72 65 64   alias is stored
10880 2e 20 20 49 66 20 7a 65 72 6f 2c 20 74 68 61 74  .  If zero, that
10890 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 0a   means that the.
108a0 2a 2a 20 61 6c 69 61 73 20 68 61 73 20 6e 6f 74  ** alias has not
108b0 20 79 65 74 20 62 65 65 6e 20 63 6f 6d 70 75 74   yet been comput
108c0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
108d0 74 20 63 6f 64 65 41 6c 69 61 73 28 50 61 72 73  t codeAlias(Pars
108e0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
108f0 41 6c 69 61 73 2c 20 45 78 70 72 20 2a 70 45 78  Alias, Expr *pEx
10900 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b  pr, int target){
10910 0a 23 69 66 20 30 0a 20 20 73 71 6c 69 74 65 33  .#if 0.  sqlite3
10920 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
10930 62 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b 0a 20  b;.  int iReg;. 
10940 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 41 6c   if( pParse->nAl
10950 69 61 73 41 6c 6c 6f 63 3c 70 50 61 72 73 65 2d  iasAlloc<pParse-
10960 3e 6e 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 70  >nAlias ){.    p
10970 50 61 72 73 65 2d 3e 61 41 6c 69 61 73 20 3d 20  Parse->aAlias = 
10980 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
10990 4f 72 46 72 65 65 28 64 62 2c 20 70 50 61 72 73  OrFree(db, pPars
109a0 65 2d 3e 61 41 6c 69 61 73 2c 0a 20 20 20 20 20  e->aAlias,.     
109b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109c0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
109d0 6f 66 28 70 50 61 72 73 65 2d 3e 61 41 6c 69 61  of(pParse->aAlia
109e0 73 5b 30 5d 29 2a 70 50 61 72 73 65 2d 3e 6e 41  s[0])*pParse->nA
109f0 6c 69 61 73 20 29 3b 0a 20 20 20 20 74 65 73 74  lias );.    test
10a00 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  case( db->malloc
10a10 46 61 69 6c 65 64 20 26 26 20 70 50 61 72 73 65  Failed && pParse
10a20 2d 3e 6e 41 6c 69 61 73 41 6c 6c 6f 63 3e 30 20  ->nAliasAlloc>0 
10a30 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  );.    if( db->m
10a40 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
10a50 74 75 72 6e 20 30 3b 0a 20 20 20 20 6d 65 6d 73  turn 0;.    mems
10a60 65 74 28 26 70 50 61 72 73 65 2d 3e 61 41 6c 69  et(&pParse->aAli
10a70 61 73 5b 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61  as[pParse->nAlia
10a80 73 41 6c 6c 6f 63 5d 2c 20 30 2c 0a 20 20 20 20  sAlloc], 0,.    
10a90 20 20 20 20 20 20 20 28 70 50 61 72 73 65 2d 3e         (pParse->
10aa0 6e 41 6c 69 61 73 2d 70 50 61 72 73 65 2d 3e 6e  nAlias-pParse->n
10ab0 41 6c 69 61 73 41 6c 6c 6f 63 29 2a 73 69 7a 65  AliasAlloc)*size
10ac0 6f 66 28 70 50 61 72 73 65 2d 3e 61 41 6c 69 61  of(pParse->aAlia
10ad0 73 5b 30 5d 29 29 3b 0a 20 20 20 20 70 50 61 72  s[0]));.    pPar
10ae0 73 65 2d 3e 6e 41 6c 69 61 73 41 6c 6c 6f 63 20  se->nAliasAlloc 
10af0 3d 20 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73  = pParse->nAlias
10b00 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
10b10 69 41 6c 69 61 73 3e 30 20 26 26 20 69 41 6c 69  iAlias>0 && iAli
10b20 61 73 3c 3d 70 50 61 72 73 65 2d 3e 6e 41 6c 69  as<=pParse->nAli
10b30 61 73 20 29 3b 0a 20 20 69 52 65 67 20 3d 20 70  as );.  iReg = p
10b40 50 61 72 73 65 2d 3e 61 41 6c 69 61 73 5b 69 41  Parse->aAlias[iA
10b50 6c 69 61 73 2d 31 5d 3b 0a 20 20 69 66 28 20 69  lias-1];.  if( i
10b60 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  Reg==0 ){.    if
10b70 28 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  ( pParse->iCache
10b80 4c 65 76 65 6c 3e 30 20 29 7b 0a 20 20 20 20 20  Level>0 ){.     
10b90 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45   iReg = sqlite3E
10ba0 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
10bb0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
10bc0 67 65 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  get);.    }else{
10bd0 0a 20 20 20 20 20 20 69 52 65 67 20 3d 20 2b 2b  .      iReg = ++
10be0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
10bf0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
10c00 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
10c10 72 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20  r, iReg);.      
10c20 70 50 61 72 73 65 2d 3e 61 41 6c 69 61 73 5b 69  pParse->aAlias[i
10c30 41 6c 69 61 73 2d 31 5d 20 3d 20 69 52 65 67 3b  Alias-1] = iReg;
10c40 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
10c50 75 72 6e 20 69 52 65 67 3b 0a 23 65 6c 73 65 0a  urn iReg;.#else.
10c60 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
10c70 45 52 28 69 41 6c 69 61 73 29 3b 0a 20 20 72 65  ER(iAlias);.  re
10c80 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
10c90 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
10ca0 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
10cb0 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  );.#endif.}../*.
10cc0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
10cd0 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e   into the curren
10ce0 74 20 56 64 62 65 20 74 6f 20 65 76 61 6c 75 61  t Vdbe to evalua
10cf0 74 65 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  te the given.** 
10d00 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 41 74 74  expression.  Att
10d10 65 6d 70 74 20 74 6f 20 73 74 6f 72 65 20 74 68  empt to store th
10d20 65 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67  e results in reg
10d30 69 73 74 65 72 20 22 74 61 72 67 65 74 22 2e 0a  ister "target"..
10d40 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  ** Return the re
10d50 67 69 73 74 65 72 20 77 68 65 72 65 20 72 65 73  gister where res
10d60 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 2e  ults are stored.
10d70 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68 69 73  .**.** With this
10d80 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 72 65 20   routine, there 
10d90 69 73 20 6e 6f 20 67 75 61 72 61 6e 74 65 65 20  is no guarantee 
10da0 74 68 61 74 20 72 65 73 75 6c 74 73 20 77 69 6c  that results wil
10db0 6c 0a 2a 2a 20 62 65 20 73 74 6f 72 65 64 20 69  l.** be stored i
10dc0 6e 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72  n target.  The r
10dd0 65 73 75 6c 74 20 6d 69 67 68 74 20 62 65 20 73  esult might be s
10de0 74 6f 72 65 64 20 69 6e 20 73 6f 6d 65 20 6f 74  tored in some ot
10df0 68 65 72 0a 2a 2a 20 72 65 67 69 73 74 65 72 20  her.** register 
10e00 69 66 20 69 74 20 69 73 20 63 6f 6e 76 65 6e 69  if it is conveni
10e10 65 6e 74 20 74 6f 20 64 6f 20 73 6f 2e 20 20 54  ent to do so.  T
10e20 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
10e30 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63 68 65 63  ion.** must chec
10e40 6b 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  k the return cod
10e50 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 72  e and move the r
10e60 65 73 75 6c 74 73 20 74 6f 20 74 68 65 20 64 65  esults to the de
10e70 73 69 72 65 64 0a 2a 2a 20 72 65 67 69 73 74 65  sired.** registe
10e80 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
10e90 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
10ea0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
10eb0 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
10ec0 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20  target){.  Vdbe 
10ed0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
10ee0 62 65 3b 20 20 2f 2a 20 54 68 65 20 56 4d 20 75  be;  /* The VM u
10ef0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
10f00 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20  n */.  int op;  
10f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 62   /* The opcode b
10f30 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
10f40 69 6e 74 20 69 6e 52 65 67 20 3d 20 74 61 72 67  int inReg = targ
10f50 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73  et;       /* Res
10f60 75 6c 74 73 20 73 74 6f 72 65 64 20 69 6e 20 72  ults stored in r
10f70 65 67 69 73 74 65 72 20 69 6e 52 65 67 20 2a 2f  egister inReg */
10f80 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20  .  int regFree1 
10f90 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
10fa0 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65  If non-zero free
10fb0 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20   this temporary 
10fc0 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e  register */.  in
10fd0 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 20  t regFree2 = 0; 
10fe0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f          /* If no
10ff0 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73  n-zero free this
11000 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
11010 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 31 2c  ter */.  int r1,
11020 20 72 32 2c 20 72 33 2c 20 72 34 3b 20 20 20 20   r2, r3, r4;    
11030 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 72 65     /* Various re
11040 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 2a  gister numbers *
11050 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
11060 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 2f 2a  = pParse->db; /*
11070 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
11080 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61  nnection */..  a
11090 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
110a0 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73  && target<=pPars
110b0 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28  e->nMem );.  if(
110c0 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73   v==0 ){.    ass
110d0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
110e0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
110f0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
11100 20 7d 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d   }..  if( pExpr=
11110 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 54  =0 ){.    op = T
11120 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b  K_NULL;.  }else{
11130 0a 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72 2d  .    op = pExpr-
11140 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  >op;.  }.  switc
11150 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
11160 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
11170 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f   {.      AggInfo
11180 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 45 78   *pAggInfo = pEx
11190 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20  pr->pAggInfo;.  
111a0 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
111b0 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26  fo_col *pCol = &
111c0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70  pAggInfo->aCol[p
111d0 45 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20 20  Expr->iAgg];.   
111e0 20 20 20 69 66 28 20 21 70 41 67 67 49 6e 66 6f     if( !pAggInfo
111f0 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 29 7b 0a  ->directMode ){.
11200 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
11210 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a  pCol->iMem>0 );.
11220 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20          inReg = 
11230 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20  pCol->iMem;.    
11240 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
11250 20 7d 65 6c 73 65 20 69 66 28 20 70 41 67 67 49   }else if( pAggI
11260 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67 49  nfo->useSortingI
11270 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  dx ){.        sq
11280 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
11290 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41  v, OP_Column, pA
112a0 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67 49  ggInfo->sortingI
112b0 64 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  dx,.            
112c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112d0 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
112e0 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a  olumn, target);.
112f0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
11300 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
11310 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20  Otherwise, fall 
11320 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b  thru into the TK
11330 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f 0a  _COLUMN case */.
11340 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
11350 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
11360 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61    if( pExpr->iTa
11370 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ble<0 ){.       
11380 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61   /* This only ha
11390 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 64 69 6e  ppens when codin
113a0 67 20 63 68 65 63 6b 20 63 6f 6e 73 74 72 61 69  g check constrai
113b0 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  nts */.        a
113c0 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 63  ssert( pParse->c
113d0 6b 42 61 73 65 3e 30 20 29 3b 0a 20 20 20 20 20  kBase>0 );.     
113e0 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72     inReg = pExpr
113f0 2d 3e 69 43 6f 6c 75 6d 6e 20 2b 20 70 50 61 72  ->iColumn + pPar
11400 73 65 2d 3e 63 6b 42 61 73 65 3b 0a 20 20 20 20  se->ckBase;.    
11410 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11420 20 74 65 73 74 63 61 73 65 28 20 28 70 45 78 70   testcase( (pExp
11430 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 41 6e  r->flags & EP_An
11440 79 41 66 66 29 21 3d 30 20 29 3b 0a 20 20 20 20  yAff)!=0 );.    
11450 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
11460 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
11470 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 45 78  lumn(pParse, pEx
11480 70 72 2d 3e 70 54 61 62 2c 0a 20 20 20 20 20 20  pr->pTab,.      
11490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114a0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
114b0 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 45 78 70 72  ->iColumn, pExpr
114c0 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65 74  ->iTable, target
114d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
114e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114f0 20 20 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20     pExpr->flags 
11500 26 20 45 50 5f 41 6e 79 41 66 66 29 3b 0a 20 20  & EP_AnyAff);.  
11510 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
11520 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
11530 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  e TK_INTEGER: {.
11540 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65        codeIntege
11550 72 28 76 2c 20 70 45 78 70 72 2c 20 30 2c 20 74  r(v, pExpr, 0, t
11560 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72  arget);.      br
11570 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
11580 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a  ase TK_FLOAT: {.
11590 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
115a0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
115b0 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
115c0 65 29 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  e) );.      code
115d0 52 65 61 6c 28 76 2c 20 70 45 78 70 72 2d 3e 75  Real(v, pExpr->u
115e0 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74 61 72 67  .zToken, 0, targ
115f0 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  et);.      break
11600 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
11610 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20   TK_STRING: {.  
11620 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
11630 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
11640 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
11650 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
11660 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
11670 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 74 61  P_String8, 0, ta
11680 72 67 65 74 2c 20 30 2c 20 70 45 78 70 72 2d 3e  rget, 0, pExpr->
11690 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20  u.zToken, 0);.  
116a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
116b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c  .    case TK_NUL
116c0 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L: {.      sqlit
116d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
116e0 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67  OP_Null, 0, targ
116f0 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  et);.      break
11700 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
11710 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42  SQLITE_OMIT_BLOB
11720 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73  _LITERAL.    cas
11730 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  e TK_BLOB: {.   
11740 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
11750 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
11760 20 20 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62       char *zBlob
11770 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
11780 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
11790 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
117a0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73  lue) );.      as
117b0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
117c0 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c  Token[0]=='x' ||
117d0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
117e0 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20  [0]=='X' );.    
117f0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
11800 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c  >u.zToken[1]=='\
11810 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20  '' );.      z = 
11820 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  &pExpr->u.zToken
11830 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73  [2];.      n = s
11840 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
11850 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73  ) - 1;.      ass
11860 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20  ert( z[n]=='\'' 
11870 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d  );.      zBlob =
11880 20 73 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f   sqlite3HexToBlo
11890 62 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  b(sqlite3VdbeDb(
118a0 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  v), z, n);.     
118b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
118c0 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e  p4(v, OP_Blob, n
118d0 2f 32 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 7a  /2, target, 0, z
118e0 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43  Blob, P4_DYNAMIC
118f0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
11900 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
11910 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c   case TK_VARIABL
11920 45 3a 20 7b 0a 20 20 20 20 20 20 56 64 62 65 4f  E: {.      VdbeO
11930 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 61 73  p *pOp;.      as
11940 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
11950 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
11960 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
11970 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
11980 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29  r->u.zToken!=0 )
11990 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
119a0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
119b0 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  0]!=0 );.      i
119c0 66 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  f( pExpr->u.zTok
119d0 65 6e 5b 31 5d 3d 3d 30 0a 20 20 20 20 20 20 20  en[1]==0.       
119e0 20 20 26 26 20 28 70 4f 70 20 3d 20 73 71 6c 69    && (pOp = sqli
119f0 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
11a00 2d 31 29 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50  -1))->opcode==OP
11a10 5f 56 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20  _Variable.      
11a20 20 20 20 26 26 20 70 4f 70 2d 3e 70 31 2b 70 4f     && pOp->p1+pO
11a30 70 2d 3e 70 33 3d 3d 70 45 78 70 72 2d 3e 69 54  p->p3==pExpr->iT
11a40 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 26 26  able.         &&
11a50 20 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33   pOp->p2+pOp->p3
11a60 3d 3d 74 61 72 67 65 74 0a 20 20 20 20 20 20 20  ==target.       
11a70 20 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 3d 3d    && pOp->p4.z==
11a80 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  0.      ){.     
11a90 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 72 65     /* If the pre
11aa0 76 69 6f 75 73 20 69 6e 73 74 72 75 63 74 69 6f  vious instructio
11ab0 6e 20 77 61 73 20 61 20 63 6f 70 79 20 6f 66 20  n was a copy of 
11ac0 74 68 65 20 70 72 65 76 69 6f 75 73 20 75 6e 6e  the previous unn
11ad0 61 6d 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  amed.        ** 
11ae0 70 61 72 61 6d 65 74 65 72 20 69 6e 74 6f 20 74  parameter into t
11af0 68 65 20 70 72 65 76 69 6f 75 73 20 72 65 67 69  he previous regi
11b00 73 74 65 72 2c 20 74 68 65 6e 20 73 69 6d 70 6c  ster, then simpl
11b10 79 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 0a  y increment the.
11b20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 70 65 61          ** repea
11b30 74 20 63 6f 75 6e 74 20 6f 6e 20 74 68 65 20 70  t count on the p
11b40 72 69 6f 72 20 69 6e 73 74 72 75 63 74 69 6f 6e  rior instruction
11b50 20 72 61 74 68 65 72 20 74 68 61 6e 20 6d 61 6b   rather than mak
11b60 69 6e 67 20 61 20 6e 65 77 0a 20 20 20 20 20 20  ing a new.      
11b70 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e    ** instruction
11b80 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
11b90 20 20 20 20 20 70 4f 70 2d 3e 70 33 2b 2b 3b 0a       pOp->p3++;.
11ba0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11bb0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11bc0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 56 61 72  AddOp3(v, OP_Var
11bd0 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 54  iable, pExpr->iT
11be0 61 62 6c 65 2c 20 74 61 72 67 65 74 2c 20 31 29  able, target, 1)
11bf0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  ;.        if( pE
11c00 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d  xpr->u.zToken[1]
11c10 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
11c20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
11c30 67 65 50 34 28 76 2c 20 2d 31 2c 20 70 45 78 70  geP4(v, -1, pExp
11c40 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b  r->u.zToken, 0);
11c50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11c60 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
11c70 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
11c80 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20  K_REGISTER: {.  
11c90 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70      inReg = pExp
11ca0 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  r->iTable;.     
11cb0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
11cc0 20 20 63 61 73 65 20 54 4b 5f 41 53 3a 20 7b 0a    case TK_AS: {.
11cd0 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 63 6f        inReg = co
11ce0 64 65 41 6c 69 61 73 28 70 50 61 72 73 65 2c 20  deAlias(pParse, 
11cf0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 70  pExpr->iTable, p
11d00 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72  Expr->pLeft, tar
11d10 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  get);.      brea
11d20 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
11d30 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53   SQLITE_OMIT_CAS
11d40 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41  T.    case TK_CA
11d50 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  ST: {.      /* E
11d60 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68  xpressions of th
11d70 65 20 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70  e form:   CAST(p
11d80 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a  Left AS token) *
11d90 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66 2c  /.      int aff,
11da0 20 74 6f 5f 6f 70 3b 0a 20 20 20 20 20 20 69 6e   to_op;.      in
11db0 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
11dc0 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
11dd0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
11de0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
11df0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
11e00 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
11e10 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
11e20 0a 20 20 20 20 20 20 61 66 66 20 3d 20 73 71 6c  .      aff = sql
11e30 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
11e40 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
11e50 29 3b 0a 20 20 20 20 20 20 74 6f 5f 6f 70 20 3d  );.      to_op =
11e60 20 61 66 66 20 2d 20 53 51 4c 49 54 45 5f 41 46   aff - SQLITE_AF
11e70 46 5f 54 45 58 54 20 2b 20 4f 50 5f 54 6f 54 65  F_TEXT + OP_ToTe
11e80 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  xt;.      assert
11e90 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 54 65  ( to_op==OP_ToTe
11ea0 78 74 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51  xt    || aff!=SQ
11eb0 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 20 20  LITE_AFF_TEXT   
11ec0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
11ed0 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c  ( to_op==OP_ToBl
11ee0 6f 62 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51  ob    || aff!=SQ
11ef0 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 20 20  LITE_AFF_NONE   
11f00 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
11f10 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75  ( to_op==OP_ToNu
11f20 6d 65 72 69 63 20 7c 7c 20 61 66 66 21 3d 53 51  meric || aff!=SQ
11f30 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
11f40 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
11f50 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 49 6e  ( to_op==OP_ToIn
11f60 74 20 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51  t     || aff!=SQ
11f70 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
11f80 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
11f90 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 52 65  ( to_op==OP_ToRe
11fa0 61 6c 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51  al    || aff!=SQ
11fb0 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 20 20  LITE_AFF_REAL   
11fc0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
11fd0 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  se( to_op==OP_To
11fe0 54 65 78 74 20 29 3b 0a 20 20 20 20 20 20 74 65  Text );.      te
11ff0 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f  stcase( to_op==O
12000 50 5f 54 6f 42 6c 6f 62 20 29 3b 0a 20 20 20 20  P_ToBlob );.    
12010 20 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f    testcase( to_o
12020 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65 72 69 63 20  p==OP_ToNumeric 
12030 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
12040 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 49  e( to_op==OP_ToI
12050 6e 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  nt );.      test
12060 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  case( to_op==OP_
12070 54 6f 52 65 61 6c 20 29 3b 0a 20 20 20 20 20 20  ToReal );.      
12080 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65  if( inReg!=targe
12090 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
120a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
120b0 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65  , OP_SCopy, inRe
120c0 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  g, target);.    
120d0 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67      inReg = targ
120e0 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  et;.      }.    
120f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12100 4f 70 31 28 76 2c 20 74 6f 5f 6f 70 2c 20 69 6e  Op1(v, to_op, in
12110 52 65 67 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Reg);.      test
12120 63 61 73 65 28 20 75 73 65 64 41 73 43 6f 6c 75  case( usedAsColu
12130 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c 20  mnCache(pParse, 
12140 69 6e 52 65 67 2c 20 69 6e 52 65 67 29 20 29 3b  inReg, inReg) );
12150 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
12160 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
12170 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 6e  hange(pParse, in
12180 52 65 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 62  Reg, 1);.      b
12190 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
121a0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
121b0 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61  T_CAST */.    ca
121c0 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
121d0 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
121e0 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
121f0 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61  se TK_GE:.    ca
12200 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
12210 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20  se TK_EQ: {.    
12220 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d    assert( TK_LT=
12230 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20  =OP_Lt );.      
12240 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f  assert( TK_LE==O
12250 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Le );.      as
12260 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f  sert( TK_GT==OP_
12270 47 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Gt );.      asse
12280 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65  rt( TK_GE==OP_Ge
12290 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
122a0 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29  ( TK_EQ==OP_Eq )
122b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
122c0 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a  TK_NE==OP_Ne );.
122d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
122e0 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20  op==TK_LT );.   
122f0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
12300 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20  =TK_LE );.      
12310 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
12320 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _GT );.      tes
12330 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 45  tcase( op==TK_GE
12340 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
12350 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b  se( op==TK_EQ );
12360 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
12370 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20   op==TK_NE );.  
12380 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 4f      codeCompareO
12390 70 65 72 61 6e 64 73 28 70 50 61 72 73 65 2c 20  perands(pParse, 
123a0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
123b0 31 2c 20 26 72 65 67 46 72 65 65 31 2c 0a 20 20  1, &regFree1,.  
123c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123e0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
123f0 72 32 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  r2, &regFree2);.
12400 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
12410 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
12420 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70  >pLeft, pExpr->p
12430 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20  Right, op,.     
12440 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c               r1,
12450 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49   r2, inReg, SQLI
12460 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20  TE_STOREP2);.   
12470 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
12480 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
12490 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
124a0 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
124b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
124c0 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20    case TK_AND:. 
124d0 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20     case TK_OR:. 
124e0 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a     case TK_PLUS:
124f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41  .    case TK_STA
12500 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d  R:.    case TK_M
12510 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54  INUS:.    case T
12520 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20  K_REM:.    case 
12530 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63  TK_BITAND:.    c
12540 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20  ase TK_BITOR:.  
12550 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a    case TK_SLASH:
12560 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48  .    case TK_LSH
12570 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  IFT:.    case TK
12580 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61  _RSHIFT: .    ca
12590 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a  se TK_CONCAT: {.
125a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
125b0 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 0a  _AND==OP_And );.
125c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
125d0 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 0a 20 20  _OR==OP_Or );.  
125e0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 50      assert( TK_P
125f0 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 0a 20  LUS==OP_Add );. 
12600 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
12610 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61  MINUS==OP_Subtra
12620 63 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ct );.      asse
12630 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52  rt( TK_REM==OP_R
12640 65 6d 61 69 6e 64 65 72 20 29 3b 0a 20 20 20 20  emainder );.    
12650 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54    assert( TK_BIT
12660 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29  AND==OP_BitAnd )
12670 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
12680 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74  TK_BITOR==OP_Bit
12690 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Or );.      asse
126a0 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50  rt( TK_SLASH==OP
126b0 5f 44 69 76 69 64 65 20 29 3b 0a 20 20 20 20 20  _Divide );.     
126c0 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48 49   assert( TK_LSHI
126d0 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74  FT==OP_ShiftLeft
126e0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
126f0 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f  ( TK_RSHIFT==OP_
12700 53 68 69 66 74 52 69 67 68 74 20 29 3b 0a 20 20  ShiftRight );.  
12710 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 43      assert( TK_C
12720 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74  ONCAT==OP_Concat
12730 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
12740 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  se( op==TK_AND )
12750 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
12760 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20  ( op==TK_OR );. 
12770 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
12780 70 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20  p==TK_PLUS );.  
12790 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
127a0 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20 20  ==TK_MINUS );.  
127b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
127c0 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20 20 20  ==TK_REM );.    
127d0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
127e0 54 4b 5f 42 49 54 41 4e 44 20 29 3b 0a 20 20 20  TK_BITAND );.   
127f0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
12800 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20 20 20  =TK_BITOR );.   
12810 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
12820 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20 20  =TK_SLASH );.   
12830 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
12840 3d 54 4b 5f 4c 53 48 49 46 54 20 29 3b 0a 20 20  =TK_LSHIFT );.  
12850 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
12860 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a 20  ==TK_RSHIFT );. 
12870 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
12880 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a  p==TK_CONCAT );.
12890 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
128a0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
128b0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
128c0 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
128d0 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
128e0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
128f0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
12900 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
12910 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12920 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70  VdbeAddOp3(v, op
12930 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74  , r2, r1, target
12940 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
12950 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
12960 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
12970 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
12980 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
12990 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
129a0 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20  UMINUS: {.      
129b0 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
129c0 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
129d0 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20    assert( pLeft 
129e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  );.      if( pLe
129f0 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54  ft->op==TK_FLOAT
12a00 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
12a10 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
12a20 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
12a30 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
12a40 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20      codeReal(v, 
12a50 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pLeft->u.zToken,
12a60 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   1, target);.   
12a70 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65     }else if( pLe
12a80 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47  ft->op==TK_INTEG
12a90 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  ER ){.        co
12aa0 64 65 49 6e 74 65 67 65 72 28 76 2c 20 70 4c 65  deInteger(v, pLe
12ab0 66 74 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a  ft, 1, target);.
12ac0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
12ad0 20 20 20 20 20 72 65 67 46 72 65 65 31 20 3d 20       regFree1 = 
12ae0 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
12af0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
12b00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
12b10 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12b20 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 31 29 3b  Integer, 0, r1);
12b30 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71  .        r2 = sq
12b40 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
12b50 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
12b60 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
12b70 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2);.        sqli
12b80 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
12b90 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72 32   OP_Subtract, r2
12ba0 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  , r1, target);. 
12bb0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
12bc0 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
12bd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e        }.      in
12be0 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20  Reg = target;.  
12bf0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
12c00 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
12c10 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NOT:.    case TK
12c20 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61 73  _NOT: {.      as
12c30 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d  sert( TK_BITNOT=
12c40 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 0a 20 20  =OP_BitNot );.  
12c50 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
12c60 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 0a 20 20  OT==OP_Not );.  
12c70 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
12c80 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20  ==TK_BITNOT );. 
12c90 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
12ca0 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20  p==TK_NOT );.   
12cb0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
12cc0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
12cd0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
12ce0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
12cf0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
12d00 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
12d10 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65     inReg = targe
12d20 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
12d30 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70  VdbeAddOp2(v, op
12d40 2c 20 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20 20  , r1, inReg);.  
12d50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
12d60 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
12d70 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
12d80 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
12d90 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
12da0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e    assert( TK_ISN
12db0 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29  ULL==OP_IsNull )
12dc0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
12dd0 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e  TK_NOTNULL==OP_N
12de0 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20  otNull );.      
12df0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
12e00 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  _ISNULL );.     
12e10 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
12e20 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20  K_NOTNULL );.   
12e30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12e40 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
12e50 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a  er, 1, target);.
12e60 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
12e70 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
12e80 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
12e90 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
12ea0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
12eb0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
12ec0 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
12ed0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
12ee0 2c 20 6f 70 2c 20 72 31 29 3b 0a 20 20 20 20 20  , op, r1);.     
12ef0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12f00 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
12f10 20 74 61 72 67 65 74 2c 20 2d 31 29 3b 0a 20 20   target, -1);.  
12f20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
12f30 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
12f40 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
12f50 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
12f60 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  _AGG_FUNCTION: {
12f70 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a  .      AggInfo *
12f80 70 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70  pInfo = pExpr->p
12f90 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69  AggInfo;.      i
12fa0 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20  f( pInfo==0 ){. 
12fb0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
12fc0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
12fd0 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
12fe0 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 73  ue) );.        s
12ff0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
13000 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f  Parse, "misuse o
13010 66 20 61 67 67 72 65 67 61 74 65 3a 20 25 73 28  f aggregate: %s(
13020 29 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  )", pExpr->u.zTo
13030 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ken);.      }els
13040 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  e{.        inReg
13050 20 3d 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b   = pInfo->aFunc[
13060 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65  pExpr->iAgg].iMe
13070 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
13080 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
13090 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f    case TK_CONST_
130a0 46 55 4e 43 3a 0a 20 20 20 20 63 61 73 65 20 54  FUNC:.    case T
130b0 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  K_FUNCTION: {.  
130c0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46      ExprList *pF
130d0 61 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69  arg;       /* Li
130e0 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61  st of function a
130f0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  rguments */.    
13100 20 20 69 6e 74 20 6e 46 61 72 67 3b 20 20 20 20    int nFarg;    
13110 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
13120 65 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61  er of function a
13130 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  rguments */.    
13140 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b    FuncDef *pDef;
13150 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
13160 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74  function definit
13170 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ion object */.  
13180 20 20 20 20 69 6e 74 20 6e 49 64 3b 20 20 20 20      int nId;    
13190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
131a0 6e 67 74 68 20 6f 66 20 74 68 65 20 66 75 6e 63  ngth of the func
131b0 74 69 6f 6e 20 6e 61 6d 65 20 69 6e 20 62 79 74  tion name in byt
131c0 65 73 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73  es */.      cons
131d0 74 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20  t char *zId;    
131e0 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69     /* The functi
131f0 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  on name */.     
13200 20 69 6e 74 20 63 6f 6e 73 74 4d 61 73 6b 20 3d   int constMask =
13210 20 30 3b 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20   0;     /* Mask 
13220 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  of function argu
13230 6d 65 6e 74 73 20 74 68 61 74 20 61 72 65 20 63  ments that are c
13240 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20 20 20 20 20  onstant */.     
13250 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
13260 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
13270 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
13280 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62   u8 enc = ENC(db
13290 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74  );      /* The t
132a0 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 75 73 65  ext encoding use
132b0 64 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61  d by this databa
132c0 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c  se */.      Coll
132d0 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20  Seq *pColl = 0; 
132e0 20 20 20 2f 2a 20 41 20 63 6f 6c 6c 61 74 69 6e     /* A collatin
132f0 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20  g sequence */.. 
13300 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
13310 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
13320 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
13330 74 29 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  t) );.      test
13340 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e  case( op==TK_CON
13350 53 54 5f 46 55 4e 43 20 29 3b 0a 20 20 20 20 20  ST_FUNC );.     
13360 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
13370 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20  K_FUNCTION );.  
13380 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 41      if( ExprHasA
13390 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  nyProperty(pExpr
133a0 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  , EP_TokenOnly) 
133b0 29 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67  ){.        pFarg
133c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
133d0 65 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67  e{.        pFarg
133e0 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
133f0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
13400 20 6e 46 61 72 67 20 3d 20 70 46 61 72 67 20 3f   nFarg = pFarg ?
13410 20 70 46 61 72 67 2d 3e 6e 45 78 70 72 20 3a 20   pFarg->nExpr : 
13420 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  0;.      assert(
13430 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
13440 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
13450 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 7a  alue) );.      z
13460 49 64 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54  Id = pExpr->u.zT
13470 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 49 64 20  oken;.      nId 
13480 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
13490 30 28 7a 49 64 29 3b 0a 20 20 20 20 20 20 70 44  0(zId);.      pD
134a0 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ef = sqlite3Find
134b0 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 49 64  Function(db, zId
134c0 2c 20 6e 49 64 2c 20 6e 46 61 72 67 2c 20 65 6e  , nId, nFarg, en
134d0 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  c, 0);.      if(
134e0 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20   pDef==0 ){.    
134f0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
13500 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b  Msg(pParse, "unk
13510 6e 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 3a 20 25  nown function: %
13520 2e 2a 73 28 29 22 2c 20 6e 49 64 2c 20 7a 49 64  .*s()", nId, zId
13530 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
13540 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13550 69 66 28 20 70 46 61 72 67 20 29 7b 0a 20 20 20  if( pFarg ){.   
13560 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
13570 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
13580 61 72 73 65 2c 20 6e 46 61 72 67 29 3b 0a 20 20  arse, nFarg);.  
13590 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
135a0 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
135b0 61 72 73 65 2c 20 70 46 61 72 67 2c 20 72 31 2c  arse, pFarg, r1,
135c0 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   1);.      }else
135d0 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 30  {.        r1 = 0
135e0 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
135f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
13600 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
13610 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76 65   /* Possibly ove
13620 72 6c 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69  rload the functi
13630 6f 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 20  on if the first 
13640 61 72 67 75 6d 65 6e 74 20 69 73 0a 20 20 20 20  argument is.    
13650 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 74    ** a virtual t
13660 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20  able column..   
13670 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46     **.      ** F
13680 6f 72 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f  or infix functio
13690 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20  ns (LIKE, GLOB, 
136a0 52 45 47 45 58 50 2c 20 61 6e 64 20 4d 41 54 43  REGEXP, and MATC
136b0 48 29 20 75 73 65 20 74 68 65 0a 20 20 20 20 20  H) use the.     
136c0 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d   ** second argum
136d0 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66 69 72  ent, not the fir
136e0 73 74 2c 20 61 73 20 74 68 65 20 61 72 67 75 6d  st, as the argum
136f0 65 6e 74 20 74 6f 20 74 65 73 74 20 74 6f 0a 20  ent to test to. 
13700 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69       ** see if i
13710 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  t is a column in
13720 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
13730 2e 20 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  .  This is done 
13740 62 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a  because.      **
13750 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e   the left operan
13760 64 20 6f 66 20 69 6e 66 69 78 20 66 75 6e 63 74  d of infix funct
13770 69 6f 6e 73 20 28 74 68 65 20 6f 70 65 72 61 6e  ions (the operan
13780 64 20 77 65 20 77 61 6e 74 20 74 6f 0a 20 20 20  d we want to.   
13790 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76     ** control ov
137a0 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73 20  erloading) ends 
137b0 75 70 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  up as the second
137c0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
137d0 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69  .      ** functi
137e0 6f 6e 2e 20 20 54 68 65 20 65 78 70 72 65 73 73  on.  The express
137f0 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 69  ion "A glob B" i
13800 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
13810 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28  .      ** "glob(
13820 42 2c 41 29 2e 20 20 57 65 20 77 61 6e 74 20 74  B,A).  We want t
13830 6f 20 75 73 65 20 74 68 65 20 41 20 69 6e 20 22  o use the A in "
13840 41 20 67 6c 6f 62 20 42 22 20 74 6f 20 74 65 73  A glob B" to tes
13850 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 66  t.      ** for f
13860 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64  unction overload
13870 69 6e 67 2e 20 20 42 75 74 20 77 65 20 75 73 65  ing.  But we use
13880 20 74 68 65 20 42 20 74 65 72 6d 20 69 6e 20 22   the B term in "
13890 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20 20  glob(B,A)"..    
138a0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e    */.      if( n
138b0 46 61 72 67 3e 3d 32 20 26 26 20 28 70 45 78 70  Farg>=2 && (pExp
138c0 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  r->flags & EP_In
138d0 66 69 78 46 75 6e 63 29 20 29 7b 0a 20 20 20 20  fixFunc) ){.    
138e0 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
138f0 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75  e3VtabOverloadFu
13900 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c  nction(db, pDef,
13910 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61   nFarg, pFarg->a
13920 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [1].pExpr);.    
13930 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 61 72    }else if( nFar
13940 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  g>0 ){.        p
13950 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61  Def = sqlite3Vta
13960 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f  bOverloadFunctio
13970 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72  n(db, pDef, nFar
13980 67 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  g, pFarg->a[0].p
13990 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23  Expr);.      }.#
139a0 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f 72 28  endif.      for(
139b0 69 3d 30 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b  i=0; i<nFarg; i+
139c0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
139d0 69 3c 33 32 20 26 26 20 73 71 6c 69 74 65 33 45  i<32 && sqlite3E
139e0 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 46  xprIsConstant(pF
139f0 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  arg->a[i].pExpr)
13a00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   ){.          co
13a10 6e 73 74 4d 61 73 6b 20 7c 3d 20 28 31 3c 3c 69  nstMask |= (1<<i
13a20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
13a30 20 20 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e       if( (pDef->
13a40 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
13a50 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30  UNC_NEEDCOLL)!=0
13a60 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20   && !pColl ){.  
13a70 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
13a80 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
13a90 65 71 28 70 50 61 72 73 65 2c 20 70 46 61 72 67  eq(pParse, pFarg
13aa0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
13ab0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
13ac0 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d  .      if( pDef-
13ad0 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
13ae0 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b  FUNC_NEEDCOLL ){
13af0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43  .        if( !pC
13b00 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62  oll ) pColl = db
13b10 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20  ->pDfltColl; .  
13b20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13b30 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
13b40 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20  llSeq, 0, 0, 0, 
13b50 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50  (char *)pColl, P
13b60 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
13b70 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
13b80 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
13b90 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 63 6f 6e 73  P_Function, cons
13ba0 74 4d 61 73 6b 2c 20 72 31 2c 20 74 61 72 67 65  tMask, r1, targe
13bb0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
13bc0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
13bd0 2a 29 70 44 65 66 2c 20 50 34 5f 46 55 4e 43 44  *)pDef, P4_FUNCD
13be0 45 46 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  EF);.      sqlit
13bf0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
13c00 2c 20 28 75 38 29 6e 46 61 72 67 29 3b 0a 20 20  , (u8)nFarg);.  
13c10 20 20 20 20 69 66 28 20 6e 46 61 72 67 20 29 7b      if( nFarg ){
13c20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
13c30 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
13c40 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 46 61  (pParse, r1, nFa
13c50 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rg);.      }.   
13c60 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
13c70 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
13c80 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 46  e(pParse, r1, nF
13c90 61 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61  arg);.      brea
13ca0 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
13cb0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
13cc0 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
13cd0 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61  K_EXISTS:.    ca
13ce0 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a  se TK_SELECT: {.
13cf0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
13d00 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b  op==TK_EXISTS );
13d10 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
13d20 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29   op==TK_SELECT )
13d30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  ;.      sqlite3C
13d40 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
13d50 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 30  rse, pExpr, 0, 0
13d60 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d  );.      inReg =
13d70 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
13d80 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
13d90 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
13da0 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  IN: {.      int 
13db0 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 30 3b 0a 20  rNotFound = 0;. 
13dc0 20 20 20 20 20 69 6e 74 20 72 4d 61 79 48 61 76       int rMayHav
13dd0 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20  eNull = 0;.     
13de0 20 69 6e 74 20 6a 32 2c 20 6a 33 2c 20 6a 34 2c   int j2, j3, j4,
13df0 20 6a 35 3b 0a 20 20 20 20 20 20 63 68 61 72 20   j5;.      char 
13e00 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20  affinity;.      
13e10 69 6e 74 20 65 54 79 70 65 3b 0a 0a 20 20 20 20  int eType;..    
13e20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
13e30 74 28 28 76 2c 20 22 62 65 67 69 6e 20 49 4e 20  t((v, "begin IN 
13e40 65 78 70 72 20 72 25 64 22 2c 20 74 61 72 67 65  expr r%d", targe
13e50 74 29 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65  t));.      eType
13e60 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
13e70 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 45  Index(pParse, pE
13e80 78 70 72 2c 20 26 72 4d 61 79 48 61 76 65 4e 75  xpr, &rMayHaveNu
13e90 6c 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ll);.      if( r
13ea0 4d 61 79 48 61 76 65 4e 75 6c 6c 20 29 7b 0a 20  MayHaveNull ){. 
13eb0 20 20 20 20 20 20 20 72 4e 6f 74 46 6f 75 6e 64         rNotFound
13ec0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
13ed0 6d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  m;.      }..    
13ee0 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
13ef0 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20  the affinity to 
13f00 75 73 65 20 74 6f 20 63 72 65 61 74 65 20 61 20  use to create a 
13f10 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 72 65 73  key from the res
13f20 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66  ults.      ** of
13f30 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
13f40 20 61 66 66 69 6e 69 74 79 53 74 72 20 73 74 6f   affinityStr sto
13f50 72 65 73 20 61 20 73 74 61 74 69 63 20 73 74 72  res a static str
13f60 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f 72  ing suitable for
13f70 0a 20 20 20 20 20 20 2a 2a 20 50 34 20 6f 66 20  .      ** P4 of 
13f80 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 20  OP_MakeRecord.. 
13f90 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 66       */.      af
13fa0 66 69 6e 69 74 79 20 3d 20 63 6f 6d 70 61 72 69  finity = compari
13fb0 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70  sonAffinity(pExp
13fc0 72 29 3b 0a 0a 0a 20 20 20 20 20 20 2f 2a 20 43  r);...      /* C
13fd0 6f 64 65 20 74 68 65 20 3c 65 78 70 72 3e 20 66  ode the <expr> f
13fe0 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20 28  rom "<expr> IN (
13ff0 2e 2e 2e 29 22 2e 20 54 68 65 20 74 65 6d 70 6f  ...)". The tempo
14000 72 61 72 79 20 74 61 62 6c 65 0a 20 20 20 20 20  rary table.     
14010 20 2a 2a 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   ** pExpr->iTabl
14020 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76  e contains the v
14030 61 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20  alues that make 
14040 75 70 20 74 68 65 20 28 2e 2e 2e 29 20 73 65 74  up the (...) set
14050 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
14060 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
14070 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
14080 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
14090 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
140a0 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65  pr->pLeft, targe
140b0 74 29 3b 0a 20 20 20 20 20 20 6a 32 20 3d 20 73  t);.      j2 = s
140c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
140d0 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 74  (v, OP_IsNull, t
140e0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66  arget);.      if
140f0 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  ( eType==IN_INDE
14100 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20  X_ROWID ){.     
14110 20 20 20 6a 33 20 3d 20 73 71 6c 69 74 65 33 56     j3 = sqlite3V
14120 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
14130 4d 75 73 74 42 65 49 6e 74 2c 20 74 61 72 67 65  MustBeInt, targe
14140 74 29 3b 0a 20 20 20 20 20 20 20 20 6a 34 20 3d  t);.        j4 =
14150 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14160 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73  p3(v, OP_NotExis
14170 74 73 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  ts, pExpr->iTabl
14180 65 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  e, 0, target);. 
14190 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
141a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
141b0 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65  nteger, 1, targe
141c0 74 29 3b 0a 20 20 20 20 20 20 20 20 6a 35 20 3d  t);.        j5 =
141d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
141e0 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a  p0(v, OP_Goto);.
141f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
14200 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
14210 33 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  3);.        sqli
14220 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
14230 76 2c 20 6a 34 29 3b 0a 20 20 20 20 20 20 20 20  v, j4);.        
14240 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14250 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
14260 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
14270 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14280 20 20 72 32 20 3d 20 72 65 67 46 72 65 65 32 20    r2 = regFree2 
14290 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
142a0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 0a 20 20  Reg(pParse);..  
142b0 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20        /* Create 
142c0 61 20 72 65 63 6f 72 64 20 61 6e 64 20 74 65 73  a record and tes
142d0 74 20 66 6f 72 20 73 65 74 20 6d 65 6d 62 65 72  t for set member
142e0 73 68 69 70 2e 20 49 66 20 74 68 65 20 73 65 74  ship. If the set
142f0 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20   contains.      
14300 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 2c 20    ** the value, 
14310 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65  then jump to the
14320 20 65 6e 64 20 6f 66 20 74 68 65 20 74 65 73 74   end of the test
14330 20 63 6f 64 65 2e 20 54 68 65 20 74 61 72 67 65   code. The targe
14340 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 67  t.        ** reg
14350 69 73 74 65 72 20 73 74 69 6c 6c 20 63 6f 6e 74  ister still cont
14360 61 69 6e 73 20 74 68 65 20 74 72 75 65 20 28 31  ains the true (1
14370 29 20 76 61 6c 75 65 20 77 72 69 74 74 65 6e 20  ) value written 
14380 74 6f 20 69 74 20 65 61 72 6c 69 65 72 2e 0a 20  to it earlier.. 
14390 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
143a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
143b0 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
143c0 63 6f 72 64 2c 20 74 61 72 67 65 74 2c 20 31 2c  cord, target, 1,
143d0 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c 20   r2, &affinity, 
143e0 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
143f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14400 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
14410 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
14420 20 6a 35 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j5 = sqlite3Vdb
14430 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 46 6f  eAddOp3(v, OP_Fo
14440 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  und, pExpr->iTab
14450 6c 65 2c 20 30 2c 20 72 32 29 3b 0a 0a 20 20 20  le, 0, r2);..   
14460 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73       /* If the s
14470 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65  et membership te
14480 73 74 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74  st fails, then t
14490 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
144a0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 78 20   .        ** "x 
144b0 49 4e 20 28 2e 2e 2e 29 22 20 65 78 70 72 65 73  IN (...)" expres
144c0 73 69 6f 6e 20 6d 75 73 74 20 62 65 20 65 69 74  sion must be eit
144d0 68 65 72 20 30 20 6f 72 20 4e 55 4c 4c 2e 20 49  her 0 or NULL. I
144e0 66 20 74 68 65 20 73 65 74 0a 20 20 20 20 20 20  f the set.      
144f0 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f    ** contains no
14500 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68   NULL values, th
14510 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  en the result is
14520 20 30 2e 20 49 66 20 74 68 65 20 73 65 74 20 0a   0. If the set .
14530 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61          ** conta
14540 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
14550 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68 65  NULL values, the
14560 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  n the result of 
14570 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65  the.        ** e
14580 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6c 73  xpression is als
14590 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20  o NULL..        
145a0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  */.        if( r
145b0 4e 6f 74 46 6f 75 6e 64 3d 3d 30 20 29 7b 0a 20  NotFound==0 ){. 
145c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
145d0 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20   branch runs if 
145e0 69 74 20 69 73 20 6b 6e 6f 77 6e 20 61 74 20 63  it is known at c
145f0 6f 6d 70 69 6c 65 20 74 69 6d 65 20 28 6e 6f 77  ompile time (now
14600 29 20 74 68 61 74 20 0a 20 20 20 20 20 20 20 20  ) that .        
14610 20 20 2a 2a 20 74 68 65 20 73 65 74 20 63 6f 6e    ** the set con
14620 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 20 76 61  tains no NULL va
14630 6c 75 65 73 2e 20 54 68 69 73 20 68 61 70 70 65  lues. This happe
14640 6e 73 20 61 73 20 74 68 65 20 72 65 73 75 6c 74  ns as the result
14650 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  .          ** of
14660 20 61 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f   a "NOT NULL" co
14670 6e 73 74 72 61 69 6e 74 20 69 6e 20 74 68 65 20  nstraint in the 
14680 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
14690 20 4e 6f 20 6e 65 65 64 0a 20 20 20 20 20 20 20   No need.       
146a0 20 20 20 2a 2a 20 74 6f 20 74 65 73 74 20 74 68     ** to test th
146b0 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
146c0 20 61 74 20 72 75 6e 74 69 6d 65 20 69 6e 20 74   at runtime in t
146d0 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20  his case..      
146e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
146f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14700 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
14710 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
14720 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14730 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
14740 6c 6f 63 6b 20 70 6f 70 75 6c 61 74 65 73 20 74  lock populates t
14750 68 65 20 72 4e 6f 74 46 6f 75 6e 64 20 72 65 67  he rNotFound reg
14760 69 73 74 65 72 20 77 69 74 68 20 65 69 74 68 65  ister with eithe
14770 72 20 4e 55 4c 4c 0a 20 20 20 20 20 20 20 20 20  r NULL.         
14780 20 2a 2a 20 6f 72 20 30 20 28 61 6e 20 69 6e 74   ** or 0 (an int
14790 65 67 65 72 20 76 61 6c 75 65 29 2e 20 49 66 20  eger value). If 
147a0 74 68 65 20 64 61 74 61 20 73 74 72 75 63 74 75  the data structu
147b0 72 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 0a  re contains one.
147c0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20            ** or 
147d0 6d 6f 72 65 20 4e 55 4c 4c 73 2c 20 74 68 65 6e  more NULLs, then
147e0 20 73 65 74 20 72 4e 6f 74 46 6f 75 6e 64 20 74   set rNotFound t
147f0 6f 20 4e 55 4c 4c 2e 20 4f 74 68 65 72 77 69 73  o NULL. Otherwis
14800 65 2c 20 73 65 74 20 69 74 0a 20 20 20 20 20 20  e, set it.      
14810 20 20 20 20 2a 2a 20 74 6f 20 30 2e 20 49 66 20      ** to 0. If 
14820 72 65 67 69 73 74 65 72 20 72 4d 61 79 48 61 76  register rMayHav
14830 65 4e 75 6c 6c 20 69 73 20 61 6c 72 65 61 64 79  eNull is already
14840 20 73 65 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c   set to some val
14850 75 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ue.          ** 
14860 6f 74 68 65 72 20 74 68 61 6e 20 4e 55 4c 4c 2c  other than NULL,
14870 20 74 68 65 6e 20 74 68 65 20 74 65 73 74 20 68   then the test h
14880 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
14890 72 75 6e 20 61 6e 64 20 0a 20 20 20 20 20 20 20  run and .       
148a0 20 20 20 2a 2a 20 72 4e 6f 74 46 6f 75 6e 64 20     ** rNotFound 
148b0 69 73 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c  is already popul
148c0 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20  ated..          
148d0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  */.          sta
148e0 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6e  tic const char n
148f0 75 6c 6c 52 65 63 6f 72 64 5b 5d 20 3d 20 7b 20  ullRecord[] = { 
14900 30 78 30 32 2c 20 30 78 30 30 20 7d 3b 0a 20 20  0x02, 0x00 };.  
14910 20 20 20 20 20 20 20 20 6a 33 20 3d 20 73 71 6c          j3 = sql
14920 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
14930 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 4d  , OP_NotNull, rM
14940 61 79 48 61 76 65 4e 75 6c 6c 29 3b 0a 20 20 20  ayHaveNull);.   
14950 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
14960 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
14970 75 6c 6c 2c 20 30 2c 20 72 4e 6f 74 46 6f 75 6e  ull, 0, rNotFoun
14980 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  d);.          sq
14990 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
149a0 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 32 2c 20 72  v, OP_Blob, 2, r
149b0 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20 30 2c 20  MayHaveNull, 0, 
149c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
149d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75                nu
149e0 6c 6c 52 65 63 6f 72 64 2c 20 50 34 5f 53 54 41  llRecord, P4_STA
149f0 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20  TIC);.          
14a00 6a 34 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j4 = sqlite3Vdbe
14a10 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 46 6f 75  AddOp3(v, OP_Fou
14a20 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nd, pExpr->iTabl
14a30 65 2c 20 30 2c 20 72 4d 61 79 48 61 76 65 4e 75  e, 0, rMayHaveNu
14a40 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ll);.          s
14a50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14a60 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
14a70 30 2c 20 72 4e 6f 74 46 6f 75 6e 64 29 3b 0a 20  0, rNotFound);. 
14a80 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14a90 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
14aa0 6a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  j4);.          s
14ab0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
14ac0 72 65 28 76 2c 20 6a 33 29 3b 0a 0a 20 20 20 20  re(v, j3);..    
14ad0 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68        /* Copy th
14ae0 65 20 76 61 6c 75 65 20 6f 66 20 72 65 67 69 73  e value of regis
14af0 74 65 72 20 72 4e 6f 74 46 6f 75 6e 64 20 28 77  ter rNotFound (w
14b00 68 69 63 68 20 69 73 20 65 69 74 68 65 72 20 4e  hich is either N
14b10 55 4c 4c 20 6f 72 20 30 29 0a 20 20 20 20 20 20  ULL or 0).      
14b20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20      ** into the 
14b30 74 61 72 67 65 74 20 72 65 67 69 73 74 65 72 2e  target register.
14b40 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68   This will be th
14b50 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a  e result of the.
14b60 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70            ** exp
14b70 72 65 73 73 69 6f 6e 2e 0a 20 20 20 20 20 20 20  ression..       
14b80 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
14b90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14ba0 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 4e  2(v, OP_Copy, rN
14bb0 6f 74 46 6f 75 6e 64 2c 20 74 61 72 67 65 74 29  otFound, target)
14bc0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14bd0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
14be0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
14bf0 20 6a 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   j2);.      sqli
14c00 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
14c10 76 2c 20 6a 35 29 3b 0a 20 20 20 20 20 20 73 71  v, j5);.      sq
14c20 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
14c30 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20  p(pParse, 1);.  
14c40 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
14c50 28 76 2c 20 22 65 6e 64 20 49 4e 20 65 78 70 72  (v, "end IN expr
14c60 20 72 25 64 22 2c 20 74 61 72 67 65 74 29 29 3b   r%d", target));
14c70 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14c80 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f    }.#endif.    /
14c90 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45  *.    **    x BE
14ca0 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20  TWEEN y AND z.  
14cb0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
14cc0 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
14cd0 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  o.    **.    ** 
14ce0 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a     x>=y AND x<=z
14cf0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58  .    **.    ** X
14d00 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45   is stored in pE
14d10 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20  xpr->pLeft..    
14d20 2a 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20 69  ** Y is stored i
14d30 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  n pExpr->pList->
14d40 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20  a[0].pExpr..    
14d50 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69  ** Z is stored i
14d60 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  n pExpr->pList->
14d70 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20  a[1].pExpr..    
14d80 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  */.    case TK_B
14d90 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
14da0 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
14db0 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
14dc0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
14dd0 74 5f 69 74 65 6d 20 2a 70 4c 49 74 65 6d 20 3d  t_item *pLItem =
14de0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
14df0 3e 61 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  >a;.      Expr *
14e00 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d  pRight = pLItem-
14e10 3e 70 45 78 70 72 3b 0a 0a 20 20 20 20 20 20 63  >pExpr;..      c
14e20 6f 64 65 43 6f 6d 70 61 72 65 4f 70 65 72 61 6e  odeCompareOperan
14e30 64 73 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  ds(pParse, pLeft
14e40 2c 20 26 72 31 2c 20 26 72 65 67 46 72 65 65 31  , &r1, &regFree1
14e50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e70 20 20 20 20 70 52 69 67 68 74 2c 20 26 72 32 2c      pRight, &r2,
14e80 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
14e90 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
14ea0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
14eb0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
14ec0 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
14ed0 20 72 33 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r3 = sqlite3Get
14ee0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
14ef0 0a 20 20 20 20 20 20 72 34 20 3d 20 73 71 6c 69  .      r4 = sqli
14f00 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
14f10 61 72 73 65 29 3b 0a 20 20 20 20 20 20 63 6f 64  arse);.      cod
14f20 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
14f30 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
14f40 4f 50 5f 47 65 2c 0a 20 20 20 20 20 20 20 20 20  OP_Ge,.         
14f50 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
14f60 20 72 33 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52   r3, SQLITE_STOR
14f70 45 50 32 29 3b 0a 20 20 20 20 20 20 70 4c 49 74  EP2);.      pLIt
14f80 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 52 69 67  em++;.      pRig
14f90 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78  ht = pLItem->pEx
14fa0 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
14fb0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
14fc0 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32  pParse, regFree2
14fd0 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
14fe0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
14ff0 70 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  p(pParse, pRight
15000 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
15010 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
15020 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
15030 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
15040 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52  Parse, pLeft, pR
15050 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 72 31 2c  ight, OP_Le, r1,
15060 20 72 32 2c 20 72 34 2c 20 53 51 4c 49 54 45 5f   r2, r4, SQLITE_
15070 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20  STOREP2);.      
15080 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15090 33 28 76 2c 20 4f 50 5f 41 6e 64 2c 20 72 33 2c  3(v, OP_And, r3,
150a0 20 72 34 2c 20 74 61 72 67 65 74 29 3b 0a 20 20   r4, target);.  
150b0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
150c0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
150d0 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r3);.      sql
150e0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
150f0 65 67 28 70 50 61 72 73 65 2c 20 72 34 29 3b 0a  eg(pParse, r4);.
15100 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15110 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
15120 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e  PLUS: {.      in
15130 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
15140 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
15150 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
15160 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
15170 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
15180 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     /*.    ** For
15190 6d 20 41 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41  m A:.    **   CA
151a0 53 45 20 78 20 57 48 45 4e 20 65 31 20 54 48 45  SE x WHEN e1 THE
151b0 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48 45  N r1 WHEN e2 THE
151c0 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e  N r2 ... WHEN eN
151d0 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20   THEN rN ELSE y 
151e0 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  END.    **.    *
151f0 2a 20 46 6f 72 6d 20 42 3a 0a 20 20 20 20 2a 2a  * Form B:.    **
15200 20 20 20 43 41 53 45 20 57 48 45 4e 20 65 31 20     CASE WHEN e1 
15210 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20  THEN r1 WHEN e2 
15220 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e  THEN r2 ... WHEN
15230 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45   eN THEN rN ELSE
15240 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20   y END.    **.  
15250 20 20 2a 2a 20 46 6f 72 6d 20 41 20 69 73 20 63    ** Form A is c
15260 61 6e 20 62 65 20 74 72 61 6e 73 66 6f 72 6d 65  an be transforme
15270 64 20 69 6e 74 6f 20 74 68 65 20 65 71 75 69 76  d into the equiv
15280 61 6c 65 6e 74 20 66 6f 72 6d 20 42 20 61 73 20  alent form B as 
15290 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 20  follows:.    ** 
152a0 20 20 43 41 53 45 20 57 48 45 4e 20 78 3d 65 31    CASE WHEN x=e1
152b0 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 78 3d   THEN r1 WHEN x=
152c0 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 0a 20  e2 THEN r2 .... 
152d0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 57 48 45     **        WHE
152e0 4e 20 78 3d 65 4e 20 54 48 45 4e 20 72 4e 20 45  N x=eN THEN rN E
152f0 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a  LSE y END.    **
15300 0a 20 20 20 20 2a 2a 20 58 20 28 69 66 20 69 74  .    ** X (if it
15310 20 65 78 69 73 74 73 29 20 69 73 20 69 6e 20 70   exists) is in p
15320 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20  Expr->pLeft..   
15330 20 2a 2a 20 59 20 69 73 20 69 6e 20 70 45 78 70   ** Y is in pExp
15340 72 2d 3e 70 52 69 67 68 74 2e 20 20 54 68 65 20  r->pRight.  The 
15350 59 20 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f 6e  Y is also option
15360 61 6c 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  al.  If there is
15370 20 6e 6f 0a 20 20 20 20 2a 2a 20 45 4c 53 45 20   no.    ** ELSE 
15380 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 20 6f 74  clause and no ot
15390 68 65 72 20 74 65 72 6d 20 6d 61 74 63 68 65 73  her term matches
153a0 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
153b0 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  t of the.    ** 
153c0 65 78 70 72 73 73 69 6f 6e 20 69 73 20 4e 55 4c  exprssion is NUL
153d0 4c 2e 0a 20 20 20 20 2a 2a 20 45 69 20 69 73 20  L..    ** Ei is 
153e0 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  in pExpr->pList-
153f0 3e 61 5b 69 2a 32 5d 20 61 6e 64 20 52 69 20 69  >a[i*2] and Ri i
15400 73 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  s pExpr->pList->
15410 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a  a[i*2+1]..    **
15420 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73 75  .    ** The resu
15430 6c 74 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  lt of the expres
15440 73 69 6f 6e 20 69 73 20 74 68 65 20 52 69 20 66  sion is the Ri f
15450 6f 72 20 74 68 65 20 66 69 72 73 74 20 6d 61 74  or the first mat
15460 63 68 69 6e 67 20 45 69 2c 0a 20 20 20 20 2a 2a  ching Ei,.    **
15470 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 20   or if there is 
15480 6e 6f 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 20  no matching Ei, 
15490 74 68 65 20 45 4c 53 45 20 74 65 72 6d 20 59 2c  the ELSE term Y,
154a0 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 0a   or if there is.
154b0 20 20 20 20 2a 2a 20 6e 6f 20 45 4c 53 45 20 74      ** no ELSE t
154c0 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a  erm, NULL..    *
154d0 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61  /.    default: a
154e0 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 43 41  ssert( op==TK_CA
154f0 53 45 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e  SE ); {.      in
15500 74 20 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20  t endLabel;     
15510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15520 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f  /* GOTO label fo
15530 72 20 65 6e 64 20 6f 66 20 43 41 53 45 20 73 74  r end of CASE st
15540 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  mt */.      int 
15550 6e 65 78 74 43 61 73 65 3b 20 20 20 20 20 20 20  nextCase;       
15560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15570 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20   GOTO label for 
15580 6e 65 78 74 20 57 48 45 4e 20 63 6c 61 75 73 65  next WHEN clause
15590 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 45   */.      int nE
155a0 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  xpr;            
155b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32              /* 2
155c0 78 20 6e 75 6d 62 65 72 20 6f 66 20 57 48 45 4e  x number of WHEN
155d0 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20   terms */.      
155e0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
155f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15600 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
15610 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c  r */.      ExprL
15620 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20  ist *pEList;    
15630 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15640 4c 69 73 74 20 6f 66 20 57 48 45 4e 20 74 65 72  List of WHEN ter
15650 6d 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75  ms */.      stru
15660 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
15670 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a   *aListelem;  /*
15680 20 41 72 72 61 79 20 6f 66 20 57 48 45 4e 20 74   Array of WHEN t
15690 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45 78  erms */.      Ex
156a0 70 72 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20  pr opCompare;   
156b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156c0 2f 2a 20 54 68 65 20 58 3d 3d 45 69 20 65 78 70  /* The X==Ei exp
156d0 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ression */.     
156e0 20 45 78 70 72 20 63 61 63 68 65 58 3b 20 20 20   Expr cacheX;   
156f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15700 20 20 20 2f 2a 20 43 61 63 68 65 64 20 65 78 70     /* Cached exp
15710 72 65 73 73 69 6f 6e 20 58 20 2a 2f 0a 20 20 20  ression X */.   
15720 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20     Expr *pX;    
15730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15740 20 20 20 20 20 2f 2a 20 54 68 65 20 58 20 65 78       /* The X ex
15750 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
15760 20 20 45 78 70 72 20 2a 70 54 65 73 74 20 3d 20    Expr *pTest = 
15770 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
15780 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28 66 6f      /* X==Ei (fo
15790 72 6d 20 41 29 20 6f 72 20 6a 75 73 74 20 45 69  rm A) or just Ei
157a0 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 20 20 20   (form B) */.   
157b0 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74     VVA_ONLY( int
157c0 20 69 43 61 63 68 65 4c 65 76 65 6c 20 3d 20 70   iCacheLevel = p
157d0 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
157e0 65 6c 3b 20 29 0a 0a 20 20 20 20 20 20 61 73 73  el; )..      ass
157f0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
15800 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
15810 78 49 73 53 65 6c 65 63 74 29 20 26 26 20 70 45  xIsSelect) && pE
15820 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29 3b 0a  xpr->x.pList );.
15830 20 20 20 20 20 20 61 73 73 65 72 74 28 28 70 45        assert((pE
15840 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
15850 78 70 72 20 25 20 32 29 20 3d 3d 20 30 29 3b 0a  xpr % 2) == 0);.
15860 20 20 20 20 20 20 61 73 73 65 72 74 28 70 45 78        assert(pEx
15870 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
15880 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70  pr > 0);.      p
15890 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  EList = pExpr->x
158a0 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 4c  .pList;.      aL
158b0 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74  istelem = pEList
158c0 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78 70 72  ->a;.      nExpr
158d0 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
158e0 3b 0a 20 20 20 20 20 20 65 6e 64 4c 61 62 65 6c  ;.      endLabel
158f0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
15900 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
15910 20 20 69 66 28 20 28 70 58 20 3d 20 70 45 78 70    if( (pX = pExp
15920 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a  r->pLeft)!=0 ){.
15930 20 20 20 20 20 20 20 20 63 61 63 68 65 58 20 3d          cacheX =
15940 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 74 65   *pX;.        te
15950 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d  stcase( pX->op==
15960 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
15970 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
15980 58 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  X->op==TK_REGIST
15990 45 52 20 29 3b 0a 20 20 20 20 20 20 20 20 63 61  ER );.        ca
159a0 63 68 65 58 2e 69 54 61 62 6c 65 20 3d 20 73 71  cheX.iTable = sq
159b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
159c0 70 28 70 50 61 72 73 65 2c 20 70 58 2c 20 26 72  p(pParse, pX, &r
159d0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
159e0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
159f0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
15a00 20 20 20 63 61 63 68 65 58 2e 6f 70 20 3d 20 54     cacheX.op = T
15a10 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 20 20  K_REGISTER;.    
15a20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70      opCompare.op
15a30 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20   = TK_EQ;.      
15a40 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66    opCompare.pLef
15a50 74 20 3d 20 26 63 61 63 68 65 58 3b 0a 20 20 20  t = &cacheX;.   
15a60 20 20 20 20 20 70 54 65 73 74 20 3d 20 26 6f 70       pTest = &op
15a70 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20 20 7d  Compare;.      }
15a80 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
15a90 69 3c 6e 45 78 70 72 3b 20 69 3d 69 2b 32 29 7b  i<nExpr; i=i+2){
15aa0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15ab0 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
15ac0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69  arse);.        i
15ad0 66 28 20 70 58 20 29 7b 0a 20 20 20 20 20 20 20  f( pX ){.       
15ae0 20 20 20 61 73 73 65 72 74 28 20 70 54 65 73 74     assert( pTest
15af0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
15b00 20 6f 70 43 6f 6d 70 61 72 65 2e 70 52 69 67 68   opCompare.pRigh
15b10 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d  t = aListelem[i]
15b20 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
15b30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
15b40 20 70 54 65 73 74 20 3d 20 61 4c 69 73 74 65 6c   pTest = aListel
15b50 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  em[i].pExpr;.   
15b60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e       }.        n
15b70 65 78 74 43 61 73 65 20 3d 20 73 71 6c 69 74 65  extCase = sqlite
15b80 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
15b90 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
15ba0 61 73 65 28 20 70 54 65 73 74 2d 3e 6f 70 3d 3d  ase( pTest->op==
15bb0 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
15bc0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
15bd0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
15be0 70 54 65 73 74 2c 20 6e 65 78 74 43 61 73 65 2c  pTest, nextCase,
15bf0 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
15c00 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  LL);.        tes
15c10 74 63 61 73 65 28 20 61 4c 69 73 74 65 6c 65 6d  tcase( aListelem
15c20 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d  [i+1].pExpr->op=
15c30 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
15c40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15c50 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70  aListelem[i+1].p
15c60 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47  Expr->op==TK_REG
15c70 49 53 54 45 52 20 29 3b 0a 20 20 20 20 20 20 20  ISTER );.       
15c80 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
15c90 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c  (pParse, aListel
15ca0 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74  em[i+1].pExpr, t
15cb0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
15cc0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15cd0 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
15ce0 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20   endLabel);.    
15cf0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
15d00 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20  achePop(pParse, 
15d10 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
15d20 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
15d30 62 65 6c 28 76 2c 20 6e 65 78 74 43 61 73 65 29  bel(v, nextCase)
15d40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15d50 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  if( pExpr->pRigh
15d60 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
15d70 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
15d80 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
15d90 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
15da0 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
15db0 2d 3e 70 52 69 67 68 74 2c 20 74 61 72 67 65 74  ->pRight, target
15dc0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
15dd0 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
15de0 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 20  Parse, 1);.     
15df0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15e00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15e10 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
15e20 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
15e30 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
15e40 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
15e50 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
15e60 3e 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  >0 .           |
15e70 7c 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  | pParse->iCache
15e80 4c 65 76 65 6c 3d 3d 69 43 61 63 68 65 4c 65 76  Level==iCacheLev
15e90 65 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  el );.      sqli
15ea0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
15eb0 62 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29  bel(v, endLabel)
15ec0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
15ed0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
15ee0 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
15ef0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49  .    case TK_RAI
15f00 53 45 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  SE: {.      if( 
15f10 21 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61  !pParse->trigSta
15f20 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ck ){.        sq
15f30 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
15f40 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
15f50 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52 41               "RA
15f60 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62  ISE() may only b
15f70 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20  e used within a 
15f80 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22  trigger-program"
15f90 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
15fa0 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
15fb0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66     if( pExpr->af
15fc0 66 69 6e 69 74 79 21 3d 4f 45 5f 49 67 6e 6f 72  finity!=OE_Ignor
15fd0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 61 73  e ){.         as
15fe0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 61 66 66  sert( pExpr->aff
15ff0 69 6e 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61  inity==OE_Rollba
16000 63 6b 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  ck ||.          
16010 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66         pExpr->af
16020 66 69 6e 69 74 79 20 3d 3d 20 4f 45 5f 41 62 6f  finity == OE_Abo
16030 72 74 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  rt ||.          
16040 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66         pExpr->af
16050 66 69 6e 69 74 79 20 3d 3d 20 4f 45 5f 46 61 69  finity == OE_Fai
16060 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 61 73  l );.         as
16070 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
16080 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
16090 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
160a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
160b0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 48  beAddOp4(v, OP_H
160c0 61 6c 74 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53  alt, SQLITE_CONS
160d0 54 52 41 49 4e 54 2c 20 70 45 78 70 72 2d 3e 61  TRAINT, pExpr->a
160e0 66 66 69 6e 69 74 79 2c 20 30 2c 0a 20 20 20 20  ffinity, 0,.    
160f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16100 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 75 2e         pExpr->u.
16110 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 20 20  zToken, 0);.    
16120 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
16130 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
16140 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 3d 20 4f  r->affinity == O
16150 45 5f 49 67 6e 6f 72 65 20 29 3b 0a 20 20 20 20  E_Ignore );.    
16160 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16170 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 6e  AddOp2(v, OP_Con
16180 74 65 78 74 50 6f 70 2c 20 30 2c 20 30 29 3b 0a  textPop, 0, 0);.
16190 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
161a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
161b0 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73 65  _Goto, 0, pParse
161c0 2d 3e 74 72 69 67 53 74 61 63 6b 2d 3e 69 67 6e  ->trigStack->ign
161d0 6f 72 65 4a 75 6d 70 29 3b 0a 20 20 20 20 20 20  oreJump);.      
161e0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
161f0 76 2c 20 22 72 61 69 73 65 28 49 47 4e 4f 52 45  v, "raise(IGNORE
16200 29 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  )"));.      }.  
16210 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
16220 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71  .#endif.  }.  sq
16230 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
16240 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
16250 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ree1);.  sqlite3
16260 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
16270 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
16280 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67  ;.  return inReg
16290 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
162a0 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c  ate code to eval
162b0 75 61 74 65 20 61 6e 20 65 78 70 72 65 73 73 69  uate an expressi
162c0 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  on and store the
162d0 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f   results.** into
162e0 20 61 20 72 65 67 69 73 74 65 72 2e 20 20 52 65   a register.  Re
162f0 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65  turn the registe
16300 72 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 74  r number where t
16310 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 61 72  he results.** ar
16320 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  e stored..**.** 
16330 49 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20  If the register 
16340 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72  is a temporary r
16350 65 67 69 73 74 65 72 20 74 68 61 74 20 63 61 6e  egister that can
16360 20 62 65 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c   be deallocated,
16370 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 69  .** then write i
16380 74 73 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a  ts number into *
16390 70 52 65 67 2e 20 20 49 66 20 74 68 65 20 72 65  pReg.  If the re
163a0 73 75 6c 74 20 72 65 67 69 73 74 65 72 20 69 73  sult register is
163b0 20 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d 70 6f 72   not.** a tempor
163c0 61 72 79 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  ary, then set *p
163d0 52 65 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a  Reg to zero..*/.
163e0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
163f0 6f 64 65 54 65 6d 70 28 50 61 72 73 65 20 2a 70  odeTemp(Parse *p
16400 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
16410 70 72 2c 20 69 6e 74 20 2a 70 52 65 67 29 7b 0a  pr, int *pReg){.
16420 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
16430 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
16440 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 32 20 3d  rse);.  int r2 =
16450 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
16460 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
16470 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 69 66 28  Expr, r1);.  if(
16480 20 72 32 3d 3d 72 31 20 29 7b 0a 20 20 20 20 2a   r2==r1 ){.    *
16490 70 52 65 67 20 3d 20 72 31 3b 0a 20 20 7d 65 6c  pReg = r1;.  }el
164a0 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  se{.    sqlite3R
164b0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
164c0 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 2a  arse, r1);.    *
164d0 70 52 65 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  pReg = 0;.  }.  
164e0 72 65 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a  return r2;.}../*
164f0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
16500 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c  e that will eval
16510 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20  uate expression 
16520 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20  pExpr and store 
16530 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69  the.** results i
16540 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
16550 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73 20  t.  The results 
16560 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74  are guaranteed t
16570 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72  o appear.** in r
16580 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a  egister target..
16590 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
165a0 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70 50  prCode(Parse *pP
165b0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
165c0 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
165d0 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a 20 20    int inReg;..  
165e0 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30  assert( target>0
165f0 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72   && target<=pPar
16600 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 6e  se->nMem );.  in
16610 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
16620 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
16630 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
16640 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  t);.  assert( pP
16650 61 72 73 65 2d 3e 70 56 64 62 65 20 7c 7c 20 70  arse->pVdbe || p
16660 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
16670 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
16680 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20 26   inReg!=target &
16690 26 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20  & pParse->pVdbe 
166a0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
166b0 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d  beAddOp2(pParse-
166c0 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79  >pVdbe, OP_SCopy
166d0 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29  , inReg, target)
166e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 74  ;.  }.  return t
166f0 61 72 67 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  arget;.}../*.** 
16700 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
16710 61 74 20 65 76 61 6c 75 74 65 73 20 74 68 65 20  at evalutes the 
16720 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
16730 20 61 6e 64 20 70 75 74 73 20 74 68 65 20 72 65   and puts the re
16740 73 75 6c 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73  sult.** in regis
16750 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a  ter target..**.*
16760 2a 20 41 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f  * Also make a co
16770 70 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  py of the expres
16780 73 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 74  sion results int
16790 6f 20 61 6e 6f 74 68 65 72 20 22 63 61 63 68 65  o another "cache
167a0 22 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e  " register.** an
167b0 64 20 6d 6f 64 69 66 79 20 74 68 65 20 65 78 70  d modify the exp
167c0 72 65 73 73 69 6f 6e 20 73 6f 20 74 68 61 74 20  ression so that 
167d0 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 69 74  the next time it
167e0 20 69 73 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a   is evaluated,.*
167f0 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  * the result is 
16800 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61  a copy of the ca
16810 63 68 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a  che register..**
16820 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
16830 20 69 73 20 75 73 65 64 20 66 6f 72 20 65 78 70   is used for exp
16840 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72  ressions that ar
16850 65 20 75 73 65 64 20 6d 75 6c 74 69 70 6c 65 20  e used multiple 
16860 0a 2a 2a 20 74 69 6d 65 73 2e 20 20 54 68 65 79  .** times.  They
16870 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 6f   are evaluated o
16880 6e 63 65 20 61 6e 64 20 74 68 65 20 72 65 73 75  nce and the resu
16890 6c 74 73 20 6f 66 20 74 68 65 20 65 78 70 72 65  lts of the expre
168a0 73 73 69 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75  ssion.** are reu
168b0 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  sed..*/.int sqli
168c0 74 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43 61  te3ExprCodeAndCa
168d0 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  che(Parse *pPars
168e0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
168f0 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56  int target){.  V
16900 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
16910 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 6e  >pVdbe;.  int in
16920 52 65 67 3b 0a 20 20 69 6e 52 65 67 20 3d 20 73  Reg;.  inReg = s
16930 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
16940 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
16950 72 67 65 74 29 3b 0a 20 20 61 73 73 65 72 74 28  rget);.  assert(
16960 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 2f   target>0 );.  /
16970 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
16980 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 65 72  s called for ter
16990 6d 73 20 74 6f 20 49 4e 53 45 52 54 20 6f 72 20  ms to INSERT or 
169a0 55 50 44 41 54 45 2e 20 20 41 6e 64 20 74 68 65  UPDATE.  And the
169b0 20 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68 65 72   only.  ** other
169c0 20 70 6c 61 63 65 20 77 68 65 72 65 20 65 78 70   place where exp
169d0 72 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20  ressions can be 
169e0 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 54  converted into T
169f0 4b 5f 52 45 47 49 53 54 45 52 20 69 73 0a 20 20  K_REGISTER is.  
16a00 2a 2a 20 69 6e 20 57 48 45 52 45 20 63 6c 61 75  ** in WHERE clau
16a10 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20  se processing.  
16a20 53 6f 20 61 73 20 63 75 72 72 65 6e 74 6c 79 20  So as currently 
16a30 69 6d 70 6c 65 6d 65 6e 74 65 64 2c 20 74 68 65  implemented, the
16a40 72 65 20 69 73 0a 20 20 2a 2a 20 6e 6f 20 77 61  re is.  ** no wa
16a50 79 20 66 6f 72 20 61 20 54 4b 5f 52 45 47 49 53  y for a TK_REGIS
16a60 54 45 52 20 74 6f 20 65 78 69 73 74 20 68 65 72  TER to exist her
16a70 65 2e 20 20 42 75 74 20 69 74 20 73 65 65 6d 73  e.  But it seems
16a80 20 70 72 75 64 65 6e 74 20 74 6f 0a 20 20 2a 2a   prudent to.  **
16a90 20 6b 65 65 70 20 74 68 65 20 41 4c 57 41 59 53   keep the ALWAYS
16aa0 28 29 20 69 6e 20 63 61 73 65 20 74 68 65 20 63  () in case the c
16ab0 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20  onditions above 
16ac0 63 68 61 6e 67 65 20 77 69 74 68 20 66 75 74 75  change with futu
16ad0 72 65 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61  re.  ** modifica
16ae0 74 69 6f 6e 73 20 6f 72 20 65 6e 68 61 6e 63 65  tions or enhance
16af0 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 28 20  ments. */.  if( 
16b00 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 6f 70  ALWAYS(pExpr->op
16b10 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 29 20 29  !=TK_REGISTER) )
16b20 7b 20 20 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d  {  .    int iMem
16b30 3b 0a 20 20 20 20 69 4d 65 6d 20 3d 20 2b 2b 70  ;.    iMem = ++p
16b40 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
16b50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16b60 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 69  p2(v, OP_Copy, i
16b70 6e 52 65 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20  nReg, iMem);.   
16b80 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
16b90 20 69 4d 65 6d 3b 0a 20 20 20 20 70 45 78 70 72   iMem;.    pExpr
16ba0 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54  ->op = TK_REGIST
16bb0 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ER;.  }.  return
16bc0 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   inReg;.}../*.**
16bd0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
16be0 70 45 78 70 72 20 69 73 20 61 6e 20 63 6f 6e 73  pExpr is an cons
16bf0 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20  tant expression 
16c00 74 68 61 74 20 69 73 20 61 70 70 72 6f 70 72 69  that is appropri
16c10 61 74 65 0a 2a 2a 20 66 6f 72 20 66 61 63 74 6f  ate.** for facto
16c20 72 69 6e 67 20 6f 75 74 20 6f 66 20 61 20 6c 6f  ring out of a lo
16c30 6f 70 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65  op.  Appropriate
16c40 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
16c50 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 41 6e  :.**.**    *  An
16c60 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  y expression tha
16c70 74 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 74  t evaluates to t
16c80 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 70 63 6f 64  wo or more opcod
16c90 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20  es..**.**    *  
16ca0 41 6e 79 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  Any OP_Integer, 
16cb0 4f 50 5f 52 65 61 6c 2c 20 4f 50 5f 53 74 72 69  OP_Real, OP_Stri
16cc0 6e 67 2c 20 4f 50 5f 42 6c 6f 62 2c 20 4f 50 5f  ng, OP_Blob, OP_
16cd0 4e 75 6c 6c 2c 20 0a 2a 2a 20 20 20 20 20 20 20  Null, .**       
16ce0 6f 72 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 74  or OP_Variable t
16cf0 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  hat does not nee
16d00 64 20 74 6f 20 62 65 20 70 6c 61 63 65 64 20 69  d to be placed i
16d10 6e 20 61 20 0a 2a 2a 20 20 20 20 20 20 20 73 70  n a .**       sp
16d20 65 63 69 66 69 63 20 72 65 67 69 73 74 65 72 2e  ecific register.
16d30 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
16d40 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 66 61 63 74  no point in fact
16d50 6f 72 69 6e 67 20 6f 75 74 20 73 69 6e 67 6c 65  oring out single
16d60 2d 69 6e 73 74 72 75 63 74 69 6f 6e 20 63 6f 6e  -instruction con
16d70 73 74 61 6e 74 0a 2a 2a 20 65 78 70 72 65 73 73  stant.** express
16d80 69 6f 6e 73 20 74 68 61 74 20 6e 65 65 64 20 74  ions that need t
16d90 6f 20 62 65 20 70 6c 61 63 65 64 20 69 6e 20 61  o be placed in a
16da0 20 70 61 72 74 69 63 75 6c 61 72 20 72 65 67 69   particular regi
16db0 73 74 65 72 2e 20 20 0a 2a 2a 20 57 65 20 63 6f  ster.  .** We co
16dc0 75 6c 64 20 66 61 63 74 6f 72 20 74 68 65 6d 20  uld factor them 
16dd0 6f 75 74 2c 20 62 75 74 20 74 68 65 6e 20 77 65  out, but then we
16de0 20 77 6f 75 6c 64 20 65 6e 64 20 75 70 20 61 64   would end up ad
16df0 64 69 6e 67 20 61 6e 0a 2a 2a 20 4f 50 5f 53 43  ding an.** OP_SC
16e00 6f 70 79 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  opy instruction 
16e10 74 6f 20 6d 6f 76 65 20 74 68 65 20 76 61 6c 75  to move the valu
16e20 65 20 69 6e 74 6f 20 74 68 65 20 63 6f 72 72 65  e into the corre
16e30 63 74 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 6c  ct register.** l
16e40 61 74 65 72 2e 20 20 57 65 20 6d 69 67 68 74 20  ater.  We might 
16e50 61 73 20 77 65 6c 6c 20 6a 75 73 74 20 75 73 65  as well just use
16e60 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 69 6e   the original in
16e70 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a  struction and.**
16e80 20 61 76 6f 69 64 20 74 68 65 20 4f 50 5f 53 43   avoid the OP_SC
16e90 6f 70 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  opy..*/.static i
16ea0 6e 74 20 69 73 41 70 70 72 6f 70 72 69 61 74 65  nt isAppropriate
16eb0 46 6f 72 46 61 63 74 6f 72 69 6e 67 28 45 78 70  ForFactoring(Exp
16ec0 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 21 73 71  r *p){.  if( !sq
16ed0 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
16ee0 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 29 20 29 7b  antNotJoin(p) ){
16ef0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
16f00 2f 2a 20 4f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74  /* Only constant
16f10 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
16f20 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
16f30 20 66 61 63 74 6f 72 69 6e 67 20 2a 2f 0a 20 20   factoring */.  
16f40 7d 0a 20 20 69 66 28 20 28 70 2d 3e 66 6c 61 67  }.  if( (p->flag
16f50 73 20 26 20 45 50 5f 46 69 78 65 64 44 65 73 74  s & EP_FixedDest
16f60 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
16f70 72 6e 20 31 3b 20 20 2f 2a 20 41 6e 79 20 63 6f  rn 1;  /* Any co
16f80 6e 73 74 61 6e 74 20 77 69 74 68 6f 75 74 20 61  nstant without a
16f90 20 66 69 78 65 64 20 64 65 73 74 69 6e 61 74 69   fixed destinati
16fa0 6f 6e 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  on is appropriat
16fb0 65 20 2a 2f 0a 20 20 7d 0a 20 20 77 68 69 6c 65  e */.  }.  while
16fc0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55  ( p->op==TK_UPLU
16fd0 53 20 29 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74  S ) p = p->pLeft
16fe0 3b 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f  ;.  switch( p->o
16ff0 70 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  p ){.#ifndef SQL
17000 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49  ITE_OMIT_BLOB_LI
17010 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54  TERAL.    case T
17020 4b 5f 42 4c 4f 42 3a 0a 23 65 6e 64 69 66 0a 20  K_BLOB:.#endif. 
17030 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41     case TK_VARIA
17040 42 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  BLE:.    case TK
17050 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61  _INTEGER:.    ca
17060 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20  se TK_FLOAT:.   
17070 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20   case TK_NULL:. 
17080 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
17090 47 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  G: {.      testc
170a0 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 42  ase( p->op==TK_B
170b0 4c 4f 42 20 29 3b 0a 20 20 20 20 20 20 74 65 73  LOB );.      tes
170c0 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  tcase( p->op==TK
170d0 5f 56 41 52 49 41 42 4c 45 20 29 3b 0a 20 20 20  _VARIABLE );.   
170e0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
170f0 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29  op==TK_INTEGER )
17100 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
17110 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41  ( p->op==TK_FLOA
17120 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
17130 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 4e  ase( p->op==TK_N
17140 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ULL );.      tes
17150 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  tcase( p->op==TK
17160 5f 53 54 52 49 4e 47 20 29 3b 0a 20 20 20 20 20  _STRING );.     
17170 20 2f 2a 20 53 69 6e 67 6c 65 2d 69 6e 73 74 72   /* Single-instr
17180 75 63 74 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 73  uction constants
17190 20 77 69 74 68 20 61 20 66 69 78 65 64 20 64 65   with a fixed de
171a0 73 74 69 6e 61 74 69 6f 6e 20 61 72 65 0a 20 20  stination are.  
171b0 20 20 20 20 2a 2a 20 62 65 74 74 65 72 20 64 6f      ** better do
171c0 6e 65 20 69 6e 2d 6c 69 6e 65 2e 20 20 49 66 20  ne in-line.  If 
171d0 77 65 20 66 61 63 74 6f 72 20 74 68 65 6d 2c 20  we factor them, 
171e0 74 68 65 79 20 77 69 6c 6c 20 6a 75 73 74 20 65  they will just e
171f0 6e 64 0a 20 20 20 20 20 20 2a 2a 20 75 70 20 67  nd.      ** up g
17200 65 6e 65 72 61 74 69 6e 67 20 61 6e 20 4f 50 5f  enerating an OP_
17210 53 43 6f 70 79 20 74 6f 20 6d 6f 76 65 20 74 68  SCopy to move th
17220 65 20 76 61 6c 75 65 20 74 6f 20 74 68 65 20 64  e value to the d
17230 65 73 74 69 6e 61 74 69 6f 6e 0a 20 20 20 20 20  estination.     
17240 20 2a 2a 20 72 65 67 69 73 74 65 72 2e 20 2a 2f   ** register. */
17250 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
17260 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
17270 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
17280 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 2d     if( p->pLeft-
17290 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 7c 7c  >op==TK_FLOAT ||
172a0 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54   p->pLeft->op==T
172b0 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20  K_INTEGER ){.   
172c0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
172d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
172e0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
172f0 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 62  fault: {.      b
17300 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
17310 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
17320 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73  *.** If pExpr is
17330 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72   a constant expr
17340 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 61  ession that is a
17350 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 0a 2a  ppropriate for.*
17360 2a 20 66 61 63 74 6f 72 69 6e 67 20 6f 75 74 20  * factoring out 
17370 6f 66 20 61 20 6c 6f 6f 70 2c 20 74 68 65 6e 20  of a loop, then 
17380 65 76 61 6c 75 61 74 65 20 74 68 65 20 65 78 70  evaluate the exp
17390 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20  ression.** into 
173a0 61 20 72 65 67 69 73 74 65 72 20 61 6e 64 20 63  a register and c
173b0 6f 6e 76 65 72 74 20 74 68 65 20 65 78 70 72 65  onvert the expre
173c0 73 73 69 6f 6e 20 69 6e 74 6f 20 61 20 54 4b 5f  ssion into a TK_
173d0 52 45 47 49 53 54 45 52 0a 2a 2a 20 65 78 70 72  REGISTER.** expr
173e0 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ession..*/.stati
173f0 63 20 69 6e 74 20 65 76 61 6c 43 6f 6e 73 74 45  c int evalConstE
17400 78 70 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  xpr(Walker *pWal
17410 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
17420 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
17430 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
17440 61 72 73 65 3b 0a 20 20 73 77 69 74 63 68 28 20  arse;.  switch( 
17450 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
17460 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45   case TK_REGISTE
17470 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  R: {.      retur
17480 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20  n WRC_Prune;.   
17490 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46   }.    case TK_F
174a0 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73  UNCTION:.    cas
174b0 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  e TK_AGG_FUNCTIO
174c0 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  N:.    case TK_C
174d0 4f 4e 53 54 5f 46 55 4e 43 3a 20 7b 0a 20 20 20  ONST_FUNC: {.   
174e0 20 20 20 2f 2a 20 54 68 65 20 61 72 67 75 6d 65     /* The argume
174f0 6e 74 73 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  nts to a functio
17500 6e 20 68 61 76 65 20 61 20 66 69 78 65 64 20 64  n have a fixed d
17510 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 20 20 20 20  estination..    
17520 20 20 2a 2a 20 4d 61 72 6b 20 74 68 65 6d 20 74    ** Mark them t
17530 68 69 73 20 77 61 79 20 74 6f 20 61 76 6f 69 64  his way to avoid
17540 20 67 65 6e 65 72 61 74 65 64 20 75 6e 6e 65 65   generated unnee
17550 64 65 64 20 4f 50 5f 53 43 6f 70 79 0a 20 20 20  ded OP_SCopy.   
17560 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f     ** instructio
17570 6e 73 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ns. .      */.  
17580 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
17590 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
175a0 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65  List;.      asse
175b0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
175c0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
175d0 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
175e0 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a     if( pList ){.
175f0 20 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20          int i = 
17600 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
17610 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
17620 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
17630 6d 20 3d 20 70 4c 69 73 74 2d 3e 61 3b 0a 20 20  m = pList->a;.  
17640 20 20 20 20 20 20 66 6f 72 28 3b 20 69 3e 30 3b        for(; i>0;
17650 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i--, pItem++){.
17660 20 20 20 20 20 20 20 20 20 20 69 66 28 20 41 4c            if( AL
17670 57 41 59 53 28 70 49 74 65 6d 2d 3e 70 45 78 70  WAYS(pItem->pExp
17680 72 29 20 29 20 70 49 74 65 6d 2d 3e 70 45 78 70  r) ) pItem->pExp
17690 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 46  r->flags |= EP_F
176a0 69 78 65 64 44 65 73 74 3b 0a 20 20 20 20 20 20  ixedDest;.      
176b0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
176c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
176d0 20 7d 0a 20 20 69 66 28 20 69 73 41 70 70 72 6f   }.  if( isAppro
176e0 70 72 69 61 74 65 46 6f 72 46 61 63 74 6f 72 69  priateForFactori
176f0 6e 67 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  ng(pExpr) ){.   
17700 20 69 6e 74 20 72 31 20 3d 20 2b 2b 70 50 61 72   int r1 = ++pPar
17710 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e  se->nMem;.    in
17720 74 20 72 32 3b 0a 20 20 20 20 72 32 20 3d 20 73  t r2;.    r2 = s
17730 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
17740 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
17750 70 72 2c 20 72 31 29 3b 0a 20 20 20 20 69 66 28  pr, r1);.    if(
17760 20 4e 45 56 45 52 28 72 31 21 3d 72 32 29 20 29   NEVER(r1!=r2) )
17770 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
17780 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
17790 31 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f  1);.    pExpr->o
177a0 70 32 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  p2 = pExpr->op;.
177b0 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
177c0 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 20  TK_REGISTER;.   
177d0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
177e0 20 72 32 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   r2;.    return 
177f0 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20  WRC_Prune;.  }. 
17800 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
17810 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  inue;.}../*.** P
17820 72 65 65 76 61 6c 75 61 74 65 20 63 6f 6e 73 74  reevaluate const
17830 61 6e 74 20 73 75 62 65 78 70 72 65 73 73 69 6f  ant subexpressio
17840 6e 73 20 77 69 74 68 69 6e 20 70 45 78 70 72 20  ns within pExpr 
17850 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a  and store the.**
17860 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69   results in regi
17870 73 74 65 72 73 2e 20 20 4d 6f 64 69 66 79 20 70  sters.  Modify p
17880 45 78 70 72 20 73 6f 20 74 68 61 74 20 74 68 65  Expr so that the
17890 20 63 6f 6e 73 74 61 6e 74 20 73 75 62 65 78 70   constant subexp
178a0 72 65 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 54  resions.** are T
178b0 4b 5f 52 45 47 49 53 54 45 52 20 6f 70 63 6f 64  K_REGISTER opcod
178c0 65 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f  es that refer to
178d0 20 74 68 65 20 70 72 65 63 6f 6d 70 75 74 65 64   the precomputed
178e0 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 76 6f 69 64   values..*/.void
178f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
17900 43 6f 6e 73 74 61 6e 74 73 28 50 61 72 73 65 20  Constants(Parse 
17910 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
17920 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20  Expr){.  Walker 
17930 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  w;.  w.xExprCall
17940 62 61 63 6b 20 3d 20 65 76 61 6c 43 6f 6e 73 74  back = evalConst
17950 45 78 70 72 3b 0a 20 20 77 2e 78 53 65 6c 65 63  Expr;.  w.xSelec
17960 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20  tCallback = 0;. 
17970 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   w.pParse = pPar
17980 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  se;.  sqlite3Wal
17990 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72 29  kExpr(&w, pExpr)
179a0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ;.}.../*.** Gene
179b0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 70  rate code that p
179c0 75 73 68 65 73 20 74 68 65 20 76 61 6c 75 65 20  ushes the value 
179d0 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74  of every element
179e0 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a   of the given.**
179f0 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
17a00 20 69 6e 74 6f 20 61 20 73 65 71 75 65 6e 63 65   into a sequence
17a10 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 62 65   of registers be
17a20 67 69 6e 6e 69 6e 67 20 61 74 20 74 61 72 67 65  ginning at targe
17a30 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  t..**.** Return 
17a40 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
17a50 65 6d 65 6e 74 73 20 65 76 61 6c 75 61 74 65 64  ements evaluated
17a60 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17a70 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
17a80 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
17a90 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
17aa0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
17ab0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
17ac0 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
17ad0 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63  ion list to be c
17ae0 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74 61  oded */.  int ta
17af0 72 67 65 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  rget,        /* 
17b00 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 72  Where to write r
17b10 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
17b20 64 6f 48 61 72 64 43 6f 70 79 20 20 20 20 20 2f  doHardCopy     /
17b30 2a 20 4d 61 6b 65 20 61 20 68 61 72 64 20 63 6f  * Make a hard co
17b40 70 79 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d  py of every elem
17b50 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ent */.){.  stru
17b60 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
17b70 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
17b80 2c 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  , n;.  assert( p
17b90 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  List!=0 );.  ass
17ba0 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b  ert( target>0 );
17bb0 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  .  n = pList->nE
17bc0 78 70 72 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d  xpr;.  for(pItem
17bd0 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20  =pList->a, i=0; 
17be0 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  i<n; i++, pItem+
17bf0 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65  +){.    if( pIte
17c00 6d 2d 3e 69 41 6c 69 61 73 20 29 7b 0a 20 20 20  m->iAlias ){.   
17c10 20 20 20 69 6e 74 20 69 52 65 67 20 3d 20 63 6f     int iReg = co
17c20 64 65 41 6c 69 61 73 28 70 50 61 72 73 65 2c 20  deAlias(pParse, 
17c30 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73 2c 20 70  pItem->iAlias, p
17c40 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 74 61 72  Item->pExpr, tar
17c50 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 56 64  get+i);.      Vd
17c60 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
17c70 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
17c80 20 20 20 20 20 20 69 66 28 20 69 52 65 67 21 3d        if( iReg!=
17c90 74 61 72 67 65 74 2b 69 20 29 7b 0a 20 20 20 20  target+i ){.    
17ca0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17cb0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
17cc0 79 2c 20 69 52 65 67 2c 20 74 61 72 67 65 74 2b  y, iReg, target+
17cd0 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i);.      }.    
17ce0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
17cf0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
17d00 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  rse, pItem->pExp
17d10 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20  r, target+i);.  
17d20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 6f 48 61    }.    if( doHa
17d30 72 64 43 6f 70 79 20 26 26 20 21 70 50 61 72 73  rdCopy && !pPars
17d40 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
17d50 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  led ){.      sql
17d60 69 74 65 33 45 78 70 72 48 61 72 64 43 6f 70 79  ite3ExprHardCopy
17d70 28 70 50 61 72 73 65 2c 20 74 61 72 67 65 74 2c  (pParse, target,
17d80 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   n);.    }.  }. 
17d90 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
17da0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
17db0 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20  e for a boolean 
17dc0 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20  expression such 
17dd0 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d  that a jump is m
17de0 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61  ade.** to the la
17df0 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68  bel "dest" if th
17e00 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
17e10 74 72 75 65 20 62 75 74 20 65 78 65 63 75 74 69  true but executi
17e20 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20  on.** continues 
17e30 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66  straight thru if
17e40 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
17e50 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20  is false..**.** 
17e60 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
17e70 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e  n evaluates to N
17e80 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75  ULL (neither tru
17e90 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68  e nor false), th
17ea0 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a  en.** take the j
17eb0 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49  ump if the jumpI
17ec0 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 53 51  fNull flag is SQ
17ed0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e  LITE_JUMPIFNULL.
17ee0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65  .**.** This code
17ef0 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20   depends on the 
17f00 66 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69  fact that certai
17f10 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28  n token values (
17f20 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72  ex: TK_EQ).** ar
17f30 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70  e the same as op
17f40 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a  code values (ex:
17f50 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70   OP_Eq) that imp
17f60 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65  lement the corre
17f70 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72  sponding.** oper
17f80 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20  ation.  Special 
17f90 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65  comments in vdbe
17fa0 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63  .c and the mkopc
17fb0 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20  odeh.awk script 
17fc0 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70  in.** the make p
17fd0 72 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65  rocess cause the
17fe0 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69  se values to ali
17ff0 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69  gn.  Assert()s i
18000 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65  n the code.** be
18010 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20  low verify that 
18020 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20  the numbers are 
18030 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c  aligned correctl
18040 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
18050 65 33 45 78 70 72 49 66 54 72 75 65 28 50 61 72  e3ExprIfTrue(Par
18060 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
18070 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73   *pExpr, int des
18080 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  t, int jumpIfNul
18090 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  l){.  Vdbe *v = 
180a0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
180b0 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69   int op = 0;.  i
180c0 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
180d0 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20  .  int regFree2 
180e0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72  = 0;.  int r1, r
180f0 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75  2;..  assert( ju
18100 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
18110 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a  _JUMPIFNULL || j
18120 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
18130 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
18140 29 20 29 20 20 20 20 20 72 65 74 75 72 6e 3b 20  ) )     return; 
18150 20 2f 2a 20 45 78 69 73 74 61 6e 63 65 20 6f 66   /* Existance of
18160 20 56 44 42 45 20 63 68 65 63 6b 65 64 20 62 79   VDBE checked by
18170 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28   caller */.  if(
18180 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29   NEVER(pExpr==0)
18190 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 4e   ) return;  /* N
181a0 6f 20 77 61 79 20 74 68 69 73 20 63 61 6e 20 68  o way this can h
181b0 61 70 70 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20  appen */.  op = 
181c0 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69  pExpr->op;.  swi
181d0 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
181e0 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20  ase TK_AND: {.  
181f0 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
18200 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
18210 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74  l(v);.      test
18220 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
18230 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
18240 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
18250 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
18260 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
18270 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
18280 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 6a 75 6d  r->pLeft, d2,jum
18290 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a  pIfNull^SQLITE_J
182a0 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
182b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
182c0 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
182d0 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
182e0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
182f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
18300 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
18310 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
18320 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
18330 61 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20  arse, 1);.      
18340 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
18350 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20   case TK_OR: {. 
18360 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
18370 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
18380 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
18390 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
183a0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
183b0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
183c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
183d0 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
183e0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
183f0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
18400 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
18410 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
18420 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74  K_NOT: {.      t
18430 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
18440 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
18450 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
18460 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
18470 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
18480 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
18490 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
184a0 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
184b0 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
184c0 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
184d0 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
184e0 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
184f0 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
18500 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
18510 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20  K_LT==OP_Lt );. 
18520 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
18530 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20  LE==OP_Le );.   
18540 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54     assert( TK_GT
18550 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20 20  ==OP_Gt );.     
18560 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d   assert( TK_GE==
18570 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20 20 20 61  OP_Ge );.      a
18580 73 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50  ssert( TK_EQ==OP
18590 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Eq );.      ass
185a0 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e  ert( TK_NE==OP_N
185b0 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
185c0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29  ase( op==TK_LT )
185d0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
185e0 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20  ( op==TK_LE );. 
185f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
18600 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20  p==TK_GT );.    
18610 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
18620 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74  TK_GE );.      t
18630 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
18640 45 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  EQ );.      test
18650 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20  case( op==TK_NE 
18660 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
18670 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
18680 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f   );.      codeCo
18690 6d 70 61 72 65 4f 70 65 72 61 6e 64 73 28 70 50  mpareOperands(pP
186a0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
186b0 66 74 2c 20 26 72 31 2c 20 26 72 65 67 46 72 65  ft, &r1, &regFre
186c0 65 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e1,.            
186d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186e0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69        pExpr->pRi
186f0 67 68 74 2c 20 26 72 32 2c 20 26 72 65 67 46 72  ght, &r2, &regFr
18700 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ee2);.      code
18710 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
18720 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
18730 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
18740 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18750 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c     r1, r2, dest,
18760 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
18770 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
18780 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
18790 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
187a0 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
187b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
187c0 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
187d0 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
187e0 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
187f0 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c  assert( TK_ISNUL
18800 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a  L==OP_IsNull );.
18810 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
18820 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74  _NOTNULL==OP_Not
18830 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 74 65  Null );.      te
18840 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
18850 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74  SNULL );.      t
18860 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
18870 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  NOTNULL );.     
18880 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
18890 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
188a0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
188b0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
188c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
188d0 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64  Op2(v, op, r1, d
188e0 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  est);.      test
188f0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
18900 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
18910 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
18920 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
18930 20 20 20 20 20 2f 2a 20 20 20 20 78 20 42 45 54       /*    x BET
18940 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20  WEEN y AND z.   
18950 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
18960 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
18970 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
18980 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78  **    x>=y AND x
18990 3c 3d 7a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  <=z.      **.   
189a0 20 20 20 2a 2a 20 43 6f 64 65 20 69 74 20 61 73     ** Code it as
189b0 20 73 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61   such, taking ca
189c0 72 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d  re to do the com
189d0 6d 6f 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f  mon subexpressio
189e0 6e 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65  n.      ** eleme
189f0 6e 74 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 20 20  ntation of x..  
18a00 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70      */.      Exp
18a10 72 20 65 78 70 72 41 6e 64 3b 0a 20 20 20 20 20  r exprAnd;.     
18a20 20 45 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b 0a   Expr compLeft;.
18a30 20 20 20 20 20 20 45 78 70 72 20 63 6f 6d 70 52        Expr compR
18a40 69 67 68 74 3b 0a 20 20 20 20 20 20 45 78 70 72  ight;.      Expr
18a50 20 65 78 70 72 58 3b 0a 0a 20 20 20 20 20 20 61   exprX;..      a
18a60 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
18a70 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
18a80 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
18a90 20 20 20 20 20 20 65 78 70 72 58 20 3d 20 2a 70        exprX = *p
18aa0 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
18ab0 20 20 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20     exprAnd.op = 
18ac0 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 65 78  TK_AND;.      ex
18ad0 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63  prAnd.pLeft = &c
18ae0 6f 6d 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 65  ompLeft;.      e
18af0 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20  xprAnd.pRight = 
18b00 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 20 20  &compRight;.    
18b10 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20    compLeft.op = 
18b20 54 4b 5f 47 45 3b 0a 20 20 20 20 20 20 63 6f 6d  TK_GE;.      com
18b30 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65  pLeft.pLeft = &e
18b40 78 70 72 58 3b 0a 20 20 20 20 20 20 63 6f 6d 70  xprX;.      comp
18b50 4c 65 66 74 2e 70 52 69 67 68 74 20 3d 20 70 45  Left.pRight = pE
18b60 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  xpr->x.pList->a[
18b70 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  0].pExpr;.      
18b80 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54  compRight.op = T
18b90 4b 5f 4c 45 3b 0a 20 20 20 20 20 20 63 6f 6d 70  K_LE;.      comp
18ba0 52 69 67 68 74 2e 70 4c 65 66 74 20 3d 20 26 65  Right.pLeft = &e
18bb0 78 70 72 58 3b 0a 20 20 20 20 20 20 63 6f 6d 70  xprX;.      comp
18bc0 52 69 67 68 74 2e 70 52 69 67 68 74 20 3d 20 70  Right.pRight = p
18bd0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
18be0 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [1].pExpr;.     
18bf0 20 65 78 70 72 58 2e 69 54 61 62 6c 65 20 3d 20   exprX.iTable = 
18c00 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
18c10 65 6d 70 28 70 50 61 72 73 65 2c 20 26 65 78 70  emp(pParse, &exp
18c20 72 58 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  rX, &regFree1);.
18c30 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
18c40 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
18c50 20 20 20 20 20 65 78 70 72 58 2e 6f 70 20 3d 20       exprX.op = 
18c60 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 20  TK_REGISTER;.   
18c70 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
18c80 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
18c90 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
18ca0 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 26 65  fTrue(pParse, &e
18cb0 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75  xprAnd, dest, ju
18cc0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
18cd0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
18ce0 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
18cf0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
18d00 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
18d10 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46  se, pExpr, &regF
18d20 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  ree1);.      sql
18d30 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
18d40 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20 64 65 73  , OP_If, r1, des
18d50 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  t, jumpIfNull!=0
18d60 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
18d70 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
18d80 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
18d90 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
18da0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
18db0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
18dc0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
18dd0 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
18de0 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  e1);.  sqlite3Re
18df0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
18e00 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 20  rse, regFree2); 
18e10 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72   .}../*.** Gener
18e20 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62  ate code for a b
18e30 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f  oolean expressio
18e40 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75  n such that a ju
18e50 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f  mp is made.** to
18e60 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74   the label "dest
18e70 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  " if the express
18e80 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74  ion is false but
18e90 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f   execution.** co
18ea0 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74  ntinues straight
18eb0 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70   thru if the exp
18ec0 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e  ression is true.
18ed0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
18ee0 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74  pression evaluat
18ef0 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74  es to NULL (neit
18f00 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c  her true nor fal
18f10 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70  se) then.** jump
18f20 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69   if jumpIfNull i
18f30 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  s SQLITE_JUMPIFN
18f40 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f  ULL or fall thro
18f50 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c  ugh if jumpIfNul
18f60 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f  l.** is 0..*/.vo
18f70 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  id sqlite3ExprIf
18f80 46 61 6c 73 65 28 50 61 72 73 65 20 2a 70 50 61  False(Parse *pPa
18f90 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
18fa0 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20  , int dest, int 
18fb0 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56  jumpIfNull){.  V
18fc0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
18fd0 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70  >pVdbe;.  int op
18fe0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46   = 0;.  int regF
18ff0 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ree1 = 0;.  int 
19000 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20  regFree2 = 0;.  
19010 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61  int r1, r2;..  a
19020 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c  ssert( jumpIfNul
19030 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  l==SQLITE_JUMPIF
19040 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75  NULL || jumpIfNu
19050 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e  ll==0 );.  if( N
19060 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74  EVER(v==0) ) ret
19070 75 72 6e 3b 20 2f 2a 20 45 78 69 73 74 61 6e 63  urn; /* Existanc
19080 65 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65  e of VDBE checke
19090 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20  d by caller */. 
190a0 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
190b0 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a     return;..  /*
190c0 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 70 45   The value of pE
190d0 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61  xpr->op and op a
190e0 72 65 20 72 65 6c 61 74 65 64 20 61 73 20 66 6f  re related as fo
190f0 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  llows:.  **.  **
19100 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
19110 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 0a 20              op. 
19120 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d   **       ------
19130 2d 2d 2d 20 20 20 20 20 20 20 20 20 20 2d 2d 2d  ---          ---
19140 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20  -------.  **    
19150 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20     TK_ISNULL    
19160 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c        OP_NotNull
19170 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e  .  **       TK_N
19180 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 4f  OTNULL         O
19190 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20  P_IsNull.  **   
191a0 20 20 20 20 54 4b 5f 4e 45 20 20 20 20 20 20 20      TK_NE       
191b0 20 20 20 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a         OP_Eq.  *
191c0 2a 20 20 20 20 20 20 20 54 4b 5f 45 51 20 20 20  *       TK_EQ   
191d0 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65             OP_Ne
191e0 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47  .  **       TK_G
191f0 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  T              O
19200 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Le.  **       
19210 54 4b 5f 4c 45 20 20 20 20 20 20 20 20 20 20 20  TK_LE           
19220 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20     OP_Gt.  **   
19230 20 20 20 20 54 4b 5f 47 45 20 20 20 20 20 20 20      TK_GE       
19240 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a         OP_Lt.  *
19250 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54 20 20 20  *       TK_LT   
19260 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 65             OP_Ge
19270 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f  .  **.  ** For o
19280 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20 70  ther values of p
19290 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20  Expr->op, op is 
192a0 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 20 75 6e  undefined and un
192b0 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76  used..  ** The v
192c0 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20  alue of TK_ and 
192d0 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61 72  OP_ constants ar
192e0 65 20 61 72 72 61 6e 67 65 64 20 73 75 63 68 20  e arranged such 
192f0 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e  that we.  ** can
19300 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 70   compute the map
19310 70 69 6e 67 20 61 62 6f 76 65 20 75 73 69 6e 67  ping above using
19320 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65   the following e
19330 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20  xpression..  ** 
19340 41 73 73 65 72 74 28 29 73 20 76 65 72 69 66 79  Assert()s verify
19350 20 74 68 61 74 20 74 68 65 20 63 6f 6d 70 75 74   that the comput
19360 61 74 69 6f 6e 20 69 73 20 63 6f 72 72 65 63 74  ation is correct
19370 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28  ..  */.  op = ((
19380 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53  pExpr->op+(TK_IS
19390 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f  NULL&1))^1)-(TK_
193a0 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a  ISNULL&1);..  /*
193b0 20 56 65 72 69 66 79 20 63 6f 72 72 65 63 74 20   Verify correct 
193c0 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f  alignment of TK_
193d0 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e   and OP_ constan
193e0 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ts.  */.  assert
193f0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
19400 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50  ISNULL || op==OP
19410 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73  _NotNull );.  as
19420 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
19430 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f  =TK_NOTNULL || o
19440 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a  p==OP_IsNull );.
19450 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
19460 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70  >op!=TK_NE || op
19470 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73 73  ==OP_Eq );.  ass
19480 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
19490 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_EQ || op==OP_
194a0 4e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Ne );.  assert( 
194b0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54  pExpr->op!=TK_LT
194c0 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b   || op==OP_Ge );
194d0 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
194e0 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f  ->op!=TK_LE || o
194f0 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73  p==OP_Gt );.  as
19500 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
19510 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_GT || op==OP
19520 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Le );.  assert(
19530 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47   pExpr->op!=TK_G
19540 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29  E || op==OP_Lt )
19550 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  ;..  switch( pEx
19560 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
19570 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20  se TK_AND: {.   
19580 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
19590 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
195a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
195b0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
195c0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
195d0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
195e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
195f0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
19600 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
19610 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
19620 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
19630 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
19640 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_OR: {.      in
19650 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64  t d2 = sqlite3Vd
19660 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
19670 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19680 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
19690 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
196a0 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
196b0 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
196c0 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
196d0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
196e0 74 2c 20 64 32 2c 20 6a 75 6d 70 49 66 4e 75 6c  t, d2, jumpIfNul
196f0 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  l^SQLITE_JUMPIFN
19700 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ULL);.      sqli
19710 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
19720 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
19730 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
19740 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
19750 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
19760 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20  eLabel(v, d2);. 
19770 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
19780 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c  CachePop(pParse,
19790 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   1);.      break
197a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
197b0 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_NOT: {.     
197c0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
197d0 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
197e0 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
197f0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
19800 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
19810 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
19820 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
19830 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
19840 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
19850 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
19860 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
19870 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
19880 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20   op==TK_LT );.  
19890 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
198a0 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20  ==TK_LE );.     
198b0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
198c0 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65  K_GT );.      te
198d0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47  stcase( op==TK_G
198e0 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  E );.      testc
198f0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20 29  ase( op==TK_EQ )
19900 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
19910 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20  ( op==TK_NE );. 
19920 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
19930 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
19940 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
19950 65 4f 70 65 72 61 6e 64 73 28 70 50 61 72 73 65  eOperands(pParse
19960 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
19970 26 72 31 2c 20 26 72 65 67 46 72 65 65 31 2c 0a  &r1, &regFree1,.
19980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199a0 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c    pExpr->pRight,
199b0 20 26 72 32 2c 20 26 72 65 67 46 72 65 65 32 29   &r2, &regFree2)
199c0 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
199d0 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
199e0 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
199f0 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
19a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
19a10 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d  1, r2, dest, jum
19a20 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
19a30 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
19a40 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
19a50 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
19a60 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
19a70 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
19a80 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
19a90 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
19aa0 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  LL: {.      test
19ab0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  case( op==TK_ISN
19ac0 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ULL );.      tes
19ad0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f  tcase( op==TK_NO
19ae0 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72  TNULL );.      r
19af0 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
19b00 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
19b10 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
19b20 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
19b30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19b40 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73  2(v, op, r1, des
19b50 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
19b60 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
19b70 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
19b80 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
19b90 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20  K_BETWEEN: {.   
19ba0 20 20 20 2f 2a 20 20 20 20 78 20 42 45 54 57 45     /*    x BETWE
19bb0 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 20  EN y AND z.     
19bc0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 73 20   **.      ** Is 
19bd0 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20  equivalent to . 
19be0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
19bf0 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d      x>=y AND x<=
19c00 7a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  z.      **.     
19c10 20 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20 73   ** Code it as s
19c20 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72 65  uch, taking care
19c30 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f   to do the commo
19c40 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a  n subexpression.
19c50 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74        ** element
19c60 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 20 20 20 20  ation of x..    
19c70 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20    */.      Expr 
19c80 65 78 70 72 41 6e 64 3b 0a 20 20 20 20 20 20 45  exprAnd;.      E
19c90 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b 0a 20 20  xpr compLeft;.  
19ca0 20 20 20 20 45 78 70 72 20 63 6f 6d 70 52 69 67      Expr compRig
19cb0 68 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 65  ht;.      Expr e
19cc0 78 70 72 58 3b 0a 0a 20 20 20 20 20 20 61 73 73  xprX;..      ass
19cd0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
19ce0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
19cf0 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
19d00 20 20 20 20 65 78 70 72 58 20 3d 20 2a 70 45 78      exprX = *pEx
19d10 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
19d20 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b   exprAnd.op = TK
19d30 5f 41 4e 44 3b 0a 20 20 20 20 20 20 65 78 70 72  _AND;.      expr
19d40 41 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d  And.pLeft = &com
19d50 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 65 78 70  pLeft;.      exp
19d60 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20 26 63  rAnd.pRight = &c
19d70 6f 6d 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ompRight;.      
19d80 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b  compLeft.op = TK
19d90 5f 47 45 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c  _GE;.      compL
19da0 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70  eft.pLeft = &exp
19db0 72 58 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65  rX;.      compLe
19dc0 66 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70  ft.pRight = pExp
19dd0 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d  r->x.pList->a[0]
19de0 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 63 6f  .pExpr;.      co
19df0 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b 5f  mpRight.op = TK_
19e00 4c 45 3b 0a 20 20 20 20 20 20 63 6f 6d 70 52 69  LE;.      compRi
19e10 67 68 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70  ght.pLeft = &exp
19e20 72 58 3b 0a 20 20 20 20 20 20 63 6f 6d 70 52 69  rX;.      compRi
19e30 67 68 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78  ght.pRight = pEx
19e40 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31  pr->x.pList->a[1
19e50 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 65  ].pExpr;.      e
19e60 78 70 72 58 2e 69 54 61 62 6c 65 20 3d 20 73 71  xprX.iTable = sq
19e70 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
19e80 70 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 58  p(pParse, &exprX
19e90 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
19ea0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
19eb0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
19ec0 20 20 20 65 78 70 72 58 2e 6f 70 20 3d 20 54 4b     exprX.op = TK
19ed0 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 20 20 20  _REGISTER;.     
19ee0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
19ef0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
19f00 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
19f10 61 6c 73 65 28 70 50 61 72 73 65 2c 20 26 65 78  alse(pParse, &ex
19f20 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d  prAnd, dest, jum
19f30 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
19f40 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
19f50 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
19f60 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
19f70 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
19f80 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46 72  e, pExpr, &regFr
19f90 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee1);.      sqli
19fa0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
19fb0 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 31 2c 20 64   OP_IfNot, r1, d
19fc0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  est, jumpIfNull!
19fd0 3d 30 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  =0);.      testc
19fe0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
19ff0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1a000 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
1a010 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1a020 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
1a030 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1a040 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
1a050 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ree1);.  sqlite3
1a060 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
1a070 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
1a080 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20  ;.}../*.** Do a 
1a090 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20  deep comparison 
1a0a0 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  of two expressio
1a0b0 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75 72 6e  n trees.  Return
1a0c0 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29   TRUE (non-zero)
1a0d0 0a 2a 2a 20 69 66 20 74 68 65 79 20 61 72 65 20  .** if they are 
1a0e0 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20 72 65  identical and re
1a0f0 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68  turn FALSE if th
1a100 65 79 20 64 69 66 66 65 72 20 69 6e 20 61 6e 79  ey differ in any
1a110 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65   way..**.** Some
1a120 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75 74 69  times this routi
1a130 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 46  ne will return F
1a140 41 4c 53 45 20 65 76 65 6e 20 69 66 20 74 68 65  ALSE even if the
1a150 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73   two expressions
1a160 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65 20 65  .** really are e
1a170 71 75 69 76 61 6c 65 6e 74 2e 20 20 49 66 20 77  quivalent.  If w
1a180 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74  e cannot prove t
1a190 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69  hat the expressi
1a1a0 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74  ons are.** ident
1a1b0 69 63 61 6c 2c 20 77 65 20 72 65 74 75 72 6e 20  ical, we return 
1a1c0 46 41 4c 53 45 20 6a 75 73 74 20 74 6f 20 62 65  FALSE just to be
1a1d0 20 73 61 66 65 2e 20 20 53 6f 20 69 66 20 74 68   safe.  So if th
1a1e0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
1a1f0 74 75 72 6e 73 20 66 61 6c 73 65 2c 20 74 68 65  turns false, the
1a200 6e 20 79 6f 75 20 64 6f 20 6e 6f 74 20 72 65 61  n you do not rea
1a210 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72 20 63 65 72  lly know for cer
1a220 74 61 69 6e 20 69 66 20 74 68 65 20 74 77 6f 0a  tain if the two.
1a230 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  ** expressions a
1a240 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75  re the same.  Bu
1a250 74 20 69 66 20 79 6f 75 20 67 65 74 20 61 20 54  t if you get a T
1a260 52 55 45 20 72 65 74 75 72 6e 2c 20 74 68 65 6e  RUE return, then
1a270 20 79 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73   you.** can be s
1a280 75 72 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ure the expressi
1a290 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  ons are the same
1a2a0 2e 20 20 49 6e 20 74 68 65 20 70 6c 61 63 65 73  .  In the places
1a2b0 20 77 68 65 72 65 0a 2a 2a 20 74 68 69 73 20 72   where.** this r
1a2c0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 2c 20  outine is used, 
1a2d0 69 74 20 64 6f 65 73 20 6e 6f 74 20 68 75 72 74  it does not hurt
1a2e0 20 74 6f 20 67 65 74 20 61 6e 20 65 78 74 72 61   to get an extra
1a2f0 20 46 41 4c 53 45 20 2d 20 74 68 61 74 0a 2a 2a   FALSE - that.**
1a300 20 6a 75 73 74 20 6d 69 67 68 74 20 72 65 73 75   just might resu
1a310 6c 74 20 69 6e 20 73 6f 6d 65 20 73 6c 69 67 68  lt in some sligh
1a320 74 6c 79 20 73 6c 6f 77 65 72 20 63 6f 64 65 2e  tly slower code.
1a330 20 20 42 75 74 20 72 65 74 75 72 6e 69 6e 67 0a    But returning.
1a340 2a 2a 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20  ** an incorrect 
1a350 54 52 55 45 20 63 6f 75 6c 64 20 6c 65 61 64 20  TRUE could lead 
1a360 74 6f 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e  to a malfunction
1a370 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1a380 45 78 70 72 43 6f 6d 70 61 72 65 28 45 78 70 72  ExprCompare(Expr
1a390 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 29 7b   *pA, Expr *pB){
1a3a0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1a3b0 70 41 3d 3d 30 7c 7c 70 42 3d 3d 30 20 29 7b 0a  pA==0||pB==0 ){.
1a3c0 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 70      return pB==p
1a3d0 41 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  A;.  }.  assert(
1a3e0 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70   !ExprHasAnyProp
1a3f0 65 72 74 79 28 70 41 2c 20 45 50 5f 54 6f 6b 65  erty(pA, EP_Toke
1a400 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
1a410 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ) );.  assert( !
1a420 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72  ExprHasAnyProper
1a430 74 79 28 70 42 2c 20 45 50 5f 54 6f 6b 65 6e 4f  ty(pB, EP_TokenO
1a440 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
1a450 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  );.  if( ExprHas
1a460 50 72 6f 70 65 72 74 79 28 70 41 2c 20 45 50 5f  Property(pA, EP_
1a470 78 49 73 53 65 6c 65 63 74 29 20 7c 7c 20 45 78  xIsSelect) || Ex
1a480 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 42  prHasProperty(pB
1a490 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1a4a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1a4b0 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 41 2d 3e  .  }.  if( (pA->
1a4c0 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69  flags & EP_Disti
1a4d0 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73  nct)!=(pB->flags
1a4e0 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 20   & EP_Distinct) 
1a4f0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
1a500 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70  ( pA->op!=pB->op
1a510 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
1a520 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 43  f( !sqlite3ExprC
1a530 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74  ompare(pA->pLeft
1a540 2c 20 70 42 2d 3e 70 4c 65 66 74 29 20 29 20 72  , pB->pLeft) ) r
1a550 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21  eturn 0;.  if( !
1a560 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
1a570 72 65 28 70 41 2d 3e 70 52 69 67 68 74 2c 20 70  re(pA->pRight, p
1a580 42 2d 3e 70 52 69 67 68 74 29 20 29 20 72 65 74  B->pRight) ) ret
1a590 75 72 6e 20 30 3b 0a 0a 20 20 69 66 28 20 70 41  urn 0;..  if( pA
1a5a0 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 70 42 2d  ->x.pList && pB-
1a5b0 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  >x.pList ){.    
1a5c0 69 66 28 20 70 41 2d 3e 78 2e 70 4c 69 73 74 2d  if( pA->x.pList-
1a5d0 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 78 2e 70 4c  >nExpr!=pB->x.pL
1a5e0 69 73 74 2d 3e 6e 45 78 70 72 20 29 20 72 65 74  ist->nExpr ) ret
1a5f0 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  urn 0;.    for(i
1a600 3d 30 3b 20 69 3c 70 41 2d 3e 78 2e 70 4c 69 73  =0; i<pA->x.pLis
1a610 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
1a620 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
1a630 72 41 20 3d 20 70 41 2d 3e 78 2e 70 4c 69 73 74  rA = pA->x.pList
1a640 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
1a650 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 42      Expr *pExprB
1a660 20 3d 20 70 42 2d 3e 78 2e 70 4c 69 73 74 2d 3e   = pB->x.pList->
1a670 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
1a680 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78    if( !sqlite3Ex
1a690 70 72 43 6f 6d 70 61 72 65 28 70 45 78 70 72 41  prCompare(pExprA
1a6a0 2c 20 70 45 78 70 72 42 29 20 29 20 72 65 74 75  , pExprB) ) retu
1a6b0 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  rn 0;.    }.  }e
1a6c0 6c 73 65 20 69 66 28 20 70 41 2d 3e 78 2e 70 4c  lse if( pA->x.pL
1a6d0 69 73 74 20 7c 7c 20 70 42 2d 3e 78 2e 70 4c 69  ist || pB->x.pLi
1a6e0 73 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  st ){.    return
1a6f0 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70   0;.  }..  if( p
1a700 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69  A->iTable!=pB->i
1a710 54 61 62 6c 65 20 7c 7c 20 70 41 2d 3e 69 43 6f  Table || pA->iCo
1a720 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d  lumn!=pB->iColum
1a730 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  n ) return 0;.  
1a740 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
1a750 72 74 79 28 70 41 2c 20 45 50 5f 49 6e 74 56 61  rty(pA, EP_IntVa
1a760 6c 75 65 29 20 29 7b 0a 20 20 20 20 69 66 28 20  lue) ){.    if( 
1a770 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1a780 28 70 42 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  (pB, EP_IntValue
1a790 29 20 7c 7c 20 70 41 2d 3e 75 2e 69 56 61 6c 75  ) || pA->u.iValu
1a7a0 65 21 3d 70 42 2d 3e 75 2e 69 56 61 6c 75 65 20  e!=pB->u.iValue 
1a7b0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1a7c0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  0;.    }.  }else
1a7d0 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f   if( pA->op!=TK_
1a7e0 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 75 2e  COLUMN && pA->u.
1a7f0 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66  zToken ){.    if
1a800 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
1a810 79 28 70 42 2c 20 45 50 5f 49 6e 74 56 61 6c 75  y(pB, EP_IntValu
1a820 65 29 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e  e) || NEVER(pB->
1a830 75 2e 7a 54 6f 6b 65 6e 3d 3d 30 29 20 29 20 72  u.zToken==0) ) r
1a840 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28  eturn 0;.    if(
1a850 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1a860 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d  pA->u.zToken,pB-
1a870 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 7b  >u.zToken)!=0 ){
1a880 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1a890 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1a8a0 75 72 6e 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn 1;.}.../*.**
1a8b0 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65   Add a new eleme
1a8c0 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e  nt to the pAggIn
1a8d0 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79  fo->aCol[] array
1a8e0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  .  Return the in
1a8f0 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  dex of.** the ne
1a900 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75  w element.  Retu
1a910 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75  rn a negative nu
1a920 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66  mber if malloc f
1a930 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
1a940 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 43 6f  int addAggInfoCo
1a950 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  lumn(sqlite3 *db
1a960 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f  , AggInfo *pInfo
1a970 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49  ){.  int i;.  pI
1a980 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69  nfo->aCol = sqli
1a990 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
1a9a0 28 0a 20 20 20 20 20 20 20 64 62 2c 0a 20 20 20  (.       db,.   
1a9b0 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c      pInfo->aCol,
1a9c0 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70  .       sizeof(p
1a9d0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a  Info->aCol[0]),.
1a9e0 20 20 20 20 20 20 20 33 2c 0a 20 20 20 20 20 20         3,.      
1a9f0 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e   &pInfo->nColumn
1aa00 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d  ,.       &pInfo-
1aa10 3e 6e 43 6f 6c 75 6d 6e 41 6c 6c 6f 63 2c 0a 20  >nColumnAlloc,. 
1aa20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20        &i.  );.  
1aa30 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a  return i;.}    .
1aa40 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
1aa50 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
1aa60 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
1aa70 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e  ] array.  Return
1aa80 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a   the index of.**
1aa90 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74   the new element
1aaa0 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61  .  Return a nega
1aab0 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d  tive number if m
1aac0 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a  alloc fails..*/.
1aad0 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67  static int addAg
1aae0 67 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69 74 65  gInfoFunc(sqlite
1aaf0 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a  3 *db, AggInfo *
1ab00 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b  pInfo){.  int i;
1ab10 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 20  .  pInfo->aFunc 
1ab20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c  = sqlite3ArrayAl
1ab30 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64  locate(.       d
1ab40 62 2c 20 0a 20 20 20 20 20 20 20 70 49 6e 66 6f  b, .       pInfo
1ab50 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20 20 20  ->aFunc,.       
1ab60 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46  sizeof(pInfo->aF
1ab70 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20  unc[0]),.       
1ab80 33 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f  3,.       &pInfo
1ab90 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20 20 20 20  ->nFunc,.       
1aba0 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 41 6c 6c  &pInfo->nFuncAll
1abb0 6f 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20  oc,.       &i.  
1abc0 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d  );.  return i;.}
1abd0 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73      ../*.** This
1abe0 20 69 73 20 74 68 65 20 78 45 78 70 72 43 61 6c   is the xExprCal
1abf0 6c 62 61 63 6b 20 66 6f 72 20 61 20 74 72 65 65  lback for a tree
1ac00 20 77 61 6c 6b 65 72 2e 20 20 49 74 20 69 73 20   walker.  It is 
1ac10 75 73 65 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65  used to.** imple
1ac20 6d 65 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  ment sqlite3Expr
1ac30 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
1ac40 73 28 29 2e 20 20 53 65 65 20 73 71 6c 69 74 65  s().  See sqlite
1ac50 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
1ac60 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64  egates.** for ad
1ac70 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
1ac80 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
1ac90 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  int analyzeAggre
1aca0 67 61 74 65 28 57 61 6c 6b 65 72 20 2a 70 57 61  gate(Walker *pWa
1acb0 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
1acc0 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e  r){.  int i;.  N
1acd0 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20  ameContext *pNC 
1ace0 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43  = pWalker->u.pNC
1acf0 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  ;.  Parse *pPars
1ad00 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b  e = pNC->pParse;
1ad10 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
1ad20 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63  List = pNC->pSrc
1ad30 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20  List;.  AggInfo 
1ad40 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d  *pAggInfo = pNC-
1ad50 3e 70 41 67 67 49 6e 66 6f 3b 0a 0a 20 20 73 77  >pAggInfo;..  sw
1ad60 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
1ad70 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
1ad80 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63  GG_COLUMN:.    c
1ad90 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
1ada0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1adb0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
1adc0 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  GG_COLUMN );.   
1add0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
1ade0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
1adf0 4e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68  N );.      /* Ch
1ae00 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
1ae10 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f  e column is in o
1ae20 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73  ne of the tables
1ae30 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 20   in the FROM.   
1ae40 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20     ** clause of 
1ae50 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75  the aggregate qu
1ae60 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ery */.      if(
1ae70 20 41 4c 57 41 59 53 28 70 53 72 63 4c 69 73 74   ALWAYS(pSrcList
1ae80 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  !=0) ){.        
1ae90 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1aea0 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72  tem *pItem = pSr
1aeb0 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  cList->a;.      
1aec0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72    for(i=0; i<pSr
1aed0 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  cList->nSrc; i++
1aee0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
1aef0 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
1af00 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a  Info_col *pCol;.
1af10 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1af20 28 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f  ( !ExprHasAnyPro
1af30 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1af40 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
1af50 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20  uced) );.       
1af60 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
1af70 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75  able==pItem->iCu
1af80 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rsor ){.        
1af90 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61      /* If we rea
1afa0 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69  ch this point, i
1afb0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 70 45 78  t means that pEx
1afc0 70 72 20 72 65 66 65 72 73 20 74 6f 20 61 20 74  pr refers to a t
1afd0 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  able.           
1afe0 20 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 20 74   ** that is in t
1aff0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
1b000 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
1b010 71 75 65 72 79 2e 20 20 0a 20 20 20 20 20 20 20  query.  .       
1b020 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
1b030 20 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65      ** Make an e
1b040 6e 74 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c  ntry for the col
1b050 75 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  umn in pAggInfo-
1b060 3e 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65  >aCol[] if there
1b070 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1b080 69 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20  is not an entry 
1b090 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20  there already.. 
1b0a0 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
1b0b0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b            int k;
1b0c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
1b0d0 6c 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43  l = pAggInfo->aC
1b0e0 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol;.            
1b0f0 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49  for(k=0; k<pAggI
1b100 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b  nfo->nColumn; k+
1b110 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
1b120 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
1b130 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70  ol->iTable==pExp
1b140 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20  r->iTable &&.   
1b150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1b160 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45  Col->iColumn==pE
1b170 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a  xpr->iColumn ){.
1b180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b190 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
1b1a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1b1b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1b1c0 20 69 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66   if( (k>=pAggInf
1b1d0 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20  o->nColumn).    
1b1e0 20 20 20 20 20 20 20 20 20 26 26 20 28 6b 20 3d           && (k =
1b1f0 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d   addAggInfoColum
1b200 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41  n(pParse->db, pA
1b210 67 67 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20  ggInfo))>=0 .   
1b220 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
1b230 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d            pCol =
1b240 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c   &pAggInfo->aCol
1b250 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [k];.           
1b260 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20     pCol->pTab = 
1b270 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20  pExpr->pTab;.   
1b280 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
1b290 3e 69 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d  >iTable = pExpr-
1b2a0 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  >iTable;.       
1b2b0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f         pCol->iCo
1b2c0 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43  lumn = pExpr->iC
1b2d0 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20  olumn;.         
1b2e0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20       pCol->iMem 
1b2f0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1b300 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1b310 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
1b320 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  umn = -1;.      
1b330 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45          pCol->pE
1b340 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  xpr = pExpr;.   
1b350 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
1b360 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42  AggInfo->pGroupB
1b370 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  y ){.           
1b380 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20       int j, n;. 
1b390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
1b3a0 78 70 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70  xprList *pGB = p
1b3b0 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42  AggInfo->pGroupB
1b3c0 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y;.             
1b3d0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
1b3e0 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d  st_item *pTerm =
1b3f0 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20   pGB->a;.       
1b400 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42           n = pGB
1b410 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->nExpr;.       
1b420 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
1b430 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72  ; j<n; j++, pTer
1b440 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
1b450 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
1b460 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
1b470 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b480 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
1b490 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e  K_COLUMN && pE->
1b4a0 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69  iTable==pExpr->i
1b4b0 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20  Table &&.       
1b4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1b4d0 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70  E->iColumn==pExp
1b4e0 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  r->iColumn ){.  
1b4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b500 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
1b510 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20  olumn = j;.     
1b520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
1b530 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
1b540 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b550 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1b560 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1b570 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
1b580 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
1b590 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  n<0 ){.         
1b5a0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
1b5b0 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67  rterColumn = pAg
1b5c0 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43  gInfo->nSortingC
1b5d0 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20  olumn++;.       
1b5e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b5f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1b600 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e     /* There is n
1b610 6f 77 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  ow an entry for 
1b620 70 45 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66  pExpr in pAggInf
1b630 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65  o->aCol[] (eithe
1b640 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  r.            **
1b650 20 62 65 63 61 75 73 65 20 69 74 20 77 61 73 20   because it was 
1b660 74 68 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20  there before or 
1b670 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 20  because we just 
1b680 63 72 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20  created it)..   
1b690 20 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76           ** Conv
1b6a0 65 72 74 20 74 68 65 20 70 45 78 70 72 20 74 6f  ert the pExpr to
1b6b0 20 62 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c   be a TK_AGG_COL
1b6c0 55 4d 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f  UMN referring to
1b6d0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20   that.          
1b6e0 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61    ** pAggInfo->a
1b6f0 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20  Col[] entry..   
1b700 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
1b710 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74 49          ExprSetI
1b720 72 72 65 64 75 63 69 62 6c 65 28 70 45 78 70 72  rreducible(pExpr
1b730 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
1b740 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d  Expr->pAggInfo =
1b750 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20   pAggInfo;.     
1b760 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
1b770 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e   = TK_AGG_COLUMN
1b780 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
1b790 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36  xpr->iAgg = (i16
1b7a0 29 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  )k;.            
1b7b0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
1b7c0 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45 78 70   } /* endif pExp
1b7d0 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d  r->iTable==pItem
1b7e0 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20  ->iCursor */.   
1b7f0 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f       } /* end lo
1b800 6f 70 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74  op over pSrcList
1b810 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
1b820 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
1b830 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ne;.    }.    ca
1b840 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
1b850 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  ON: {.      /* T
1b860 68 65 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d  he pNC->nDepth==
1b870 30 20 74 65 73 74 20 63 61 75 73 65 73 20 61 67  0 test causes ag
1b880 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
1b890 73 20 69 6e 20 73 75 62 71 75 65 72 69 65 73 0a  s in subqueries.
1b8a0 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69        ** to be i
1b8b0 67 6e 6f 72 65 64 20 2a 2f 0a 20 20 20 20 20 20  gnored */.      
1b8c0 69 66 28 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d  if( pNC->nDepth=
1b8d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
1b8e0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
1b8f0 20 70 45 78 70 72 20 69 73 20 61 20 64 75 70 6c   pExpr is a dupl
1b900 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65 72  icate of another
1b910 20 61 67 67 72 65 67 61 74 65 20 0a 20 20 20 20   aggregate .    
1b920 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20      ** function 
1b930 74 68 61 74 20 69 73 20 61 6c 72 65 61 64 79 20  that is already 
1b940 69 6e 20 74 68 65 20 70 41 67 67 49 6e 66 6f 20  in the pAggInfo 
1b950 73 74 72 75 63 74 75 72 65 0a 20 20 20 20 20 20  structure.      
1b960 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74 72    */.        str
1b970 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
1b980 20 2a 70 49 74 65 6d 20 3d 20 70 41 67 67 49 6e   *pItem = pAggIn
1b990 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20 20 20  fo->aFunc;.     
1b9a0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41     for(i=0; i<pA
1b9b0 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
1b9c0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
1b9d0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
1b9e0 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
1b9f0 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78  Item->pExpr, pEx
1ba00 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pr) ){.         
1ba10 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1ba20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1ba30 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70          if( i>=p
1ba40 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29  AggInfo->nFunc )
1ba50 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70  {.          /* p
1ba60 45 78 70 72 20 69 73 20 6f 72 69 67 69 6e 61 6c  Expr is original
1ba70 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e  .  Make a new en
1ba80 74 72 79 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  try in pAggInfo-
1ba90 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20  >aFunc[].       
1baa0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
1bab0 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61  u8 enc = ENC(pPa
1bac0 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20  rse->db);.      
1bad0 20 20 20 20 69 20 3d 20 61 64 64 41 67 67 49 6e      i = addAggIn
1bae0 66 6f 46 75 6e 63 28 70 50 61 72 73 65 2d 3e 64  foFunc(pParse->d
1baf0 62 2c 20 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20  b, pAggInfo);.  
1bb00 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 30          if( i>=0
1bb10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1bb20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1bb30 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1bb40 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
1bb50 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
1bb60 65 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e  em = &pAggInfo->
1bb70 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20  aFunc[i];.      
1bb80 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78        pItem->pEx
1bb90 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  pr = pExpr;.    
1bba0 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
1bbb0 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
1bbc0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  nMem;.          
1bbd0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1bbe0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1bbf0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
1bc00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
1bc10 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c  tem->pFunc = sql
1bc20 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
1bc30 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20  (pParse->db,.   
1bc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc50 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
1bc60 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
1bc70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
1bc80 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
1bc90 20 20 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70        pExpr->x.p
1bca0 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e 78 2e  List ? pExpr->x.
1bcb0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
1bcc0 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  , enc, 0);.     
1bcd0 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
1bce0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73  ->flags & EP_Dis
1bcf0 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 20  tinct ){.       
1bd00 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44         pItem->iD
1bd10 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65  istinct = pParse
1bd20 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
1bd30 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1bd40 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
1bd50 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31  ->iDistinct = -1
1bd60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1bd70 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1bd80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
1bd90 20 4d 61 6b 65 20 70 45 78 70 72 20 70 6f 69 6e   Make pExpr poin
1bda0 74 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72  t to the appropr
1bdb0 69 61 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61  iate pAggInfo->a
1bdc0 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20  Func[] entry.   
1bdd0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1bde0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1bdf0 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70  AnyProperty(pExp
1be00 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  r, EP_TokenOnly|
1be10 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
1be20 20 20 20 20 20 20 20 45 78 70 72 53 65 74 49 72         ExprSetIr
1be30 72 65 64 75 63 69 62 6c 65 28 70 45 78 70 72 29  reducible(pExpr)
1be40 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
1be50 3e 69 41 67 67 20 3d 20 28 69 31 36 29 69 3b 0a  >iAgg = (i16)i;.
1be60 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
1be70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e  AggInfo = pAggIn
1be80 66 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  fo;.        retu
1be90 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
1bea0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1beb0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
1bec0 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20  tinue;.}.static 
1bed0 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  int analyzeAggre
1bee0 67 61 74 65 73 49 6e 53 65 6c 65 63 74 28 57 61  gatesInSelect(Wa
1bef0 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
1bf00 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
1bf10 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
1bf20 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75  pNC = pWalker->u
1bf30 2e 70 4e 43 3b 0a 20 20 69 66 28 20 70 4e 43 2d  .pNC;.  if( pNC-
1bf40 3e 6e 44 65 70 74 68 3d 3d 30 20 29 7b 0a 20 20  >nDepth==0 ){.  
1bf50 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2b 2b 3b    pNC->nDepth++;
1bf60 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  .    sqlite3Walk
1bf70 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
1bf80 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 70 4e  pSelect);.    pN
1bf90 43 2d 3e 6e 44 65 70 74 68 2d 2d 3b 0a 20 20 20  C->nDepth--;.   
1bfa0 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
1bfb0 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
1bfc0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
1bfd0 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  nue;.  }.}../*.*
1bfe0 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 67 69  * Analyze the gi
1bff0 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  ven expression l
1c000 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67 72 65  ooking for aggre
1c010 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  gate functions a
1c020 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61 62  nd.** for variab
1c030 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  les that need to
1c040 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
1c050 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20   pParse->aAgg[] 
1c060 61 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b 65 20 61  array..** Make a
1c070 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65  dditional entrie
1c080 73 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d  s to the pParse-
1c090 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 20 61 73  >aAgg[] array as
1c0a0 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a   necessary..**.*
1c0b0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
1c0c0 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61  hould only be ca
1c0d0 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 65  lled after the e
1c0e0 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65  xpression has be
1c0f0 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62  en.** analyzed b
1c100 79 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  y sqlite3Resolve
1c110 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a  ExprNames()..*/.
1c120 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1c130 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
1c140 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70  s(NameContext *p
1c150 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  NC, Expr *pExpr)
1c160 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
1c170 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
1c180 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  = analyzeAggrega
1c190 74 65 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  te;.  w.xSelectC
1c1a0 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a  allback = analyz
1c1b0 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c  eAggregatesInSel
1c1c0 65 63 74 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d  ect;.  w.u.pNC =
1c1d0 20 70 4e 43 3b 0a 20 20 61 73 73 65 72 74 28 20   pNC;.  assert( 
1c1e0 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d 30  pNC->pSrcList!=0
1c1f0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c   );.  sqlite3Wal
1c200 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72 29  kExpr(&w, pExpr)
1c210 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20  ;.}../*.** Call 
1c220 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
1c230 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 20 66  zeAggregates() f
1c240 6f 72 20 65 76 65 72 79 20 65 78 70 72 65 73 73  or every express
1c250 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70  ion in an.** exp
1c260 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52  ression list.  R
1c270 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
1c280 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a   of errors..**.*
1c290 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73  * If an error is
1c2a0 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c   found, the anal
1c2b0 79 73 69 73 20 69 73 20 63 75 74 20 73 68 6f 72  ysis is cut shor
1c2c0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
1c2d0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
1c2e0 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74  List(NameContext
1c2f0 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73 74 20   *pNC, ExprList 
1c300 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74 72 75 63  *pList){.  struc
1c310 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
1c320 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b  *pItem;.  int i;
1c330 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
1c340 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c      for(pItem=pL
1c350 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70  ist->a, i=0; i<p
1c360 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
1c370 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
1c380 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
1c390 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70  lyzeAggregates(p
1c3a0 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  NC, pItem->pExpr
1c3b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
1c3c0 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
1c3d0 20 73 69 6e 67 6c 65 20 6e 65 77 20 72 65 67 69   single new regi
1c3e0 73 74 65 72 20 66 6f 72 20 75 73 65 20 74 6f 20  ster for use to 
1c3f0 68 6f 6c 64 20 73 6f 6d 65 20 69 6e 74 65 72 6d  hold some interm
1c400 65 64 69 61 74 65 20 72 65 73 75 6c 74 2e 0a 2a  ediate result..*
1c410 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74  /.int sqlite3Get
1c420 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70  TempReg(Parse *p
1c430 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70 50  Parse){.  if( pP
1c440 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d  arse->nTempReg==
1c450 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1c460 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1c470 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61    }.  return pPa
1c480 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 2d 2d  rse->aTempReg[--
1c490 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
1c4a0 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c  ];.}../*.** Deal
1c4b0 6c 6f 63 61 74 65 20 61 20 72 65 67 69 73 74 65  locate a registe
1c4c0 72 2c 20 6d 61 6b 69 6e 67 20 61 76 61 69 6c 61  r, making availa
1c4d0 62 6c 65 20 66 6f 72 20 72 65 75 73 65 20 66 6f  ble for reuse fo
1c4e0 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  r some other.** 
1c4f0 70 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  purpose..**.** I
1c500 66 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20  f a register is 
1c510 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
1c520 75 73 65 64 20 62 79 20 74 68 65 20 63 6f 6c 75  used by the colu
1c530 6d 6e 20 63 61 63 68 65 2c 20 74 68 65 6e 0a 2a  mn cache, then.*
1c540 2a 20 74 68 65 20 64 61 6c 6c 6f 63 61 74 69 6f  * the dallocatio
1c550 6e 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e  n is deferred un
1c560 74 69 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  til the column c
1c570 61 63 68 65 20 6c 69 6e 65 20 74 68 61 74 20 75  ache line that u
1c580 73 65 73 0a 2a 2a 20 74 68 65 20 72 65 67 69 73  ses.** the regis
1c590 74 65 72 20 62 65 63 6f 6d 65 73 20 73 74 61 6c  ter becomes stal
1c5a0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
1c5b0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1c5c0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1c5d0 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 66 28  int iReg){.  if(
1c5e0 20 69 52 65 67 20 26 26 20 70 50 61 72 73 65 2d   iReg && pParse-
1c5f0 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53  >nTempReg<ArrayS
1c600 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d  ize(pParse->aTem
1c610 70 52 65 67 29 20 29 7b 0a 20 20 20 20 69 6e 74  pReg) ){.    int
1c620 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74 20 79   i;.    struct y
1c630 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 20  ColCache *p;.   
1c640 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
1c650 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
1c660 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
1c670 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
1c680 20 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67       if( p->iReg
1c690 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20  ==iReg ){.      
1c6a0 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 31    p->tempReg = 1
1c6b0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1c6c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1c6d0 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d      pParse->aTem
1c6e0 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65  pReg[pParse->nTe
1c6f0 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b  mpReg++] = iReg;
1c700 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
1c710 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f  locate or deallo
1c720 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20  cate a block of 
1c730 6e 52 65 67 20 63 6f 6e 73 65 63 75 74 69 76 65  nReg consecutive
1c740 20 72 65 67 69 73 74 65 72 73 0a 2a 2f 0a 69 6e   registers.*/.in
1c750 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  t sqlite3GetTemp
1c760 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61  Range(Parse *pPa
1c770 72 73 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a  rse, int nReg){.
1c780 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 20    int i, n;.  i 
1c790 3d 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65  = pParse->iRange
1c7a0 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73  Reg;.  n = pPars
1c7b0 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b 0a 20 20  e->nRangeReg;.  
1c7c0 69 66 28 20 6e 52 65 67 3c 3d 6e 20 26 26 20 21  if( nReg<=n && !
1c7d0 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68  usedAsColumnCach
1c7e0 65 28 70 50 61 72 73 65 2c 20 69 2c 20 69 2b 6e  e(pParse, i, i+n
1c7f0 2d 31 29 20 29 7b 0a 20 20 20 20 70 50 61 72 73  -1) ){.    pPars
1c800 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 2b 3d 20  e->iRangeReg += 
1c810 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65  nReg;.    pParse
1c820 2d 3e 6e 52 61 6e 67 65 52 65 67 20 2d 3d 20 6e  ->nRangeReg -= n
1c830 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Reg;.  }else{.  
1c840 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d    i = pParse->nM
1c850 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65  em+1;.    pParse
1c860 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a  ->nMem += nReg;.
1c870 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a    }.  return i;.
1c880 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  }.void sqlite3Re
1c890 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 50  leaseTempRange(P
1c8a0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1c8b0 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67  t iReg, int nReg
1c8c0 29 7b 0a 20 20 69 66 28 20 6e 52 65 67 3e 70 50  ){.  if( nReg>pP
1c8d0 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
1c8e0 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  ){.    pParse->n
1c8f0 52 61 6e 67 65 52 65 67 20 3d 20 6e 52 65 67 3b  RangeReg = nReg;
1c900 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61  .    pParse->iRa
1c910 6e 67 65 52 65 67 20 3d 20 69 52 65 67 3b 0a 20  ngeReg = iReg;. 
1c920 20 7d 0a 7d 0a                                    }.}.