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

Artifact bdbf8714374e1bba4587e3b098b793f2de967f6f:


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 70 2d 3e 70  op;.    if( p->p
0b90: 54 61 62 21 3d 30 20 26 26 20 28 0a 20 20 20 20  Tab!=0 && (.    
0ba0: 20 20 20 20 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43      op==TK_AGG_C
0bb0: 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  OLUMN || op==TK_
0bc0: 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b  COLUMN || op==TK
0bd0: 5f 52 45 47 49 53 54 45 52 20 7c 7c 20 6f 70 3d  _REGISTER || op=
0be0: 3d 54 4b 5f 54 52 49 47 47 45 52 0a 20 20 20 20  =TK_TRIGGER.    
0bf0: 29 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d  )){.      /* op=
0c00: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20  =TK_REGISTER && 
0c10: 70 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65  p->pTab!=0 happe
0c20: 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61  ns when pExpr wa
0c30: 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20  s originally.   
0c40: 20 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d     ** a TK_COLUM
0c50: 4e 20 62 75 74 20 77 61 73 20 70 72 65 76 69 6f  N but was previo
0c60: 75 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61  usly evaluated a
0c70: 6e 64 20 63 61 63 68 65 64 20 69 6e 20 61 20 72  nd cached in a r
0c80: 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 20  egister */.     
0c90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
0ca0: 6c 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 20  ll;.      int j 
0cb0: 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  = p->iColumn;.  
0cc0: 20 20 20 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a      if( j>=0 ){.
0cd0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 20          sqlite3 
0ce0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
0cf0: 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 20  ;.        zColl 
0d00: 3d 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b  = p->pTab->aCol[
0d10: 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  j].zColl;.      
0d20: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
0d30: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
0d40: 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c   ENC(db), zColl,
0d50: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78   0);.        pEx
0d60: 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c  pr->pColl = pCol
0d70: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
0d80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
0d90: 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 43 41 53    if( op!=TK_CAS
0da0: 54 20 26 26 20 6f 70 21 3d 54 4b 5f 55 50 4c 55  T && op!=TK_UPLU
0db0: 53 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  S ){.      break
0dc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20  ;.    }.    p = 
0dd0: 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 7d 0a 20 20  p->pLeft;.  }.  
0de0: 69 66 28 20 73 71 6c 69 74 65 33 43 68 65 63 6b  if( sqlite3Check
0df0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
0e00: 70 43 6f 6c 6c 29 20 29 7b 20 0a 20 20 20 20 70  pColl) ){ .    p
0e10: 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Coll = 0;.  }.  
0e20: 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a  return pColl;.}.
0e30: 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20  ./*.** pExpr is 
0e40: 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  an operand of a 
0e50: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
0e60: 74 6f 72 2e 20 20 61 66 66 32 20 69 73 20 74 68  tor.  aff2 is th
0e70: 65 0a 2a 2a 20 74 79 70 65 20 61 66 66 69 6e 69  e.** type affini
0e80: 74 79 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20  ty of the other 
0e90: 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73 20 72  operand.  This r
0ea0: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
0eb0: 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66 69 6e  he.** type affin
0ec0: 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ity that should 
0ed0: 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  be used for the 
0ee0: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
0ef0: 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c  tor..*/.char sql
0f00: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
0f10: 69 74 79 28 45 78 70 72 20 2a 70 45 78 70 72 2c  ity(Expr *pExpr,
0f20: 20 63 68 61 72 20 61 66 66 32 29 7b 0a 20 20 63   char aff2){.  c
0f30: 68 61 72 20 61 66 66 31 20 3d 20 73 71 6c 69 74  har aff1 = sqlit
0f40: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
0f50: 45 78 70 72 29 3b 0a 20 20 69 66 28 20 61 66 66  Expr);.  if( aff
0f60: 31 20 26 26 20 61 66 66 32 20 29 7b 0a 20 20 20  1 && aff2 ){.   
0f70: 20 2f 2a 20 42 6f 74 68 20 73 69 64 65 73 20 6f   /* Both sides o
0f80: 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
0f90: 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e 20 49 66   are columns. If
0fa0: 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65 72 69 63   one has numeric
0fb0: 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e 69 74 79  .    ** affinity
0fc0: 2c 20 75 73 65 20 74 68 61 74 2e 20 4f 74 68 65  , use that. Othe
0fd0: 72 77 69 73 65 20 75 73 65 20 6e 6f 20 61 66 66  rwise use no aff
0fe0: 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  inity..    */.  
0ff0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 4e    if( sqlite3IsN
1000: 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 61  umericAffinity(a
1010: 66 66 31 29 20 7c 7c 20 73 71 6c 69 74 65 33 49  ff1) || sqlite3I
1020: 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  sNumericAffinity
1030: 28 61 66 66 32 29 20 29 7b 0a 20 20 20 20 20 20  (aff2) ){.      
1040: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46  return SQLITE_AF
1050: 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d  F_NUMERIC;.    }
1060: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
1070: 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  rn SQLITE_AFF_NO
1080: 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  NE;.    }.  }els
1090: 65 20 69 66 28 20 21 61 66 66 31 20 26 26 20 21  e if( !aff1 && !
10a0: 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  aff2 ){.    /* N
10b0: 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 74  either side of t
10c0: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  he comparison is
10d0: 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f 6d 70   a column.  Comp
10e0: 61 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 72  are the.    ** r
10f0: 65 73 75 6c 74 73 20 64 69 72 65 63 74 6c 79 2e  esults directly.
1100: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75  .    */.    retu
1110: 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  rn SQLITE_AFF_NO
1120: 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  NE;.  }else{.   
1130: 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20 69 73 20   /* One side is 
1140: 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 6f 74  a column, the ot
1150: 68 65 72 20 69 73 20 6e 6f 74 2e 20 55 73 65 20  her is not. Use 
1160: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69  the columns affi
1170: 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73  nity. */.    ass
1180: 65 72 74 28 20 61 66 66 31 3d 3d 30 20 7c 7c 20  ert( aff1==0 || 
1190: 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20 20 20 72  aff2==0 );.    r
11a0: 65 74 75 72 6e 20 28 61 66 66 31 20 2b 20 61 66  eturn (aff1 + af
11b0: 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  f2);.  }.}../*.*
11c0: 2a 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d  * pExpr is a com
11d0: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
11e0: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 74 79  .  Return the ty
11f0: 70 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74  pe affinity that
1200: 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 61 70   should.** be ap
1210: 70 6c 69 65 64 20 74 6f 20 62 6f 74 68 20 6f 70  plied to both op
1220: 65 72 61 6e 64 73 20 70 72 69 6f 72 20 74 6f 20  erands prior to 
1230: 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70 61 72  doing the compar
1240: 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ison..*/.static 
1250: 63 68 61 72 20 63 6f 6d 70 61 72 69 73 6f 6e 41  char comparisonA
1260: 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45  ffinity(Expr *pE
1270: 78 70 72 29 7b 0a 20 20 63 68 61 72 20 61 66 66  xpr){.  char aff
1280: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
1290: 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20  r->op==TK_EQ || 
12a0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  pExpr->op==TK_IN
12b0: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
12c0: 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20 20 20  K_LT ||.        
12d0: 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f    pExpr->op==TK_
12e0: 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  GT || pExpr->op=
12f0: 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70 72 2d  =TK_GE || pExpr-
1300: 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a 20 20  >op==TK_LE ||.  
1310: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
1320: 70 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70 45 78 70  p==TK_NE || pExp
1330: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c 7c 20  r->op==TK_IS || 
1340: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
1350: 4e 4f 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NOT );.  assert(
1360: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b   pExpr->pLeft );
1370: 0a 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33  .  aff = sqlite3
1380: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78  ExprAffinity(pEx
1390: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66  pr->pLeft);.  if
13a0: 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20  ( pExpr->pRight 
13b0: 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c  ){.    aff = sql
13c0: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
13d0: 69 74 79 28 70 45 78 70 72 2d 3e 70 52 69 67 68  ity(pExpr->pRigh
13e0: 74 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65  t, aff);.  }else
13f0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
1400: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
1410: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
1420: 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f   aff = sqlite3Co
1430: 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45  mpareAffinity(pE
1440: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  xpr->x.pSelect->
1450: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
1460: 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c 73  pr, aff);.  }els
1470: 65 20 69 66 28 20 21 61 66 66 20 29 7b 0a 20 20  e if( !aff ){.  
1480: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
1490: 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 0a 20 20 72  FF_NONE;.  }.  r
14a0: 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a  eturn aff;.}../*
14b0: 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63  .** pExpr is a c
14c0: 6f 6d 70 61 72 69 73 6f 6e 20 65 78 70 72 65 73  omparison expres
14d0: 73 69 6f 6e 2c 20 65 67 2e 20 27 3d 27 2c 20 27  sion, eg. '=', '
14e0: 3c 27 2c 20 49 4e 28 2e 2e 2e 29 20 65 74 63 2e  <', IN(...) etc.
14f0: 0a 2a 2a 20 69 64 78 5f 61 66 66 69 6e 69 74 79  .** idx_affinity
1500: 20 69 73 20 74 68 65 20 61 66 66 69 6e 69 74 79   is the affinity
1510: 20 6f 66 20 61 6e 20 69 6e 64 65 78 65 64 20 63   of an indexed c
1520: 6f 6c 75 6d 6e 2e 20 52 65 74 75 72 6e 20 74 72  olumn. Return tr
1530: 75 65 0a 2a 2a 20 69 66 20 74 68 65 20 69 6e 64  ue.** if the ind
1540: 65 78 20 77 69 74 68 20 61 66 66 69 6e 69 74 79  ex with affinity
1550: 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20 6d 61   idx_affinity ma
1560: 79 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70  y be used to imp
1570: 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 63 6f  lement.** the co
1580: 6d 70 61 72 69 73 6f 6e 20 69 6e 20 70 45 78 70  mparison in pExp
1590: 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
15a0: 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b  3IndexAffinityOk
15b0: 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68  (Expr *pExpr, ch
15c0: 61 72 20 69 64 78 5f 61 66 66 69 6e 69 74 79 29  ar idx_affinity)
15d0: 7b 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20 63  {.  char aff = c
15e0: 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74  omparisonAffinit
15f0: 79 28 70 45 78 70 72 29 3b 0a 20 20 73 77 69 74  y(pExpr);.  swit
1600: 63 68 28 20 61 66 66 20 29 7b 0a 20 20 20 20 63  ch( aff ){.    c
1610: 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ase SQLITE_AFF_N
1620: 4f 4e 45 3a 0a 20 20 20 20 20 20 72 65 74 75 72  ONE:.      retur
1630: 6e 20 31 3b 0a 20 20 20 20 63 61 73 65 20 53 51  n 1;.    case SQ
1640: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20  LITE_AFF_TEXT:. 
1650: 20 20 20 20 20 72 65 74 75 72 6e 20 69 64 78 5f       return idx_
1660: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
1670: 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 64  _AFF_TEXT;.    d
1680: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65  efault:.      re
1690: 74 75 72 6e 20 73 71 6c 69 74 65 33 49 73 4e 75  turn sqlite3IsNu
16a0: 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 69 64  mericAffinity(id
16b0: 78 5f 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 7d  x_affinity);.  }
16c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
16d0: 20 74 68 65 20 50 35 20 76 61 6c 75 65 20 74 68   the P5 value th
16e0: 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  at should be use
16f0: 64 20 66 6f 72 20 61 20 62 69 6e 61 72 79 20 63  d for a binary c
1700: 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63  omparison.** opc
1710: 6f 64 65 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47  ode (OP_Eq, OP_G
1720: 65 20 65 74 63 2e 29 20 75 73 65 64 20 74 6f 20  e etc.) used to 
1730: 63 6f 6d 70 61 72 65 20 70 45 78 70 72 31 20 61  compare pExpr1 a
1740: 6e 64 20 70 45 78 70 72 32 2e 0a 2a 2f 0a 73 74  nd pExpr2..*/.st
1750: 61 74 69 63 20 75 38 20 62 69 6e 61 72 79 43 6f  atic u8 binaryCo
1760: 6d 70 61 72 65 50 35 28 45 78 70 72 20 2a 70 45  mpareP5(Expr *pE
1770: 78 70 72 31 2c 20 45 78 70 72 20 2a 70 45 78 70  xpr1, Expr *pExp
1780: 72 32 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  r2, int jumpIfNu
1790: 6c 6c 29 7b 0a 20 20 75 38 20 61 66 66 20 3d 20  ll){.  u8 aff = 
17a0: 28 63 68 61 72 29 73 71 6c 69 74 65 33 45 78 70  (char)sqlite3Exp
17b0: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 32  rAffinity(pExpr2
17c0: 29 3b 0a 20 20 61 66 66 20 3d 20 28 75 38 29 73  );.  aff = (u8)s
17d0: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
17e0: 69 6e 69 74 79 28 70 45 78 70 72 31 2c 20 61 66  inity(pExpr1, af
17f0: 66 29 20 7c 20 28 75 38 29 6a 75 6d 70 49 66 4e  f) | (u8)jumpIfN
1800: 75 6c 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 66  ull;.  return af
1810: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  f;.}../*.** Retu
1820: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
1830: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
1840: 71 75 65 6e 63 65 20 74 68 61 74 20 73 68 6f 75  quence that shou
1850: 6c 64 20 62 65 20 75 73 65 64 20 62 79 0a 2a 2a  ld be used by.**
1860: 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 72   a binary compar
1870: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20 63 6f  ison operator co
1880: 6d 70 61 72 69 6e 67 20 70 4c 65 66 74 20 61 6e  mparing pLeft an
1890: 64 20 70 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20  d pRight..**.** 
18a0: 49 66 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64  If the left hand
18b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
18c0: 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
18d0: 65 6e 63 65 20 74 79 70 65 2c 20 74 68 65 6e 20  ence type, then 
18e0: 69 74 20 69 73 0a 2a 2a 20 75 73 65 64 2e 20 4f  it is.** used. O
18f0: 74 68 65 72 77 69 73 65 20 74 68 65 20 63 6f 6c  therwise the col
1900: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1910: 66 6f 72 20 74 68 65 20 72 69 67 68 74 20 68 61  for the right ha
1920: 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  nd expression.**
1930: 20 69 73 20 75 73 65 64 2c 20 6f 72 20 74 68 65   is used, or the
1940: 20 64 65 66 61 75 6c 74 20 28 42 49 4e 41 52 59   default (BINARY
1950: 29 20 69 66 20 6e 65 69 74 68 65 72 20 65 78 70  ) if neither exp
1960: 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63 6f  ression has a co
1970: 6c 6c 61 74 69 6e 67 0a 2a 2a 20 74 79 70 65 2e  llating.** type.
1980: 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  .**.** Argument 
1990: 70 52 69 67 68 74 20 28 62 75 74 20 6e 6f 74 20  pRight (but not 
19a0: 70 4c 65 66 74 29 20 6d 61 79 20 62 65 20 61 20  pLeft) may be a 
19b0: 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2e 20 49 6e  null pointer. In
19c0: 20 74 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69   this case,.** i
19d0: 74 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65  t is not conside
19e0: 72 65 64 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  red..*/.CollSeq 
19f0: 2a 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f  *sqlite3BinaryCo
1a00: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20  mpareCollSeq(.  
1a10: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a  Parse *pParse, .
1a20: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 0a    Expr *pLeft, .
1a30: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 0a 29    Expr *pRight.)
1a40: 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  {.  CollSeq *pCo
1a50: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  ll;.  assert( pL
1a60: 65 66 74 20 29 3b 0a 20 20 69 66 28 20 70 4c 65  eft );.  if( pLe
1a70: 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45  ft->flags & EP_E
1a80: 78 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20  xpCollate ){.   
1a90: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 2d 3e   assert( pLeft->
1aa0: 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 70 43 6f  pColl );.    pCo
1ab0: 6c 6c 20 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c  ll = pLeft->pCol
1ac0: 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  l;.  }else if( p
1ad0: 52 69 67 68 74 20 26 26 20 70 52 69 67 68 74 2d  Right && pRight-
1ae0: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
1af0: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 61 73  ollate ){.    as
1b00: 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e 70 43  sert( pRight->pC
1b10: 6f 6c 6c 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c  oll );.    pColl
1b20: 20 3d 20 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c   = pRight->pColl
1b30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1b40: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
1b50: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
1b60: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66  , pLeft);.    if
1b70: 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  ( !pColl ){.    
1b80: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
1b90: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
1ba0: 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  rse, pRight);.  
1bb0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1bc0: 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pColl;.}../*.**
1bd0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
1be0: 6f 72 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  or a comparison 
1bf0: 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61  operator..*/.sta
1c00: 74 69 63 20 69 6e 74 20 63 6f 64 65 43 6f 6d 70  tic int codeComp
1c10: 61 72 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  are(.  Parse *pP
1c20: 61 72 73 65 2c 20 20 20 20 2f 2a 20 54 68 65 20  arse,    /* The 
1c30: 70 61 72 73 69 6e 67 20 28 61 6e 64 20 63 6f 64  parsing (and cod
1c40: 65 20 67 65 6e 65 72 61 74 69 6e 67 29 20 63 6f  e generating) co
1c50: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
1c60: 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 2f 2a 20  *pLeft,      /* 
1c70: 54 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64  The left operand
1c80: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67   */.  Expr *pRig
1c90: 68 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 72  ht,     /* The r
1ca0: 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  ight operand */.
1cb0: 20 20 69 6e 74 20 6f 70 63 6f 64 65 2c 20 20 20    int opcode,   
1cc0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61      /* The compa
1cd0: 72 69 73 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a  rison opcode */.
1ce0: 20 20 69 6e 74 20 69 6e 31 2c 20 69 6e 74 20 69    int in1, int i
1cf0: 6e 32 2c 20 2f 2a 20 52 65 67 69 73 74 65 72 20  n2, /* Register 
1d00: 68 6f 6c 64 69 6e 67 20 6f 70 65 72 61 6e 64 73  holding operands
1d10: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20   */.  int dest, 
1d20: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
1d30: 68 65 72 65 20 69 66 20 74 72 75 65 2e 20 20 2a  here if true.  *
1d40: 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  /.  int jumpIfNu
1d50: 6c 6c 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65  ll    /* If true
1d60: 2c 20 6a 75 6d 70 20 69 66 20 65 69 74 68 65 72  , jump if either
1d70: 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c   operand is NULL
1d80: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 70 35 3b   */.){.  int p5;
1d90: 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 43  .  int addr;.  C
1da0: 6f 6c 6c 53 65 71 20 2a 70 34 3b 0a 0a 20 20 70  ollSeq *p4;..  p
1db0: 34 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  4 = sqlite3Binar
1dc0: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
1dd0: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
1de0: 52 69 67 68 74 29 3b 0a 20 20 70 35 20 3d 20 62  Right);.  p5 = b
1df0: 69 6e 61 72 79 43 6f 6d 70 61 72 65 50 35 28 70  inaryCompareP5(p
1e00: 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 6a 75  Left, pRight, ju
1e10: 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 61 64 64  mpIfNull);.  add
1e20: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
1e30: 64 64 4f 70 34 28 70 50 61 72 73 65 2d 3e 70 56  ddOp4(pParse->pV
1e40: 64 62 65 2c 20 6f 70 63 6f 64 65 2c 20 69 6e 32  dbe, opcode, in2
1e50: 2c 20 64 65 73 74 2c 20 69 6e 31 2c 0a 20 20 20  , dest, in1,.   
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e70: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70          (void*)p
1e80: 34 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  4, P4_COLLSEQ);.
1e90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1ea0: 6e 67 65 50 35 28 70 50 61 72 73 65 2d 3e 70 56  ngeP5(pParse->pV
1eb0: 64 62 65 2c 20 28 75 38 29 70 35 29 3b 0a 20 20  dbe, (u8)p5);.  
1ec0: 69 66 28 20 28 70 35 20 26 20 53 51 4c 49 54 45  if( (p5 & SQLITE
1ed0: 5f 41 46 46 5f 4d 41 53 4b 29 21 3d 53 51 4c 49  _AFF_MASK)!=SQLI
1ee0: 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20  TE_AFF_NONE ){. 
1ef0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1f00: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
1f10: 65 28 70 50 61 72 73 65 2c 20 69 6e 31 2c 20 31  e(pParse, in1, 1
1f20: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
1f30: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
1f40: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 6e  hange(pParse, in
1f50: 32 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74  2, 1);.  }.  ret
1f60: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 23 69 66  urn addr;.}..#if
1f70: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
1f80: 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43  _DEPTH>0./*.** C
1f90: 68 65 63 6b 20 74 68 61 74 20 61 72 67 75 6d 65  heck that argume
1fa0: 6e 74 20 6e 48 65 69 67 68 74 20 69 73 20 6c 65  nt nHeight is le
1fb0: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
1fc0: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a   to the maximum.
1fd0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65  ** expression de
1fe0: 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66 20  pth allowed. If 
1ff0: 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76 65  it is not, leave
2000: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2010: 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e 0a  e in.** pParse..
2020: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
2030: 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 50 61  prCheckHeight(Pa
2040: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
2050: 20 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 6e 74   nHeight){.  int
2060: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2070: 0a 20 20 69 6e 74 20 6d 78 48 65 69 67 68 74 20  .  int mxHeight 
2080: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c  = pParse->db->aL
2090: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
20a0: 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20  T_EXPR_DEPTH];. 
20b0: 20 69 66 28 20 6e 48 65 69 67 68 74 3e 6d 78 48   if( nHeight>mxH
20c0: 65 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c  eight ){.    sql
20d0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
20e0: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22 45 78  rse, .       "Ex
20f0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73  pression tree is
2100: 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78 69   too large (maxi
2110: 6d 75 6d 20 64 65 70 74 68 20 25 64 29 22 2c 20  mum depth %d)", 
2120: 6d 78 48 65 69 67 68 74 0a 20 20 20 20 29 3b 0a  mxHeight.    );.
2130: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2140: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
2150: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68  urn rc;.}../* Th
2160: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65  e following thre
2170: 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69  e functions, hei
2180: 67 68 74 4f 66 45 78 70 72 28 29 2c 20 68 65 69  ghtOfExpr(), hei
2190: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 29 0a  ghtOfExprList().
21a0: 2a 2a 20 61 6e 64 20 68 65 69 67 68 74 4f 66 53  ** and heightOfS
21b0: 65 6c 65 63 74 28 29 2c 20 61 72 65 20 75 73 65  elect(), are use
21c0: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  d to determine t
21d0: 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68  he maximum heigh
21e0: 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70 72  t.** of any expr
21f0: 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65  ession tree refe
2200: 72 65 6e 63 65 64 20 62 79 20 74 68 65 20 73 74  renced by the st
2210: 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61  ructure passed a
2220: 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61  s the.** first a
2230: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49  rgument..**.** I
2240: 66 20 74 68 69 73 20 6d 61 78 69 6d 75 6d 20 68  f this maximum h
2250: 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72  eight is greater
2260: 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
2270: 74 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a  t value pointed.
2280: 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65 69 67 68  ** to by pnHeigh
2290: 74 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  t, the second pa
22a0: 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20 73 65  rameter, then se
22b0: 74 20 2a 70 6e 48 65 69 67 68 74 20 74 6f 20 74  t *pnHeight to t
22c0: 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f  hat.** value..*/
22d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
22e0: 67 68 74 4f 66 45 78 70 72 28 45 78 70 72 20 2a  ghtOfExpr(Expr *
22f0: 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74  p, int *pnHeight
2300: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
2310: 20 20 69 66 28 20 70 2d 3e 6e 48 65 69 67 68 74    if( p->nHeight
2320: 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a 20 20  >*pnHeight ){.  
2330: 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20      *pnHeight = 
2340: 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20  p->nHeight;.    
2350: 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  }.  }.}.static v
2360: 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78 70 72  oid heightOfExpr
2370: 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70  List(ExprList *p
2380: 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29  , int *pnHeight)
2390: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
23a0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
23b0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b  i=0; i<p->nExpr;
23c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65 69   i++){.      hei
23d0: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69  ghtOfExpr(p->a[i
23e0: 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65 69 67 68  ].pExpr, pnHeigh
23f0: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
2400: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67  static void heig
2410: 68 74 4f 66 53 65 6c 65 63 74 28 53 65 6c 65 63  htOfSelect(Selec
2420: 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69  t *p, int *pnHei
2430: 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b  ght){.  if( p ){
2440: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
2450: 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 6e 48  r(p->pWhere, pnH
2460: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
2470: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 48 61 76  htOfExpr(p->pHav
2480: 69 6e 67 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  ing, pnHeight);.
2490: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
24a0: 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e 48 65  (p->pLimit, pnHe
24b0: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
24c0: 74 4f 66 45 78 70 72 28 70 2d 3e 70 4f 66 66 73  tOfExpr(p->pOffs
24d0: 65 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  et, pnHeight);. 
24e0: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c     heightOfExprL
24f0: 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 70  ist(p->pEList, p
2500: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
2510: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70  ightOfExprList(p
2520: 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e 48 65  ->pGroupBy, pnHe
2530: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
2540: 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  tOfExprList(p->p
2550: 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69 67 68  OrderBy, pnHeigh
2560: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
2570: 53 65 6c 65 63 74 28 70 2d 3e 70 50 72 69 6f 72  Select(p->pPrior
2580: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d  , pnHeight);.  }
2590: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
25a0: 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76  e Expr.nHeight v
25b0: 61 72 69 61 62 6c 65 20 69 6e 20 74 68 65 20 73  ariable in the s
25c0: 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
25d0: 61 73 20 61 6e 20 0a 2a 2a 20 61 72 67 75 6d 65  as an .** argume
25e0: 6e 74 2e 20 41 6e 20 65 78 70 72 65 73 73 69 6f  nt. An expressio
25f0: 6e 20 77 69 74 68 20 6e 6f 20 63 68 69 6c 64 72  n with no childr
2600: 65 6e 2c 20 45 78 70 72 2e 70 4c 69 73 74 20 6f  en, Expr.pList o
2610: 72 20 0a 2a 2a 20 45 78 70 72 2e 70 53 65 6c 65  r .** Expr.pSele
2620: 63 74 20 6d 65 6d 62 65 72 20 68 61 73 20 61 20  ct member has a 
2630: 68 65 69 67 68 74 20 6f 66 20 31 2e 20 41 6e 79  height of 1. Any
2640: 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f   other expressio
2650: 6e 0a 2a 2a 20 68 61 73 20 61 20 68 65 69 67 68  n.** has a heigh
2660: 74 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d  t equal to the m
2670: 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66  aximum height of
2680: 20 61 6e 79 20 6f 74 68 65 72 20 0a 2a 2a 20 72   any other .** r
2690: 65 66 65 72 65 6e 63 65 64 20 45 78 70 72 20 70  eferenced Expr p
26a0: 6c 75 73 20 6f 6e 65 2e 0a 2a 2f 0a 73 74 61 74  lus one..*/.stat
26b0: 69 63 20 76 6f 69 64 20 65 78 70 72 53 65 74 48  ic void exprSetH
26c0: 65 69 67 68 74 28 45 78 70 72 20 2a 70 29 7b 0a  eight(Expr *p){.
26d0: 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20    int nHeight = 
26e0: 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70  0;.  heightOfExp
26f0: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 6e 48 65  r(p->pLeft, &nHe
2700: 69 67 68 74 29 3b 0a 20 20 68 65 69 67 68 74 4f  ight);.  heightO
2710: 66 45 78 70 72 28 70 2d 3e 70 52 69 67 68 74 2c  fExpr(p->pRight,
2720: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 69 66   &nHeight);.  if
2730: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
2740: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
2750: 74 29 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74  t) ){.    height
2760: 4f 66 53 65 6c 65 63 74 28 70 2d 3e 78 2e 70 53  OfSelect(p->x.pS
2770: 65 6c 65 63 74 2c 20 26 6e 48 65 69 67 68 74 29  elect, &nHeight)
2780: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 68  ;.  }else{.    h
2790: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
27a0: 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 48 65  p->x.pList, &nHe
27b0: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  ight);.  }.  p->
27c0: 6e 48 65 69 67 68 74 20 3d 20 6e 48 65 69 67 68  nHeight = nHeigh
27d0: 74 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t + 1;.}../*.** 
27e0: 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65  Set the Expr.nHe
27f0: 69 67 68 74 20 76 61 72 69 61 62 6c 65 20 75 73  ight variable us
2800: 69 6e 67 20 74 68 65 20 65 78 70 72 53 65 74 48  ing the exprSetH
2810: 65 69 67 68 74 28 29 20 66 75 6e 63 74 69 6f 6e  eight() function
2820: 2e 20 49 66 0a 2a 2a 20 74 68 65 20 68 65 69 67  . If.** the heig
2830: 68 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ht is greater th
2840: 61 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  an the maximum a
2850: 6c 6c 6f 77 65 64 20 65 78 70 72 65 73 73 69 6f  llowed expressio
2860: 6e 20 64 65 70 74 68 2c 0a 2a 2a 20 6c 65 61 76  n depth,.** leav
2870: 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50  e an error in pP
2880: 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  arse..*/.void sq
2890: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
28a0: 68 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ht(Parse *pParse
28b0: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 65 78  , Expr *p){.  ex
28c0: 70 72 53 65 74 48 65 69 67 68 74 28 70 29 3b 0a  prSetHeight(p);.
28d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65    sqlite3ExprChe
28e0: 63 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c  ckHeight(pParse,
28f0: 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 7d 0a   p->nHeight);.}.
2900: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2910: 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74  e maximum height
2920: 20 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73 69   of any expressi
2930: 6f 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e 63  on tree referenc
2940: 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 65 6c  ed.** by the sel
2950: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61  ect statement pa
2960: 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
2970: 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
2980: 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69  te3SelectExprHei
2990: 67 68 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  ght(Select *p){.
29a0: 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20    int nHeight = 
29b0: 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c  0;.  heightOfSel
29c0: 65 63 74 28 70 2c 20 26 6e 48 65 69 67 68 74 29  ect(p, &nHeight)
29d0: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 48 65 69 67  ;.  return nHeig
29e0: 68 74 3b 0a 7d 0a 23 65 6c 73 65 0a 20 20 23 64  ht;.}.#else.  #d
29f0: 65 66 69 6e 65 20 65 78 70 72 53 65 74 48 65 69  efine exprSetHei
2a00: 67 68 74 28 79 29 0a 23 65 6e 64 69 66 20 2f 2a  ght(y).#endif /*
2a10: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
2a20: 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a  _DEPTH>0 */../*.
2a30: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2a40: 69 73 20 74 68 65 20 63 6f 72 65 20 61 6c 6c 6f  is the core allo
2a50: 63 61 74 6f 72 20 66 6f 72 20 45 78 70 72 20 6e  cator for Expr n
2a60: 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73  odes..**.** Cons
2a70: 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72  truct a new expr
2a80: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64 20  ession node and 
2a90: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
2aa0: 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a   to it.  Memory.
2ab0: 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f 64 65  ** for this node
2ac0: 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70 54 6f   and for the pTo
2ad0: 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ken argument is 
2ae0: 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74  a single allocat
2af0: 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20  ion.** obtained 
2b00: 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61  from sqlite3DbMa
2b10: 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63 61 6c  lloc().  The cal
2b20: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ling function.**
2b30: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
2b40: 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20  for making sure 
2b50: 74 68 65 20 6e 6f 64 65 20 65 76 65 6e 74 75 61  the node eventua
2b60: 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a  lly gets freed..
2b70: 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74 65  **.** If dequote
2b80: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
2b90: 68 65 20 74 6f 6b 65 6e 20 28 69 66 20 69 74 20  he token (if it 
2ba0: 65 78 69 73 74 73 29 20 69 73 20 64 65 71 75 6f  exists) is dequo
2bb0: 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65 71 75 6f  ted..** If dequo
2bc0: 74 65 20 69 73 20 66 61 6c 73 65 2c 20 6e 6f 20  te is false, no 
2bd0: 64 65 71 75 6f 74 69 6e 67 20 69 73 20 70 65 72  dequoting is per
2be0: 66 6f 72 6d 61 6e 63 65 2e 20 20 54 68 65 20 64  formance.  The d
2bf0: 65 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d 65  eQuote.** parame
2c00: 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69  ter is ignored i
2c10: 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c  f pToken is NULL
2c20: 20 6f 72 20 69 66 20 74 68 65 20 74 6f 6b 65 6e   or if the token
2c30: 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70 70   does not.** app
2c40: 65 61 72 20 74 6f 20 62 65 20 71 75 6f 74 65 64  ear to be quoted
2c50: 2e 20 20 49 66 20 74 68 65 20 71 75 6f 74 65 73  .  If the quotes
2c60: 20 77 65 72 65 20 6f 66 20 74 68 65 20 66 6f 72   were of the for
2c70: 6d 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65 2d  m "..." (double-
2c80: 71 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e 20  quotes).** then 
2c90: 74 68 65 20 45 50 5f 44 62 6c 51 75 6f 74 65 64  the EP_DblQuoted
2ca0: 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20   flag is set on 
2cb0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  the expression n
2cc0: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69  ode..**.** Speci
2cd0: 61 6c 20 63 61 73 65 3a 20 20 49 66 20 6f 70 3d  al case:  If op=
2ce0: 3d 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64 20  =TK_INTEGER and 
2cf0: 70 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74 6f  pToken points to
2d00: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 0a 2a   a string that.*
2d10: 2a 20 63 61 6e 20 62 65 20 74 72 61 6e 73 6c 61  * can be transla
2d20: 74 65 64 20 69 6e 74 6f 20 61 20 33 32 2d 62 69  ted into a 32-bi
2d30: 74 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20  t integer, then 
2d40: 74 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f 74  the token is not
2d50: 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 75 2e  .** stored in u.
2d60: 7a 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61 64  zToken.  Instead
2d70: 2c 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61  , the integer va
2d80: 6c 75 65 73 20 69 73 20 77 72 69 74 74 65 6e 0a  lues is written.
2d90: 2a 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75 65  ** into u.iValue
2da0: 20 61 6e 64 20 74 68 65 20 45 50 5f 49 6e 74 56   and the EP_IntV
2db0: 61 6c 75 65 20 66 6c 61 67 20 69 73 20 73 65 74  alue flag is set
2dc0: 2e 20 20 4e 6f 20 65 78 74 72 61 20 73 74 6f 72  .  No extra stor
2dd0: 61 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63 61  age.** is alloca
2de0: 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ted to hold the 
2df0: 69 6e 74 65 67 65 72 20 74 65 78 74 20 61 6e 64  integer text and
2e00: 20 74 68 65 20 64 65 71 75 6f 74 65 20 66 6c 61   the dequote fla
2e10: 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f  g is ignored..*/
2e20: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
2e30: 70 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69 74  prAlloc(.  sqlit
2e40: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
2e50: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72     /* Handle for
2e60: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
2e70: 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65 20 6e  Zero() (may be n
2e80: 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  ull) */.  int op
2e90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2ea0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
2eb0: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73  opcode */.  cons
2ec0: 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c  t Token *pToken,
2ed0: 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67      /* Token arg
2ee0: 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20 62 65  ument.  Might be
2ef0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 64   NULL */.  int d
2f00: 65 71 75 6f 74 65 20 20 20 20 20 20 20 20 20 20  equote          
2f10: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65     /* True to de
2f20: 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20 20 45 78  quote */.){.  Ex
2f30: 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  pr *pNew;.  int 
2f40: 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 69 6e  nExtra = 0;.  in
2f50: 74 20 69 56 61 6c 75 65 20 3d 20 30 3b 0a 0a 20  t iValue = 0;.. 
2f60: 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20   if( pToken ){. 
2f70: 20 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e     if( op!=TK_IN
2f80: 54 45 47 45 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d  TEGER || pToken-
2f90: 3e 7a 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  >z==0.          
2fa0: 7c 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74  || sqlite3GetInt
2fb0: 33 32 28 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69  32(pToken->z, &i
2fc0: 56 61 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20  Value)==0 ){.   
2fd0: 20 20 20 6e 45 78 74 72 61 20 3d 20 70 54 6f 6b     nExtra = pTok
2fe0: 65 6e 2d 3e 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20  en->n+1;.    }. 
2ff0: 20 7d 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69   }.  pNew = sqli
3000: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
3010: 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29  db, sizeof(Expr)
3020: 2b 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20  +nExtra);.  if( 
3030: 70 4e 65 77 20 29 7b 0a 20 20 20 20 70 4e 65 77  pNew ){.    pNew
3040: 2d 3e 6f 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20  ->op = (u8)op;. 
3050: 20 20 20 70 4e 65 77 2d 3e 69 41 67 67 20 3d 20     pNew->iAgg = 
3060: 2d 31 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 6b  -1;.    if( pTok
3070: 65 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  en ){.      if( 
3080: 6e 45 78 74 72 61 3d 3d 30 20 29 7b 0a 20 20 20  nExtra==0 ){.   
3090: 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73       pNew->flags
30a0: 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b   |= EP_IntValue;
30b0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
30c0: 2e 69 56 61 6c 75 65 20 3d 20 69 56 61 6c 75 65  .iValue = iValue
30d0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
30e0: 20 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20         int c;.  
30f0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54        pNew->u.zT
3100: 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 70  oken = (char*)&p
3110: 4e 65 77 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20  New[1];.        
3120: 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 75 2e 7a  memcpy(pNew->u.z
3130: 54 6f 6b 65 6e 2c 20 70 54 6f 6b 65 6e 2d 3e 7a  Token, pToken->z
3140: 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20  , pToken->n);.  
3150: 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54        pNew->u.zT
3160: 6f 6b 65 6e 5b 70 54 6f 6b 65 6e 2d 3e 6e 5d 20  oken[pToken->n] 
3170: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 0;.        if(
3180: 20 64 65 71 75 6f 74 65 20 26 26 20 6e 45 78 74   dequote && nExt
3190: 72 61 3e 3d 33 20 0a 20 20 20 20 20 20 20 20 20  ra>=3 .         
31a0: 20 20 20 20 26 26 20 28 28 63 20 3d 20 70 54 6f      && ((c = pTo
31b0: 6b 65 6e 2d 3e 7a 5b 30 5d 29 3d 3d 27 5c 27 27  ken->z[0])=='\''
31c0: 20 7c 7c 20 63 3d 3d 27 22 27 20 7c 7c 20 63 3d   || c=='"' || c=
31d0: 3d 27 5b 27 20 7c 7c 20 63 3d 3d 27 60 27 29 20  ='[' || c=='`') 
31e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
31f0: 69 74 65 33 44 65 71 75 6f 74 65 28 70 4e 65 77  ite3Dequote(pNew
3200: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
3210: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 22         if( c=='"
3220: 27 20 29 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20  ' ) pNew->flags 
3230: 7c 3d 20 45 50 5f 44 62 6c 51 75 6f 74 65 64 3b  |= EP_DblQuoted;
3240: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
3250: 20 7d 0a 20 20 20 20 7d 0a 23 69 66 20 53 51 4c   }.    }.#if SQL
3260: 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
3270: 54 48 3e 30 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  TH>0.    pNew->n
3280: 48 65 69 67 68 74 20 3d 20 31 3b 0a 23 65 6e 64  Height = 1;.#end
3290: 69 66 20 20 0a 20 20 7d 0a 20 20 72 65 74 75 72  if  .  }.  retur
32a0: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
32b0: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
32c0: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
32d0: 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 74 65 72 6d  from a zero-term
32e0: 69 6e 61 74 65 64 20 74 6f 6b 65 6e 20 74 68 61  inated token tha
32f0: 74 20 68 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79  t has.** already
3300: 20 62 65 65 6e 20 64 65 71 75 6f 74 65 64 2e 0a   been dequoted..
3310: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
3320: 45 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20  Expr(.  sqlite3 
3330: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
3340: 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 73 71  /* Handle for sq
3350: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
3360: 6f 28 29 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c  o() (may be null
3370: 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  ) */.  int op,  
3380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3390: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63  * Expression opc
33a0: 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ode */.  const c
33b0: 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 20 20 20 20  har *zToken     
33c0: 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65   /* Token argume
33d0: 6e 74 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55  nt.  Might be NU
33e0: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e  LL */.){.  Token
33f0: 20 78 3b 0a 20 20 78 2e 7a 20 3d 20 7a 54 6f 6b   x;.  x.z = zTok
3400: 65 6e 3b 0a 20 20 78 2e 6e 20 3d 20 7a 54 6f 6b  en;.  x.n = zTok
3410: 65 6e 20 3f 20 73 71 6c 69 74 65 33 53 74 72 6c  en ? sqlite3Strl
3420: 65 6e 33 30 28 7a 54 6f 6b 65 6e 29 20 3a 20 30  en30(zToken) : 0
3430: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
3440: 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20  e3ExprAlloc(db, 
3450: 6f 70 2c 20 26 78 2c 20 30 29 3b 0a 7d 0a 0a 2f  op, &x, 0);.}../
3460: 2a 0a 2a 2a 20 41 74 74 61 63 68 20 73 75 62 74  *.** Attach subt
3470: 72 65 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70  rees pLeft and p
3480: 52 69 67 68 74 20 74 6f 20 74 68 65 20 45 78 70  Right to the Exp
3490: 72 20 6e 6f 64 65 20 70 52 6f 6f 74 2e 0a 2a 2a  r node pRoot..**
34a0: 0a 2a 2a 20 49 66 20 70 52 6f 6f 74 3d 3d 4e 55  .** If pRoot==NU
34b0: 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  LL that means th
34c0: 61 74 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  at a memory allo
34d0: 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73  cation error has
34e0: 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20 49 6e   occurred..** In
34f0: 20 74 68 61 74 20 63 61 73 65 2c 20 64 65 6c 65   that case, dele
3500: 74 65 20 74 68 65 20 73 75 62 74 72 65 65 73 20  te the subtrees 
3510: 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74  pLeft and pRight
3520: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3530: 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72  3ExprAttachSubtr
3540: 65 65 73 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ees(.  sqlite3 *
3550: 64 62 2c 0a 20 20 45 78 70 72 20 2a 70 52 6f 6f  db,.  Expr *pRoo
3560: 74 2c 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74  t,.  Expr *pLeft
3570: 2c 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74  ,.  Expr *pRight
3580: 0a 29 7b 0a 20 20 69 66 28 20 70 52 6f 6f 74 3d  .){.  if( pRoot=
3590: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
35a0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
35b0: 65 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ed );.    sqlite
35c0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
35d0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69  pLeft);.    sqli
35e0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
35f0: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c  , pRight);.  }el
3600: 73 65 7b 0a 20 20 20 20 69 66 28 20 70 52 69 67  se{.    if( pRig
3610: 68 74 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f  ht ){.      pRoo
3620: 74 2d 3e 70 52 69 67 68 74 20 3d 20 70 52 69 67  t->pRight = pRig
3630: 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52  ht;.      if( pR
3640: 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45 50  ight->flags & EP
3650: 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20  _ExpCollate ){. 
3660: 20 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c         pRoot->fl
3670: 61 67 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c  ags |= EP_ExpCol
3680: 6c 61 74 65 3b 0a 20 20 20 20 20 20 20 20 70 52  late;.        pR
3690: 6f 6f 74 2d 3e 70 43 6f 6c 6c 20 3d 20 70 52 69  oot->pColl = pRi
36a0: 67 68 74 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20  ght->pColl;.    
36b0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
36c0: 28 20 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20  ( pLeft ){.     
36d0: 20 70 52 6f 6f 74 2d 3e 70 4c 65 66 74 20 3d 20   pRoot->pLeft = 
36e0: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 69 66 28  pLeft;.      if(
36f0: 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20   pLeft->flags & 
3700: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b  EP_ExpCollate ){
3710: 0a 20 20 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e  .        pRoot->
3720: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78 70 43  flags |= EP_ExpC
3730: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 20 20  ollate;.        
3740: 70 52 6f 6f 74 2d 3e 70 43 6f 6c 6c 20 3d 20 70  pRoot->pColl = p
3750: 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20  Left->pColl;.   
3760: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 65     }.    }.    e
3770: 78 70 72 53 65 74 48 65 69 67 68 74 28 70 52 6f  xprSetHeight(pRo
3780: 6f 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ot);.  }.}../*.*
3790: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 45 78 70  * Allocate a Exp
37a0: 72 20 6e 6f 64 65 20 77 68 69 63 68 20 6a 6f 69  r node which joi
37b0: 6e 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74 77  ns as many as tw
37c0: 6f 20 73 75 62 74 72 65 65 73 2e 0a 2a 2a 0a 2a  o subtrees..**.*
37d0: 2a 20 4f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66  * One or both of
37e0: 20 74 68 65 20 73 75 62 74 72 65 65 73 20 63 61   the subtrees ca
37f0: 6e 20 62 65 20 4e 55 4c 4c 2e 20 20 52 65 74 75  n be NULL.  Retu
3800: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
3810: 74 68 65 20 6e 65 77 0a 2a 2a 20 45 78 70 72 20  the new.** Expr 
3820: 6e 6f 64 65 2e 20 20 4f 72 2c 20 69 66 20 61 6e  node.  Or, if an
3830: 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72   OOM error occur
3840: 73 2c 20 73 65 74 20 70 50 61 72 73 65 2d 3e 64  s, set pParse->d
3850: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2c  b->mallocFailed,
3860: 0a 2a 2a 20 66 72 65 65 20 74 68 65 20 73 75 62  .** free the sub
3870: 74 72 65 65 73 20 61 6e 64 20 72 65 74 75 72 6e  trees and return
3880: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45 78 70 72 20 2a   NULL..*/.Expr *
3890: 73 71 6c 69 74 65 33 50 45 78 70 72 28 0a 20 20  sqlite3PExpr(.  
38a0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
38b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
38c0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
38d0: 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
38e0: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
38f0: 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a  ssion opcode */.
3900: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20    Expr *pLeft,  
3910: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66            /* Lef
3920: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45  t operand */.  E
3930: 78 70 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20  xpr *pRight,    
3940: 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20         /* Right 
3950: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e  operand */.  con
3960: 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  st Token *pToken
3970: 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
3980: 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a 20 20 45   token */.){.  E
3990: 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  xpr *p = sqlite3
39a0: 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65  ExprAlloc(pParse
39b0: 2d 3e 64 62 2c 20 6f 70 2c 20 70 54 6f 6b 65 6e  ->db, op, pToken
39c0: 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  , 1);.  sqlite3E
39d0: 78 70 72 41 74 74 61 63 68 53 75 62 74 72 65 65  xprAttachSubtree
39e0: 73 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2c  s(pParse->db, p,
39f0: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b   pLeft, pRight);
3a00: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
3a10: 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f 20 65  /*.** Join two e
3a20: 78 70 72 65 73 73 69 6f 6e 73 20 75 73 69 6e 67  xpressions using
3a30: 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   an AND operator
3a40: 2e 20 20 49 66 20 65 69 74 68 65 72 20 65 78 70  .  If either exp
3a50: 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 4e 55  ression is.** NU
3a60: 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65  LL, then just re
3a70: 74 75 72 6e 20 74 68 65 20 6f 74 68 65 72 20 65  turn the other e
3a80: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 45 78  xpression..*/.Ex
3a90: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41  pr *sqlite3ExprA
3aa0: 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  nd(sqlite3 *db, 
3ab0: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70  Expr *pLeft, Exp
3ac0: 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69 66  r *pRight){.  if
3ad0: 28 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20  ( pLeft==0 ){.  
3ae0: 20 20 72 65 74 75 72 6e 20 70 52 69 67 68 74 3b    return pRight;
3af0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69  .  }else if( pRi
3b00: 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ght==0 ){.    re
3b10: 74 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65  turn pLeft;.  }e
3b20: 6c 73 65 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  lse{.    Expr *p
3b30: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
3b40: 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 41 4e  rAlloc(db, TK_AN
3b50: 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  D, 0, 0);.    sq
3b60: 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53  lite3ExprAttachS
3b70: 75 62 74 72 65 65 73 28 64 62 2c 20 70 4e 65 77  ubtrees(db, pNew
3b80: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29  , pLeft, pRight)
3b90: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4e 65  ;.    return pNe
3ba0: 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  w;.  }.}../*.** 
3bb0: 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20  Construct a new 
3bc0: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
3bd0: 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 77  for a function w
3be0: 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  ith multiple.** 
3bf0: 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78  arguments..*/.Ex
3c00: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 46  pr *sqlite3ExprF
3c10: 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  unction(Parse *p
3c20: 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74 20  Parse, ExprList 
3c30: 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
3c40: 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a  Token){.  Expr *
3c50: 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74 65 33 20  pNew;.  sqlite3 
3c60: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
3c70: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b  ;.  assert( pTok
3c80: 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  en );.  pNew = s
3c90: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
3ca0: 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 2c  db, TK_FUNCTION,
3cb0: 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20 69   pToken, 1);.  i
3cc0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
3cd0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
3ce0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
3cf0: 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6d 65 6d  t); /* Avoid mem
3d00: 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e 20 6d 61  ory leak when ma
3d10: 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20  lloc fails */.  
3d20: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
3d30: 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20    pNew->x.pList 
3d40: 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73 73 65 72  = pList;.  asser
3d50: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
3d60: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49 73  rty(pNew, EP_xIs
3d70: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 73 71 6c  Select) );.  sql
3d80: 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68  ite3ExprSetHeigh
3d90: 74 28 70 50 61 72 73 65 2c 20 70 4e 65 77 29 3b  t(pParse, pNew);
3da0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
3db0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20  }../*.** Assign 
3dc0: 61 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  a variable numbe
3dd0: 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69  r to an expressi
3de0: 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64 65 73 20  on that encodes 
3df0: 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69 6e  a wildcard.** in
3e00: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51   the original SQ
3e10: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a 2a  L statement.  .*
3e20: 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 63  *.** Wildcards c
3e30: 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73  onsisting of a s
3e40: 69 6e 67 6c 65 20 22 3f 22 20 61 72 65 20 61 73  ingle "?" are as
3e50: 73 69 67 6e 65 64 20 74 68 65 20 6e 65 78 74 20  signed the next 
3e60: 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a 20 76 61  sequential.** va
3e70: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 2e 0a 2a  riable number..*
3e80: 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f  *.** Wildcards o
3e90: 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e  f the form "?nnn
3ea0: 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  " are assigned t
3eb0: 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e 6e 22 2e  he number "nnn".
3ec0: 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20 73 75 72    We make.** sur
3ed0: 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f 74 20 74  e "nnn" is not t
3ee0: 6f 6f 20 62 65 20 74 6f 20 61 76 6f 69 64 20 61  oo be to avoid a
3ef0: 20 64 65 6e 69 61 6c 20 6f 66 20 73 65 72 76 69   denial of servi
3f00: 63 65 20 61 74 74 61 63 6b 20 77 68 65 6e 0a 2a  ce attack when.*
3f10: 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  * the SQL statem
3f20: 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20 61  ent comes from a
3f30: 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f 75 72 63  n external sourc
3f40: 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72  e..**.** Wildcar
3f50: 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ds of the form "
3f60: 3a 61 61 61 22 2c 20 22 40 61 61 61 22 2c 20 6f  :aaa", "@aaa", o
3f70: 72 20 22 24 61 61 61 22 20 61 72 65 20 61 73 73  r "$aaa" are ass
3f80: 69 67 6e 65 64 20 74 68 65 20 73 61 6d 65 20 6e  igned the same n
3f90: 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68 65 20  umber.** as the 
3fa0: 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61 6e 63  previous instanc
3fb0: 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 77 69  e of the same wi
3fc0: 6c 64 63 61 72 64 2e 20 20 4f 72 20 69 66 20 74  ldcard.  Or if t
3fd0: 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
3fe0: 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  .** instance of 
3ff0: 74 68 65 20 77 69 6c 64 63 61 72 64 2c 20 74 68  the wildcard, th
4000: 65 20 6e 65 78 74 20 73 65 71 75 65 6e 69 61 6c  e next sequenial
4010: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
4020: 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65 64 2e   is.** assigned.
4030: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4040: 45 78 70 72 41 73 73 69 67 6e 56 61 72 4e 75 6d  ExprAssignVarNum
4050: 62 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ber(Parse *pPars
4060: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
4070: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
4080: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 63   pParse->db;.  c
4090: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 0a 20  onst char *z;.. 
40a0: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
40b0: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
40c0: 28 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f  ( !ExprHasAnyPro
40d0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
40e0: 49 6e 74 56 61 6c 75 65 7c 45 50 5f 52 65 64 75  IntValue|EP_Redu
40f0: 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ced|EP_TokenOnly
4100: 29 20 29 3b 0a 20 20 7a 20 3d 20 70 45 78 70 72  ) );.  z = pExpr
4110: 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 61 73  ->u.zToken;.  as
4120: 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20  sert( z!=0 );.  
4130: 61 73 73 65 72 74 28 20 7a 5b 30 5d 21 3d 30 20  assert( z[0]!=0 
4140: 29 3b 0a 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 30  );.  if( z[1]==0
4150: 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63   ){.    /* Wildc
4160: 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ard of the form 
4170: 22 3f 22 2e 20 20 41 73 73 69 67 6e 20 74 68 65  "?".  Assign the
4180: 20 6e 65 78 74 20 76 61 72 69 61 62 6c 65 20 6e   next variable n
4190: 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 61 73 73  umber */.    ass
41a0: 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29  ert( z[0]=='?' )
41b0: 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f  ;.    pExpr->iCo
41c0: 6c 75 6d 6e 20 3d 20 28 79 6e 56 61 72 29 28 2b  lumn = (ynVar)(+
41d0: 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a  +pParse->nVar);.
41e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 30 5d    }else if( z[0]
41f0: 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 2f 2a 20  =='?' ){.    /* 
4200: 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20  Wildcard of the 
4210: 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f  form "?nnn".  Co
4220: 6e 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61  nvert "nnn" to a
4230: 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 0a 20 20  n integer and.  
4240: 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20 74    ** use it as t
4250: 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  he variable numb
4260: 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 20  er */.    int i 
4270: 3d 20 61 74 6f 69 28 28 63 68 61 72 2a 29 26 7a  = atoi((char*)&z
4280: 5b 31 5d 29 3b 0a 20 20 20 20 70 45 78 70 72 2d  [1]);.    pExpr-
4290: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56 61  >iColumn = (ynVa
42a0: 72 29 69 3b 0a 20 20 20 20 74 65 73 74 63 61 73  r)i;.    testcas
42b0: 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 74  e( i==0 );.    t
42c0: 65 73 74 63 61 73 65 28 20 69 3d 3d 31 20 29 3b  estcase( i==1 );
42d0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69  .    testcase( i
42e0: 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ==db->aLimit[SQL
42f0: 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
4300: 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31 20 29 3b 0a  LE_NUMBER]-1 );.
4310: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d      testcase( i=
4320: 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  =db->aLimit[SQLI
4330: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
4340: 45 5f 4e 55 4d 42 45 52 5d 20 29 3b 0a 20 20 20  E_NUMBER] );.   
4350: 20 69 66 28 20 69 3c 31 20 7c 7c 20 69 3e 64 62   if( i<1 || i>db
4360: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
4370: 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
4380: 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 20 20  UMBER] ){.      
4390: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
43a0: 70 50 61 72 73 65 2c 20 22 76 61 72 69 61 62 6c  pParse, "variabl
43b0: 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 62 65  e number must be
43c0: 20 62 65 74 77 65 65 6e 20 3f 31 20 61 6e 64 20   between ?1 and 
43d0: 3f 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ?%d",.          
43e0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
43f0: 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
4400: 5f 4e 55 4d 42 45 52 5d 29 3b 0a 20 20 20 20 7d  _NUMBER]);.    }
4410: 0a 20 20 20 20 69 66 28 20 69 3e 70 50 61 72 73  .    if( i>pPars
4420: 65 2d 3e 6e 56 61 72 20 29 7b 0a 20 20 20 20 20  e->nVar ){.     
4430: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20   pParse->nVar = 
4440: 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  i;.    }.  }else
4450: 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72  {.    /* Wildcar
4460: 64 73 20 6c 69 6b 65 20 22 3a 61 61 61 22 2c 20  ds like ":aaa", 
4470: 22 24 61 61 61 22 20 6f 72 20 22 40 61 61 61 22  "$aaa" or "@aaa"
4480: 2e 20 20 52 65 75 73 65 20 74 68 65 20 73 61 6d  .  Reuse the sam
4490: 65 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a  e variable.    *
44a0: 2a 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20  * number as the 
44b0: 70 72 69 6f 72 20 61 70 70 65 61 72 61 6e 63 65  prior appearance
44c0: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d   of the same nam
44d0: 65 2c 20 6f 72 20 69 66 20 74 68 65 20 6e 61 6d  e, or if the nam
44e0: 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 65 76  e.    ** has nev
44f0: 65 72 20 61 70 70 65 61 72 65 64 20 62 65 66 6f  er appeared befo
4500: 72 65 2c 20 72 65 75 73 65 20 74 68 65 20 73 61  re, reuse the sa
4510: 6d 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  me variable numb
4520: 65 72 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  er.    */.    in
4530: 74 20 69 3b 0a 20 20 20 20 75 33 32 20 6e 3b 0a  t i;.    u32 n;.
4540: 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53      n = sqlite3S
4550: 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20  trlen30(z);.    
4560: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
4570: 65 2d 3e 6e 56 61 72 45 78 70 72 3b 20 69 2b 2b  e->nVarExpr; i++
4580: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
4590: 45 20 3d 20 70 50 61 72 73 65 2d 3e 61 70 56 61  E = pParse->apVa
45a0: 72 45 78 70 72 5b 69 5d 3b 0a 20 20 20 20 20 20  rExpr[i];.      
45b0: 61 73 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b  assert( pE!=0 );
45c0: 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  .      if( memcm
45d0: 70 28 70 45 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  p(pE->u.zToken, 
45e0: 7a 2c 20 6e 29 3d 3d 30 20 26 26 20 70 45 2d 3e  z, n)==0 && pE->
45f0: 75 2e 7a 54 6f 6b 65 6e 5b 6e 5d 3d 3d 30 20 29  u.zToken[n]==0 )
4600: 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  {.        pExpr-
4610: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 2d 3e 69  >iColumn = pE->i
4620: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
4630: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
4640: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d     }.    if( i>=
4650: 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72  pParse->nVarExpr
4660: 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   ){.      pExpr-
4670: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56 61  >iColumn = (ynVa
4680: 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61  r)(++pParse->nVa
4690: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  r);.      if( pP
46a0: 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 3e 3d  arse->nVarExpr>=
46b0: 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72  pParse->nVarExpr
46c0: 41 6c 6c 6f 63 2d 31 20 29 7b 0a 20 20 20 20 20  Alloc-1 ){.     
46d0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45     pParse->nVarE
46e0: 78 70 72 41 6c 6c 6f 63 20 2b 3d 20 70 50 61 72  xprAlloc += pPar
46f0: 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f  se->nVarExprAllo
4700: 63 20 2b 20 31 30 3b 0a 20 20 20 20 20 20 20 20  c + 10;.        
4710: 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70  pParse->apVarExp
4720: 72 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  r =.            
4730: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
4740: 4f 72 46 72 65 65 28 0a 20 20 20 20 20 20 20 20  OrFree(.        
4750: 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20        db,.      
4760: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
4770: 61 70 56 61 72 45 78 70 72 2c 0a 20 20 20 20 20  apVarExpr,.     
4780: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
4790: 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 2a 73  >nVarExprAlloc*s
47a0: 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61 70  izeof(pParse->ap
47b0: 56 61 72 45 78 70 72 5b 30 5d 29 0a 20 20 20 20  VarExpr[0]).    
47c0: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
47d0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 64 62   }.      if( !db
47e0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
47f0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
4800: 28 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45  ( pParse->apVarE
4810: 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  xpr!=0 );.      
4820: 20 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45    pParse->apVarE
4830: 78 70 72 5b 70 50 61 72 73 65 2d 3e 6e 56 61 72  xpr[pParse->nVar
4840: 45 78 70 72 2b 2b 5d 20 3d 20 70 45 78 70 72 3b  Expr++] = pExpr;
4850: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4860: 20 7d 20 0a 20 20 69 66 28 20 21 70 50 61 72 73   } .  if( !pPars
4870: 65 2d 3e 6e 45 72 72 20 26 26 20 70 50 61 72 73  e->nErr && pPars
4880: 65 2d 3e 6e 56 61 72 3e 64 62 2d 3e 61 4c 69 6d  e->nVar>db->aLim
4890: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
48a0: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
48b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
48c0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
48d0: 22 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61  "too many SQL va
48e0: 72 69 61 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d  riables");.  }.}
48f0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76  ../*.** Recursiv
4900: 65 6c 79 20 64 65 6c 65 74 65 20 61 6e 20 65 78  ely delete an ex
4910: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a  pression tree..*
4920: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
4930: 70 72 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  prDelete(sqlite3
4940: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a   *db, Expr *p){.
4950: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
4960: 75 72 6e 3b 0a 20 20 69 66 28 20 21 45 78 70 72  urn;.  if( !Expr
4970: 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
4980: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  , EP_TokenOnly) 
4990: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
49a0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
49b0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69  pLeft);.    sqli
49c0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
49d0: 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  , p->pRight);.  
49e0: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
49f0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64  operty(p, EP_Red
4a00: 75 63 65 64 29 20 26 26 20 28 70 2d 3e 66 6c 61  uced) && (p->fla
4a10: 67 73 32 20 26 20 45 50 32 5f 4d 61 6c 6c 6f 63  gs2 & EP2_Malloc
4a20: 65 64 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20  edToken)!=0 ){. 
4a30: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
4a40: 65 65 28 64 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b  ee(db, p->u.zTok
4a50: 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  en);.    }.    i
4a60: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
4a70: 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
4a80: 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ct) ){.      sql
4a90: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
4aa0: 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63  (db, p->x.pSelec
4ab0: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
4ac0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
4ad0: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
4ae0: 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
4af0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21 45 78 70  }.  }.  if( !Exp
4b00: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
4b10: 45 50 5f 53 74 61 74 69 63 29 20 29 7b 0a 20 20  EP_Static) ){.  
4b20: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4b30: 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  db, p);.  }.}../
4b40: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
4b50: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
4b60: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
4b70: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73 74 72  e expression str
4b80: 75 63 74 75 72 65 20 0a 2a 2a 20 70 61 73 73 65  ucture .** passe
4b90: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
4ba0: 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 20 69 73  rgument. This is
4bb0: 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 20 45   always one of E
4bc0: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a  XPR_FULLSIZE,.**
4bd0: 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a   EXPR_REDUCEDSIZ
4be0: 45 20 6f 72 20 45 58 50 52 5f 54 4f 4b 45 4e 4f  E or EXPR_TOKENO
4bf0: 4e 4c 59 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74  NLYSIZE..*/.stat
4c00: 69 63 20 69 6e 74 20 65 78 70 72 53 74 72 75 63  ic int exprStruc
4c10: 74 53 69 7a 65 28 45 78 70 72 20 2a 70 29 7b 0a  tSize(Expr *p){.
4c20: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
4c30: 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65  perty(p, EP_Toke
4c40: 6e 4f 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20  nOnly) ) return 
4c50: 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49  EXPR_TOKENONLYSI
4c60: 5a 45 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61  ZE;.  if( ExprHa
4c70: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
4c80: 52 65 64 75 63 65 64 29 20 29 20 72 65 74 75 72  Reduced) ) retur
4c90: 6e 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49  n EXPR_REDUCEDSI
4ca0: 5a 45 3b 0a 20 20 72 65 74 75 72 6e 20 45 58 50  ZE;.  return EXP
4cb0: 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f  R_FULLSIZE;.}../
4cc0: 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78  *.** The dupedEx
4cd0: 70 72 2a 53 69 7a 65 28 29 20 72 6f 75 74 69 6e  pr*Size() routin
4ce0: 65 73 20 65 61 63 68 20 72 65 74 75 72 6e 20 74  es each return t
4cf0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
4d00: 65 73 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74  es required.** t
4d10: 6f 20 73 74 6f 72 65 20 61 20 63 6f 70 79 20 6f  o store a copy o
4d20: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
4d30: 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  or expression tr
4d40: 65 65 2e 20 20 54 68 65 79 20 64 69 66 66 65 72  ee.  They differ
4d50: 20 69 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63 68 20   in.** how much 
4d60: 6f 66 20 74 68 65 20 74 72 65 65 20 69 73 20 6d  of the tree is m
4d70: 65 61 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  easured..**.**  
4d80: 20 20 20 64 75 70 65 64 45 78 70 72 53 74 72 75     dupedExprStru
4d90: 63 74 53 69 7a 65 28 29 20 20 20 20 20 53 69 7a  ctSize()     Siz
4da0: 65 20 6f 66 20 6f 6e 6c 79 20 74 68 65 20 45 78  e of only the Ex
4db0: 70 72 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a  pr structure .**
4dc0: 20 20 20 20 20 64 75 70 65 64 45 78 70 72 4e 6f       dupedExprNo
4dd0: 64 65 53 69 7a 65 28 29 20 20 20 20 20 20 20 53  deSize()       S
4de0: 69 7a 65 20 6f 66 20 45 78 70 72 20 2b 20 73 70  ize of Expr + sp
4df0: 61 63 65 20 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a  ace for token.**
4e00: 20 20 20 20 20 64 75 70 65 64 45 78 70 72 53 69       dupedExprSi
4e10: 7a 65 28 29 20 20 20 20 20 20 20 20 20 20 20 45  ze()           E
4e20: 78 70 72 20 2b 20 74 6f 6b 65 6e 20 2b 20 73 75  xpr + token + su
4e30: 62 74 72 65 65 20 63 6f 6d 70 6f 6e 65 6e 74 73  btree components
4e40: 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
4e50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4e60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4e70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4e80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
4e90: 2a 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45  **.** The dupedE
4ea0: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20  xprStructSize() 
4eb0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
4ec0: 20 74 77 6f 20 76 61 6c 75 65 73 20 4f 52 2d 65   two values OR-e
4ed0: 64 20 74 6f 67 65 74 68 65 72 3a 20 20 0a 2a 2a  d together:  .**
4ee0: 20 28 31 29 20 74 68 65 20 73 70 61 63 65 20 72   (1) the space r
4ef0: 65 71 75 69 72 65 64 20 66 6f 72 20 61 20 63 6f  equired for a co
4f00: 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 20 73  py of the Expr s
4f10: 74 72 75 63 74 75 72 65 20 6f 6e 6c 79 20 61 6e  tructure only an
4f20: 64 20 0a 2a 2a 20 28 32 29 20 74 68 65 20 45 50  d .** (2) the EP
4f30: 5f 78 78 78 20 66 6c 61 67 73 20 74 68 61 74 20  _xxx flags that 
4f40: 69 6e 64 69 63 61 74 65 20 77 68 61 74 20 74 68  indicate what th
4f50: 65 20 73 74 72 75 63 74 75 72 65 20 73 69 7a 65  e structure size
4f60: 20 73 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a 20 54   should be..** T
4f70: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73  he return values
4f80: 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f   is always one o
4f90: 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 45 58  f:.**.**      EX
4fa0: 50 52 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20  PR_FULLSIZE.**  
4fb0: 20 20 20 20 45 58 50 52 5f 52 45 44 55 43 45 44      EXPR_REDUCED
4fc0: 53 49 5a 45 20 20 20 7c 20 45 50 5f 52 65 64 75  SIZE   | EP_Redu
4fd0: 63 65 64 0a 2a 2a 20 20 20 20 20 20 45 58 50 52  ced.**      EXPR
4fe0: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c  _TOKENONLYSIZE |
4ff0: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a   EP_TokenOnly.**
5000: 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20  .** The size of 
5010: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 63 61  the structure ca
5020: 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61  n be found by ma
5030: 73 6b 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e  sking the return
5040: 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 69   value.** of thi
5050: 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 30  s routine with 0
5060: 78 66 66 66 2e 20 20 54 68 65 20 66 6c 61 67 73  xfff.  The flags
5070: 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79   can be found by
5080: 20 6d 61 73 6b 69 6e 67 20 74 68 65 0a 2a 2a 20   masking the.** 
5090: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 77 69 74  return value wit
50a0: 68 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f  h EP_Reduced|EP_
50b0: 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a  TokenOnly..**.**
50c0: 20 4e 6f 74 65 20 74 68 61 74 20 77 69 74 68 20   Note that with 
50d0: 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52  flags==EXPRDUP_R
50e0: 45 44 55 43 45 2c 20 74 68 69 73 20 72 6f 75 74  EDUCE, this rout
50f0: 69 6e 65 73 20 77 6f 72 6b 73 20 6f 6e 20 66 75  ines works on fu
5100: 6c 6c 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e 72 65  ll-size.** (unre
5110: 64 75 63 65 64 29 20 45 78 70 72 20 6f 62 6a 65  duced) Expr obje
5120: 63 74 73 20 61 73 20 74 68 65 79 20 6f 72 20 6f  cts as they or o
5130: 72 69 67 69 6e 61 6c 6c 79 20 63 6f 6e 73 74 72  riginally constr
5140: 75 63 74 65 64 20 62 79 20 74 68 65 20 70 61 72  ucted by the par
5150: 73 65 72 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 65  ser..** During e
5160: 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73  xpression analys
5170: 69 73 2c 20 65 78 74 72 61 20 69 6e 66 6f 72 6d  is, extra inform
5180: 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70 75 74 65  ation is compute
5190: 64 20 61 6e 64 20 6d 6f 76 65 64 20 69 6e 74 6f  d and moved into
51a0: 0a 2a 2a 20 6c 61 74 65 72 20 70 61 72 74 73 20  .** later parts 
51b0: 6f 66 20 74 65 68 20 45 78 70 72 20 6f 62 6a 65  of teh Expr obje
51c0: 63 74 20 61 6e 64 20 74 68 61 74 20 65 78 74 72  ct and that extr
51d0: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6d 69  a information mi
51e0: 67 68 74 20 67 65 74 20 63 68 6f 70 70 65 64 0a  ght get chopped.
51f0: 2a 2a 20 6f 66 66 20 69 66 20 74 68 65 20 65 78  ** off if the ex
5200: 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65 64 75  pression is redu
5210: 63 65 64 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20  ced.  Note also 
5220: 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74  that it does not
5230: 20 77 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65   work to.** make
5240: 20 61 20 45 58 50 52 44 55 50 5f 52 45 44 55 43   a EXPRDUP_REDUC
5250: 45 20 63 6f 70 79 20 6f 66 20 61 20 72 65 64 75  E copy of a redu
5260: 63 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  ced expression. 
5270: 20 49 74 20 69 73 20 6f 6e 6c 79 20 6c 65 67 61   It is only lega
5280: 6c 0a 2a 2a 20 74 6f 20 72 65 64 75 63 65 20 61  l.** to reduce a
5290: 20 70 72 69 73 74 69 6e 65 20 65 78 70 72 65 73   pristine expres
52a0: 73 69 6f 6e 20 74 72 65 65 20 66 72 6f 6d 20 74  sion tree from t
52b0: 68 65 20 70 61 72 73 65 72 2e 20 20 54 68 65 20  he parser.  The 
52c0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a  implementation.*
52d0: 2a 20 6f 66 20 64 75 70 65 64 45 78 70 72 53 74  * of dupedExprSt
52e0: 72 75 63 74 53 69 7a 65 28 29 20 63 6f 6e 74 61  ructSize() conta
52f0: 69 6e 20 6d 75 6c 74 69 70 6c 65 20 61 73 73 65  in multiple asse
5300: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
5310: 74 68 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20  that attempt.** 
5320: 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20  to enforce this 
5330: 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73  constraint..*/.s
5340: 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45  tatic int dupedE
5350: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 45 78  xprStructSize(Ex
5360: 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  pr *p, int flags
5370: 29 7b 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b 0a  ){.  int nSize;.
5380: 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
5390: 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  =EXPRDUP_REDUCE 
53a0: 7c 7c 20 66 6c 61 67 73 3d 3d 30 20 29 3b 20 2f  || flags==0 ); /
53b0: 2a 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c 61 67 20  * Only one flag 
53c0: 76 61 6c 75 65 20 61 6c 6c 6f 77 65 64 20 2a 2f  value allowed */
53d0: 0a 20 20 69 66 28 20 30 3d 3d 28 66 6c 61 67 73  .  if( 0==(flags
53e0: 26 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29  &EXPRDUP_REDUCE)
53f0: 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20   ){.    nSize = 
5400: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 20  EXPR_FULLSIZE;. 
5410: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
5420: 72 74 28 20 21 45 78 70 72 48 61 73 41 6e 79 50  rt( !ExprHasAnyP
5430: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f  roperty(p, EP_To
5440: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
5450: 65 64 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ed) );.    asser
5460: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
5470: 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f  rty(p, EP_FromJo
5480: 69 6e 29 20 29 3b 20 0a 20 20 20 20 61 73 73 65  in) ); .    asse
5490: 72 74 28 20 28 70 2d 3e 66 6c 61 67 73 32 20 26  rt( (p->flags2 &
54a0: 20 45 50 32 5f 4d 61 6c 6c 6f 63 65 64 54 6f 6b   EP2_MallocedTok
54b0: 65 6e 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  en)==0 );.    as
54c0: 73 65 72 74 28 20 28 70 2d 3e 66 6c 61 67 73 32  sert( (p->flags2
54d0: 20 26 20 45 50 32 5f 49 72 72 65 64 75 63 69 62   & EP2_Irreducib
54e0: 6c 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  le)==0 );.    if
54f0: 28 20 70 2d 3e 70 4c 65 66 74 20 7c 7c 20 70 2d  ( p->pLeft || p-
5500: 3e 70 52 69 67 68 74 20 7c 7c 20 70 2d 3e 70 43  >pRight || p->pC
5510: 6f 6c 6c 20 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73  oll || p->x.pLis
5520: 74 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65  t ){.      nSize
5530: 20 3d 20 45 58 50 52 5f 52 45 44 55 43 45 44 53   = EXPR_REDUCEDS
5540: 49 5a 45 20 7c 20 45 50 5f 52 65 64 75 63 65 64  IZE | EP_Reduced
5550: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
5560: 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f     nSize = EXPR_
5570: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20  TOKENONLYSIZE | 
5580: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20  EP_TokenOnly;.  
5590: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
55a0: 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   nSize;.}../*.**
55b0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
55c0: 65 74 75 72 6e 73 20 74 68 65 20 73 70 61 63 65  eturns the space
55d0: 20 69 6e 20 62 79 74 65 73 20 72 65 71 75 69 72   in bytes requir
55e0: 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
55f0: 63 6f 70 79 20 0a 2a 2a 20 6f 66 20 74 68 65 20  copy .** of the 
5600: 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20 61  Expr structure a
5610: 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  nd a copy of the
5620: 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 73   Expr.u.zToken s
5630: 74 72 69 6e 67 20 28 69 66 20 74 68 61 74 0a 2a  tring (if that.*
5640: 2a 20 73 74 72 69 6e 67 20 69 73 20 64 65 66 69  * string is defi
5650: 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20  ned.).*/.static 
5660: 69 6e 74 20 64 75 70 65 64 45 78 70 72 4e 6f 64  int dupedExprNod
5670: 65 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69  eSize(Expr *p, i
5680: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74  nt flags){.  int
5690: 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45 78   nByte = dupedEx
56a0: 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c 20  prStructSize(p, 
56b0: 66 6c 61 67 73 29 20 26 20 30 78 66 66 66 3b 0a  flags) & 0xfff;.
56c0: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
56d0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74  operty(p, EP_Int
56e0: 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a  Value) && p->u.z
56f0: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 6e 42 79  Token ){.    nBy
5700: 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  te += sqlite3Str
5710: 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65  len30(p->u.zToke
5720: 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  n)+1;.  }.  retu
5730: 72 6e 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29  rn ROUND8(nByte)
5740: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
5750: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
5760: 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74  bytes required t
5770: 6f 20 63 72 65 61 74 65 20 61 20 64 75 70 6c 69  o create a dupli
5780: 63 61 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  cate of the .** 
5790: 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73 65  expression passe
57a0: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
57b0: 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 73 65 63  rgument. The sec
57c0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
57d0: 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e 74 61 69  a.** mask contai
57e0: 6e 69 6e 67 20 45 58 50 52 44 55 50 5f 58 58 58  ning EXPRDUP_XXX
57f0: 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   flags..**.** Th
5800: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
5810: 20 69 6e 63 6c 75 64 65 73 20 73 70 61 63 65 20   includes space 
5820: 74 6f 20 63 72 65 61 74 65 20 61 20 63 6f 70 79  to create a copy
5830: 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72   of the Expr str
5840: 75 63 74 0a 2a 2a 20 69 74 73 65 6c 66 20 61 6e  uct.** itself an
5850: 64 20 74 68 65 20 62 75 66 66 65 72 20 72 65 66  d the buffer ref
5860: 65 72 72 65 64 20 74 6f 20 62 79 20 45 78 70 72  erred to by Expr
5870: 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66 20 61 6e  .u.zToken, if an
5880: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  y..**.** If the 
5890: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 66  EXPRDUP_REDUCE f
58a0: 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
58b0: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
58c0: 65 20 69 6e 63 6c 75 64 65 73 20 0a 2a 2a 20 73  e includes .** s
58d0: 70 61 63 65 20 74 6f 20 64 75 70 6c 69 63 61 74  pace to duplicat
58e0: 65 20 61 6c 6c 20 45 78 70 72 20 6e 6f 64 65 73  e all Expr nodes
58f0: 20 69 6e 20 74 68 65 20 74 72 65 65 20 66 6f 72   in the tree for
5900: 6d 65 64 20 62 79 20 45 78 70 72 2e 70 4c 65 66  med by Expr.pLef
5910: 74 20 0a 2a 2a 20 61 6e 64 20 45 78 70 72 2e 70  t .** and Expr.p
5920: 52 69 67 68 74 20 76 61 72 69 61 62 6c 65 73 20  Right variables 
5930: 28 62 75 74 20 6e 6f 74 20 66 6f 72 20 61 6e 79  (but not for any
5940: 20 73 74 72 75 63 74 75 72 65 73 20 70 6f 69 6e   structures poin
5950: 74 65 64 20 74 6f 20 6f 72 20 0a 2a 2a 20 64 65  ted to or .** de
5960: 73 63 65 6e 64 65 64 20 66 72 6f 6d 20 74 68 65  scended from the
5970: 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 6f 72   Expr.x.pList or
5980: 20 45 78 70 72 2e 78 2e 70 53 65 6c 65 63 74 20   Expr.x.pSelect 
5990: 76 61 72 69 61 62 6c 65 73 29 2e 0a 2a 2f 0a 73  variables)..*/.s
59a0: 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45  tatic int dupedE
59b0: 78 70 72 53 69 7a 65 28 45 78 70 72 20 2a 70 2c  xprSize(Expr *p,
59c0: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69   int flags){.  i
59d0: 6e 74 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20  nt nByte = 0;.  
59e0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 6e 42 79  if( p ){.    nBy
59f0: 74 65 20 3d 20 64 75 70 65 64 45 78 70 72 4e 6f  te = dupedExprNo
5a00: 64 65 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29  deSize(p, flags)
5a10: 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 26  ;.    if( flags&
5a20: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 29  EXPRDUP_REDUCE )
5a30: 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d  {.      nByte +=
5a40: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 70   dupedExprSize(p
5a50: 2d 3e 70 4c 65 66 74 2c 20 66 6c 61 67 73 29 20  ->pLeft, flags) 
5a60: 2b 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28  + dupedExprSize(
5a70: 70 2d 3e 70 52 69 67 68 74 2c 20 66 6c 61 67 73  p->pRight, flags
5a80: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
5a90: 65 74 75 72 6e 20 6e 42 79 74 65 3b 0a 7d 0a 0a  eturn nByte;.}..
5aa0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
5ab0: 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74  ion is similar t
5ac0: 6f 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  o sqlite3ExprDup
5ad0: 28 29 2c 20 65 78 63 65 70 74 20 74 68 61 74 20  (), except that 
5ae0: 69 66 20 70 7a 42 75 66 66 65 72 20 0a 2a 2a 20  if pzBuffer .** 
5af0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e  is not NULL then
5b00: 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20 61 73   *pzBuffer is as
5b10: 73 75 6d 65 64 20 74 6f 20 70 6f 69 6e 74 20 74  sumed to point t
5b20: 6f 20 61 20 62 75 66 66 65 72 20 6c 61 72 67 65  o a buffer large
5b30: 20 65 6e 6f 75 67 68 20 0a 2a 2a 20 74 6f 20 73   enough .** to s
5b40: 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20 6f 66  tore the copy of
5b50: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 2c 20 74   expression p, t
5b60: 68 65 20 63 6f 70 69 65 73 20 6f 66 20 70 2d 3e  he copies of p->
5b70: 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28 69 66 20  u.zToken.** (if 
5b80: 61 70 70 6c 69 63 61 62 6c 65 29 2c 20 61 6e 64  applicable), and
5b90: 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20 74   the copies of t
5ba0: 68 65 20 70 2d 3e 70 4c 65 66 74 20 61 6e 64 20  he p->pLeft and 
5bb0: 70 2d 3e 70 52 69 67 68 74 20 65 78 70 72 65 73  p->pRight expres
5bc0: 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20 61 6e 79  sions,.** if any
5bd0: 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69  . Before returni
5be0: 6e 67 2c 20 2a 70 7a 42 75 66 66 65 72 20 69 73  ng, *pzBuffer is
5bf0: 20 73 65 74 20 74 6f 20 74 68 65 20 66 69 72 73   set to the firs
5c00: 74 20 62 79 74 65 20 70 61 73 73 65 64 20 74 68  t byte passed th
5c10: 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e 20 6f 66 20  e.** portion of 
5c20: 74 68 65 20 62 75 66 66 65 72 20 63 6f 70 69 65  the buffer copie
5c30: 64 20 69 6e 74 6f 20 62 79 20 74 68 69 73 20 66  d into by this f
5c40: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
5c50: 69 63 20 45 78 70 72 20 2a 65 78 70 72 44 75 70  ic Expr *exprDup
5c60: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
5c70: 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  pr *p, int flags
5c80: 2c 20 75 38 20 2a 2a 70 7a 42 75 66 66 65 72 29  , u8 **pzBuffer)
5c90: 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d  {.  Expr *pNew =
5ca0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
5cb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
5cc0: 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  e to return */. 
5cd0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63 6f   if( p ){.    co
5ce0: 6e 73 74 20 69 6e 74 20 69 73 52 65 64 75 63 65  nst int isReduce
5cf0: 64 20 3d 20 28 66 6c 61 67 73 26 45 58 50 52 44  d = (flags&EXPRD
5d00: 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20  UP_REDUCE);.    
5d10: 75 38 20 2a 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20  u8 *zAlloc;.    
5d20: 75 33 32 20 73 74 61 74 69 63 46 6c 61 67 20 3d  u32 staticFlag =
5d30: 20 30 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28   0;..    assert(
5d40: 20 70 7a 42 75 66 66 65 72 3d 3d 30 20 7c 7c 20   pzBuffer==0 || 
5d50: 69 73 52 65 64 75 63 65 64 20 29 3b 0a 0a 20 20  isReduced );..  
5d60: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
5d70: 77 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 74  where to write t
5d80: 68 65 20 6e 65 77 20 45 78 70 72 20 73 74 72 75  he new Expr stru
5d90: 63 74 75 72 65 2e 20 2a 2f 0a 20 20 20 20 69 66  cture. */.    if
5da0: 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20  ( pzBuffer ){.  
5db0: 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a 70 7a      zAlloc = *pz
5dc0: 42 75 66 66 65 72 3b 0a 20 20 20 20 20 20 73 74  Buffer;.      st
5dd0: 61 74 69 63 46 6c 61 67 20 3d 20 45 50 5f 53 74  aticFlag = EP_St
5de0: 61 74 69 63 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  atic;.    }else{
5df0: 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20  .      zAlloc = 
5e00: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
5e10: 61 77 28 64 62 2c 20 64 75 70 65 64 45 78 70 72  aw(db, dupedExpr
5e20: 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 29 3b  Size(p, flags));
5e30: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 20  .    }.    pNew 
5e40: 3d 20 28 45 78 70 72 20 2a 29 7a 41 6c 6c 6f 63  = (Expr *)zAlloc
5e50: 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20  ;..    if( pNew 
5e60: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20  ){.      /* Set 
5e70: 6e 4e 65 77 53 69 7a 65 20 74 6f 20 74 68 65 20  nNewSize to the 
5e80: 73 69 7a 65 20 61 6c 6c 6f 63 61 74 65 64 20 66  size allocated f
5e90: 6f 72 20 74 68 65 20 73 74 72 75 63 74 75 72 65  or the structure
5ea0: 20 70 6f 69 6e 74 65 64 20 74 6f 0a 20 20 20 20   pointed to.    
5eb0: 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e 20 54 68    ** by pNew. Th
5ec0: 69 73 20 69 73 20 65 69 74 68 65 72 20 45 58 50  is is either EXP
5ed0: 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45 58 50 52  R_FULLSIZE, EXPR
5ee0: 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72 0a  _REDUCEDSIZE or.
5ef0: 20 20 20 20 20 20 2a 2a 20 45 58 50 52 5f 54 4f        ** EXPR_TO
5f00: 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e 54 6f  KENONLYSIZE. nTo
5f10: 6b 65 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68  ken is set to th
5f20: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
5f30: 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20 20 20 20  s consumed.     
5f40: 20 2a 2a 20 62 79 20 74 68 65 20 63 6f 70 79 20   ** by the copy 
5f50: 6f 66 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b  of the p->u.zTok
5f60: 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20 61 6e  en string (if an
5f70: 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  y)..      */.   
5f80: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
5f90: 64 20 6e 53 74 72 75 63 74 53 69 7a 65 20 3d 20  d nStructSize = 
5fa0: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
5fb0: 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20  ize(p, flags);. 
5fc0: 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e       const int n
5fd0: 4e 65 77 53 69 7a 65 20 3d 20 6e 53 74 72 75 63  NewSize = nStruc
5fe0: 74 53 69 7a 65 20 26 20 30 78 66 66 66 3b 0a 20  tSize & 0xfff;. 
5ff0: 20 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b       int nToken;
6000: 0a 20 20 20 20 20 20 69 66 28 20 21 45 78 70 72  .      if( !Expr
6010: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
6020: 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70  P_IntValue) && p
6030: 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20  ->u.zToken ){.  
6040: 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 73        nToken = s
6050: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
6060: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20 2b 20 31 3b  ->u.zToken) + 1;
6070: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6080: 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 30        nToken = 0
6090: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
60a0: 69 66 28 20 69 73 52 65 64 75 63 65 64 20 29 7b  if( isReduced ){
60b0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
60c0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
60d0: 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29 3d  (p, EP_Reduced)=
60e0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  =0 );.        me
60f0: 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20  mcpy(zAlloc, p, 
6100: 6e 4e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20  nNewSize);.     
6110: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6120: 69 6e 74 20 6e 53 69 7a 65 20 3d 20 65 78 70 72  int nSize = expr
6130: 53 74 72 75 63 74 53 69 7a 65 28 70 29 3b 0a 20  StructSize(p);. 
6140: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41         memcpy(zA
6150: 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a 65 29 3b  lloc, p, nSize);
6160: 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
6170: 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d 2c 20  &zAlloc[nSize], 
6180: 30 2c 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45  0, EXPR_FULLSIZE
6190: 2d 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  -nSize);.      }
61a0: 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74  ..      /* Set t
61b0: 68 65 20 45 50 5f 52 65 64 75 63 65 64 2c 20 45  he EP_Reduced, E
61c0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20 61 6e 64  P_TokenOnly, and
61d0: 20 45 50 5f 53 74 61 74 69 63 20 66 6c 61 67 73   EP_Static flags
61e0: 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 20   appropriately. 
61f0: 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  */.      pNew->f
6200: 6c 61 67 73 20 26 3d 20 7e 28 45 50 5f 52 65 64  lags &= ~(EP_Red
6210: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
6220: 79 7c 45 50 5f 53 74 61 74 69 63 29 3b 0a 20 20  y|EP_Static);.  
6230: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
6240: 7c 3d 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26  |= nStructSize &
6250: 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f   (EP_Reduced|EP_
6260: 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20  TokenOnly);.    
6270: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
6280: 20 73 74 61 74 69 63 46 6c 61 67 3b 0a 0a 20 20   staticFlag;..  
6290: 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20      /* Copy the 
62a0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69  p->u.zToken stri
62b0: 6e 67 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20  ng, if any. */. 
62c0: 20 20 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20       if( nToken 
62d0: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
62e0: 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e  *zToken = pNew->
62f0: 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72  u.zToken = (char
6300: 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69  *)&zAlloc[nNewSi
6310: 7a 65 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ze];.        mem
6320: 63 70 79 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75  cpy(zToken, p->u
6330: 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29  .zToken, nToken)
6340: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
6350: 20 69 66 28 20 30 3d 3d 28 28 70 2d 3e 66 6c 61   if( 0==((p->fla
6360: 67 73 7c 70 4e 65 77 2d 3e 66 6c 61 67 73 29 20  gs|pNew->flags) 
6370: 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  & EP_TokenOnly) 
6380: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ){.        /* Fi
6390: 6c 6c 20 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e  ll in the pNew->
63a0: 78 2e 70 53 65 6c 65 63 74 20 6f 72 20 70 4e 65  x.pSelect or pNe
63b0: 77 2d 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65  w->x.pList membe
63c0: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  r. */.        if
63d0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
63e0: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
63f0: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
6400: 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20  pNew->x.pSelect 
6410: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
6420: 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c  up(db, p->x.pSel
6430: 65 63 74 2c 20 69 73 52 65 64 75 63 65 64 29 3b  ect, isReduced);
6440: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
6450: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
6460: 78 2e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  x.pList = sqlite
6470: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
6480: 20 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 73 52   p->x.pList, isR
6490: 65 64 75 63 65 64 29 3b 0a 20 20 20 20 20 20 20  educed);.       
64a0: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
64b0: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65    /* Fill in pNe
64c0: 77 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e 65  w->pLeft and pNe
64d0: 77 2d 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20  w->pRight. */.  
64e0: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 41      if( ExprHasA
64f0: 6e 79 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c  nyProperty(pNew,
6500: 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54   EP_Reduced|EP_T
6510: 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  okenOnly) ){.   
6520: 20 20 20 20 20 7a 41 6c 6c 6f 63 20 2b 3d 20 64       zAlloc += d
6530: 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65  upedExprNodeSize
6540: 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  (p, flags);.    
6550: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
6560: 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50  roperty(pNew, EP
6570: 5f 52 65 64 75 63 65 64 29 20 29 7b 0a 20 20 20  _Reduced) ){.   
6580: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65         pNew->pLe
6590: 66 74 20 3d 20 65 78 70 72 44 75 70 28 64 62 2c  ft = exprDup(db,
65a0: 20 70 2d 3e 70 4c 65 66 74 2c 20 45 58 50 52 44   p->pLeft, EXPRD
65b0: 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c  UP_REDUCE, &zAll
65c0: 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  oc);.          p
65d0: 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 65 78  New->pRight = ex
65e0: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69  prDup(db, p->pRi
65f0: 67 68 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44  ght, EXPRDUP_RED
6600: 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 3b 0a 20  UCE, &zAlloc);. 
6610: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6620: 20 69 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b   if( pzBuffer ){
6630: 0a 20 20 20 20 20 20 20 20 20 20 2a 70 7a 42 75  .          *pzBu
6640: 66 66 65 72 20 3d 20 7a 41 6c 6c 6f 63 3b 0a 20  ffer = zAlloc;. 
6650: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6660: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e  else{.        pN
6670: 65 77 2d 3e 66 6c 61 67 73 32 20 3d 20 30 3b 0a  ew->flags2 = 0;.
6680: 20 20 20 20 20 20 20 20 69 66 28 20 21 45 78 70          if( !Exp
6690: 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28  rHasAnyProperty(
66a0: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  p, EP_TokenOnly)
66b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
66c0: 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69  ew->pLeft = sqli
66d0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
66e0: 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20  ->pLeft, 0);.   
66f0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69         pNew->pRi
6700: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
6710: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67  rDup(db, p->pRig
6720: 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ht, 0);.        
6730: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 7d  }.      }..    }
6740: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
6750: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ew;.}../*.** The
6760: 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70   following group
6770: 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b   of routines mak
6780: 65 20 64 65 65 70 20 63 6f 70 69 65 73 20 6f 66  e deep copies of
6790: 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a   expressions,.**
67a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
67b0: 73 2c 20 49 44 20 6c 69 73 74 73 2c 20 61 6e 64  s, ID lists, and
67c0: 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
67d0: 74 73 2e 20 20 54 68 65 20 63 6f 70 69 65 73 20  ts.  The copies 
67e0: 63 61 6e 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65  can.** be delete
67f0: 64 20 28 62 79 20 62 65 69 6e 67 20 70 61 73 73  d (by being pass
6800: 65 64 20 74 6f 20 74 68 65 69 72 20 72 65 73 70  ed to their resp
6810: 65 63 74 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65  ective ...Delete
6820: 28 29 20 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20  () routines).** 
6830: 77 69 74 68 6f 75 74 20 65 66 66 65 63 74 69 6e  without effectin
6840: 67 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e  g the originals.
6850: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65  .**.** The expre
6860: 73 73 69 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20  ssion list, ID, 
6870: 61 6e 64 20 73 6f 75 72 63 65 20 6c 69 73 74 73  and source lists
6880: 20 72 65 74 75 72 6e 20 62 79 20 73 71 6c 69 74   return by sqlit
6890: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 29 2c  e3ExprListDup(),
68a0: 0a 2a 2a 20 73 71 6c 69 74 65 33 49 64 4c 69 73  .** sqlite3IdLis
68b0: 74 44 75 70 28 29 2c 20 61 6e 64 20 73 71 6c 69  tDup(), and sqli
68c0: 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 29 20  te3SrcListDup() 
68d0: 63 61 6e 20 6e 6f 74 20 62 65 20 66 75 72 74 68  can not be furth
68e0: 65 72 20 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20  er expanded .** 
68f0: 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  by subsequent ca
6900: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69  lls to sqlite*Li
6910: 73 74 41 70 70 65 6e 64 28 29 20 72 6f 75 74 69  stAppend() routi
6920: 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74  nes..**.** Any t
6930: 61 62 6c 65 73 20 74 68 61 74 20 74 68 65 20 53  ables that the S
6940: 72 63 4c 69 73 74 20 6d 69 67 68 74 20 70 6f 69  rcList might poi
6950: 6e 74 20 74 6f 20 61 72 65 20 6e 6f 74 20 64 75  nt to are not du
6960: 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  plicated..**.** 
6970: 54 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65  The flags parame
6980: 74 65 72 20 63 6f 6e 74 61 69 6e 73 20 61 20 63  ter contains a c
6990: 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68  ombination of th
69a0: 65 20 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c  e EXPRDUP_XXX fl
69b0: 61 67 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 45  ags..** If the E
69c0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 66 6c  XPRDUP_REDUCE fl
69d0: 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
69e0: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 72 65  the structure re
69f0: 74 75 72 6e 65 64 20 69 73 20 61 0a 2a 2a 20 74  turned is a.** t
6a00: 72 75 6e 63 61 74 65 64 20 76 65 72 73 69 6f 6e  runcated version
6a10: 20 6f 66 20 74 68 65 20 75 73 75 61 6c 20 45 78   of the usual Ex
6a20: 70 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61  pr structure tha
6a30: 74 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64  t will be stored
6a40: 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74   as.** part of t
6a50: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
6a60: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
6a70: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
6a80: 6d 61 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  ma..*/.Expr *sql
6a90: 69 74 65 33 45 78 70 72 44 75 70 28 73 71 6c 69  ite3ExprDup(sqli
6aa0: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
6ab0: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
6ac0: 72 65 74 75 72 6e 20 65 78 70 72 44 75 70 28 64  return exprDup(d
6ad0: 62 2c 20 70 2c 20 66 6c 61 67 73 2c 20 30 29 3b  b, p, flags, 0);
6ae0: 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c  .}.ExprList *sql
6af0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
6b00: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
6b10: 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c  rList *p, int fl
6b20: 61 67 73 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  ags){.  ExprList
6b30: 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74   *pNew;.  struct
6b40: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
6b50: 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d  pItem, *pOldItem
6b60: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
6b70: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
6b80: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
6b90: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
6ba0: 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  , sizeof(*pNew) 
6bb0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
6bc0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
6bd0: 4e 65 77 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20  New->iECursor = 
6be0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72  0;.  pNew->nExpr
6bf0: 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20   = pNew->nAlloc 
6c00: 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 4e  = p->nExpr;.  pN
6c10: 65 77 2d 3e 61 20 3d 20 70 49 74 65 6d 20 3d 20  ew->a = pItem = 
6c20: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
6c30: 61 77 28 64 62 2c 20 20 70 2d 3e 6e 45 78 70 72  aw(db,  p->nExpr
6c40: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29  *sizeof(p->a[0])
6c50: 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 3d   );.  if( pItem=
6c60: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
6c70: 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77  3DbFree(db, pNew
6c80: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
6c90: 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49 74 65 6d  .  } .  pOldItem
6ca0: 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69   = p->a;.  for(i
6cb0: 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20  =0; i<p->nExpr; 
6cc0: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f  i++, pItem++, pO
6cd0: 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45  ldItem++){.    E
6ce0: 78 70 72 20 2a 70 4f 6c 64 45 78 70 72 20 3d 20  xpr *pOldExpr = 
6cf0: 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72 3b  pOldItem->pExpr;
6d00: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70  .    pItem->pExp
6d10: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
6d20: 75 70 28 64 62 2c 20 70 4f 6c 64 45 78 70 72 2c  up(db, pOldExpr,
6d30: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 49 74   flags);.    pIt
6d40: 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
6d50: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
6d60: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  pOldItem->zName)
6d70: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70  ;.    pItem->zSp
6d80: 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  an = sqlite3DbSt
6d90: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
6da0: 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70  m->zSpan);.    p
6db0: 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20  Item->sortOrder 
6dc0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74  = pOldItem->sort
6dd0: 4f 72 64 65 72 3b 0a 20 20 20 20 70 49 74 65 6d  Order;.    pItem
6de0: 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20  ->done = 0;.    
6df0: 70 49 74 65 6d 2d 3e 69 43 6f 6c 20 3d 20 70 4f  pItem->iCol = pO
6e00: 6c 64 49 74 65 6d 2d 3e 69 43 6f 6c 3b 0a 20 20  ldItem->iCol;.  
6e10: 20 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73 20    pItem->iAlias 
6e20: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 41 6c 69  = pOldItem->iAli
6e30: 61 73 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  as;.  }.  return
6e40: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
6e50: 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72 69 67  If cursors, trig
6e60: 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e 64 20  gers, views and 
6e70: 73 75 62 71 75 65 72 69 65 73 20 61 72 65 20 61  subqueries are a
6e80: 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 0a  ll omitted from.
6e90: 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20 74 68  ** the build, th
6ea0: 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 66  en none of the f
6eb0: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
6ec0: 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20 0a 2a  s, except for .*
6ed0: 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  * sqlite3SelectD
6ee0: 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63 61 6c  up(), can be cal
6ef0: 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65 6c 65  led. sqlite3Sele
6f00: 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d 65 74  ctDup() is somet
6f10: 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 77  imes.** called w
6f20: 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67 75 6d  ith a NULL argum
6f30: 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ent..*/.#if !def
6f40: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
6f50: 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
6f60: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
6f70: 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21 64  RIGGER) \. || !d
6f80: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
6f90: 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53 72 63  IT_SUBQUERY).Src
6fa0: 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63  List *sqlite3Src
6fb0: 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20  ListDup(sqlite3 
6fc0: 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c  *db, SrcList *p,
6fd0: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53   int flags){.  S
6fe0: 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  rcList *pNew;.  
6ff0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79  int i;.  int nBy
7000: 74 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  te;.  if( p==0 )
7010: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79   return 0;.  nBy
7020: 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20  te = sizeof(*p) 
7030: 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73  + (p->nSrc>0 ? s
7040: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a  izeof(p->a[0]) *
7050: 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30   (p->nSrc-1) : 0
7060: 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
7070: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
7080: 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  b, nByte );.  if
7090: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
70a0: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53  rn 0;.  pNew->nS
70b0: 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f  rc = pNew->nAllo
70c0: 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66  c = p->nSrc;.  f
70d0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72  or(i=0; i<p->nSr
70e0: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  c; i++){.    str
70f0: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
7100: 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e   *pNewItem = &pN
7110: 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74  ew->a[i];.    st
7120: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
7130: 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70  m *pOldItem = &p
7140: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c  ->a[i];.    Tabl
7150: 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e 65  e *pTab;.    pNe
7160: 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  wItem->zDatabase
7170: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
7180: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
7190: 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  >zDatabase);.   
71a0: 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pNewItem->zName
71b0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
71c0: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
71d0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65  >zName);.    pNe
71e0: 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20  wItem->zAlias = 
71f0: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
7200: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41  db, pOldItem->zA
7210: 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65 77 49  lias);.    pNewI
7220: 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 3d 20  tem->jointype = 
7230: 70 4f 6c 64 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79  pOldItem->jointy
7240: 70 65 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  pe;.    pNewItem
7250: 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64  ->iCursor = pOld
7260: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
7270: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 73 50     pNewItem->isP
7280: 6f 70 75 6c 61 74 65 64 20 3d 20 70 4f 6c 64 49  opulated = pOldI
7290: 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64  tem->isPopulated
72a0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
72b0: 7a 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  zIndex = sqlite3
72c0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
72d0: 64 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 29 3b 0a  dItem->zIndex);.
72e0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6e 6f      pNewItem->no
72f0: 74 49 6e 64 65 78 65 64 20 3d 20 70 4f 6c 64 49  tIndexed = pOldI
7300: 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3b  tem->notIndexed;
7310: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
7320: 49 6e 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d  Index = pOldItem
7330: 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 54  ->pIndex;.    pT
7340: 61 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70  ab = pNewItem->p
7350: 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  Tab = pOldItem->
7360: 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54  pTab;.    if( pT
7370: 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  ab ){.      pTab
7380: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a  ->nRef++;.    }.
7390: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53      pNewItem->pS
73a0: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
73b0: 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 4f 6c  electDup(db, pOl
73c0: 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  dItem->pSelect, 
73d0: 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77  flags);.    pNew
73e0: 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69  Item->pOn = sqli
73f0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
7400: 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c  OldItem->pOn, fl
7410: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ags);.    pNewIt
7420: 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c  em->pUsing = sql
7430: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 64 62  ite3IdListDup(db
7440: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69  , pOldItem->pUsi
7450: 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ng);.    pNewIte
7460: 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c  m->colUsed = pOl
7470: 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a  dItem->colUsed;.
7480: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
7490: 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c  w;.}.IdList *sql
74a0: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 73 71  ite3IdListDup(sq
74b0: 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73  lite3 *db, IdLis
74c0: 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20  t *p){.  IdList 
74d0: 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pNew;.  int i;.
74e0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
74f0: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
7500: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
7510: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  aw(db, sizeof(*p
7520: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
7530: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
7540: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20  ;.  pNew->nId = 
7550: 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70  pNew->nAlloc = p
7560: 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61  ->nId;.  pNew->a
7570: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
7580: 6f 63 52 61 77 28 64 62 2c 20 70 2d 3e 6e 49 64  ocRaw(db, p->nId
7590: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29  *sizeof(p->a[0])
75a0: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e   );.  if( pNew->
75b0: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  a==0 ){.    sqli
75c0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e  te3DbFree(db, pN
75d0: 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ew);.    return 
75e0: 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  0;.  }.  for(i=0
75f0: 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29  ; i<p->nId; i++)
7600: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  {.    struct IdL
7610: 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74  ist_item *pNewIt
7620: 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d  em = &pNew->a[i]
7630: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  ;.    struct IdL
7640: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74  ist_item *pOldIt
7650: 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  em = &p->a[i];. 
7660: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
7670: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
7680: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
7690: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
76a0: 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70  NewItem->idx = p
76b0: 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20  OldItem->idx;.  
76c0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
76d0: 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74  .}.Select *sqlit
76e0: 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69  e3SelectDup(sqli
76f0: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
7700: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
7710: 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a    Select *pNew;.
7720: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
7730: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
7740: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
7750: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  aw(db, sizeof(*p
7760: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
7770: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
7780: 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20   pNew->pEList = 
7790: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
77a0: 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74  up(db, p->pEList
77b0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
77c0: 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  ->pSrc = sqlite3
77d0: 53 72 63 4c 69 73 74 44 75 70 28 64 62 2c 20 70  SrcListDup(db, p
77e0: 2d 3e 70 53 72 63 2c 20 66 6c 61 67 73 29 3b 0a  ->pSrc, flags);.
77f0: 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d    pNew->pWhere =
7800: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
7810: 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 66  db, p->pWhere, f
7820: 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  lags);.  pNew->p
7830: 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
7840: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
7850: 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 66 6c   p->pGroupBy, fl
7860: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48  ags);.  pNew->pH
7870: 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45  aving = sqlite3E
7880: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 48  xprDup(db, p->pH
7890: 61 76 69 6e 67 2c 20 66 6c 61 67 73 29 3b 0a 20  aving, flags);. 
78a0: 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20   pNew->pOrderBy 
78b0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
78c0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64  tDup(db, p->pOrd
78d0: 65 72 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20  erBy, flags);.  
78e0: 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70  pNew->op = p->op
78f0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72  ;.  pNew->pPrior
7900: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
7910: 44 75 70 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f  Dup(db, p->pPrio
7920: 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  r, flags);.  pNe
7930: 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69  w->pLimit = sqli
7940: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
7950: 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61 67 73 29  ->pLimit, flags)
7960: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65  ;.  pNew->pOffse
7970: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
7980: 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65  up(db, p->pOffse
7990: 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  t, flags);.  pNe
79a0: 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  w->iLimit = 0;. 
79b0: 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d   pNew->iOffset =
79c0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46   0;.  pNew->selF
79d0: 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61  lags = p->selFla
79e0: 67 73 20 26 20 7e 53 46 5f 55 73 65 73 45 70 68  gs & ~SF_UsesEph
79f0: 65 6d 65 72 61 6c 3b 0a 20 20 70 4e 65 77 2d 3e  emeral;.  pNew->
7a00: 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a  pRightmost = 0;.
7a10: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
7a20: 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[0] = -1;.  
7a30: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
7a40: 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[1] = -1;.  pN
7a50: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
7a60: 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75  [2] = -1;.  retu
7a70: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65  rn pNew;.}.#else
7a80: 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33  .Select *sqlite3
7a90: 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65  SelectDup(sqlite
7aa0: 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70  3 *db, Select *p
7ab0: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
7ac0: 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a  assert( p==0 );.
7ad0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
7ae0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  ndif.../*.** Add
7af0: 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
7b00: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20  o the end of an 
7b10: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
7b20: 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a    If pList is.**
7b30: 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c   initially NULL,
7b40: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e   then create a n
7b50: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ew expression li
7b60: 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  st..**.** If a m
7b70: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
7b80: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
7b90: 68 65 20 65 6e 74 69 72 65 20 6c 69 73 74 20 69  he entire list i
7ba0: 73 20 66 72 65 65 64 20 61 6e 64 0a 2a 2a 20 4e  s freed and.** N
7bb0: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
7bc0: 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73    If non-NULL is
7bd0: 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20   returned, then 
7be0: 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
7bf0: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6e 65 77  .** that the new
7c00: 20 65 6e 74 72 79 20 77 61 73 20 73 75 63 63 65   entry was succe
7c10: 73 73 66 75 6c 6c 79 20 61 70 70 65 6e 64 65 64  ssfully appended
7c20: 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73  ..*/.ExprList *s
7c30: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
7c40: 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a 70  pend(.  Parse *p
7c50: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
7c60: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
7c70: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
7c80: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
7c90: 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68  /* List to which
7ca0: 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68   to append. Migh
7cb0: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  t be NULL */.  E
7cc0: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
7cd0: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
7ce0: 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e  sion to be appen
7cf0: 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  ded. Might be NU
7d00: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  LL */.){.  sqlit
7d10: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
7d20: 3e 64 62 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  >db;.  if( pList
7d30: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ==0 ){.    pList
7d40: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
7d50: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
7d60: 66 28 45 78 70 72 4c 69 73 74 29 20 29 3b 0a 20  f(ExprList) );. 
7d70: 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
7d80: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f  ){.      goto no
7d90: 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _mem;.    }.    
7da0: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
7db0: 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 7d 0a  Alloc==0 );.  }.
7dc0: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 41 6c    if( pList->nAl
7dd0: 6c 6f 63 3c 3d 70 4c 69 73 74 2d 3e 6e 45 78 70  loc<=pList->nExp
7de0: 72 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  r ){.    struct 
7df0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
7e00: 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c  ;.    int n = pL
7e10: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20  ist->nAlloc*2 + 
7e20: 34 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74  4;.    a = sqlit
7e30: 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
7e40: 70 4c 69 73 74 2d 3e 61 2c 20 6e 2a 73 69 7a 65  pList->a, n*size
7e50: 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29  of(pList->a[0]))
7e60: 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29  ;.    if( a==0 )
7e70: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f  {.      goto no_
7e80: 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  mem;.    }.    p
7e90: 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 20  List->a = a;.   
7ea0: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d   pList->nAlloc =
7eb0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
7ec0: 53 69 7a 65 28 64 62 2c 20 61 29 2f 73 69 7a 65  Size(db, a)/size
7ed0: 6f 66 28 61 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20  of(a[0]);.  }.  
7ee0: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61  assert( pList->a
7ef0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 31 20 29  !=0 );.  if( 1 )
7f00: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
7f10: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
7f20: 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  m = &pList->a[pL
7f30: 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20  ist->nExpr++];. 
7f40: 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c     memset(pItem,
7f50: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65   0, sizeof(*pIte
7f60: 6d 29 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  m));.    pItem->
7f70: 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
7f80: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73   }.  return pLis
7f90: 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20  t;..no_mem:     
7fa0: 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b  .  /* Avoid leak
7fb0: 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61  ing memory if ma
7fc0: 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c 65 64 2e  lloc has failed.
7fd0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70   */.  sqlite3Exp
7fe0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70  rDelete(db, pExp
7ff0: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  r);.  sqlite3Exp
8000: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
8010: 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  pList);.  return
8020: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   0;.}../*.** Set
8030: 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b   the ExprList.a[
8040: 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e 74 20  ].zName element 
8050: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
8060: 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a  ntly added item.
8070: 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ** on the expres
8080: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
8090: 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20   pList might be 
80a0: 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61  NULL following a
80b0: 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75  n OOM error.  Bu
80c0: 74 20 70 4e 61 6d 65 20 73 68 6f 75 6c 64 20 6e  t pName should n
80d0: 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e  ever be.** NULL.
80e0: 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c    If a memory al
80f0: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20  location fails, 
8100: 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  the pParse->db->
8110: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
8120: 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a  g.** is set..*/.
8130: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
8140: 4c 69 73 74 53 65 74 4e 61 6d 65 28 0a 20 20 50  ListSetName(.  P
8150: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
8160: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
8170: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
8180: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
8190: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
81a0: 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64 20 74  o which to add t
81b0: 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f  he span. */.  To
81c0: 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20  ken *pName,     
81d0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 74 6f        /* Name to
81e0: 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 69   be added */.  i
81f0: 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20 20  nt dequote      
8200: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
8210: 6f 20 63 61 75 73 65 20 74 68 65 20 6e 61 6d 65  o cause the name
8220: 20 74 6f 20 62 65 20 64 65 71 75 6f 74 65 64 20   to be dequoted 
8230: 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
8240: 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50 61 72  pList!=0 || pPar
8250: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
8260: 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28  iled!=0 );.  if(
8270: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74   pList ){.    st
8280: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
8290: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61  em *pItem;.    a
82a0: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
82b0: 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 70 49 74  xpr>0 );.    pIt
82c0: 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
82d0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a  List->nExpr-1];.
82e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
82f0: 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20  m->zName==0 );. 
8300: 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20     pItem->zName 
8310: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
8320: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
8330: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
8340: 6e 29 3b 0a 20 20 20 20 69 66 28 20 64 65 71 75  n);.    if( dequ
8350: 6f 74 65 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e  ote && pItem->zN
8360: 61 6d 65 20 29 20 73 71 6c 69 74 65 33 44 65 71  ame ) sqlite3Deq
8370: 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d  uote(pItem->zNam
8380: 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
8390: 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69 73   Set the ExprLis
83a0: 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d  t.a[].zSpan elem
83b0: 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ent of the most 
83c0: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69  recently added i
83d0: 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78  tem.** on the ex
83e0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
83f0: 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74  *.** pList might
8400: 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69   be NULL followi
8410: 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  ng an OOM error.
8420: 20 20 42 75 74 20 70 53 70 61 6e 20 73 68 6f 75    But pSpan shou
8430: 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e  ld never be.** N
8440: 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72  ULL.  If a memor
8450: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
8460: 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e  ls, the pParse->
8470: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8480: 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e   flag.** is set.
8490: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
84a0: 45 78 70 72 4c 69 73 74 53 65 74 53 70 61 6e 28  ExprListSetSpan(
84b0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
84c0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
84d0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
84e0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
84f0: 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  st,        /* Li
8500: 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61  st to which to a
8510: 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a  dd the span. */.
8520: 20 20 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61    ExprSpan *pSpa
8530: 6e 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  n         /* The
8540: 20 73 70 61 6e 20 74 6f 20 62 65 20 61 64 64 65   span to be adde
8550: 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  d */.){.  sqlite
8560: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
8570: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  db;.  assert( pL
8580: 69 73 74 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  ist!=0 || db->ma
8590: 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b  llocFailed!=0 );
85a0: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
85b0: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
85c0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
85d0: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
85e0: 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20  t->nExpr-1];.   
85f0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
8600: 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 61  nExpr>0 );.    a
8610: 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
8620: 63 46 61 69 6c 65 64 20 7c 7c 20 70 49 74 65 6d  cFailed || pItem
8630: 2d 3e 70 45 78 70 72 3d 3d 70 53 70 61 6e 2d 3e  ->pExpr==pSpan->
8640: 70 45 78 70 72 20 29 3b 0a 20 20 20 20 73 71 6c  pExpr );.    sql
8650: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
8660: 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20  Item->zSpan);.  
8670: 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d    pItem->zSpan =
8680: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
8690: 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 53 70  p(db, (char*)pSp
86a0: 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20  an->zStart,.    
86b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86d0: 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e  (int)(pSpan->zEn
86e0: 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72  d - pSpan->zStar
86f0: 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  t));.  }.}../*.*
8700: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
8710: 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20  ion list pEList 
8720: 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68  contains more th
8730: 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e  an iLimit elemen
8740: 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20  ts,.** leave an 
8750: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
8760: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64   pParse..*/.void
8770: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
8780: 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50  CheckLength(.  P
8790: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20  arse *pParse,.  
87a0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
87b0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
87c0: 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74  zObject.){.  int
87d0: 20 6d 78 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   mx = pParse->db
87e0: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
87f0: 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20  LIMIT_COLUMN];. 
8800: 20 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73   testcase( pELis
8810: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
8820: 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74  pr==mx );.  test
8830: 63 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20  case( pEList && 
8840: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d  pEList->nExpr==m
8850: 78 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 45 4c  x+1 );.  if( pEL
8860: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
8870: 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73  Expr>mx ){.    s
8880: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
8890: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
88a0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c   columns in %s",
88b0: 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d   zObject);.  }.}
88c0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
88d0: 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65 73 73  n entire express
88e0: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  ion list..*/.voi
88f0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
8900: 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  tDelete(sqlite3 
8910: 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  *db, ExprList *p
8920: 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
8930: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
8940: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
8950: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
8960: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
8970: 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 7c 7c  ( pList->a!=0 ||
8980: 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   (pList->nExpr==
8990: 30 20 26 26 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  0 && pList->nAll
89a0: 6f 63 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73 65  oc==0) );.  asse
89b0: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
89c0: 3c 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20  <=pList->nAlloc 
89d0: 29 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  );.  for(pItem=p
89e0: 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c  List->a, i=0; i<
89f0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
8a00: 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
8a10: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
8a20: 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 45  te(db, pItem->pE
8a30: 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  xpr);.    sqlite
8a40: 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
8a50: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  m->zName);.    s
8a60: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
8a70: 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a   pItem->zSpan);.
8a80: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
8a90: 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  ree(db, pList->a
8aa0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
8ab0: 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d  ee(db, pList);.}
8ac0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ../*.** These ro
8ad0: 75 74 69 6e 65 73 20 61 72 65 20 57 61 6c 6b 65  utines are Walke
8ae0: 72 20 63 61 6c 6c 62 61 63 6b 73 2e 20 20 57 61  r callbacks.  Wa
8af0: 6c 6b 65 72 2e 75 2e 70 69 20 69 73 20 61 20 70  lker.u.pi is a p
8b00: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20  ointer.** to an 
8b10: 69 6e 74 65 67 65 72 2e 20 20 54 68 65 73 65 20  integer.  These 
8b20: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63 68 65  routines are che
8b30: 63 6b 69 6e 67 20 61 6e 20 65 78 70 72 65 73 73  cking an express
8b40: 69 6f 6e 20 74 6f 20 73 65 65 0a 2a 2a 20 69 66  ion to see.** if
8b50: 20 69 74 20 69 73 20 61 20 63 6f 6e 73 74 61 6e   it is a constan
8b60: 74 2e 20 20 53 65 74 20 2a 57 61 6c 6b 65 72 2e  t.  Set *Walker.
8b70: 75 2e 70 69 20 74 6f 20 30 20 69 66 20 74 68 65  u.pi to 0 if the
8b80: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a   expression is.*
8b90: 2a 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 2e 0a  * not constant..
8ba0: 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c  **.** These call
8bb0: 62 61 63 6b 20 72 6f 75 74 69 6e 65 73 20 61 72  back routines ar
8bc0: 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
8bd0: 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ent the followin
8be0: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c  g:.**.**     sql
8bf0: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
8c00: 6e 74 28 29 0a 2a 2a 20 20 20 20 20 73 71 6c 69  nt().**     sqli
8c10: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
8c20: 74 4e 6f 74 4a 6f 69 6e 28 29 0a 2a 2a 20 20 20  tNotJoin().**   
8c30: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43    sqlite3ExprIsC
8c40: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
8c50: 6e 28 29 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  n().**.*/.static
8c60: 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43   int exprNodeIsC
8c70: 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a  onstant(Walker *
8c80: 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
8c90: 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20  Expr){..  /* If 
8ca0: 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 69 73 20  pWalker->u.i is 
8cb0: 33 20 74 68 65 6e 20 61 6e 79 20 74 65 72 6d 20  3 then any term 
8cc0: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
8cd0: 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66 72 6f  n that comes fro
8ce0: 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f 72  m.  ** the ON or
8cf0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f   USING clauses o
8d00: 66 20 61 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c  f a join disqual
8d10: 69 66 69 65 73 20 74 68 65 20 65 78 70 72 65 73  ifies the expres
8d20: 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62  sion.  ** from b
8d30: 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20  eing considered 
8d40: 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69  constant. */.  i
8d50: 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d  f( pWalker->u.i=
8d60: 3d 33 20 26 26 20 45 78 70 72 48 61 73 41 6e 79  =3 && ExprHasAny
8d70: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
8d80: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a  EP_FromJoin) ){.
8d90: 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69      pWalker->u.i
8da0: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
8db0: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
8dc0: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
8dd0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43  ->op ){.    /* C
8de0: 6f 6e 73 69 64 65 72 20 66 75 6e 63 74 69 6f 6e  onsider function
8df0: 73 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74  s to be constant
8e00: 20 69 66 20 61 6c 6c 20 74 68 65 69 72 20 61 72   if all their ar
8e10: 67 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e 73  guments are cons
8e20: 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20  tant.    ** and 
8e30: 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 32 20  pWalker->u.i==2 
8e40: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  */.    case TK_F
8e50: 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69  UNCTION:.      i
8e60: 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d  f( pWalker->u.i=
8e70: 3d 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =2 ) return 0;. 
8e80: 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
8e90: 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65  ough */.    case
8ea0: 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65   TK_ID:.    case
8eb0: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20   TK_COLUMN:.    
8ec0: 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
8ed0: 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  TION:.    case T
8ee0: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  K_AGG_COLUMN:.  
8ef0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
8f00: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29  xpr->op==TK_ID )
8f10: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
8f20: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
8f30: 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
8f40: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
8f50: 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op==TK_AGG_FUNC
8f60: 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  TION );.      te
8f70: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
8f80: 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
8f90: 20 29 3b 0a 20 20 20 20 20 20 70 57 61 6c 6b 65   );.      pWalke
8fa0: 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20 20 20 20  r->u.i = 0;.    
8fb0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
8fc0: 72 74 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  rt;.    default:
8fd0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
8fe0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
8ff0: 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73 65 6c 65  ELECT ); /* sele
9000: 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  ctNodeIsConstant
9010: 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a   will disallow *
9020: 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
9030: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
9040: 45 58 49 53 54 53 20 29 3b 20 2f 2a 20 73 65 6c  EXISTS ); /* sel
9050: 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  ectNodeIsConstan
9060: 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20  t will disallow 
9070: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
9080: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
9090: 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73  }.}.static int s
90a0: 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74  electNodeIsConst
90b0: 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ant(Walker *pWal
90c0: 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74  ker, Select *Not
90d0: 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f  Used){.  UNUSED_
90e0: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
90f0: 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 75  d);.  pWalker->u
9100: 2e 69 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  .i = 0;.  return
9110: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74   WRC_Abort;.}.st
9120: 61 74 69 63 20 69 6e 74 20 65 78 70 72 49 73 43  atic int exprIsC
9130: 6f 6e 73 74 28 45 78 70 72 20 2a 70 2c 20 69 6e  onst(Expr *p, in
9140: 74 20 69 6e 69 74 46 6c 61 67 29 7b 0a 20 20 57  t initFlag){.  W
9150: 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 75 2e 69  alker w;.  w.u.i
9160: 20 3d 20 69 6e 69 74 46 6c 61 67 3b 0a 20 20 77   = initFlag;.  w
9170: 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
9180: 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74   exprNodeIsConst
9190: 61 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  ant;.  w.xSelect
91a0: 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63  Callback = selec
91b0: 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b  tNodeIsConstant;
91c0: 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
91d0: 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74  pr(&w, p);.  ret
91e0: 75 72 6e 20 77 2e 75 2e 69 3b 0a 7d 0a 0a 2f 2a  urn w.u.i;.}../*
91f0: 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
9200: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
9210: 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78  turn 1 if the ex
9220: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
9230: 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66  tant.** and 0 if
9240: 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72   it involves var
9250: 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69  iables or functi
9260: 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20  on calls..**.** 
9270: 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  For the purposes
9280: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
9290: 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74  n, a double-quot
92a0: 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22  ed string (ex: "
92b0: 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73  abc").** is cons
92c0: 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c  idered a variabl
92d0: 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71  e but a single-q
92e0: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
92f0: 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61  : 'abc') is.** a
9300: 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e   constant..*/.in
9310: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
9320: 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 29  onstant(Expr *p)
9330: 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49  {.  return exprI
9340: 73 43 6f 6e 73 74 28 70 2c 20 31 29 3b 0a 7d 0a  sConst(p, 1);.}.
9350: 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
9360: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
9370: 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
9380: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
9390: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 61 74 20  onstant.** that 
93a0: 64 6f 65 73 20 6e 6f 20 6f 72 69 67 69 6e 61 74  does no originat
93b0: 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72  e from the ON or
93c0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f   USING clauses o
93d0: 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20 52 65 74  f a join..** Ret
93e0: 75 72 6e 20 30 20 69 66 20 69 74 20 69 6e 76 6f  urn 0 if it invo
93f0: 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f  lves variables o
9400: 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73  r function calls
9410: 20 6f 72 20 74 65 72 6d 73 20 66 72 6f 6d 0a 2a   or terms from.*
9420: 2a 20 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47  * an ON or USING
9430: 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20   clause..*/.int 
9440: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
9450: 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78 70  stantNotJoin(Exp
9460: 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  r *p){.  return 
9470: 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 33  exprIsConst(p, 3
9480: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  );.}../*.** Walk
9490: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
94a0: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69  ree.  Return 1 i
94b0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
94c0: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
94d0: 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61  or a function ca
94e0: 6c 6c 20 77 69 74 68 20 63 6f 6e 73 74 61 6e 74  ll with constant
94f0: 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74   arguments.  Ret
9500: 75 72 6e 20 61 6e 64 20 30 20 69 66 20 74 68 65  urn and 0 if the
9510: 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79 20 76 61  re.** are any va
9520: 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46  riables..**.** F
9530: 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
9540: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
9550: 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65  , a double-quote
9560: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61  d string (ex: "a
9570: 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  bc").** is consi
9580: 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65  dered a variable
9590: 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75   but a single-qu
95a0: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
95b0: 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20   'abc') is.** a 
95c0: 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74  constant..*/.int
95d0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
95e0: 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e  nstantOrFunction
95f0: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74  (Expr *p){.  ret
9600: 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28  urn exprIsConst(
9610: 70 2c 20 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p, 2);.}../*.** 
9620: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
9630: 6e 20 70 20 63 6f 64 65 73 20 61 20 63 6f 6e 73  n p codes a cons
9640: 74 61 6e 74 20 69 6e 74 65 67 65 72 20 74 68 61  tant integer tha
9650: 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  t is small enoug
9660: 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61  h.** to fit in a
9670: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c   32-bit integer,
9680: 20 72 65 74 75 72 6e 20 31 20 61 6e 64 20 70 75   return 1 and pu
9690: 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
96a0: 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e  he integer.** in
96b0: 20 2a 70 56 61 6c 75 65 2e 20 20 49 66 20 74 68   *pValue.  If th
96c0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
96d0: 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6f  not an integer o
96e0: 72 20 69 66 20 69 74 20 69 73 20 74 6f 6f 20 62  r if it is too b
96f0: 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20  ig.** to fit in 
9700: 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20  a signed 32-bit 
9710: 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20  integer, return 
9720: 30 20 61 6e 64 20 6c 65 61 76 65 20 2a 70 56 61  0 and leave *pVa
9730: 6c 75 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  lue unchanged..*
9740: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
9750: 72 49 73 49 6e 74 65 67 65 72 28 45 78 70 72 20  rIsInteger(Expr 
9760: 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65 29  *p, int *pValue)
9770: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  {.  int rc = 0;.
9780: 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26    if( p->flags &
9790: 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a   EP_IntValue ){.
97a0: 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 70 2d      *pValue = p-
97b0: 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 72  >u.iValue;.    r
97c0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73  eturn 1;.  }.  s
97d0: 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
97e0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
97f0: 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 63 20  GER: {.      rc 
9800: 3d 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33  = sqlite3GetInt3
9810: 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70  2(p->u.zToken, p
9820: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 61 73  Value);.      as
9830: 73 65 72 74 28 20 72 63 3d 3d 30 20 29 3b 0a 20  sert( rc==0 );. 
9840: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9850: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50  }.    case TK_UP
9860: 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 63 20  LUS: {.      rc 
9870: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  = sqlite3ExprIsI
9880: 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c  nteger(p->pLeft,
9890: 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20   pValue);.      
98a0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
98b0: 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a   case TK_UMINUS:
98c0: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b 0a   {.      int v;.
98d0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
98e0: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
98f0: 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a  ->pLeft, &v) ){.
9900: 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20          *pValue 
9910: 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 63  = -v;.        rc
9920: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
9930: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9940: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72  .    default: br
9950: 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  eak;.  }.  if( r
9960: 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  c ){.    assert(
9970: 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65   ExprHasAnyPrope
9980: 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65  rty(p, EP_Reduce
9990: 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 0a  d|EP_TokenOnly).
99a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
99b0: 7c 20 28 70 2d 3e 66 6c 61 67 73 32 20 26 20 45  | (p->flags2 & E
99c0: 50 32 5f 4d 61 6c 6c 6f 63 65 64 54 6f 6b 65 6e  P2_MallocedToken
99d0: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6f  )==0 );.    p->o
99e0: 70 20 3d 20 54 4b 5f 49 4e 54 45 47 45 52 3b 0a  p = TK_INTEGER;.
99f0: 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20      p->flags |= 
9a00: 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20  EP_IntValue;.   
9a10: 20 70 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 2a   p->u.iValue = *
9a20: 70 56 61 6c 75 65 3b 0a 20 20 7d 0a 20 20 72 65  pValue;.  }.  re
9a30: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
9a40: 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69  * Return FALSE i
9a50: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68  f there is no ch
9a60: 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 65 78  ance that the ex
9a70: 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 20  pression can be 
9a80: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  NULL..**.** If t
9a90: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 69  he expression mi
9aa0: 67 68 74 20 62 65 20 4e 55 4c 4c 20 6f 72 20 69  ght be NULL or i
9ab0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
9ac0: 20 69 73 20 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a   is too complex.
9ad0: 2a 2a 20 74 6f 20 74 65 6c 6c 20 72 65 74 75 72  ** to tell retur
9ae0: 6e 20 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20  n TRUE.  .**.** 
9af0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
9b00: 75 73 65 64 20 61 73 20 61 6e 20 6f 70 74 69 6d  used as an optim
9b10: 69 7a 61 74 69 6f 6e 2c 20 74 6f 20 73 6b 69 70  ization, to skip
9b20: 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f 64   OP_IsNull opcod
9b30: 65 73 0a 2a 2a 20 77 68 65 6e 20 77 65 20 6b 6e  es.** when we kn
9b40: 6f 77 20 74 68 61 74 20 61 20 76 61 6c 75 65 20  ow that a value 
9b50: 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20  cannot be NULL. 
9b60: 20 48 65 6e 63 65 2c 20 61 20 66 61 6c 73 65 20   Hence, a false 
9b70: 70 6f 73 69 74 69 76 65 0a 2a 2a 20 28 72 65 74  positive.** (ret
9b80: 75 72 6e 69 6e 67 20 54 52 55 45 20 77 68 65 6e  urning TRUE when
9b90: 20 69 6e 20 66 61 63 74 20 74 68 65 20 65 78 70   in fact the exp
9ba0: 72 65 73 73 69 6f 6e 20 63 61 6e 20 6e 65 76 65  ression can neve
9bb0: 72 20 62 65 20 4e 55 4c 4c 29 20 6d 69 67 68 74  r be NULL) might
9bc0: 0a 2a 2a 20 62 65 20 61 20 73 6d 61 6c 6c 20 70  .** be a small p
9bd0: 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 20 62  erformance hit b
9be0: 75 74 20 69 73 20 6f 74 68 65 72 77 69 73 65 20  ut is otherwise 
9bf0: 68 61 72 6d 6c 65 73 73 2e 20 20 4f 6e 20 74 68  harmless.  On th
9c00: 65 20 6f 74 68 65 72 0a 2a 2a 20 68 61 6e 64 2c  e other.** hand,
9c10: 20 61 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76   a false negativ
9c20: 65 20 28 72 65 74 75 72 6e 69 6e 67 20 46 41 4c  e (returning FAL
9c30: 53 45 20 77 68 65 6e 20 74 68 65 20 72 65 73 75  SE when the resu
9c40: 6c 74 20 63 6f 75 6c 64 20 62 65 20 4e 55 4c 4c  lt could be NULL
9c50: 29 0a 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  ).** will likely
9c60: 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e   result in an in
9c70: 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 2e 20  correct answer. 
9c80: 20 53 6f 20 77 68 65 6e 20 69 6e 20 64 6f 75 62   So when in doub
9c90: 74 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 54 52 55  t, return.** TRU
9ca0: 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  E..*/.int sqlite
9cb0: 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 63  3ExprCanBeNull(c
9cc0: 6f 6e 73 74 20 45 78 70 72 20 2a 70 29 7b 0a 20  onst Expr *p){. 
9cd0: 20 75 38 20 6f 70 3b 0a 20 20 77 68 69 6c 65 28   u8 op;.  while(
9ce0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53   p->op==TK_UPLUS
9cf0: 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d   || p->op==TK_UM
9d00: 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70  INUS ){ p = p->p
9d10: 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70  Left; }.  op = p
9d20: 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  ->op;.  if( op==
9d30: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
9d40: 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69   = p->op2;.  swi
9d50: 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
9d60: 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a  ase TK_INTEGER:.
9d70: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49      case TK_STRI
9d80: 4e 47 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NG:.    case TK_
9d90: 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20  FLOAT:.    case 
9da0: 54 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72  TK_BLOB:.      r
9db0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 64 65 66  eturn 0;.    def
9dc0: 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75  ault:.      retu
9dd0: 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rn 1;.  }.}../*.
9de0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 4f  ** Generate an O
9df0: 50 5f 49 73 4e 75 6c 6c 20 69 6e 73 74 72 75 63  P_IsNull instruc
9e00: 74 69 6f 6e 20 74 68 61 74 20 74 65 73 74 73 20  tion that tests 
9e10: 72 65 67 69 73 74 65 72 20 69 52 65 67 20 61 6e  register iReg an
9e20: 64 20 6a 75 6d 70 73 0a 2a 2a 20 74 6f 20 6c 6f  d jumps.** to lo
9e30: 63 61 74 69 6f 6e 20 69 44 65 73 74 20 69 66 20  cation iDest if 
9e40: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 69 52 65  the value in iRe
9e50: 67 20 69 73 20 4e 55 4c 4c 2e 20 20 54 68 65 20  g is NULL.  The 
9e60: 76 61 6c 75 65 20 69 6e 20 69 52 65 67 20 0a 2a  value in iReg .*
9e70: 2a 20 77 61 73 20 63 6f 6d 70 75 74 65 64 20 62  * was computed b
9e80: 79 20 70 45 78 70 72 2e 20 20 49 66 20 77 65 20  y pExpr.  If we 
9e90: 63 61 6e 20 6c 6f 6f 6b 20 61 74 20 70 45 78 70  can look at pExp
9ea0: 72 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  r at compile-tim
9eb0: 65 20 61 6e 64 0a 2a 2a 20 64 65 74 65 72 6d 69  e and.** determi
9ec0: 6e 65 20 74 68 61 74 20 69 74 20 63 61 6e 20 6e  ne that it can n
9ed0: 65 76 65 72 20 67 65 6e 65 72 61 74 65 20 61 20  ever generate a 
9ee0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 4f  NULL, then the O
9ef0: 50 5f 49 73 4e 75 6c 6c 20 6f 70 65 72 61 74 69  P_IsNull operati
9f00: 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 6d 69  on.** can be omi
9f10: 74 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tted..*/.void sq
9f20: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e  lite3ExprCodeIsN
9f30: 75 6c 6c 4a 75 6d 70 28 0a 20 20 56 64 62 65 20  ullJump(.  Vdbe 
9f40: 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *v,            /
9f50: 2a 20 54 68 65 20 56 44 42 45 20 75 6e 64 65 72  * The VDBE under
9f60: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
9f70: 0a 20 20 63 6f 6e 73 74 20 45 78 70 72 20 2a 70  .  const Expr *p
9f80: 45 78 70 72 2c 20 20 2f 2a 20 4f 6e 6c 79 20 67  Expr,  /* Only g
9f90: 65 6e 65 72 61 74 65 20 4f 50 5f 49 73 4e 75 6c  enerate OP_IsNul
9fa0: 6c 20 69 66 20 74 68 69 73 20 65 78 70 72 20 63  l if this expr c
9fb0: 61 6e 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  an be NULL */.  
9fc0: 69 6e 74 20 69 52 65 67 2c 20 20 20 20 20 20 20  int iReg,       
9fd0: 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68 65 20      /* Test the 
9fe0: 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65  value in this re
9ff0: 67 69 73 74 65 72 20 66 6f 72 20 4e 55 4c 4c 20  gister for NULL 
a000: 2a 2f 0a 20 20 69 6e 74 20 69 44 65 73 74 20 20  */.  int iDest  
a010: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
a020: 20 68 65 72 65 20 69 66 20 74 68 65 20 76 61 6c   here if the val
a030: 75 65 20 69 73 20 6e 75 6c 6c 20 2a 2f 0a 29 7b  ue is null */.){
a040: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
a050: 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 45 78 70  prCanBeNull(pExp
a060: 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  r) ){.    sqlite
a070: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a080: 50 5f 49 73 4e 75 6c 6c 2c 20 69 52 65 67 2c 20  P_IsNull, iReg, 
a090: 69 44 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  iDest);.  }.}../
a0a0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
a0b0: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   if the given ex
a0c0: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
a0d0: 6e 73 74 61 6e 74 20 77 68 69 63 68 20 77 6f 75  nstant which wou
a0e0: 6c 64 20 62 65 0a 2a 2a 20 75 6e 63 68 61 6e 67  ld be.** unchang
a0f0: 65 64 20 62 79 20 4f 50 5f 41 66 66 69 6e 69 74  ed by OP_Affinit
a100: 79 20 77 69 74 68 20 74 68 65 20 61 66 66 69 6e  y with the affin
a110: 69 74 79 20 67 69 76 65 6e 20 69 6e 20 74 68 65  ity given in the
a120: 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d   second.** argum
a130: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ent..**.** This 
a140: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
a150: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
a160: 74 68 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 20  the OP_Affinity 
a170: 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e  operation.** can
a180: 20 62 65 20 6f 6d 69 74 74 65 64 2e 20 20 57 68   be omitted.  Wh
a190: 65 6e 20 69 6e 20 64 6f 75 62 74 20 72 65 74 75  en in doubt retu
a1a0: 72 6e 20 46 41 4c 53 45 2e 20 20 41 20 66 61 6c  rn FALSE.  A fal
a1b0: 73 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 69  se negative.** i
a1c0: 73 20 68 61 72 6d 6c 65 73 73 2e 20 20 41 20 66  s harmless.  A f
a1d0: 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2c 20 68  alse positive, h
a1e0: 6f 77 65 76 65 72 2c 20 63 61 6e 20 72 65 73 75  owever, can resu
a1f0: 6c 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 0a  lt in the wrong.
a200: 2a 2a 20 61 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e  ** answer..*/.in
a210: 74 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65  t sqlite3ExprNee
a220: 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e  dsNoAffinityChan
a230: 67 65 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70  ge(const Expr *p
a240: 2c 20 63 68 61 72 20 61 66 66 29 7b 0a 20 20 75  , char aff){.  u
a250: 38 20 6f 70 3b 0a 20 20 69 66 28 20 61 66 66 3d  8 op;.  if( aff=
a260: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
a270: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 77   ) return 1;.  w
a280: 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  hile( p->op==TK_
a290: 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  UPLUS || p->op==
a2a0: 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d  TK_UMINUS ){ p =
a2b0: 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f   p->pLeft; }.  o
a2c0: 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28  p = p->op;.  if(
a2d0: 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52   op==TK_REGISTER
a2e0: 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a   ) op = p->op2;.
a2f0: 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
a300: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
a310: 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  GER: {.      ret
a320: 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f  urn aff==SQLITE_
a330: 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61  AFF_INTEGER || a
a340: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
a350: 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20  UMERIC;.    }.  
a360: 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
a370: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
a380: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
a390: 52 45 41 4c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c  REAL || aff==SQL
a3a0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
a3b0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
a3c0: 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20  TK_STRING: {.   
a3d0: 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53     return aff==S
a3e0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
a3f0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
a400: 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20  K_BLOB: {.      
a410: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
a420: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
a430: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  MN: {.      asse
a440: 72 74 28 20 70 2d 3e 69 54 61 62 6c 65 3e 3d 30  rt( p->iTable>=0
a450: 20 29 3b 20 20 2f 2a 20 70 20 63 61 6e 6e 6f 74   );  /* p cannot
a460: 20 62 65 20 70 61 72 74 20 6f 66 20 61 20 43 48   be part of a CH
a470: 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  ECK constraint *
a480: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  /.      return p
a490: 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20  ->iColumn<0.    
a4a0: 20 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53        && (aff==S
a4b0: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
a4c0: 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45  R || aff==SQLITE
a4d0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 29 3b 0a 20  _AFF_NUMERIC);. 
a4e0: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
a4f0: 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
a500: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
a510: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
a520: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
a530: 73 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d  string is a row-
a540: 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a  id column name..
a550: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73  */.int sqlite3Is
a560: 52 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72  Rowid(const char
a570: 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69   *z){.  if( sqli
a580: 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f  te3StrICmp(z, "_
a590: 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65  ROWID_")==0 ) re
a5a0: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
a5b0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
a5c0: 22 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65  "ROWID")==0 ) re
a5d0: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
a5e0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
a5f0: 22 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75  "OID")==0 ) retu
a600: 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 1;.  return 0
a610: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
a620: 6e 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65  n true if we are
a630: 20 61 62 6c 65 20 74 6f 20 74 68 65 20 49 4e 20   able to the IN 
a640: 6f 70 65 72 61 74 6f 72 20 6f 70 74 69 6d 69 7a  operator optimiz
a650: 61 74 69 6f 6e 20 6f 6e 20 61 0a 2a 2a 20 71 75  ation on a.** qu
a660: 65 72 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a  ery of the form.
a670: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 78 20 49 4e  **.**       x IN
a680: 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a   (SELECT ...).**
a690: 0a 2a 2a 20 57 68 65 72 65 20 74 68 65 20 53 45  .** Where the SE
a6a0: 4c 45 43 54 2e 2e 2e 20 63 6c 61 75 73 65 20 69  LECT... clause i
a6b0: 73 20 61 73 20 73 70 65 63 69 66 69 65 64 20 62  s as specified b
a6c0: 79 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20  y the parameter 
a6d0: 74 6f 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  to this.** routi
a6e0: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 65  ne..**.** The Se
a6f0: 6c 65 63 74 20 6f 62 6a 65 63 74 20 70 61 73 73  lect object pass
a700: 65 64 20 69 6e 20 68 61 73 20 61 6c 72 65 61 64  ed in has alread
a710: 79 20 62 65 65 6e 20 70 72 65 70 72 6f 63 65 73  y been preproces
a720: 73 65 64 20 61 6e 64 20 6e 6f 0a 2a 2a 20 65 72  sed and no.** er
a730: 72 6f 72 73 20 68 61 76 65 20 62 65 65 6e 20 66  rors have been f
a740: 6f 75 6e 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ound..*/.#ifndef
a750: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
a760: 51 55 45 52 59 0a 73 74 61 74 69 63 20 69 6e 74  QUERY.static int
a770: 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49   isCandidateForI
a780: 6e 4f 70 74 28 53 65 6c 65 63 74 20 2a 70 29 7b  nOpt(Select *p){
a790: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
a7a0: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
a7b0: 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70  List;.  Table *p
a7c0: 54 61 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  Tab;.  if( p==0 
a7d0: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
a7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a7f0: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
a800: 20 6f 66 20 49 4e 20 69 73 20 53 45 4c 45 43 54   of IN is SELECT
a810: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   */.  if( p->pPr
a820: 69 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ior ) return 0; 
a830: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a840: 4e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53  Not a compound S
a850: 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70  ELECT */.  if( p
a860: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
a870: 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
a880: 72 65 67 61 74 65 29 20 29 7b 0a 20 20 20 20 74  regate) ){.    t
a890: 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c  estcase( (p->sel
a8a0: 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
a8b0: 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
a8c0: 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74  e))==SF_Distinct
a8d0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
a8e0: 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
a8f0: 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
a900: 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
a910: 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20  _Aggregate );.  
a920: 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e    return 0; /* N
a930: 6f 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  o DISTINCT keywo
a940: 72 64 20 61 6e 64 20 6e 6f 20 61 67 67 72 65 67  rd and no aggreg
a950: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
a960: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
a970: 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b  ->pGroupBy==0 );
a980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a990: 20 48 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59   Has no GROUP BY
a9a0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28   clause */.  if(
a9b0: 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74   p->pLimit ) ret
a9c0: 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
a9d0: 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49      /* Has no LI
a9e0: 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  MIT clause */.  
a9f0: 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73  assert( p->pOffs
aa00: 65 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20  et==0 );        
aa10: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d         /* No LIM
aa20: 49 54 20 6d 65 61 6e 73 20 6e 6f 20 4f 46 46 53  IT means no OFFS
aa30: 45 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  ET */.  if( p->p
aa40: 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30  Where ) return 0
aa50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
aa60: 2a 20 48 61 73 20 6e 6f 20 57 48 45 52 45 20 63  * Has no WHERE c
aa70: 6c 61 75 73 65 20 2a 2f 0a 20 20 70 53 72 63 20  lause */.  pSrc 
aa80: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  = p->pSrc;.  ass
aa90: 65 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a  ert( pSrc!=0 );.
aaa0: 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63    if( pSrc->nSrc
aab0: 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20  !=1 ) return 0; 
aac0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 67           /* Sing
aad0: 6c 65 20 74 65 72 6d 20 69 6e 20 46 52 4f 4d 20  le term in FROM 
aae0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20  clause */.  if( 
aaf0: 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
ab00: 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  ct ) return 0;  
ab10: 20 20 20 2f 2a 20 46 52 4f 4d 20 69 73 20 6e 6f     /* FROM is no
ab20: 74 20 61 20 73 75 62 71 75 65 72 79 20 6f 72 20  t a subquery or 
ab30: 76 69 65 77 20 2a 2f 0a 20 20 70 54 61 62 20 3d  view */.  pTab =
ab40: 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62   pSrc->a[0].pTab
ab50: 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 54  ;.  if( NEVER(pT
ab60: 61 62 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20  ab==0) ) return 
ab70: 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  0;.  assert( pTa
ab80: 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b  b->pSelect==0 );
ab90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
aba0: 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f  ROM clause is no
abb0: 74 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 69 66  t a view */.  if
abc0: 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
abd0: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  ) ) return 0;   
abe0: 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
abf0: 75 73 65 20 6e 6f 74 20 61 20 76 69 72 74 75 61  use not a virtua
ac00: 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c  l table */.  pEL
ac10: 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
ac20: 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e  .  if( pEList->n
ac30: 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e  Expr!=1 ) return
ac40: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65   0;       /* One
ac50: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72   column in the r
ac60: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69  esult set */.  i
ac70: 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  f( pEList->a[0].
ac80: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  pExpr->op!=TK_CO
ac90: 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b  LUMN ) return 0;
aca0: 20 2f 2a 20 52 65 73 75 6c 74 20 69 73 20 61 20   /* Result is a 
acb0: 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 72 65 74 75  column */.  retu
acc0: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
acd0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
ace0: 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  BQUERY */../*.**
acf0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
ad00: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 69 6d  s used by the im
ad10: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
ad20: 74 68 65 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65  the IN (...) ope
ad30: 72 61 74 6f 72 2e 0a 2a 2a 20 49 74 27 73 20 6a  rator..** It's j
ad40: 6f 62 20 69 73 20 74 6f 20 66 69 6e 64 20 6f 72  ob is to find or
ad50: 20 63 72 65 61 74 65 20 61 20 62 2d 74 72 65 65   create a b-tree
ad60: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
ad70: 6d 61 79 20 62 65 20 75 73 65 64 0a 2a 2a 20 65  may be used.** e
ad80: 69 74 68 65 72 20 74 6f 20 74 65 73 74 20 66 6f  ither to test fo
ad90: 72 20 6d 65 6d 62 65 72 73 68 69 70 20 6f 66 20  r membership of 
ada0: 74 68 65 20 28 2e 2e 2e 29 20 73 65 74 20 6f 72  the (...) set or
adb0: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
adc0: 75 67 68 0a 2a 2a 20 69 74 73 20 6d 65 6d 62 65  ugh.** its membe
add0: 72 73 2c 20 73 6b 69 70 70 69 6e 67 20 64 75 70  rs, skipping dup
ade0: 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  licates..**.** T
adf0: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
ae00: 63 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 6f 6e  cursor opened on
ae10: 20 74 68 65 20 62 2d 74 72 65 65 20 28 64 61 74   the b-tree (dat
ae20: 61 62 61 73 65 20 74 61 62 6c 65 2c 20 64 61 74  abase table, dat
ae30: 61 62 61 73 65 20 69 6e 64 65 78 20 0a 2a 2a 20  abase index .** 
ae40: 6f 72 20 65 70 68 65 72 6d 61 6c 20 74 61 62 6c  or ephermal tabl
ae50: 65 29 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  e) is stored in 
ae60: 70 58 2d 3e 69 54 61 62 6c 65 20 62 65 66 6f 72  pX->iTable befor
ae70: 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
ae80: 72 65 74 75 72 6e 73 2e 0a 2a 2a 20 54 68 65 20  returns..** The 
ae90: 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6f  returned value o
aea0: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
aeb0: 69 6e 64 69 63 61 74 65 73 20 74 68 65 20 62 2d  indicates the b-
aec0: 74 72 65 65 20 74 79 70 65 2c 20 61 73 20 66 6f  tree type, as fo
aed0: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49  llows:.**.**   I
aee0: 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 2d 20  N_INDEX_ROWID - 
aef0: 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f  The cursor was o
af00: 70 65 6e 65 64 20 6f 6e 20 61 20 64 61 74 61 62  pened on a datab
af10: 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20  ase table..**   
af20: 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 20 2d  IN_INDEX_INDEX -
af30: 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20   The cursor was 
af40: 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 61 74 61  opened on a data
af50: 62 61 73 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 20  base index..**  
af60: 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 20 2d 20   IN_INDEX_EPH - 
af70: 20 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73    The cursor was
af80: 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 73 70 65   opened on a spe
af90: 63 69 61 6c 6c 79 20 63 72 65 61 74 65 64 20 61  cially created a
afa0: 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  nd.**           
afb0: 20 20 20 20 20 20 20 20 20 70 6f 70 75 6c 61 74           populat
afc0: 65 64 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62  ed epheremal tab
afd0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69  le..**.** An exi
afe0: 73 74 69 6e 67 20 62 2d 74 72 65 65 20 6d 61 79  sting b-tree may
aff0: 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 69 66   only be used if
b000: 20 74 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f   the SELECT is o
b010: 66 20 74 68 65 20 73 69 6d 70 6c 65 0a 2a 2a 20  f the simple.** 
b020: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  form:.**.**     
b030: 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20  SELECT <column> 
b040: 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a  FROM <table>.**.
b050: 2a 2a 20 49 66 20 74 68 65 20 70 72 4e 6f 74 46  ** If the prNotF
b060: 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  ound parameter i
b070: 73 20 30 2c 20 74 68 65 6e 20 74 68 65 20 62 2d  s 0, then the b-
b080: 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65  tree will be use
b090: 64 20 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20  d to iterate.** 
b0a0: 74 68 72 6f 75 67 68 20 74 68 65 20 73 65 74 20  through the set 
b0b0: 6d 65 6d 62 65 72 73 2c 20 73 6b 69 70 70 69 6e  members, skippin
b0c0: 67 20 61 6e 79 20 64 75 70 6c 69 63 61 74 65 73  g any duplicates
b0d0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
b0e0: 6e 0a 2a 2a 20 65 70 68 65 72 65 6d 61 6c 20 74  n.** epheremal t
b0f0: 61 62 6c 65 20 6d 75 73 74 20 62 65 20 75 73 65  able must be use
b100: 64 20 75 6e 6c 65 73 73 20 74 68 65 20 73 65 6c  d unless the sel
b110: 65 63 74 65 64 20 3c 63 6f 6c 75 6d 6e 3e 20 69  ected <column> i
b120: 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20  s guaranteed.** 
b130: 74 6f 20 62 65 20 75 6e 69 71 75 65 20 2d 20 65  to be unique - e
b140: 69 74 68 65 72 20 62 65 63 61 75 73 65 20 69 74  ither because it
b150: 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50   is an INTEGER P
b160: 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 69 74  RIMARY KEY or it
b170: 0a 2a 2a 20 68 61 73 20 61 20 55 4e 49 51 55 45  .** has a UNIQUE
b180: 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20 55   constraint or U
b190: 4e 49 51 55 45 20 69 6e 64 65 78 2e 0a 2a 2a 0a  NIQUE index..**.
b1a0: 2a 2a 20 49 66 20 74 68 65 20 70 72 4e 6f 74 46  ** If the prNotF
b1b0: 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  ound parameter i
b1c0: 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 74 68  s not 0, then th
b1d0: 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65  e b-tree will be
b1e0: 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61   used .** for fa
b1f0: 73 74 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69  st set membershi
b200: 70 20 74 65 73 74 73 2e 20 49 6e 20 74 68 69 73  p tests. In this
b210: 20 63 61 73 65 20 61 6e 20 65 70 68 65 72 65 6d   case an epherem
b220: 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a  al table must .*
b230: 2a 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73  * be used unless
b240: 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 61 6e 20   <column> is an 
b250: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
b260: 4b 45 59 20 6f 72 20 61 6e 20 69 6e 64 65 78 20  KEY or an index 
b270: 63 61 6e 20 0a 2a 2a 20 62 65 20 66 6f 75 6e 64  can .** be found
b280: 20 77 69 74 68 20 3c 63 6f 6c 75 6d 6e 3e 20 61   with <column> a
b290: 73 20 69 74 73 20 6c 65 66 74 2d 6d 6f 73 74 20  s its left-most 
b2a0: 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68  column..**.** Wh
b2b0: 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20 69 73  en the b-tree is
b2c0: 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20   being used for 
b2d0: 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 73  membership tests
b2e0: 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  , the calling fu
b2f0: 6e 63 74 69 6f 6e 0a 2a 2a 20 6e 65 65 64 73 20  nction.** needs 
b300: 74 6f 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20  to know whether 
b310: 6f 72 20 6e 6f 74 20 74 68 65 20 73 74 72 75 63  or not the struc
b320: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e  ture contains an
b330: 20 53 51 4c 20 4e 55 4c 4c 20 0a 2a 2a 20 76 61   SQL NULL .** va
b340: 6c 75 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  lue in order to 
b350: 63 6f 72 72 65 63 74 6c 79 20 65 76 61 6c 75 61  correctly evalua
b360: 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c  te expressions l
b370: 69 6b 65 20 22 58 20 49 4e 20 28 59 2c 20 5a 29  ike "X IN (Y, Z)
b380: 22 2e 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69  "..** If there i
b390: 73 20 61 6e 79 20 63 68 61 6e 63 65 20 74 68 61  s any chance tha
b3a0: 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d 69 67 68  t the (...) migh
b3b0: 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c  t contain a NULL
b3c0: 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20 72 75 6e   value at.** run
b3d0: 74 69 6d 65 2c 20 74 68 65 6e 20 61 20 72 65 67  time, then a reg
b3e0: 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74  ister is allocat
b3f0: 65 64 20 61 6e 64 20 74 68 65 20 72 65 67 69 73  ed and the regis
b400: 74 65 72 20 6e 75 6d 62 65 72 20 77 72 69 74 74  ter number writt
b410: 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 4e 6f 74 46  en.** to *prNotF
b420: 6f 75 6e 64 2e 20 49 66 20 74 68 65 72 65 20 69  ound. If there i
b430: 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74  s no chance that
b440: 20 74 68 65 20 28 2e 2e 2e 29 20 63 6f 6e 74 61   the (...) conta
b450: 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61  ins a.** NULL va
b460: 6c 75 65 2c 20 74 68 65 6e 20 2a 70 72 4e 6f 74  lue, then *prNot
b470: 46 6f 75 6e 64 20 69 73 20 6c 65 66 74 20 75 6e  Found is left un
b480: 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  changed..**.** I
b490: 66 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20  f a register is 
b4a0: 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 74  allocated and it
b4b0: 73 20 6c 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65  s location store
b4c0: 64 20 69 6e 20 2a 70 72 4e 6f 74 46 6f 75 6e 64  d in *prNotFound
b4d0: 2c 20 74 68 65 6e 0a 2a 2a 20 69 74 73 20 69 6e  , then.** its in
b4e0: 69 74 69 61 6c 20 76 61 6c 75 65 20 69 73 20 4e  itial value is N
b4f0: 55 4c 4c 2e 20 20 49 66 20 74 68 65 20 28 2e 2e  ULL.  If the (..
b500: 2e 29 20 64 6f 65 73 20 6e 6f 74 20 72 65 6d 61  .) does not rema
b510: 69 6e 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66  in constant.** f
b520: 6f 72 20 74 68 65 20 64 75 72 61 74 69 6f 6e 20  or the duration 
b530: 6f 66 20 74 68 65 20 71 75 65 72 79 20 28 69 2e  of the query (i.
b540: 65 2e 20 74 68 65 20 53 45 4c 45 43 54 20 77 69  e. the SELECT wi
b550: 74 68 69 6e 20 74 68 65 20 28 2e 2e 2e 29 0a 2a  thin the (...).*
b560: 2a 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65  * is a correlate
b570: 64 20 73 75 62 71 75 65 72 79 29 20 74 68 65 6e  d subquery) then
b580: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
b590: 65 20 61 6c 6c 6f 63 61 74 65 64 20 72 65 67 69  e allocated regi
b5a0: 73 74 65 72 20 69 73 0a 2a 2a 20 72 65 73 65 74  ster is.** reset
b5b0: 20 74 6f 20 4e 55 4c 4c 20 65 61 63 68 20 74 69   to NULL each ti
b5c0: 6d 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  me the subquery 
b5d0: 69 73 20 72 65 72 75 6e 2e 20 54 68 69 73 20 61  is rerun. This a
b5e0: 6c 6c 6f 77 73 20 74 68 65 0a 2a 2a 20 63 61 6c  llows the.** cal
b5f0: 6c 65 72 20 74 6f 20 75 73 65 20 76 64 62 65 20  ler to use vdbe 
b600: 63 6f 64 65 20 65 71 75 69 76 61 6c 65 6e 74 20  code equivalent 
b610: 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
b620: 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 72 65  :.**.**   if( re
b630: 67 69 73 74 65 72 3d 3d 4e 55 4c 4c 20 29 7b 0a  gister==NULL ){.
b640: 2a 2a 20 20 20 20 20 68 61 73 5f 6e 75 6c 6c 20  **     has_null 
b650: 3d 20 3c 74 65 73 74 20 69 66 20 64 61 74 61 20  = <test if data 
b660: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
b670: 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a 20 20 20 20 20  ns null>.**     
b680: 72 65 67 69 73 74 65 72 20 3d 20 31 0a 2a 2a 20  register = 1.** 
b690: 20 20 7d 0a 2a 2a 0a 2a 2a 20 69 6e 20 6f 72 64    }.**.** in ord
b6a0: 65 72 20 74 6f 20 61 76 6f 69 64 20 72 75 6e 6e  er to avoid runn
b6b0: 69 6e 67 20 74 68 65 20 3c 74 65 73 74 20 69 66  ing the <test if
b6c0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
b6d0: 63 6f 6e 74 61 69 6e 73 20 6e 75 6c 6c 3e 0a 2a  contains null>.*
b6e0: 2a 20 74 65 73 74 20 6d 6f 72 65 20 6f 66 74 65  * test more ofte
b6f0: 6e 20 74 68 61 6e 20 69 73 20 6e 65 63 65 73 73  n than is necess
b700: 61 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ary..*/.#ifndef 
b710: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
b720: 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33  UERY.int sqlite3
b730: 46 69 6e 64 49 6e 49 6e 64 65 78 28 50 61 72 73  FindInIndex(Pars
b740: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
b750: 2a 70 58 2c 20 69 6e 74 20 2a 70 72 4e 6f 74 46  *pX, int *prNotF
b760: 6f 75 6e 64 29 7b 0a 20 20 53 65 6c 65 63 74 20  ound){.  Select 
b770: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
b780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b790: 2a 20 53 45 4c 45 43 54 20 74 6f 20 74 68 65 20  * SELECT to the 
b7a0: 72 69 67 68 74 20 6f 66 20 49 4e 20 6f 70 65 72  right of IN oper
b7b0: 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 65 54  ator */.  int eT
b7c0: 79 70 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ype = 0;        
b7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7e0: 2f 2a 20 54 79 70 65 20 6f 66 20 52 48 53 20 74  /* Type of RHS t
b7f0: 61 62 6c 65 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a  able. IN_INDEX_*
b800: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d   */.  int iTab =
b810: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
b820: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
b830: 75 72 73 6f 72 20 6f 66 20 74 68 65 20 52 48 53  ursor of the RHS
b840: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
b850: 6d 75 73 74 42 65 55 6e 69 71 75 65 20 3d 20 28  mustBeUnique = (
b860: 70 72 4e 6f 74 46 6f 75 6e 64 3d 3d 30 29 3b 20  prNotFound==0); 
b870: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 52 48 53    /* True if RHS
b880: 20 6d 75 73 74 20 62 65 20 75 6e 69 71 75 65 20   must be unique 
b890: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 58  */..  assert( pX
b8a0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 0a  ->op==TK_IN );..
b8b0: 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
b8c0: 65 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67  e if an existing
b8d0: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
b8e0: 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 0a 20  can be used to. 
b8f0: 20 2a 2a 20 73 61 74 69 73 66 79 20 74 68 65 20   ** satisfy the 
b900: 71 75 65 72 79 2e 20 20 54 68 69 73 20 69 73 20  query.  This is 
b910: 70 72 65 66 65 72 61 62 6c 65 20 74 6f 20 67 65  preferable to ge
b920: 6e 65 72 61 74 69 6e 67 20 61 20 6e 65 77 20 0a  nerating a new .
b930: 20 20 2a 2a 20 65 70 68 65 6d 65 72 61 6c 20 74    ** ephemeral t
b940: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d  able..  */.  p =
b950: 20 28 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   (ExprHasPropert
b960: 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65  y(pX, EP_xIsSele
b970: 63 74 29 20 3f 20 70 58 2d 3e 78 2e 70 53 65 6c  ct) ? pX->x.pSel
b980: 65 63 74 20 3a 20 30 29 3b 0a 20 20 69 66 28 20  ect : 0);.  if( 
b990: 41 4c 57 41 59 53 28 70 50 61 72 73 65 2d 3e 6e  ALWAYS(pParse->n
b9a0: 45 72 72 3d 3d 30 29 20 26 26 20 69 73 43 61 6e  Err==0) && isCan
b9b0: 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
b9c0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
b9d0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
b9e0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
b9f0: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
ba00: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 45 78  ection */.    Ex
ba10: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 2d 3e 70  pr *pExpr = p->p
ba20: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
ba30: 72 3b 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69  r;   /* Expressi
ba40: 6f 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20  on <column> */. 
ba50: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45     int iCol = pE
ba60: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 20  xpr->iColumn;   
ba70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
ba80: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 3c 63 6f  ex of column <co
ba90: 6c 75 6d 6e 3e 20 2a 2f 0a 20 20 20 20 56 64 62  lumn> */.    Vdb
baa0: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
bab0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 20 20  tVdbe(pParse);  
bac0: 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d      /* Virtual m
bad0: 61 63 68 69 6e 65 20 62 65 69 6e 67 20 63 6f 64  achine being cod
bae0: 65 64 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20  ed */.    Table 
baf0: 2a 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d  *pTab = p->pSrc-
bb00: 3e 61 5b 30 5d 2e 70 54 61 62 3b 20 20 20 20 20  >a[0].pTab;     
bb10: 20 2f 2a 20 54 61 62 6c 65 20 3c 74 61 62 6c 65   /* Table <table
bb20: 3e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44  >. */.    int iD
bb30: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
bb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb50: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 64 78   /* Database idx
bb60: 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 20   for pTab */.   
bb70: 0a 20 20 20 20 2f 2a 20 43 6f 64 65 20 61 6e 20  .    /* Code an 
bb80: 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 20  OP_VerifyCookie 
bb90: 61 6e 64 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b  and OP_TableLock
bba0: 20 66 6f 72 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f   for <table>. */
bbb0: 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
bbc0: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
bbd0: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
bbe0: 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  a);.    sqlite3C
bbf0: 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
bc00: 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
bc10: 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
bc20: 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
bc30: 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70  pTab->tnum, 0, p
bc40: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20  Tab->zName);..  
bc50: 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
bc60: 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  on is only calle
bc70: 64 20 66 72 6f 6d 20 74 77 6f 20 70 6c 61 63 65  d from two place
bc80: 73 2e 20 49 6e 20 62 6f 74 68 20 63 61 73 65 73  s. In both cases
bc90: 20 74 68 65 20 76 64 62 65 0a 20 20 20 20 2a 2a   the vdbe.    **
bca0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
bcb0: 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 20 53 6f 20  n allocated. So 
bcc0: 61 73 73 75 6d 65 20 73 71 6c 69 74 65 33 47 65  assume sqlite3Ge
bcd0: 74 56 64 62 65 28 29 20 69 73 20 61 6c 77 61 79  tVdbe() is alway
bce0: 73 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73  s.    ** success
bcf0: 66 75 6c 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f  ful here..    */
bd00: 0a 20 20 20 20 61 73 73 65 72 74 28 76 29 3b 0a  .    assert(v);.
bd10: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
bd20: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4d 65 6d  {.      int iMem
bd30: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
bd40: 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 41 64  m;.      int iAd
bd50: 64 72 3b 0a 0a 20 20 20 20 20 20 69 41 64 64 72  dr;..      iAddr
bd60: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
bd70: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 69  dOp1(v, OP_If, i
bd80: 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Mem);.      sqli
bd90: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
bda0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
bdb0: 69 4d 65 6d 29 3b 0a 0a 20 20 20 20 20 20 73 71  iMem);..      sq
bdc0: 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70  lite3OpenTable(p
bdd0: 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62  Parse, iTab, iDb
bde0: 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52  , pTab, OP_OpenR
bdf0: 65 61 64 29 3b 0a 20 20 20 20 20 20 65 54 79 70  ead);.      eTyp
be00: 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  e = IN_INDEX_ROW
be10: 49 44 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  ID;..      sqlit
be20: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
be30: 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 7d 65  , iAddr);.    }e
be40: 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  lse{.      Index
be50: 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
be60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be70: 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
be80: 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f  able */..      /
be90: 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  * The collation 
bea0: 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 62 79  sequence used by
beb0: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   the comparison.
bec0: 20 49 66 20 61 6e 20 69 6e 64 65 78 20 69 73 20   If an index is 
bed0: 74 6f 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 75  to.      ** be u
bee0: 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  sed in place of 
bef0: 61 20 74 65 6d 70 2d 74 61 62 6c 65 2c 20 69 74  a temp-table, it
bf00: 20 6d 75 73 74 20 62 65 20 6f 72 64 65 72 65 64   must be ordered
bf10: 20 61 63 63 6f 72 64 69 6e 67 0a 20 20 20 20 20   according.     
bf20: 20 2a 2a 20 74 6f 20 74 68 69 73 20 63 6f 6c 6c   ** to this coll
bf30: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 20  ation sequence. 
bf40: 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65   */.      CollSe
bf50: 71 20 2a 70 52 65 71 20 3d 20 73 71 6c 69 74 65  q *pReq = sqlite
bf60: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
bf70: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58  llSeq(pParse, pX
bf80: 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 29 3b  ->pLeft, pExpr);
bf90: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b  ..      /* Check
bfa0: 20 74 68 61 74 20 74 68 65 20 61 66 66 69 6e 69   that the affini
bfb0: 74 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ty that will be 
bfc0: 75 73 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20  used to perform 
bfd0: 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  the .      ** co
bfe0: 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 68 65 20  mparison is the 
bff0: 73 61 6d 65 20 61 73 20 74 68 65 20 61 66 66 69  same as the affi
c000: 6e 69 74 79 20 6f 66 20 74 68 65 20 63 6f 6c 75  nity of the colu
c010: 6d 6e 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20  mn. If.      ** 
c020: 69 74 20 69 73 20 6e 6f 74 2c 20 69 74 20 69 73  it is not, it is
c030: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
c040: 20 75 73 65 20 61 6e 79 20 69 6e 64 65 78 2e 0a   use any index..
c050: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
c060: 68 61 72 20 61 66 66 20 3d 20 63 6f 6d 70 61 72  har aff = compar
c070: 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 58 29  isonAffinity(pX)
c080: 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66 69  ;.      int affi
c090: 6e 69 74 79 5f 6f 6b 20 3d 20 28 70 54 61 62 2d  nity_ok = (pTab-
c0a0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69  >aCol[iCol].affi
c0b0: 6e 69 74 79 3d 3d 61 66 66 7c 7c 61 66 66 3d 3d  nity==aff||aff==
c0c0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29  SQLITE_AFF_NONE)
c0d0: 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64  ;..      for(pId
c0e0: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
c0f0: 70 49 64 78 20 26 26 20 65 54 79 70 65 3d 3d 30  pIdx && eType==0
c100: 20 26 26 20 61 66 66 69 6e 69 74 79 5f 6f 6b 3b   && affinity_ok;
c110: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
c120: 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t){.        if( 
c130: 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  (pIdx->aiColumn[
c140: 30 5d 3d 3d 69 43 6f 6c 29 0a 20 20 20 20 20 20  0]==iCol).      
c150: 20 20 20 26 26 20 73 71 6c 69 74 65 33 46 69 6e     && sqlite3Fin
c160: 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43  dCollSeq(db, ENC
c170: 28 64 62 29 2c 20 70 49 64 78 2d 3e 61 7a 43 6f  (db), pIdx->azCo
c180: 6c 6c 5b 30 5d 2c 20 30 29 3d 3d 70 52 65 71 0a  ll[0], 0)==pReq.
c190: 20 20 20 20 20 20 20 20 20 26 26 20 28 21 6d 75           && (!mu
c1a0: 73 74 42 65 55 6e 69 71 75 65 20 7c 7c 20 28 70  stBeUnique || (p
c1b0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20  Idx->nColumn==1 
c1c0: 26 26 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  && pIdx->onError
c1d0: 21 3d 4f 45 5f 4e 6f 6e 65 29 29 0a 20 20 20 20  !=OE_None)).    
c1e0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
c1f0: 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50   int iMem = ++pP
c200: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
c210: 20 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 3b        int iAddr;
c220: 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
c230: 2a 70 4b 65 79 3b 0a 20 20 0a 20 20 20 20 20 20  *pKey;.  .      
c240: 20 20 20 20 70 4b 65 79 20 3d 20 28 63 68 61 72      pKey = (char
c250: 20 2a 29 73 71 6c 69 74 65 33 49 6e 64 65 78 4b   *)sqlite3IndexK
c260: 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyinfo(pParse, p
c270: 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Idx);.          
c280: 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56  iAddr = sqlite3V
c290: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
c2a0: 49 66 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20  If, iMem);.     
c2b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c2c0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
c2d0: 65 67 65 72 2c 20 31 2c 20 69 4d 65 6d 29 3b 0a  eger, 1, iMem);.
c2e0: 20 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c    .          sql
c2f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
c300: 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
c310: 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c  Tab, pIdx->tnum,
c320: 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20   iDb,.          
c330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c340: 20 20 20 20 20 70 4b 65 79 2c 50 34 5f 4b 45 59       pKey,P4_KEY
c350: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
c360: 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d           VdbeCom
c370: 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
c380: 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Idx->zName));.  
c390: 20 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20          eType = 
c3a0: 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 3b 0a  IN_INDEX_INDEX;.
c3b0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
c3c0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
c3d0: 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20  , iAddr);.      
c3e0: 20 20 20 20 69 66 28 20 70 72 4e 6f 74 46 6f 75      if( prNotFou
c3f0: 6e 64 20 26 26 20 21 70 54 61 62 2d 3e 61 43 6f  nd && !pTab->aCo
c400: 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20  l[iCol].notNull 
c410: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ){.            *
c420: 70 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 2b 2b 70  prNotFound = ++p
c430: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
c440: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c450: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
c460: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 54 79 70  .  }..  if( eTyp
c470: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43  e==0 ){.    /* C
c480: 6f 75 6c 64 20 6e 6f 74 20 66 6f 75 6e 64 20 61  ould not found a
c490: 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65  n existing table
c4a0: 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65   or index to use
c4b0: 20 61 73 20 74 68 65 20 52 48 53 20 62 2d 74 72   as the RHS b-tr
c4c0: 65 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20 77 69  ee..    ** We wi
c4d0: 6c 6c 20 68 61 76 65 20 74 6f 20 67 65 6e 65 72  ll have to gener
c4e0: 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ate an ephemeral
c4f0: 20 74 61 62 6c 65 20 74 6f 20 64 6f 20 74 68 65   table to do the
c500: 20 6a 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   job..    */.   
c510: 20 69 6e 74 20 72 4d 61 79 48 61 76 65 4e 75 6c   int rMayHaveNul
c520: 6c 20 3d 20 30 3b 0a 20 20 20 20 65 54 79 70 65  l = 0;.    eType
c530: 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 3b   = IN_INDEX_EPH;
c540: 0a 20 20 20 20 69 66 28 20 70 72 4e 6f 74 46 6f  .    if( prNotFo
c550: 75 6e 64 20 29 7b 0a 20 20 20 20 20 20 2a 70 72  und ){.      *pr
c560: 4e 6f 74 46 6f 75 6e 64 20 3d 20 72 4d 61 79 48  NotFound = rMayH
c570: 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72  aveNull = ++pPar
c580: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d 65  se->nMem;.    }e
c590: 6c 73 65 20 69 66 28 20 70 58 2d 3e 70 4c 65 66  lse if( pX->pLef
c5a0: 74 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20  t->iColumn<0 && 
c5b0: 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65  !ExprHasAnyPrope
c5c0: 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65  rty(pX, EP_xIsSe
c5d0: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 65  lect) ){.      e
c5e0: 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
c5f0: 52 4f 57 49 44 3b 0a 20 20 20 20 7d 0a 20 20 20  ROWID;.    }.   
c600: 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
c610: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 58  elect(pParse, pX
c620: 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20  , rMayHaveNull, 
c630: 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
c640: 52 4f 57 49 44 29 3b 0a 20 20 7d 65 6c 73 65 7b  ROWID);.  }else{
c650: 0a 20 20 20 20 70 58 2d 3e 69 54 61 62 6c 65 20  .    pX->iTable 
c660: 3d 20 69 54 61 62 3b 0a 20 20 7d 0a 20 20 72 65  = iTab;.  }.  re
c670: 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 23 65  turn eType;.}.#e
c680: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ndif../*.** Gene
c690: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 73 63  rate code for sc
c6a0: 61 6c 61 72 20 73 75 62 71 75 65 72 69 65 73 20  alar subqueries 
c6b0: 75 73 65 64 20 61 73 20 61 6e 20 65 78 70 72 65  used as an expre
c6c0: 73 73 69 6f 6e 0a 2a 2a 20 61 6e 64 20 49 4e 20  ssion.** and IN 
c6d0: 6f 70 65 72 61 74 6f 72 73 2e 20 20 45 78 61 6d  operators.  Exam
c6e0: 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ples:.**.**     
c6f0: 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62  (SELECT a FROM b
c700: 29 20 20 20 20 20 20 20 20 20 20 2d 2d 20 73 75  )          -- su
c710: 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 45 58  bquery.**     EX
c720: 49 53 54 53 20 28 53 45 4c 45 43 54 20 61 20 46  ISTS (SELECT a F
c730: 52 4f 4d 20 62 29 20 20 20 2d 2d 20 45 58 49 53  ROM b)   -- EXIS
c740: 54 53 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20  TS subquery.**  
c750: 20 20 20 78 20 49 4e 20 28 34 2c 35 2c 31 31 29     x IN (4,5,11)
c760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
c770: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74   IN operator wit
c780: 68 20 6c 69 73 74 20 6f 6e 20 72 69 67 68 74 2d  h list on right-
c790: 68 61 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20 20  hand side.**    
c7a0: 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 61 20   x IN (SELECT a 
c7b0: 46 52 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20 49  FROM b)     -- I
c7c0: 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  N operator with 
c7d0: 73 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20  subquery on the 
c7e0: 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20  right.**.** The 
c7f0: 70 45 78 70 72 20 70 61 72 61 6d 65 74 65 72 20  pExpr parameter 
c800: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 65 78  describes the ex
c810: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f  pression that co
c820: 6e 74 61 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a  ntains the IN.**
c830: 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 75 62   operator or sub
c840: 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  query..**.** If 
c850: 70 61 72 61 6d 65 74 65 72 20 69 73 52 6f 77 69  parameter isRowi
c860: 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  d is non-zero, t
c870: 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 70  hen expression p
c880: 45 78 70 72 20 69 73 20 67 75 61 72 61 6e 74 65  Expr is guarante
c890: 65 64 0a 2a 2a 20 74 6f 20 62 65 20 6f 66 20 74  ed.** to be of t
c8a0: 68 65 20 66 6f 72 6d 20 22 3c 72 6f 77 69 64 3e  he form "<rowid>
c8b0: 20 49 4e 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20   IN (?, ?, ?)", 
c8c0: 77 68 65 72 65 20 3c 72 6f 77 69 64 3e 20 69 73  where <rowid> is
c8d0: 20 61 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20   a reference.** 
c8e0: 74 6f 20 73 6f 6d 65 20 69 6e 74 65 67 65 72 20  to some integer 
c8f0: 6b 65 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20  key column of a 
c900: 74 61 62 6c 65 20 42 2d 54 72 65 65 2e 20 49 6e  table B-Tree. In
c910: 20 74 68 69 73 20 63 61 73 65 2c 20 75 73 65 20   this case, use 
c920: 61 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20 42 2d 54  an.** intkey B-T
c930: 72 65 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65  ree to store the
c940: 20 73 65 74 20 6f 66 20 49 4e 28 2e 2e 2e 29 20   set of IN(...) 
c950: 76 61 6c 75 65 73 20 69 6e 73 74 65 61 64 20 6f  values instead o
c960: 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 28  f the usual.** (
c970: 73 6c 6f 77 65 72 29 20 76 61 72 69 61 62 6c 65  slower) variable
c980: 20 6c 65 6e 67 74 68 20 6b 65 79 73 20 42 2d 54   length keys B-T
c990: 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d  ree..**.** If rM
c9a0: 61 79 48 61 76 65 4e 75 6c 6c 20 69 73 20 6e 6f  ayHaveNull is no
c9b0: 6e 2d 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65 61  n-zero, that mea
c9c0: 6e 73 20 74 68 61 74 20 74 68 65 20 6f 70 65 72  ns that the oper
c9d0: 61 74 69 6f 6e 20 69 73 20 61 6e 20 49 4e 0a 2a  ation is an IN.*
c9e0: 2a 20 28 6e 6f 74 20 61 20 53 45 4c 45 43 54 20  * (not a SELECT 
c9f0: 6f 72 20 45 58 49 53 54 53 29 20 61 6e 64 20 74  or EXISTS) and t
ca00: 68 61 74 20 74 68 65 20 52 48 53 20 6d 69 67 68  hat the RHS migh
ca10: 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73  t contains NULLs
ca20: 2e 0a 2a 2a 20 46 75 72 74 68 65 72 6d 6f 72 65  ..** Furthermore
ca30: 2c 20 74 68 65 20 49 4e 20 69 73 20 69 6e 20 61  , the IN is in a
ca40: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 6e   WHERE clause an
ca50: 64 20 74 68 61 74 20 77 65 20 72 65 61 6c 6c 79  d that we really
ca60: 20 77 61 6e 74 0a 2a 2a 20 74 6f 20 69 74 65 72   want.** to iter
ca70: 61 74 65 20 6f 76 65 72 20 74 68 65 20 52 48 53  ate over the RHS
ca80: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
ca90: 74 6f 72 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  tor in order to 
caa0: 71 75 69 63 6b 6c 79 20 6c 6f 63 61 74 65 0a 2a  quickly locate.*
cab0: 2a 20 61 6c 6c 20 63 6f 72 72 65 73 70 6f 6e 64  * all correspond
cac0: 69 6e 67 20 4c 48 53 20 65 6c 65 6d 65 6e 74 73  ing LHS elements
cad0: 2e 20 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74  .  All this rout
cae0: 69 6e 65 20 64 6f 65 73 20 69 73 20 69 6e 69 74  ine does is init
caf0: 69 61 6c 69 7a 65 0a 2a 2a 20 74 68 65 20 72 65  ialize.** the re
cb00: 67 69 73 74 65 72 20 67 69 76 65 6e 20 62 79 20  gister given by 
cb10: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 74 6f 20  rMayHaveNull to 
cb20: 4e 55 4c 4c 2e 20 20 43 61 6c 6c 69 6e 67 20 72  NULL.  Calling r
cb30: 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 74 61 6b  outines will tak
cb40: 65 0a 2a 2a 20 63 61 72 65 20 6f 66 20 63 68 61  e.** care of cha
cb50: 6e 67 69 6e 67 20 74 68 69 73 20 72 65 67 69 73  nging this regis
cb60: 74 65 72 20 76 61 6c 75 65 20 74 6f 20 6e 6f 6e  ter value to non
cb70: 2d 4e 55 4c 4c 20 69 66 20 74 68 65 20 52 48 53  -NULL if the RHS
cb80: 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a   is NULL-free..*
cb90: 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48 61 76 65  *.** If rMayHave
cba0: 4e 75 6c 6c 20 69 73 20 7a 65 72 6f 2c 20 74 68  Null is zero, th
cbb0: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  at means that th
cbc0: 65 20 73 75 62 71 75 65 72 79 20 69 73 20 62 65  e subquery is be
cbd0: 69 6e 67 20 75 73 65 64 0a 2a 2a 20 66 6f 72 20  ing used.** for 
cbe0: 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 69  membership testi
cbf0: 6e 67 20 6f 6e 6c 79 2e 20 20 54 68 65 72 65 20  ng only.  There 
cc00: 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e  is no need to in
cc10: 69 74 69 61 6c 69 7a 65 20 61 6e 79 0a 2a 2a 20  itialize any.** 
cc20: 72 65 67 69 73 74 65 72 73 20 74 6f 20 69 6e 64  registers to ind
cc30: 69 63 61 74 65 20 74 68 65 20 70 72 65 73 65 6e  icate the presen
cc40: 73 65 20 6f 72 20 61 62 73 65 6e 63 65 20 6f 66  se or absence of
cc50: 20 4e 55 4c 4c 73 20 6f 6e 20 74 68 65 20 52 48   NULLs on the RH
cc60: 53 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 53  S..**.** For a S
cc70: 45 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53 20  ELECT or EXISTS 
cc80: 6f 70 65 72 61 74 6f 72 2c 20 72 65 74 75 72 6e  operator, return
cc90: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 74 68   the register th
cca0: 61 74 20 68 6f 6c 64 73 20 74 68 65 0a 2a 2a 20  at holds the.** 
ccb0: 72 65 73 75 6c 74 2e 20 20 46 6f 72 20 49 4e 20  result.  For IN 
ccc0: 6f 70 65 72 61 74 6f 72 73 20 6f 72 20 69 66 20  operators or if 
ccd0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
cce0: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
ccf0: 65 20 69 73 20 30 2e 0a 2a 2f 0a 23 69 66 6e 64  e is 0..*/.#ifnd
cd00: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
cd10: 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69  UBQUERY.int sqli
cd20: 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
cd30: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
cd40: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
cd50: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
cd60: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
cd70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
cd80: 68 65 20 49 4e 2c 20 53 45 4c 45 43 54 2c 20 6f  he IN, SELECT, o
cd90: 72 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f  r EXISTS operato
cda0: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 4d 61 79 48  r */.  int rMayH
cdb0: 61 76 65 4e 75 6c 6c 2c 20 20 20 20 20 20 20 2f  aveNull,       /
cdc0: 2a 20 52 65 67 69 73 74 65 72 20 74 68 61 74 20  * Register that 
cdd0: 72 65 63 6f 72 64 73 20 77 68 65 74 68 65 72 20  records whether 
cde0: 4e 55 4c 4c 73 20 65 78 69 73 74 20 69 6e 20 52  NULLs exist in R
cdf0: 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f  HS */.  int isRo
ce00: 77 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20  wid             
ce10: 2f 2a 20 49 66 20 74 72 75 65 2c 20 4c 48 53 20  /* If true, LHS 
ce20: 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69  of IN operator i
ce30: 73 20 61 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a  s a rowid */.){.
ce40: 20 20 69 6e 74 20 74 65 73 74 41 64 64 72 20 3d    int testAddr =
ce50: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
ce60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
ce70: 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64 72 65  -time test addre
ce80: 73 73 20 2a 2f 0a 20 20 69 6e 74 20 72 52 65 67  ss */.  int rReg
ce90: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
cea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ceb0: 2f 2a 20 52 65 67 69 73 74 65 72 20 73 74 6f 72  /* Register stor
cec0: 69 6e 67 20 72 65 73 75 6c 74 69 6e 67 20 2a 2f  ing resulting */
ced0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
cee0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
cef0: 73 65 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  se);.  if( NEVER
cf00: 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20  (v==0) ) return 
cf10: 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  0;.  sqlite3Expr
cf20: 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
cf30: 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f  );..  /* This co
cf40: 64 65 20 6d 75 73 74 20 62 65 20 72 75 6e 20 69  de must be run i
cf50: 6e 20 69 74 73 20 65 6e 74 69 72 65 74 79 20 65  n its entirety e
cf60: 76 65 72 79 20 74 69 6d 65 20 69 74 20 69 73 20  very time it is 
cf70: 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a  encountered.  **
cf80: 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   if any of the f
cf90: 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65  ollowing is true
cfa0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a  :.  **.  **    *
cfb0: 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64    The right-hand
cfc0: 20 73 69 64 65 20 69 73 20 61 20 63 6f 72 72 65   side is a corre
cfd0: 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 0a 20  lated subquery. 
cfe0: 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69   **    *  The ri
cff0: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
d000: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
d010: 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76  ist containing v
d020: 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20  ariables.  **   
d030: 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69 64   *  We are insid
d040: 65 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a  e a trigger.  **
d050: 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20  .  ** If all of 
d060: 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 66 61  the above are fa
d070: 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e  lse, then we can
d080: 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 6a   run this code j
d090: 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61  ust once.  ** sa
d0a0: 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20  ve the results, 
d0b0: 61 6e 64 20 72 65 75 73 65 20 74 68 65 20 73 61  and reuse the sa
d0c0: 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62  me result on sub
d0d0: 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69  sequent invocati
d0e0: 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
d0f0: 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65  !ExprHasAnyPrope
d100: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61  rty(pExpr, EP_Va
d110: 72 53 65 6c 65 63 74 29 20 26 26 20 21 70 50 61  rSelect) && !pPa
d120: 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62  rse->pTriggerTab
d130: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 65 6d 20   ){.    int mem 
d140: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
d150: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
d160: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
d170: 2c 20 6d 65 6d 29 3b 0a 20 20 20 20 74 65 73 74  , mem);.    test
d180: 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
d190: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
d1a0: 6e 74 65 67 65 72 2c 20 31 2c 20 6d 65 6d 29 3b  nteger, 1, mem);
d1b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 74 65 73  .    assert( tes
d1c0: 74 41 64 64 72 3e 30 20 7c 7c 20 70 50 61 72 73  tAddr>0 || pPars
d1d0: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
d1e0: 6c 65 64 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 77  led );.  }..  sw
d1f0: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
d200: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  ){.    case TK_I
d210: 4e 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20  N: {.      char 
d220: 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20  affinity;.      
d230: 4b 65 79 49 6e 66 6f 20 6b 65 79 49 6e 66 6f 3b  KeyInfo keyInfo;
d240: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
d250: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
d260: 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68  ss of OP_OpenEph
d270: 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69  emeral instructi
d280: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  on */.      Expr
d290: 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
d2a0: 3e 70 4c 65 66 74 3b 0a 0a 20 20 20 20 20 20 69  >pLeft;..      i
d2b0: 66 28 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20  f( rMayHaveNull 
d2c0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
d2d0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
d2e0: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 4d 61 79  OP_Null, 0, rMay
d2f0: 48 61 76 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  HaveNull);.     
d300: 20 7d 0a 0a 20 20 20 20 20 20 61 66 66 69 6e 69   }..      affini
d310: 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ty = sqlite3Expr
d320: 41 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29 3b  Affinity(pLeft);
d330: 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74 68  ..      /* Wheth
d340: 65 72 20 74 68 69 73 20 69 73 20 61 6e 20 27 78  er this is an 'x
d350: 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29 27 20   IN(SELECT...)' 
d360: 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c 65 78 70  or an 'x IN(<exp
d370: 72 6c 69 73 74 3e 29 27 0a 20 20 20 20 20 20 2a  rlist>)'.      *
d380: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69 74 20  * expression it 
d390: 69 73 20 68 61 6e 64 6c 65 64 20 74 68 65 20 73  is handled the s
d3a0: 61 6d 65 20 77 61 79 2e 20 20 41 6e 20 65 70 68  ame way.  An eph
d3b0: 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 73 20  emeral table is 
d3c0: 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64  .      ** filled
d3d0: 20 77 69 74 68 20 73 69 6e 67 6c 65 2d 66 69 65   with single-fie
d3e0: 6c 64 20 69 6e 64 65 78 20 6b 65 79 73 20 72 65  ld index keys re
d3f0: 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 72  presenting the r
d400: 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20  esults.      ** 
d410: 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20  from the SELECT 
d420: 6f 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74  or the <exprlist
d430: 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  >..      **.    
d440: 20 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20    ** If the 'x' 
d450: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
d460: 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72  column value, or
d470: 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20   the SELECT.... 
d480: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
d490: 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75  t returns a colu
d4a0: 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  mn value, then t
d4b0: 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74  he affinity of t
d4c0: 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c  hat.      ** col
d4d0: 75 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62  umn is used to b
d4e0: 75 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b  uild the index k
d4f0: 65 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27  eys. If both 'x'
d500: 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a   and the.      *
d510: 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74  * SELECT... stat
d520: 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e  ement are column
d530: 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20  s, then numeric 
d540: 61 66 66 69 6e 69 74 79 20 69 73 20 75 73 65 64  affinity is used
d550: 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74  .      ** if eit
d560: 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e  her column has N
d570: 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45  UMERIC or INTEGE
d580: 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e  R affinity. If n
d590: 65 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20  either.      ** 
d5a0: 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45  'x' nor the SELE
d5b0: 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20  CT... statement 
d5c0: 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  are columns, the
d5d0: 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  n numeric affini
d5e0: 74 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75  ty.      ** is u
d5f0: 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sed..      */.  
d600: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
d610: 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  e = pParse->nTab
d620: 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  ++;.      addr =
d630: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d640: 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
d650: 65 6d 65 72 61 6c 2c 20 70 45 78 70 72 2d 3e 69  emeral, pExpr->i
d660: 54 61 62 6c 65 2c 20 21 69 73 52 6f 77 69 64 29  Table, !isRowid)
d670: 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
d680: 6b 65 79 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  keyInfo, 0, size
d690: 6f 66 28 6b 65 79 49 6e 66 6f 29 29 3b 0a 20 20  of(keyInfo));.  
d6a0: 20 20 20 20 6b 65 79 49 6e 66 6f 2e 6e 46 69 65      keyInfo.nFie
d6b0: 6c 64 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 69  ld = 1;..      i
d6c0: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
d6d0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
d6e0: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
d6f0: 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20     /* Case 1:   
d700: 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43    expr IN (SELEC
d710: 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a  T ...).        *
d720: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e  *.        ** Gen
d730: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72  erate code to wr
d740: 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ite the results 
d750: 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e  of the select in
d760: 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  to the temporary
d770: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  .        ** tabl
d780: 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  e allocated and 
d790: 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20  opened above..  
d7a0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
d7b0: 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
d7c0: 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69  ;.        ExprLi
d7d0: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 20  st *pEList;..   
d7e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73       assert( !is
d7f0: 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20  Rowid );.       
d800: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
d810: 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
d820: 54 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 54  T_Set, pExpr->iT
d830: 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 64  able);.        d
d840: 65 73 74 2e 61 66 66 69 6e 69 74 79 20 3d 20 28  est.affinity = (
d850: 75 38 29 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  u8)affinity;.   
d860: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 45       assert( (pE
d870: 78 70 72 2d 3e 69 54 61 62 6c 65 26 30 78 30 30  xpr->iTable&0x00
d880: 30 30 46 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e  00FFFF)==pExpr->
d890: 69 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20  iTable );.      
d8a0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
d8b0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  ect(pParse, pExp
d8c0: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26 64  r->x.pSelect, &d
d8d0: 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  est) ){.        
d8e0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
d8f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 45      }.        pE
d900: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
d910: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
d920: 0a 20 20 20 20 20 20 20 20 69 66 28 20 41 4c 57  .        if( ALW
d930: 41 59 53 28 70 45 4c 69 73 74 21 3d 30 20 26 26  AYS(pEList!=0 &&
d940: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30   pEList->nExpr>0
d950: 29 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20  ) ){ .          
d960: 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d  keyInfo.aColl[0]
d970: 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
d980: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
d990: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
d9a0: 65 66 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eft,.           
d9b0: 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e     pEList->a[0].
d9c0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
d9d0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
d9e0: 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ( pExpr->x.pList
d9f0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  !=0 ){.        /
da00: 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20 65 78  * Case 2:     ex
da10: 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29  pr IN (exprlist)
da20: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
da30: 20 20 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20      ** For each 
da40: 65 78 70 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c  expression, buil
da50: 64 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 66  d an index key f
da60: 72 6f 6d 20 74 68 65 20 65 76 61 6c 75 61 74 69  rom the evaluati
da70: 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  on and.        *
da80: 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68  * store it in th
da90: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
daa0: 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20  e. If <expr> is 
dab0: 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75  a column, then u
dac0: 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  se.        ** th
dad0: 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e  at columns affin
dae0: 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64 69 6e  ity when buildin
daf0: 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66  g index keys. If
db00: 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20   <expr> is not. 
db10: 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75         ** a colu
db20: 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69 63 20  mn, use numeric 
db30: 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 20 20  affinity..      
db40: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
db50: 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72   i;.        Expr
db60: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
db70: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
db80: 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
db90: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
dba0: 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  m;.        int r
dbb0: 31 2c 20 72 32 2c 20 72 33 3b 0a 0a 20 20 20 20  1, r2, r3;..    
dbc0: 20 20 20 20 69 66 28 20 21 61 66 66 69 6e 69 74      if( !affinit
dbd0: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  y ){.          a
dbe0: 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
dbf0: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
dc00: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6b 65 79     }.        key
dc10: 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20  Info.aColl[0] = 
dc20: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
dc30: 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
dc40: 2d 3e 70 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20  ->pLeft);..     
dc50: 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75     /* Loop throu
dc60: 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69  gh each expressi
dc70: 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e  on in <exprlist>
dc80: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 31 20  . */.        r1 
dc90: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
dca0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
dcb0: 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
dcc0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
dcd0: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
dce0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
dcf0: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 32  , OP_Null, 0, r2
dd00: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
dd10: 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70  =pList->nExpr, p
dd20: 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69  Item=pList->a; i
dd30: 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; i--, pItem++
dd40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
dd50: 72 20 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e  r *pE2 = pItem->
dd60: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
dd70: 20 69 6e 74 20 69 56 61 6c 54 6f 49 6e 73 3b 0a   int iValToIns;.
dd80: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
dd90: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
dda0: 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20  is not constant 
ddb0: 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65  then we will nee
ddc0: 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a  d to.          *
ddd0: 2a 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65  * disable the te
dde0: 73 74 20 74 68 61 74 20 77 61 73 20 67 65 6e 65  st that was gene
ddf0: 72 61 74 65 64 20 61 62 6f 76 65 20 74 68 61 74  rated above that
de00: 20 6d 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20   makes sure.    
de10: 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f        ** this co
de20: 64 65 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73  de only executes
de30: 20 6f 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20   once.  Because 
de40: 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61  for a non-consta
de50: 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nt.          ** 
de60: 65 78 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65  expression we ne
de70: 65 64 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73  ed to rerun this
de80: 20 63 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e   code each time.
de90: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
dea0: 20 20 20 20 20 20 20 20 69 66 28 20 74 65 73 74          if( test
deb0: 41 64 64 72 20 26 26 20 21 73 71 6c 69 74 65 33  Addr && !sqlite3
dec0: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
ded0: 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  E2) ){.         
dee0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
def0: 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 74 65  angeToNoop(v, te
df00: 73 74 41 64 64 72 2d 31 2c 20 32 29 3b 0a 20 20  stAddr-1, 2);.  
df10: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 41 64            testAd
df20: 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  dr = 0;.        
df30: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f    }..          /
df40: 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65  * Evaluate the e
df50: 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e  xpression and in
df60: 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65  sert it into the
df70: 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
df80: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 73 52           if( isR
df90: 6f 77 69 64 20 26 26 20 73 71 6c 69 74 65 33 45  owid && sqlite3E
dfa0: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 32  xprIsInteger(pE2
dfb0: 2c 20 26 69 56 61 6c 54 6f 49 6e 73 29 20 29 7b  , &iValToIns) ){
dfc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
dfd0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
dfe0: 2c 20 4f 50 5f 49 6e 73 65 72 74 49 6e 74 2c 20  , OP_InsertInt, 
dff0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72  pExpr->iTable, r
e000: 32 2c 20 69 56 61 6c 54 6f 49 6e 73 29 3b 0a 20  2, iValToIns);. 
e010: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
e020: 20 20 20 20 20 20 20 20 20 20 20 20 72 33 20 3d              r3 =
e030: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
e040: 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
e050: 45 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  E2, r1);.       
e060: 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69 64       if( isRowid
e070: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
e080: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e090: 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op2(v, OP_MustBe
e0a0: 49 6e 74 2c 20 72 33 2c 0a 20 20 20 20 20 20 20  Int, r3,.       
e0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0c0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e0d0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
e0e0: 76 29 2b 32 29 3b 0a 20 20 20 20 20 20 20 20 20  v)+2);.         
e0f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e100: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
e110: 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  ert, pExpr->iTab
e120: 6c 65 2c 20 72 32 2c 20 72 33 29 3b 0a 20 20 20  le, r2, r3);.   
e130: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
e140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
e150: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
e160: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
e170: 2c 20 72 33 2c 20 31 2c 20 72 32 2c 20 26 61 66  , r3, 1, r2, &af
e180: 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20  finity, 1);.    
e190: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
e1a0: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
e1b0: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
e1c0: 20 72 33 2c 20 31 29 3b 0a 20 20 20 20 20 20 20   r3, 1);.       
e1d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
e1e0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
e1f0: 64 78 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d  dxInsert, pExpr-
e200: 3e 69 54 61 62 6c 65 2c 20 72 32 29 3b 0a 20 20  >iTable, r2);.  
e210: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
e220: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e230: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
e240: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
e250: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
e260: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
e270: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
e280: 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a  e, r2);.      }.
e290: 20 20 20 20 20 20 69 66 28 20 21 69 73 52 6f 77        if( !isRow
e2a0: 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  id ){.        sq
e2b0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
e2c0: 34 28 76 2c 20 61 64 64 72 2c 20 28 76 6f 69 64  4(v, addr, (void
e2d0: 20 2a 29 26 6b 65 79 49 6e 66 6f 2c 20 50 34 5f   *)&keyInfo, P4_
e2e0: 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
e2f0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
e300: 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54     }..    case T
e310: 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61  K_EXISTS:.    ca
e320: 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20  se TK_SELECT:.  
e330: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
e340: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 68 61     /* If this ha
e350: 73 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72  s to be a scalar
e360: 20 53 45 4c 45 43 54 2e 20 20 47 65 6e 65 72 61   SELECT.  Genera
e370: 74 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74  te code to put t
e380: 68 65 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c 75  he.      ** valu
e390: 65 20 6f 66 20 74 68 69 73 20 73 65 6c 65 63 74  e of this select
e3a0: 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c   in a memory cel
e3b0: 6c 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68 65  l and record the
e3c0: 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a   number.      **
e3d0: 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63   of the memory c
e3e0: 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 20  ell in iColumn. 
e3f0: 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 45   If this is an E
e400: 58 49 53 54 53 2c 20 77 72 69 74 65 0a 20 20 20  XISTS, write.   
e410: 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72     ** an integer
e420: 20 30 20 28 6e 6f 74 20 65 78 69 73 74 73 29 20   0 (not exists) 
e430: 6f 72 20 31 20 28 65 78 69 73 74 73 29 20 69 6e  or 1 (exists) in
e440: 74 6f 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  to a memory cell
e450: 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65  .      ** and re
e460: 63 6f 72 64 20 74 68 61 74 20 6d 65 6d 6f 72 79  cord that memory
e470: 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e   cell in iColumn
e480: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
e490: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 54 6f   static const To
e4a0: 6b 65 6e 20 6f 6e 65 20 3d 20 7b 20 22 31 22 2c  ken one = { "1",
e4b0: 20 31 20 7d 3b 20 20 2f 2a 20 54 6f 6b 65 6e 20   1 };  /* Token 
e4c0: 66 6f 72 20 6c 69 74 65 72 61 6c 20 76 61 6c 75  for literal valu
e4d0: 65 20 31 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c  e 1 */.      Sel
e4e0: 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 20  ect *pSel;      
e4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e500: 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61     /* SELECT sta
e510: 74 65 6d 65 6e 74 20 74 6f 20 65 6e 63 6f 64 65  tement to encode
e520: 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74   */.      Select
e530: 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20  Dest dest;      
e540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e550: 2f 2a 20 48 6f 77 20 74 6f 20 64 65 61 6c 20 77  /* How to deal w
e560: 69 74 68 20 53 45 4c 45 43 74 20 72 65 73 75 6c  ith SELECt resul
e570: 74 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65 73 74  t */..      test
e580: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
e590: 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20  =TK_EXISTS );.  
e5a0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
e5b0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
e5c0: 43 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CT );.      asse
e5d0: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
e5e0: 4b 5f 45 58 49 53 54 53 20 7c 7c 20 70 45 78 70  K_EXISTS || pExp
e5f0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
e600: 20 29 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72   );..      asser
e610: 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  t( ExprHasProper
e620: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
e630: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
e640: 20 70 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e 78   pSel = pExpr->x
e650: 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  .pSelect;.      
e660: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
e670: 74 49 6e 69 74 28 26 64 65 73 74 2c 20 30 2c 20  tInit(&dest, 0, 
e680: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 29 3b  ++pParse->nMem);
e690: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
e6a0: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
e6b0: 29 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e  ){.        dest.
e6c0: 65 44 65 73 74 20 3d 20 53 52 54 5f 4d 65 6d 3b  eDest = SRT_Mem;
e6d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e6e0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
e6f0: 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69  _Null, 0, dest.i
e700: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 56  Parm);.        V
e710: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
e720: 49 6e 69 74 20 73 75 62 71 75 65 72 79 20 72 65  Init subquery re
e730: 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d  sult"));.      }
e740: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64 65  else{.        de
e750: 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 45  st.eDest = SRT_E
e760: 78 69 73 74 73 3b 0a 20 20 20 20 20 20 20 20 73  xists;.        s
e770: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
e780: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
e790: 30 2c 20 64 65 73 74 2e 69 50 61 72 6d 29 3b 0a  0, dest.iParm);.
e7a0: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
e7b0: 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 45 58  ent((v, "Init EX
e7c0: 49 53 54 53 20 72 65 73 75 6c 74 22 29 29 3b 0a  ISTS result"));.
e7d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
e7e0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
e7f0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c  pParse->db, pSel
e800: 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  ->pLimit);.     
e810: 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20   pSel->pLimit = 
e820: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
e830: 72 73 65 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c  rse, TK_INTEGER,
e840: 20 30 2c 20 30 2c 20 26 6f 6e 65 29 3b 0a 20 20   0, 0, &one);.  
e850: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
e860: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
e870: 65 6c 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20  el, &dest) ){.  
e880: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
e890: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 52        }.      rR
e8a0: 65 67 20 3d 20 64 65 73 74 2e 69 50 61 72 6d 3b  eg = dest.iParm;
e8b0: 0a 20 20 20 20 20 20 45 78 70 72 53 65 74 49 72  .      ExprSetIr
e8c0: 72 65 64 75 63 69 62 6c 65 28 70 45 78 70 72 29  reducible(pExpr)
e8d0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
e8e0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
e8f0: 74 65 73 74 41 64 64 72 20 29 7b 0a 20 20 20 20  testAddr ){.    
e900: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
e910: 65 72 65 28 76 2c 20 74 65 73 74 41 64 64 72 2d  ere(v, testAddr-
e920: 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  1);.  }.  sqlite
e930: 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
e940: 61 72 73 65 2c 20 31 29 3b 0a 0a 20 20 72 65 74  arse, 1);..  ret
e950: 75 72 6e 20 72 52 65 67 3b 0a 7d 0a 23 65 6e 64  urn rReg;.}.#end
e960: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
e970: 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23  T_SUBQUERY */..#
e980: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e990: 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
e9a0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
e9b0: 66 6f 72 20 61 6e 20 49 4e 20 65 78 70 72 65 73  for an IN expres
e9c0: 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  sion..**.**     
e9d0: 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e   x IN (SELECT ..
e9e0: 2e 29 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20  .).**      x IN 
e9f0: 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e  (value, value, .
ea00: 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65  ..).**.** The le
ea10: 66 74 2d 68 61 6e 64 20 73 69 64 65 20 28 4c 48  ft-hand side (LH
ea20: 53 29 20 69 73 20 61 20 73 63 61 6c 61 72 20 65  S) is a scalar e
ea30: 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 65 20  xpression.  The 
ea40: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
ea50: 28 52 48 53 29 0a 2a 2a 20 69 73 20 61 6e 20 61  (RHS).** is an a
ea60: 72 72 61 79 20 6f 66 20 7a 65 72 6f 20 6f 72 20  rray of zero or 
ea70: 6d 6f 72 65 20 76 61 6c 75 65 73 2e 20 20 54 68  more values.  Th
ea80: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
ea90: 74 72 75 65 20 69 66 20 74 68 65 20 4c 48 53 20  true if the LHS 
eaa0: 69 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20  is.** contained 
eab0: 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20  within the RHS. 
eac0: 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   The value of th
ead0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
eae0: 75 6e 6b 6e 6f 77 6e 20 28 4e 55 4c 4c 29 0a 2a  unknown (NULL).*
eaf0: 2a 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20  * if the LHS is 
eb00: 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 4c  NULL or if the L
eb10: 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69  HS is not contai
eb20: 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52  ned within the R
eb30: 48 53 20 61 6e 64 20 74 68 65 0a 2a 2a 20 52 48  HS and the.** RH
eb40: 53 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f  S contains one o
eb50: 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75  r more NULL valu
eb60: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  es..**.** This r
eb70: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
eb80: 20 63 6f 64 65 20 77 69 6c 6c 20 6a 75 6d 70 20   code will jump 
eb90: 74 6f 20 64 65 73 74 49 66 46 61 6c 73 65 20 69  to destIfFalse i
eba0: 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74  f the LHS is not
ebb0: 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77   .** contained w
ebc0: 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20  ithin the RHS.  
ebd0: 49 66 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20  If due to NULLs 
ebe0: 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d  we cannot determ
ebf0: 69 6e 65 20 69 66 20 74 68 65 20 4c 48 53 0a 2a  ine if the LHS.*
ec00: 2a 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69  * is contained i
ec10: 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 20 6a  n the RHS then j
ec20: 75 6d 70 20 74 6f 20 64 65 73 74 49 66 4e 75 6c  ump to destIfNul
ec30: 6c 2e 20 20 49 66 20 74 68 65 20 4c 48 53 20 69  l.  If the LHS i
ec40: 73 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 77  s contained.** w
ec50: 69 74 68 69 6e 20 74 68 65 20 52 48 53 20 74 68  ithin the RHS th
ec60: 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e  en fall through.
ec70: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ec80: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
ec90: 4e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  N(.  Parse *pPar
eca0: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
ecb0: 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
ecc0: 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
ecd0: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
ece0: 70 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pr,          /* 
ecf0: 54 68 65 20 49 4e 20 65 78 70 72 65 73 73 69 6f  The IN expressio
ed00: 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49  n */.  int destI
ed10: 66 46 61 6c 73 65 2c 20 20 20 20 20 20 2f 2a 20  fFalse,      /* 
ed20: 4a 75 6d 70 20 68 65 72 65 20 69 66 20 4c 48 53  Jump here if LHS
ed30: 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65   is not containe
ed40: 64 20 69 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a  d in the RHS */.
ed50: 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c    int destIfNull
ed60: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
ed70: 68 65 72 65 20 69 66 20 74 68 65 20 72 65 73 75  here if the resu
ed80: 6c 74 73 20 61 72 65 20 75 6e 6b 6e 6f 77 6e 20  lts are unknown 
ed90: 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 2a 2f 0a  due to NULLs */.
eda0: 29 7b 0a 20 20 69 6e 74 20 72 52 68 73 48 61 73  ){.  int rRhsHas
edb0: 4e 75 6c 6c 20 3d 20 30 3b 20 20 2f 2a 20 52 65  Null = 0;  /* Re
edc0: 67 69 73 74 65 72 20 74 68 61 74 20 69 73 20 74  gister that is t
edd0: 72 75 65 20 69 66 20 52 48 53 20 63 6f 6e 74 61  rue if RHS conta
ede0: 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20  ins NULL values 
edf0: 2a 2f 0a 20 20 63 68 61 72 20 61 66 66 69 6e 69  */.  char affini
ee00: 74 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ty;        /* Co
ee10: 6d 70 61 72 69 73 6f 6e 20 61 66 66 69 6e 69 74  mparison affinit
ee20: 79 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 69 6e  y to use */.  in
ee30: 74 20 65 54 79 70 65 3b 20 20 20 20 20 20 20 20  t eType;        
ee40: 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74      /* Type of t
ee50: 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20  he RHS */.  int 
ee60: 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r1;             
ee70: 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75    /* Temporary u
ee80: 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  se register */. 
ee90: 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
eea0: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d         /* Statem
eeb0: 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ent under constr
eec0: 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  uction */..  /* 
eed0: 43 6f 6d 70 75 74 65 20 74 68 65 20 52 48 53 2e  Compute the RHS.
eee0: 20 20 20 41 66 74 65 72 20 74 68 69 73 20 73 74     After this st
eef0: 65 70 2c 20 74 68 65 20 74 61 62 6c 65 20 77 69  ep, the table wi
ef00: 74 68 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 70  th cursor.  ** p
ef10: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 77 69 6c  Expr->iTable wil
ef20: 6c 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76  l contains the v
ef30: 61 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20  alues that make 
ef40: 75 70 20 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f  up the RHS..  */
ef50: 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
ef60: 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Vdbe;.  assert( 
ef70: 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a  v!=0 );       /*
ef80: 20 4f 4f 4d 20 64 65 74 65 63 74 65 64 20 70 72   OOM detected pr
ef90: 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74  ior to this rout
efa0: 69 6e 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  ine */.  VdbeNoo
efb0: 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65  pComment((v, "be
efc0: 67 69 6e 20 49 4e 20 65 78 70 72 22 29 29 3b 0a  gin IN expr"));.
efd0: 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65    eType = sqlite
efe0: 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61  3FindInIndex(pPa
eff0: 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 52 68  rse, pExpr, &rRh
f000: 73 48 61 73 4e 75 6c 6c 29 3b 0a 0a 20 20 2f 2a  sHasNull);..  /*
f010: 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
f020: 61 66 66 69 6e 69 74 79 20 74 6f 20 75 73 65 20  affinity to use 
f030: 74 6f 20 63 72 65 61 74 65 20 61 20 6b 65 79 20  to create a key 
f040: 66 72 6f 6d 20 74 68 65 20 72 65 73 75 6c 74 73  from the results
f050: 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 65 78 70  .  ** of the exp
f060: 72 65 73 73 69 6f 6e 2e 20 61 66 66 69 6e 69 74  ression. affinit
f070: 79 53 74 72 20 73 74 6f 72 65 73 20 61 20 73 74  yStr stores a st
f080: 61 74 69 63 20 73 74 72 69 6e 67 20 73 75 69 74  atic string suit
f090: 61 62 6c 65 20 66 6f 72 0a 20 20 2a 2a 20 50 34  able for.  ** P4
f0a0: 20 6f 66 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72   of OP_MakeRecor
f0b0: 64 2e 0a 20 20 2a 2f 0a 20 20 61 66 66 69 6e 69  d..  */.  affini
f0c0: 74 79 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41  ty = comparisonA
f0d0: 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a  ffinity(pExpr);.
f0e0: 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4c  .  /* Code the L
f0f0: 48 53 2c 20 74 68 65 20 3c 65 78 70 72 3e 20 66  HS, the <expr> f
f100: 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20 28  rom "<expr> IN (
f110: 2e 2e 2e 29 22 2e 0a 20 20 2a 2f 0a 20 20 73 71  ...)"..  */.  sq
f120: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
f130: 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 72 31  sh(pParse);.  r1
f140: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
f150: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
f160: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
f170: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
f180: 4c 65 66 74 2c 20 72 31 29 3b 0a 20 20 73 71 6c  Left, r1);.  sql
f190: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f1a0: 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c  , OP_IsNull, r1,
f1b0: 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 0a 0a   destIfNull);...
f1c0: 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f    if( eType==IN_
f1d0: 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20  INDEX_ROWID ){. 
f1e0: 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
f1f0: 73 65 2c 20 74 68 65 20 52 48 53 20 69 73 20 74  se, the RHS is t
f200: 68 65 20 52 4f 57 49 44 20 6f 66 20 74 61 62 6c  he ROWID of tabl
f210: 65 20 62 2d 74 72 65 65 0a 20 20 20 20 2a 2f 0a  e b-tree.    */.
f220: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f230: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp2(v, OP_Must
f240: 42 65 49 6e 74 2c 20 72 31 2c 20 64 65 73 74 49  BeInt, r1, destI
f250: 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 73 71 6c  fFalse);.    sql
f260: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
f270: 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20  , OP_NotExists, 
f280: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64  pExpr->iTable, d
f290: 65 73 74 49 66 46 61 6c 73 65 2c 20 72 31 29 3b  estIfFalse, r1);
f2a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
f2b0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74   In this case, t
f2c0: 68 65 20 52 48 53 20 69 73 20 61 6e 20 69 6e 64  he RHS is an ind
f2d0: 65 78 20 62 2d 74 72 65 65 2e 0a 20 20 20 20 2a  ex b-tree..    *
f2e0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
f2f0: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66  eAddOp4(v, OP_Af
f300: 66 69 6e 69 74 79 2c 20 72 31 2c 20 31 2c 20 30  finity, r1, 1, 0
f310: 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b  , &affinity, 1);
f320: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
f330: 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74  set membership t
f340: 65 73 74 20 66 61 69 6c 73 2c 20 74 68 65 6e 20  est fails, then 
f350: 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
f360: 65 20 0a 20 20 20 20 2a 2a 20 22 78 20 49 4e 20  e .    ** "x IN 
f370: 28 2e 2e 2e 29 22 20 65 78 70 72 65 73 73 69 6f  (...)" expressio
f380: 6e 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  n must be either
f390: 20 30 20 6f 72 20 4e 55 4c 4c 2e 20 49 66 20 74   0 or NULL. If t
f3a0: 68 65 20 73 65 74 0a 20 20 20 20 2a 2a 20 63 6f  he set.    ** co
f3b0: 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 20 76  ntains no NULL v
f3c0: 61 6c 75 65 73 2c 20 74 68 65 6e 20 74 68 65 20  alues, then the 
f3d0: 72 65 73 75 6c 74 20 69 73 20 30 2e 20 49 66 20  result is 0. If 
f3e0: 74 68 65 20 73 65 74 20 0a 20 20 20 20 2a 2a 20  the set .    ** 
f3f0: 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20  contains one or 
f400: 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73  more NULL values
f410: 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
f420: 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  t of the.    ** 
f430: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6c  expression is al
f440: 73 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a  so NULL..    */.
f450: 20 20 20 20 69 66 28 20 72 52 68 73 48 61 73 4e      if( rRhsHasN
f460: 75 6c 6c 3d 3d 30 20 7c 7c 20 64 65 73 74 49 66  ull==0 || destIf
f470: 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c  False==destIfNul
f480: 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  l ){.      /* Th
f490: 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69  is branch runs i
f4a0: 66 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 61 74  f it is known at
f4b0: 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 74 68   compile time th
f4c0: 61 74 20 74 68 65 20 52 48 53 0a 20 20 20 20 20  at the RHS.     
f4d0: 20 2a 2a 20 63 61 6e 6e 6f 74 20 63 6f 6e 74 61   ** cannot conta
f4e0: 69 6e 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 20  in NULL values. 
f4f0: 54 68 69 73 20 68 61 70 70 65 6e 73 20 61 73 20  This happens as 
f500: 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20  the result.     
f510: 20 2a 2a 20 6f 66 20 61 20 22 4e 4f 54 20 4e 55   ** of a "NOT NU
f520: 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  LL" constraint i
f530: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  n the database s
f540: 63 68 65 6d 61 2e 0a 20 20 20 20 20 20 2a 2a 0a  chema..      **.
f550: 20 20 20 20 20 20 2a 2a 20 41 6c 73 6f 20 72 75        ** Also ru
f560: 6e 20 74 68 69 73 20 62 72 61 6e 63 68 20 69 66  n this branch if
f570: 20 4e 55 4c 4c 20 69 73 20 65 71 75 69 76 61 6c   NULL is equival
f580: 65 6e 74 20 74 6f 20 46 41 4c 53 45 0a 20 20 20  ent to FALSE.   
f590: 20 20 20 2a 2a 20 66 6f 72 20 74 68 69 73 20 70     ** for this p
f5a0: 61 72 74 69 63 75 6c 61 72 20 49 4e 20 6f 70 65  articular IN ope
f5b0: 72 61 74 6f 72 2e 0a 20 20 20 20 20 20 2a 2f 0a  rator..      */.
f5c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f5d0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
f5e0: 5f 4e 6f 74 46 6f 75 6e 64 2c 20 70 45 78 70 72  _NotFound, pExpr
f5f0: 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66  ->iTable, destIf
f600: 46 61 6c 73 65 2c 20 72 31 2c 20 31 29 3b 0a 0a  False, r1, 1);..
f610: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f620: 20 2f 2a 20 49 6e 20 74 68 69 73 20 62 72 61 6e   /* In this bran
f630: 63 68 2c 20 74 68 65 20 52 48 53 20 6f 66 20 74  ch, the RHS of t
f640: 68 65 20 49 4e 20 6d 69 67 68 74 20 63 6f 6e 74  he IN might cont
f650: 61 69 6e 20 61 20 4e 55 4c 4c 20 61 6e 64 0a 20  ain a NULL and. 
f660: 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 65 73       ** the pres
f670: 65 6e 63 65 20 6f 66 20 61 20 4e 55 4c 4c 20 6f  ence of a NULL o
f680: 6e 20 74 68 65 20 52 48 53 20 6d 61 6b 65 73 20  n the RHS makes 
f690: 61 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20  a difference in 
f6a0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 75 74  the.      ** out
f6b0: 63 6f 6d 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  come..      */. 
f6c0: 20 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32 2c       int j1, j2,
f6d0: 20 6a 33 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46   j3;..      /* F
f6e0: 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65  irst check to se
f6f0: 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20  e if the LHS is 
f700: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
f710: 20 52 48 53 2e 20 20 49 66 20 73 6f 2c 0a 20 20   RHS.  If so,.  
f720: 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20      ** then the 
f730: 70 72 65 73 65 6e 63 65 20 6f 66 20 4e 55 4c 4c  presence of NULL
f740: 73 20 69 6e 20 74 68 65 20 52 48 53 20 64 6f 65  s in the RHS doe
f750: 73 20 6e 6f 74 20 6d 61 74 74 65 72 2c 20 73 6f  s not matter, so
f760: 20 6a 75 6d 70 0a 20 20 20 20 20 20 2a 2a 20 6f   jump.      ** o
f770: 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63  ver all of the c
f780: 6f 64 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  ode that follows
f790: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
f7a0: 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j1 = sqlite3Vdb
f7b0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
f7c0: 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69  _Found, pExpr->i
f7d0: 54 61 62 6c 65 2c 20 30 2c 20 72 31 2c 20 31 29  Table, 0, r1, 1)
f7e0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 48 65 72 65  ;..      /* Here
f7f0: 20 77 65 20 62 65 67 69 6e 20 67 65 6e 65 72 61   we begin genera
f800: 74 69 6e 67 20 63 6f 64 65 20 74 68 61 74 20 72  ting code that r
f810: 75 6e 73 20 69 66 20 74 68 65 20 4c 48 53 20 69  uns if the LHS i
f820: 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 63  s not.      ** c
f830: 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
f840: 74 68 65 20 52 48 53 2e 20 20 47 65 6e 65 72 61  the RHS.  Genera
f850: 74 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  te additional co
f860: 64 65 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  de that.      **
f870: 20 74 65 73 74 73 20 74 68 65 20 52 48 53 20 66   tests the RHS f
f880: 6f 72 20 4e 55 4c 4c 73 2e 20 20 49 66 20 74 68  or NULLs.  If th
f890: 65 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 61  e RHS contains a
f8a0: 20 4e 55 4c 4c 20 74 68 65 6e 0a 20 20 20 20 20   NULL then.     
f8b0: 20 2a 2a 20 6a 75 6d 70 20 74 6f 20 64 65 73 74   ** jump to dest
f8c0: 49 66 4e 75 6c 6c 2e 20 20 49 66 20 74 68 65 72  IfNull.  If ther
f8d0: 65 20 61 72 65 20 6e 6f 20 4e 55 4c 4c 73 20 69  e are no NULLs i
f8e0: 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 0a 20  n the RHS then. 
f8f0: 20 20 20 20 20 2a 2a 20 6a 75 6d 70 20 74 6f 20       ** jump to 
f900: 64 65 73 74 49 66 46 61 6c 73 65 2e 0a 20 20 20  destIfFalse..   
f910: 20 20 20 2a 2f 0a 20 20 20 20 20 20 6a 32 20 3d     */.      j2 =
f920: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f930: 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  p1(v, OP_NotNull
f940: 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a  , rRhsHasNull);.
f950: 20 20 20 20 20 20 6a 33 20 3d 20 73 71 6c 69 74        j3 = sqlit
f960: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
f970: 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78  v, OP_Found, pEx
f980: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 20 72  pr->iTable, 0, r
f990: 52 68 73 48 61 73 4e 75 6c 6c 2c 20 31 29 3b 0a  RhsHasNull, 1);.
f9a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f9b0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
f9c0: 74 65 67 65 72 2c 20 2d 31 2c 20 72 52 68 73 48  teger, -1, rRhsH
f9d0: 61 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  asNull);.      s
f9e0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
f9f0: 72 65 28 76 2c 20 6a 33 29 3b 0a 20 20 20 20 20  re(v, j3);.     
fa00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fa10: 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
fa20: 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 31 29   rRhsHasNull, 1)
fa30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
fa40: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
fa50: 32 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4a 75  2);..      /* Ju
fa60: 6d 70 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70  mp to the approp
fa70: 72 69 61 74 65 20 74 61 72 67 65 74 20 64 65 70  riate target dep
fa80: 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65  ending on whethe
fa90: 72 20 6f 72 20 6e 6f 74 0a 20 20 20 20 20 20 2a  r or not.      *
faa0: 2a 20 74 68 65 20 52 48 53 20 63 6f 6e 74 61 69  * the RHS contai
fab0: 6e 73 20 61 20 4e 55 4c 4c 0a 20 20 20 20 20 20  ns a NULL.      
fac0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
fad0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
fae0: 5f 49 66 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c  _If, rRhsHasNull
faf0: 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
fb00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fb10: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
fb20: 6f 2c 20 30 2c 20 64 65 73 74 49 66 46 61 6c 73  o, 0, destIfFals
fb30: 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68  e);..      /* Th
fb40: 65 20 4f 50 5f 46 6f 75 6e 64 20 61 74 20 74 68  e OP_Found at th
fb50: 65 20 74 6f 70 20 6f 66 20 74 68 69 73 20 62 72  e top of this br
fb60: 61 6e 63 68 20 6a 75 6d 70 73 20 68 65 72 65 20  anch jumps here 
fb70: 77 68 65 6e 20 74 72 75 65 2c 20 0a 20 20 20 20  when true, .    
fb80: 20 20 2a 2a 20 63 61 75 73 69 6e 67 20 74 68 65    ** causing the
fb90: 20 6f 76 65 72 61 6c 6c 20 49 4e 20 65 78 70 72   overall IN expr
fba0: 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 69 6f  ession evaluatio
fbb0: 6e 20 74 6f 20 66 61 6c 6c 20 74 68 72 6f 75 67  n to fall throug
fbc0: 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  h..      */.    
fbd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
fbe0: 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20  pHere(v, j1);.  
fbf0: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
fc00: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
fc10: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 73  pParse, r1);.  s
fc20: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
fc30: 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20  op(pParse, 1);. 
fc40: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
fc50: 20 22 65 6e 64 20 49 4e 20 65 78 70 72 22 29 29   "end IN expr"))
fc60: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
fc70: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
fc80: 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 75 70  RY */../*.** Dup
fc90: 6c 69 63 61 74 65 20 61 6e 20 38 2d 62 79 74 65  licate an 8-byte
fca0: 20 76 61 6c 75 65 0a 2a 2f 0a 73 74 61 74 69 63   value.*/.static
fcb0: 20 63 68 61 72 20 2a 64 75 70 38 62 79 74 65 73   char *dup8bytes
fcc0: 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20  (Vdbe *v, const 
fcd0: 63 68 61 72 20 2a 69 6e 29 7b 0a 20 20 63 68 61  char *in){.  cha
fce0: 72 20 2a 6f 75 74 20 3d 20 73 71 6c 69 74 65 33  r *out = sqlite3
fcf0: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 73 71 6c 69  DbMallocRaw(sqli
fd00: 74 65 33 56 64 62 65 44 62 28 76 29 2c 20 38 29  te3VdbeDb(v), 8)
fd10: 3b 0a 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20  ;.  if( out ){. 
fd20: 20 20 20 6d 65 6d 63 70 79 28 6f 75 74 2c 20 69     memcpy(out, i
fd30: 6e 2c 20 38 29 3b 0a 20 20 7d 0a 20 20 72 65 74  n, 8);.  }.  ret
fd40: 75 72 6e 20 6f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn out;.}../*.*
fd50: 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e  * Generate an in
fd60: 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77  struction that w
fd70: 69 6c 6c 20 70 75 74 20 74 68 65 20 66 6c 6f 61  ill put the floa
fd80: 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61  ting point.** va
fd90: 6c 75 65 20 64 65 73 63 72 69 62 65 64 20 62 79  lue described by
fda0: 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20   z[0..n-1] into 
fdb0: 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a  register iMem..*
fdc0: 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72  *.** The z[] str
fdd0: 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c  ing will probabl
fde0: 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65  y not be zero-te
fdf0: 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74  rminated.  But t
fe00: 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72  he .** z[n] char
fe10: 61 63 74 65 72 20 69 73 20 67 75 61 72 61 6e 74  acter is guarant
fe20: 65 65 64 20 74 6f 20 62 65 20 73 6f 6d 65 74 68  eed to be someth
fe30: 69 6e 67 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ing that does no
fe40: 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74  t look.** like t
fe50: 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20  he continuation 
fe60: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a  of the number..*
fe70: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
fe80: 64 65 52 65 61 6c 28 56 64 62 65 20 2a 76 2c 20  deReal(Vdbe *v, 
fe90: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
fea0: 6e 74 20 6e 65 67 61 74 65 46 6c 61 67 2c 20 69  nt negateFlag, i
feb0: 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69 66 28 20  nt iMem){.  if( 
fec0: 41 4c 57 41 59 53 28 7a 21 3d 30 29 20 29 7b 0a  ALWAYS(z!=0) ){.
fed0: 20 20 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65      double value
fee0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a  ;.    char *zV;.
fef0: 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f 46 28      sqlite3AtoF(
ff00: 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20 20 20  z, &value);.    
ff10: 61 73 73 65 72 74 28 20 21 73 71 6c 69 74 65 33  assert( !sqlite3
ff20: 49 73 4e 61 4e 28 76 61 6c 75 65 29 20 29 3b 20  IsNaN(value) ); 
ff30: 2f 2a 20 54 68 65 20 6e 65 77 20 41 74 6f 46 20  /* The new AtoF 
ff40: 6e 65 76 65 72 20 72 65 74 75 72 6e 73 20 4e 61  never returns Na
ff50: 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 67  N */.    if( neg
ff60: 61 74 65 46 6c 61 67 20 29 20 76 61 6c 75 65 20  ateFlag ) value 
ff70: 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20 7a 56  = -value;.    zV
ff80: 20 3d 20 64 75 70 38 62 79 74 65 73 28 76 2c 20   = dup8bytes(v, 
ff90: 28 63 68 61 72 2a 29 26 76 61 6c 75 65 29 3b 0a  (char*)&value);.
ffa0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ffb0: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 52 65 61 6c  ddOp4(v, OP_Real
ffc0: 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a 56  , 0, iMem, 0, zV
ffd0: 2c 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a  , P4_REAL);.  }.
ffe0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
fff0: 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f  te an instructio
10000 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20  n that will put 
10010 74 68 65 20 69 6e 74 65 67 65 72 20 64 65 73 63  the integer desc
10020 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74 20  ribe by.** text 
10030 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72  z[0..n-1] into r
10040 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a  egister iMem..**
10050 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72 69  .** The z[] stri
10060 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79  ng will probably
10070 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65 72   not be zero-ter
10080 6d 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74 68  minated.  But th
10090 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61  e .** z[n] chara
100a0 63 74 65 72 20 69 73 20 67 75 61 72 61 6e 74 65  cter is guarante
100b0 65 64 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69  ed to be somethi
100c0 6e 67 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ng that does not
100d0 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68   look.** like th
100e0 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f  e continuation o
100f0 66 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f  f the number..*/
10100 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
10110 65 49 6e 74 65 67 65 72 28 56 64 62 65 20 2a 76  eInteger(Vdbe *v
10120 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
10130 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74 20  nt negFlag, int 
10140 69 4d 65 6d 29 7b 0a 20 20 69 66 28 20 70 45 78  iMem){.  if( pEx
10150 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49  pr->flags & EP_I
10160 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69  ntValue ){.    i
10170 6e 74 20 69 20 3d 20 70 45 78 70 72 2d 3e 75 2e  nt i = pExpr->u.
10180 69 56 61 6c 75 65 3b 0a 20 20 20 20 69 66 28 20  iValue;.    if( 
10190 6e 65 67 46 6c 61 67 20 29 20 69 20 3d 20 2d 69  negFlag ) i = -i
101a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
101b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
101c0 74 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b  teger, i, iMem);
101d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f  .  }else{.    co
101e0 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 45  nst char *z = pE
101f0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  xpr->u.zToken;. 
10200 20 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20     assert( z!=0 
10210 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
10220 65 33 46 69 74 73 49 6e 36 34 42 69 74 73 28 7a  e3FitsIn64Bits(z
10230 2c 20 6e 65 67 46 6c 61 67 29 20 29 7b 0a 20 20  , negFlag) ){.  
10240 20 20 20 20 69 36 34 20 76 61 6c 75 65 3b 0a 20      i64 value;. 
10250 20 20 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20       char *zV;. 
10260 20 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f 69       sqlite3Atoi
10270 36 34 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20  64(z, &value);. 
10280 20 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67       if( negFlag
10290 20 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75   ) value = -valu
102a0 65 3b 0a 20 20 20 20 20 20 7a 56 20 3d 20 64 75  e;.      zV = du
102b0 70 38 62 79 74 65 73 28 76 2c 20 28 63 68 61 72  p8bytes(v, (char
102c0 2a 29 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 20  *)&value);.     
102d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
102e0 70 34 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20  p4(v, OP_Int64, 
102f0 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20  0, iMem, 0, zV, 
10300 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d  P4_INT64);.    }
10310 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 64 65  else{.      code
10320 52 65 61 6c 28 76 2c 20 7a 2c 20 6e 65 67 46 6c  Real(v, z, negFl
10330 61 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 7d  ag, iMem);.    }
10340 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
10350 65 61 72 20 61 20 63 61 63 68 65 20 65 6e 74 72  ear a cache entr
10360 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
10370 64 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61  d cacheEntryClea
10380 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
10390 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
103a0 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  e *p){.  if( p->
103b0 74 65 6d 70 52 65 67 20 29 7b 0a 20 20 20 20 69  tempReg ){.    i
103c0 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  f( pParse->nTemp
103d0 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50  Reg<ArraySize(pP
103e0 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20  arse->aTempReg) 
103f0 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
10400 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65  >aTempReg[pParse
10410 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20  ->nTempReg++] = 
10420 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20  p->iReg;.    }. 
10430 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20     p->tempReg = 
10440 30 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  0;.  }.}.../*.**
10450 20 52 65 63 6f 72 64 20 69 6e 20 74 68 65 20 63   Record in the c
10460 6f 6c 75 6d 6e 20 63 61 63 68 65 20 74 68 61 74  olumn cache that
10470 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f   a particular co
10480 6c 75 6d 6e 20 66 72 6f 6d 20 61 0a 2a 2a 20 70  lumn from a.** p
10490 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65 20  articular table 
104a0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20 70  is stored in a p
104b0 61 72 74 69 63 75 6c 61 72 20 72 65 67 69 73 74  articular regist
104c0 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  er..*/.void sqli
104d0 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72  te3ExprCacheStor
104e0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
104f0 20 69 6e 74 20 69 54 61 62 2c 20 69 6e 74 20 69   int iTab, int i
10500 43 6f 6c 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a  Col, int iReg){.
10510 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d    int i;.  int m
10520 69 6e 4c 72 75 3b 0a 20 20 69 6e 74 20 69 64 78  inLru;.  int idx
10530 4c 72 75 3b 0a 20 20 73 74 72 75 63 74 20 79 43  Lru;.  struct yC
10540 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 61  olCache *p;..  a
10550 73 73 65 72 74 28 20 69 52 65 67 3e 30 20 29 3b  ssert( iReg>0 );
10560 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 6e 75    /* Register nu
10570 6d 62 65 72 73 20 61 72 65 20 61 6c 77 61 79 73  mbers are always
10580 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 61   positive */.  a
10590 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 2d 31 20  ssert( iCol>=-1 
105a0 26 26 20 69 43 6f 6c 3c 33 32 37 36 38 20 29 3b  && iCol<32768 );
105b0 20 20 2f 2a 20 46 69 6e 69 74 65 20 63 6f 6c 75    /* Finite colu
105c0 6d 6e 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20  mn numbers */.. 
105d0 20 2f 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 43   /* The SQLITE_C
105e0 6f 6c 75 6d 6e 43 61 63 68 65 20 66 6c 61 67 20  olumnCache flag 
105f0 64 69 73 61 62 6c 65 73 20 74 68 65 20 63 6f 6c  disables the col
10600 75 6d 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73  umn cache.  This
10610 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 66 6f   is used.  ** fo
10620 72 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79 20 2d  r testing only -
10630 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
10640 53 51 4c 69 74 65 20 61 6c 77 61 79 73 20 67 65  SQLite always ge
10650 74 73 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77  ts the same answ
10660 65 72 0a 20 20 2a 2a 20 77 69 74 68 20 61 6e 64  er.  ** with and
10670 20 77 69 74 68 6f 75 74 20 74 68 65 20 63 6f 6c   without the col
10680 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a  umn cache..  */.
10690 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
106a0 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
106b0 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 20 29 20 72  _ColumnCache ) r
106c0 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 46 69 72  eturn;..  /* Fir
106d0 73 74 20 72 65 70 6c 61 63 65 20 61 6e 79 20 65  st replace any e
106e0 78 69 73 74 69 6e 67 20 65 6e 74 72 79 2e 0a 20  xisting entry.. 
106f0 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c   **.  ** Actuall
10700 79 2c 20 74 68 65 20 77 61 79 20 74 68 65 20 63  y, the way the c
10710 6f 6c 75 6d 6e 20 63 61 63 68 65 20 69 73 20 63  olumn cache is c
10720 75 72 72 65 6e 74 6c 79 20 75 73 65 64 2c 20 77  urrently used, w
10730 65 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64  e are guaranteed
10740 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6f  .  ** that the o
10750 62 6a 65 63 74 20 77 69 6c 6c 20 6e 65 76 65 72  bject will never
10760 20 61 6c 72 65 61 64 79 20 62 65 20 69 6e 20 63   already be in c
10770 61 63 68 65 2e 20 20 56 65 72 69 66 79 20 74 68  ache.  Verify th
10780 69 73 20 67 75 61 72 61 6e 74 65 65 2e 0a 20 20  is guarantee..  
10790 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
107a0 47 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  G.  for(i=0, p=p
107b0 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
107c0 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
107d0 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
107e0 7b 0a 23 69 66 20 30 20 2f 2a 20 54 68 69 73 20  {.#if 0 /* This 
107f0 63 6f 64 65 20 77 6f 6c 64 20 72 65 6d 6f 76 65  code wold remove
10800 20 74 68 65 20 65 6e 74 72 79 20 66 72 6f 6d 20   the entry from 
10810 74 68 65 20 63 61 63 68 65 20 69 66 20 69 74 20  the cache if it 
10820 65 78 69 73 74 65 64 20 2a 2f 0a 20 20 20 20 69  existed */.    i
10830 66 28 20 70 2d 3e 69 52 65 67 20 26 26 20 70 2d  f( p->iReg && p-
10840 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 26 26  >iTable==iTab &&
10850 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f   p->iColumn==iCo
10860 6c 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65  l ){.      cache
10870 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72 73  EntryClear(pPars
10880 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e  e, p);.      p->
10890 69 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d  iLevel = pParse-
108a0 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20  >iCacheLevel;.  
108b0 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 69 52      p->iReg = iR
108c0 65 67 3b 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75  eg;.      p->lru
108d0 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68   = pParse->iCach
108e0 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 72 65  eCnt++;.      re
108f0 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  turn;.    }.#end
10900 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  if.    assert( p
10910 2d 3e 69 52 65 67 3d 3d 30 20 7c 7c 20 70 2d 3e  ->iReg==0 || p->
10920 69 54 61 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20  iTable!=iTab || 
10930 70 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c  p->iColumn!=iCol
10940 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
10950 20 20 2f 2a 20 46 69 6e 64 20 61 6e 20 65 6d 70    /* Find an emp
10960 74 79 20 73 6c 6f 74 20 61 6e 64 20 72 65 70 6c  ty slot and repl
10970 61 63 65 20 69 74 20 2a 2f 0a 20 20 66 6f 72 28  ace it */.  for(
10980 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
10990 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
109a0 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
109b0 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
109c0 28 20 70 2d 3e 69 52 65 67 3d 3d 30 20 29 7b 0a  ( p->iReg==0 ){.
109d0 20 20 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20        p->iLevel 
109e0 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
109f0 4c 65 76 65 6c 3b 0a 20 20 20 20 20 20 70 2d 3e  Level;.      p->
10a00 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20  iTable = iTab;. 
10a10 20 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20       p->iColumn 
10a20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 70 2d  = iCol;.      p-
10a30 3e 69 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20  >iReg = iReg;.  
10a40 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d      p->tempReg =
10a50 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75   0;.      p->lru
10a60 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68   = pParse->iCach
10a70 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 72 65  eCnt++;.      re
10a80 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
10a90 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74 68  .  /* Replace th
10aa0 65 20 6c 61 73 74 20 72 65 63 65 6e 74 6c 79 20  e last recently 
10ab0 75 73 65 64 20 2a 2f 0a 20 20 6d 69 6e 4c 72 75  used */.  minLru
10ac0 20 3d 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20   = 0x7fffffff;. 
10ad0 20 69 64 78 4c 72 75 20 3d 20 2d 31 3b 0a 20 20   idxLru = -1;.  
10ae0 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
10af0 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
10b00 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
10b10 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
10b20 20 20 69 66 28 20 70 2d 3e 6c 72 75 3c 6d 69 6e    if( p->lru<min
10b30 4c 72 75 20 29 7b 0a 20 20 20 20 20 20 69 64 78  Lru ){.      idx
10b40 4c 72 75 20 3d 20 69 3b 0a 20 20 20 20 20 20 6d  Lru = i;.      m
10b50 69 6e 4c 72 75 20 3d 20 70 2d 3e 6c 72 75 3b 0a  inLru = p->lru;.
10b60 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
10b70 41 4c 57 41 59 53 28 69 64 78 4c 72 75 3e 3d 30  ALWAYS(idxLru>=0
10b80 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 50  ) ){.    p = &pP
10b90 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b  arse->aColCache[
10ba0 69 64 78 4c 72 75 5d 3b 0a 20 20 20 20 70 2d 3e  idxLru];.    p->
10bb0 69 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d  iLevel = pParse-
10bc0 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20  >iCacheLevel;.  
10bd0 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54    p->iTable = iT
10be0 61 62 3b 0a 20 20 20 20 70 2d 3e 69 43 6f 6c 75  ab;.    p->iColu
10bf0 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70  mn = iCol;.    p
10c00 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b 0a 20  ->iReg = iReg;. 
10c10 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20     p->tempReg = 
10c20 30 3b 0a 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20  0;.    p->lru = 
10c30 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e  pParse->iCacheCn
10c40 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  t++;.    return;
10c50 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
10c60 64 69 63 61 74 65 20 74 68 61 74 20 61 20 72 65  dicate that a re
10c70 67 69 73 74 65 72 20 69 73 20 62 65 69 6e 67 20  gister is being 
10c80 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20 50 75  overwritten.  Pu
10c90 72 67 65 20 74 68 65 20 72 65 67 69 73 74 65 72  rge the register
10ca0 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c  .** from the col
10cb0 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 76 6f  umn cache..*/.vo
10cc0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
10cd0 63 68 65 52 65 6d 6f 76 65 28 50 61 72 73 65 20  cheRemove(Parse 
10ce0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65  *pParse, int iRe
10cf0 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  g){.  int i;.  s
10d00 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
10d10 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  *p;.  for(i=0, p
10d20 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
10d30 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
10d40 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
10d50 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  +){.    if( p->i
10d60 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20  Reg==iReg ){.   
10d70 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65     cacheEntryCle
10d80 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  ar(pParse, p);. 
10d90 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 30       p->iReg = 0
10da0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
10db0 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68  *.** Remember th
10dc0 65 20 63 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e  e current column
10dd0 20 63 61 63 68 65 20 63 6f 6e 74 65 78 74 2e 20   cache context. 
10de0 20 41 6e 79 20 6e 65 77 20 65 6e 74 72 69 65 73   Any new entries
10df0 20 61 64 64 65 64 0a 2a 2a 20 61 64 64 65 64 20   added.** added 
10e00 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  to the column ca
10e10 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20 63  che after this c
10e20 61 6c 6c 20 61 72 65 20 72 65 6d 6f 76 65 64 20  all are removed 
10e30 77 68 65 6e 20 74 68 65 0a 2a 2a 20 63 6f 72 72  when the.** corr
10e40 65 73 70 6f 6e 64 69 6e 67 20 70 6f 70 20 6f 63  esponding pop oc
10e50 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  curs..*/.void sq
10e60 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
10e70 73 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  sh(Parse *pParse
10e80 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 69 43 61  ){.  pParse->iCa
10e90 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a 7d 0a 0a 2f  cheLevel++;.}../
10ea0 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 66 72 6f 6d  *.** Remove from
10eb0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
10ec0 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 74 68  e any entries th
10ed0 61 74 20 77 65 72 65 20 61 64 64 65 64 20 73 69  at were added si
10ee0 6e 63 65 20 74 68 65 0a 2a 2a 20 74 68 65 20 70  nce the.** the p
10ef0 72 65 76 69 6f 75 73 20 4e 20 50 75 73 68 20 6f  revious N Push o
10f00 70 65 72 61 74 69 6f 6e 73 2e 20 20 49 6e 20 6f  perations.  In o
10f10 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 73 74  ther words, rest
10f20 6f 72 65 20 74 68 65 20 63 61 63 68 65 0a 2a 2a  ore the cache.**
10f30 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 69 74   to the state it
10f40 20 77 61 73 20 69 6e 20 4e 20 50 75 73 68 65 73   was in N Pushes
10f50 20 61 67 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   ago..*/.void sq
10f60 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
10f70 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  p(Parse *pParse,
10f80 20 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74 20 69   int N){.  int i
10f90 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
10fa0 61 63 68 65 20 2a 70 3b 0a 20 20 61 73 73 65 72  ache *p;.  asser
10fb0 74 28 20 4e 3e 30 20 29 3b 0a 20 20 61 73 73 65  t( N>0 );.  asse
10fc0 72 74 28 20 70 50 61 72 73 65 2d 3e 69 43 61 63  rt( pParse->iCac
10fd0 68 65 4c 65 76 65 6c 3e 3d 4e 20 29 3b 0a 20 20  heLevel>=N );.  
10fe0 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
10ff0 76 65 6c 20 2d 3d 20 4e 3b 0a 20 20 66 6f 72 28  vel -= N;.  for(
11000 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
11010 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
11020 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
11030 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
11040 28 20 70 2d 3e 69 52 65 67 20 26 26 20 70 2d 3e  ( p->iReg && p->
11050 69 4c 65 76 65 6c 3e 70 50 61 72 73 65 2d 3e 69  iLevel>pParse->i
11060 43 61 63 68 65 4c 65 76 65 6c 20 29 7b 0a 20 20  CacheLevel ){.  
11070 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c      cacheEntryCl
11080 65 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  ear(pParse, p);.
11090 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20        p->iReg = 
110a0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
110b0 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 63 61 63  /*.** When a cac
110c0 68 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20 72 65  hed column is re
110d0 75 73 65 64 2c 20 6d 61 6b 65 20 73 75 72 65 20  used, make sure 
110e0 74 68 61 74 20 69 74 73 20 72 65 67 69 73 74 65  that its registe
110f0 72 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65  r is.** no longe
11100 72 20 61 76 61 69 6c 61 62 6c 65 20 61 73 20 61  r available as a
11110 20 74 65 6d 70 20 72 65 67 69 73 74 65 72 2e 20   temp register. 
11120 20 74 69 63 6b 65 74 20 23 33 38 37 39 3a 20 20   ticket #3879:  
11130 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 72 65 67  that same.** reg
11140 69 73 74 65 72 20 6d 69 67 68 74 20 62 65 20 69  ister might be i
11150 6e 20 74 68 65 20 63 61 63 68 65 20 69 6e 20 6d  n the cache in m
11160 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 2c 20  ultiple places, 
11170 73 6f 20 62 65 20 73 75 72 65 20 74 6f 0a 2a 2a  so be sure to.**
11180 20 67 65 74 20 74 68 65 6d 20 61 6c 6c 2e 0a 2a   get them all..*
11190 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
111a0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 69  lite3ExprCachePi
111b0 6e 52 65 67 69 73 74 65 72 28 50 61 72 73 65 20  nRegister(Parse 
111c0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65  *pParse, int iRe
111d0 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  g){.  int i;.  s
111e0 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
111f0 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  *p;.  for(i=0, p
11200 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
11210 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
11220 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
11230 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  +){.    if( p->i
11240 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20  Reg==iReg ){.   
11250 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20     p->tempReg = 
11260 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
11270 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
11280 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 78  ode that will ex
11290 74 72 61 63 74 20 74 68 65 20 69 43 6f 6c 75 6d  tract the iColum
112a0 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d  n-th column from
112b0 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61 62 20 61  .** table pTab a
112c0 6e 64 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c  nd store the col
112d0 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 61 20 72  umn value in a r
112e0 65 67 69 73 74 65 72 2e 20 20 41 6e 20 65 66 66  egister.  An eff
112f0 6f 72 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74  ort.** is made t
11300 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75  o store the colu
11310 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  mn value in regi
11320 73 74 65 72 20 69 52 65 67 2c 20 62 75 74 20 74  ster iReg, but t
11330 68 69 73 20 69 73 0a 2a 2a 20 6e 6f 74 20 67 75  his is.** not gu
11340 61 72 61 6e 74 65 65 64 2e 20 20 54 68 65 20 6c  aranteed.  The l
11350 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 63  ocation of the c
11360 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73 20 72  olumn value is r
11370 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
11380 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20  here must be an 
11390 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 6f 20 70  open cursor to p
113a0 54 61 62 20 69 6e 20 69 54 61 62 6c 65 20 77 68  Tab in iTable wh
113b0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
113c0 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 49  ** is called.  I
113d0 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e  f iColumn<0 then
113e0 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74   code is generat
113f0 65 64 20 74 68 61 74 20 65 78 74 72 61 63 74 73  ed that extracts
11400 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69   the rowid..*/.i
11410 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
11420 64 65 47 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 50  deGetColumn(.  P
11430 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
11440 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
11450 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
11460 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c  ontext */.  Tabl
11470 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20  e *pTab,     /* 
11480 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  Description of t
11490 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20  he table we are 
114a0 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a  reading from */.
114b0 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20    int iColumn,  
114c0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
114d0 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20  he table column 
114e0 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
114f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
11500 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
11510 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  the table */.  i
11520 6e 74 20 69 52 65 67 20 20 20 20 20 20 20 20 20  nt iReg         
11530 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73  /* Store results
11540 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56 64   here */.){.  Vd
11550 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
11560 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
11570 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
11580 68 65 20 2a 70 3b 0a 0a 20 20 66 6f 72 28 69 3d  he *p;..  for(i=
11590 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
115a0 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
115b0 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
115c0 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , p++){.    if( 
115d0 70 2d 3e 69 52 65 67 3e 30 20 26 26 20 70 2d 3e  p->iReg>0 && p->
115e0 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26  iTable==iTable &
115f0 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43  & p->iColumn==iC
11600 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 70  olumn ){.      p
11610 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e  ->lru = pParse->
11620 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20  iCacheCnt++;.   
11630 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
11640 63 68 65 50 69 6e 52 65 67 69 73 74 65 72 28 70  chePinRegister(p
11650 50 61 72 73 65 2c 20 70 2d 3e 69 52 65 67 29 3b  Parse, p->iReg);
11660 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d  .      return p-
11670 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d  >iReg;.    }.  }
11680 20 20 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d    .  assert( v!=
11690 30 20 29 3b 0a 20 20 69 66 28 20 69 43 6f 6c 75  0 );.  if( iColu
116a0 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  mn<0 ){.    sqli
116b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
116c0 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 6c   OP_Rowid, iTabl
116d0 65 2c 20 69 52 65 67 29 3b 0a 20 20 7d 65 6c 73  e, iReg);.  }els
116e0 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 54 61  e if( ALWAYS(pTa
116f0 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 69 6e 74  b!=0) ){.    int
11700 20 6f 70 20 3d 20 49 73 56 69 72 74 75 61 6c 28   op = IsVirtual(
11710 70 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f 6c 75  pTab) ? OP_VColu
11720 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a  mn : OP_Column;.
11730 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11740 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 54 61  ddOp3(v, op, iTa
11750 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52  ble, iColumn, iR
11760 65 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  eg);.    sqlite3
11770 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c  ColumnDefault(v,
11780 20 70 54 61 62 2c 20 69 43 6f 6c 75 6d 6e 2c 20   pTab, iColumn, 
11790 69 52 65 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  iReg);.  }.  sql
117a0 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f  ite3ExprCacheSto
117b0 72 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 6c  re(pParse, iTabl
117c0 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67  e, iColumn, iReg
117d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67  );.  return iReg
117e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
117f0 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61 63 68   all column cach
11800 65 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 76 6f  e entries..*/.vo
11810 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
11820 63 68 65 43 6c 65 61 72 28 50 61 72 73 65 20 2a  cheClear(Parse *
11830 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69  pParse){.  int i
11840 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
11850 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f 72 28  ache *p;..  for(
11860 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
11870 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
11880 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
11890 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
118a0 28 20 70 2d 3e 69 52 65 67 20 29 7b 0a 20 20 20  ( p->iReg ){.   
118b0 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65     cacheEntryCle
118c0 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  ar(pParse, p);. 
118d0 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 30       p->iReg = 0
118e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
118f0 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20  *.** Record the 
11900 66 61 63 74 20 74 68 61 74 20 61 6e 20 61 66 66  fact that an aff
11910 69 6e 69 74 79 20 63 68 61 6e 67 65 20 68 61 73  inity change has
11920 20 6f 63 63 75 72 72 65 64 20 6f 6e 20 69 43 6f   occurred on iCo
11930 75 6e 74 0a 2a 2a 20 72 65 67 69 73 74 65 72 73  unt.** registers
11940 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 69   starting with i
11950 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  Start..*/.void s
11960 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
11970 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 50 61  ffinityChange(Pa
11980 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
11990 20 69 53 74 61 72 74 2c 20 69 6e 74 20 69 43 6f   iStart, int iCo
119a0 75 6e 74 29 7b 0a 20 20 69 6e 74 20 69 45 6e 64  unt){.  int iEnd
119b0 20 3d 20 69 53 74 61 72 74 20 2b 20 69 43 6f 75   = iStart + iCou
119c0 6e 74 20 2d 20 31 3b 0a 20 20 69 6e 74 20 69 3b  nt - 1;.  int i;
119d0 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
119e0 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d  che *p;.  for(i=
119f0 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
11a00 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
11a10 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
11a20 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  , p++){.    int 
11a30 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20  r = p->iReg;.   
11a40 20 69 66 28 20 72 3e 3d 69 53 74 61 72 74 20 26   if( r>=iStart &
11a50 26 20 72 3c 3d 69 45 6e 64 20 29 7b 0a 20 20 20  & r<=iEnd ){.   
11a60 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65     cacheEntryCle
11a70 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  ar(pParse, p);. 
11a80 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 30       p->iReg = 0
11a90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
11aa0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
11ab0 64 65 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65  de to move conte
11ac0 6e 74 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72  nt from register
11ad0 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b  s iFrom...iFrom+
11ae0 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74  nReg-1.** over t
11af0 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d  o iTo..iTo+nReg-
11b00 31 2e 20 4b 65 65 70 20 74 68 65 20 63 6f 6c 75  1. Keep the colu
11b10 6d 6e 20 63 61 63 68 65 20 75 70 2d 74 6f 2d 64  mn cache up-to-d
11b20 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ate..*/.void sql
11b30 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
11b40 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
11b50 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69  int iFrom, int i
11b60 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20  To, int nReg){. 
11b70 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
11b80 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20   yColCache *p;. 
11b90 20 69 66 28 20 4e 45 56 45 52 28 69 46 72 6f 6d   if( NEVER(iFrom
11ba0 3d 3d 69 54 6f 29 20 29 20 72 65 74 75 72 6e 3b  ==iTo) ) return;
11bb0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
11bc0 64 4f 70 33 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp3(pParse->pVd
11bd0 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72  be, OP_Move, iFr
11be0 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65 67 29 3b 0a  om, iTo, nReg);.
11bf0 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
11c00 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
11c10 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
11c20 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
11c30 20 20 20 20 69 6e 74 20 78 20 3d 20 70 2d 3e 69      int x = p->i
11c40 52 65 67 3b 0a 20 20 20 20 69 66 28 20 78 3e 3d  Reg;.    if( x>=
11c50 69 46 72 6f 6d 20 26 26 20 78 3c 69 46 72 6f 6d  iFrom && x<iFrom
11c60 2b 6e 52 65 67 20 29 7b 0a 20 20 20 20 20 20 70  +nReg ){.      p
11c70 2d 3e 69 52 65 67 20 2b 3d 20 69 54 6f 2d 69 46  ->iReg += iTo-iF
11c80 72 6f 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  rom;.    }.  }.}
11c90 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
11ca0 20 63 6f 64 65 20 74 6f 20 63 6f 70 79 20 63 6f   code to copy co
11cb0 6e 74 65 6e 74 20 66 72 6f 6d 20 72 65 67 69 73  ntent from regis
11cc0 74 65 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72  ters iFrom...iFr
11cd0 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65  om+nReg-1.** ove
11ce0 72 20 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52  r to iTo..iTo+nR
11cf0 65 67 2d 31 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eg-1..*/.void sq
11d00 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70  lite3ExprCodeCop
11d10 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
11d20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20   int iFrom, int 
11d30 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a  iTo, int nReg){.
11d40 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 4e    int i;.  if( N
11d50 45 56 45 52 28 69 46 72 6f 6d 3d 3d 69 54 6f 29  EVER(iFrom==iTo)
11d60 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
11d70 28 69 3d 30 3b 20 69 3c 6e 52 65 67 3b 20 69 2b  (i=0; i<nReg; i+
11d80 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +){.    sqlite3V
11d90 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65  dbeAddOp2(pParse
11da0 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79  ->pVdbe, OP_Copy
11db0 2c 20 69 46 72 6f 6d 2b 69 2c 20 69 54 6f 2b 69  , iFrom+i, iTo+i
11dc0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
11dd0 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61  Return true if a
11de0 6e 79 20 72 65 67 69 73 74 65 72 20 69 6e 20 74  ny register in t
11df0 68 65 20 72 61 6e 67 65 20 69 46 72 6f 6d 2e 2e  he range iFrom..
11e00 69 54 6f 20 28 69 6e 63 6c 75 73 69 76 65 29 0a  iTo (inclusive).
11e10 2a 2a 20 69 73 20 75 73 65 64 20 61 73 20 70 61  ** is used as pa
11e20 72 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  rt of the column
11e30 20 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69   cache..*/.stati
11e40 63 20 69 6e 74 20 75 73 65 64 41 73 43 6f 6c 75  c int usedAsColu
11e50 6d 6e 43 61 63 68 65 28 50 61 72 73 65 20 2a 70  mnCache(Parse *p
11e60 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d  Parse, int iFrom
11e70 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69 6e  , int iTo){.  in
11e80 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
11e90 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f  olCache *p;.  fo
11ea0 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
11eb0 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
11ec0 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
11ed0 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
11ee0 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b  int r = p->iReg;
11ef0 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 46 72 6f  .    if( r>=iFro
11f00 6d 20 26 26 20 72 3c 3d 69 54 6f 20 29 20 72 65  m && r<=iTo ) re
11f10 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
11f20 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
11f30 20 49 66 20 74 68 65 20 6c 61 73 74 20 69 6e 73   If the last ins
11f40 74 72 75 63 74 69 6f 6e 20 63 6f 64 65 64 20 69  truction coded i
11f50 73 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 63  s an ephemeral c
11f60 6f 70 79 20 6f 66 20 61 6e 79 20 6f 66 0a 2a 2a  opy of any of.**
11f70 20 74 68 65 20 72 65 67 69 73 74 65 72 73 20 69   the registers i
11f80 6e 20 74 68 65 20 6e 52 65 67 20 72 65 67 69 73  n the nReg regis
11f90 74 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 77  ters beginning w
11fa0 69 74 68 20 69 52 65 67 2c 20 74 68 65 6e 0a 2a  ith iReg, then.*
11fb0 2a 20 63 6f 6e 76 65 72 74 20 74 68 65 20 6c 61  * convert the la
11fc0 73 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66  st instruction f
11fd0 72 6f 6d 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20  rom OP_SCopy to 
11fe0 4f 50 5f 43 6f 70 79 2e 0a 2a 2f 0a 76 6f 69 64  OP_Copy..*/.void
11ff0 20 73 71 6c 69 74 65 33 45 78 70 72 48 61 72 64   sqlite3ExprHard
12000 43 6f 70 79 28 50 61 72 73 65 20 2a 70 50 61 72  Copy(Parse *pPar
12010 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e  se, int iReg, in
12020 74 20 6e 52 65 67 29 7b 0a 20 20 56 64 62 65 4f  t nReg){.  VdbeO
12030 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 20 2a  p *pOp;.  Vdbe *
12040 76 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  v;..  assert( pP
12050 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
12060 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 76  Failed==0 );.  v
12070 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
12080 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
12090 20 29 3b 0a 20 20 70 4f 70 20 3d 20 73 71 6c 69   );.  pOp = sqli
120a0 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
120b0 2d 31 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  -1);.  assert( p
120c0 4f 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  Op!=0 );.  if( p
120d0 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53  Op->opcode==OP_S
120e0 43 6f 70 79 20 26 26 20 70 4f 70 2d 3e 70 31 3e  Copy && pOp->p1>
120f0 3d 69 52 65 67 20 26 26 20 70 4f 70 2d 3e 70 31  =iReg && pOp->p1
12100 3c 69 52 65 67 2b 6e 52 65 67 20 29 7b 0a 20 20  <iReg+nReg ){.  
12110 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
12120 4f 50 5f 43 6f 70 79 3b 0a 20 20 7d 0a 7d 0a 0a  OP_Copy;.  }.}..
12130 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
12140 6f 64 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65  ode to store the
12150 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 41   value of the iA
12160 6c 69 61 73 2d 74 68 20 61 6c 69 61 73 20 69 6e  lias-th alias in
12170 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 74 61 72   register.** tar
12180 67 65 74 2e 20 20 54 68 65 20 66 69 72 73 74 20  get.  The first 
12190 74 69 6d 65 20 74 68 69 73 20 69 73 20 63 61 6c  time this is cal
121a0 6c 65 64 2c 20 70 45 78 70 72 20 69 73 20 65 76  led, pExpr is ev
121b0 61 6c 75 61 74 65 64 20 74 6f 20 63 6f 6d 70 75  aluated to compu
121c0 74 65 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  te.** the value 
121d0 6f 66 20 74 68 65 20 61 6c 69 61 73 2e 20 20 54  of the alias.  T
121e0 68 65 20 76 61 6c 75 65 20 69 73 20 73 74 6f 72  he value is stor
121f0 65 64 20 69 6e 20 61 6e 20 61 75 78 69 6c 69 61  ed in an auxilia
12200 72 79 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 61  ry register.** a
12210 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
12220 20 74 68 61 74 20 72 65 67 69 73 74 65 72 20 69   that register i
12230 73 20 72 65 74 75 72 6e 65 64 2e 20 20 4f 6e 20  s returned.  On 
12240 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
12250 2c 0a 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65  ,.** the registe
12260 72 20 6e 75 6d 62 65 72 20 69 73 20 72 65 74 75  r number is retu
12270 72 6e 65 64 20 77 69 74 68 6f 75 74 20 67 65 6e  rned without gen
12280 65 72 61 74 69 6e 67 20 61 6e 79 20 63 6f 64 65  erating any code
12290 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
122a0 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 74  t in order for t
122b0 68 69 73 20 74 6f 20 77 6f 72 6b 2c 20 63 6f 64  his to work, cod
122c0 65 20 6d 75 73 74 20 62 65 20 67 65 6e 65 72 61  e must be genera
122d0 74 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 73 61  ted in the.** sa
122e0 6d 65 20 6f 72 64 65 72 20 74 68 61 74 20 69 74  me order that it
122f0 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a 2a 2a   is executed..**
12300 0a 2a 2a 20 41 6c 69 61 73 65 73 20 61 72 65 20  .** Aliases are 
12310 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e  numbered startin
12320 67 20 77 69 74 68 20 31 2e 20 20 53 6f 20 69 41  g with 1.  So iA
12330 6c 69 61 73 20 69 73 20 69 6e 20 74 68 65 20 72  lias is in the r
12340 61 6e 67 65 0a 2a 2a 20 6f 66 20 31 20 74 6f 20  ange.** of 1 to 
12350 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73 20 69  pParse->nAlias i
12360 6e 63 6c 75 73 69 76 65 2e 20 20 0a 2a 2a 0a 2a  nclusive.  .**.*
12370 2a 20 70 50 61 72 73 65 2d 3e 61 41 6c 69 61 73  * pParse->aAlias
12380 5b 69 41 6c 69 61 73 2d 31 5d 20 72 65 63 6f 72  [iAlias-1] recor
12390 64 73 20 74 68 65 20 72 65 67 69 73 74 65 72 20  ds the register 
123a0 6e 75 6d 62 65 72 20 77 68 65 72 65 20 74 68 65  number where the
123b0 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65   value.** of the
123c0 20 69 41 6c 69 61 73 2d 74 68 20 61 6c 69 61 73   iAlias-th alias
123d0 20 69 73 20 73 74 6f 72 65 64 2e 20 20 49 66 20   is stored.  If 
123e0 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73  zero, that means
123f0 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 61 6c 69   that the.** ali
12400 61 73 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  as has not yet b
12410 65 65 6e 20 63 6f 6d 70 75 74 65 64 2e 0a 2a 2f  een computed..*/
12420 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
12430 41 6c 69 61 73 28 50 61 72 73 65 20 2a 70 50 61  Alias(Parse *pPa
12440 72 73 65 2c 20 69 6e 74 20 69 41 6c 69 61 73 2c  rse, int iAlias,
12450 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
12460 74 20 74 61 72 67 65 74 29 7b 0a 23 69 66 20 30  t target){.#if 0
12470 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
12480 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
12490 6e 74 20 69 52 65 67 3b 0a 20 20 69 66 28 20 70  nt iReg;.  if( p
124a0 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73 41 6c 6c  Parse->nAliasAll
124b0 6f 63 3c 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61  oc<pParse->nAlia
124c0 73 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  s ){.    pParse-
124d0 3e 61 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65  >aAlias = sqlite
124e0 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65  3DbReallocOrFree
124f0 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 41 6c  (db, pParse->aAl
12500 69 61 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ias,.           
12510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12520 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 50 61        sizeof(pPa
12530 72 73 65 2d 3e 61 41 6c 69 61 73 5b 30 5d 29 2a  rse->aAlias[0])*
12540 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73 20 29  pParse->nAlias )
12550 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
12560 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
12570 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 41 6c 69   && pParse->nAli
12580 61 73 41 6c 6c 6f 63 3e 30 20 29 3b 0a 20 20 20  asAlloc>0 );.   
12590 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
125a0 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30  ailed ) return 0
125b0 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 50  ;.    memset(&pP
125c0 61 72 73 65 2d 3e 61 41 6c 69 61 73 5b 70 50 61  arse->aAlias[pPa
125d0 72 73 65 2d 3e 6e 41 6c 69 61 73 41 6c 6c 6f 63  rse->nAliasAlloc
125e0 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  ], 0,.          
125f0 20 28 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73   (pParse->nAlias
12600 2d 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73 41  -pParse->nAliasA
12610 6c 6c 6f 63 29 2a 73 69 7a 65 6f 66 28 70 50 61  lloc)*sizeof(pPa
12620 72 73 65 2d 3e 61 41 6c 69 61 73 5b 30 5d 29 29  rse->aAlias[0]))
12630 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 41  ;.    pParse->nA
12640 6c 69 61 73 41 6c 6c 6f 63 20 3d 20 70 50 61 72  liasAlloc = pPar
12650 73 65 2d 3e 6e 41 6c 69 61 73 3b 0a 20 20 7d 0a  se->nAlias;.  }.
12660 20 20 61 73 73 65 72 74 28 20 69 41 6c 69 61 73    assert( iAlias
12670 3e 30 20 26 26 20 69 41 6c 69 61 73 3c 3d 70 50  >0 && iAlias<=pP
12680 61 72 73 65 2d 3e 6e 41 6c 69 61 73 20 29 3b 0a  arse->nAlias );.
12690 20 20 69 52 65 67 20 3d 20 70 50 61 72 73 65 2d    iReg = pParse-
126a0 3e 61 41 6c 69 61 73 5b 69 41 6c 69 61 73 2d 31  >aAlias[iAlias-1
126b0 5d 3b 0a 20 20 69 66 28 20 69 52 65 67 3d 3d 30  ];.  if( iReg==0
126c0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72   ){.    if( pPar
126d0 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3e  se->iCacheLevel>
126e0 30 20 29 7b 0a 20 20 20 20 20 20 69 52 65 67 20  0 ){.      iReg 
126f0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
12700 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
12710 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
12720 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12730 20 69 52 65 67 20 3d 20 2b 2b 70 50 61 72 73 65   iReg = ++pParse
12740 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71  ->nMem;.      sq
12750 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
12760 61 72 73 65 2c 20 70 45 78 70 72 2c 20 69 52 65  arse, pExpr, iRe
12770 67 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  g);.      pParse
12780 2d 3e 61 41 6c 69 61 73 5b 69 41 6c 69 61 73 2d  ->aAlias[iAlias-
12790 31 5d 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 7d  1] = iReg;.    }
127a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52  .  }.  return iR
127b0 65 67 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53  eg;.#else.  UNUS
127c0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 41 6c  ED_PARAMETER(iAl
127d0 69 61 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  ias);.  return s
127e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
127f0 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
12800 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 23 65 6e  pr, target);.#en
12810 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  dif.}../*.** Gen
12820 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
12830 74 68 65 20 63 75 72 72 65 6e 74 20 56 64 62 65  the current Vdbe
12840 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
12850 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73   given.** expres
12860 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74 20 74  sion.  Attempt t
12870 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  o store the resu
12880 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20  lts in register 
12890 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74  "target"..** Ret
128a0 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
128b0 20 77 68 65 72 65 20 72 65 73 75 6c 74 73 20 61   where results a
128c0 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a  re stored..**.**
128d0 20 57 69 74 68 20 74 68 69 73 20 72 6f 75 74 69   With this routi
128e0 6e 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ne, there is no 
128f0 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 72  guarantee that r
12900 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62  esults will.** b
12910 65 20 73 74 6f 72 65 64 20 69 6e 20 74 61 72 67  e stored in targ
12920 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20  et.  The result 
12930 6d 69 67 68 74 20 62 65 20 73 74 6f 72 65 64 20  might be stored 
12940 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  in some other.**
12950 20 72 65 67 69 73 74 65 72 20 69 66 20 69 74 20   register if it 
12960 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f  is convenient to
12970 20 64 6f 20 73 6f 2e 20 20 54 68 65 20 63 61 6c   do so.  The cal
12980 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ling function.**
12990 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65 20   must check the 
129a0 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20  return code and 
129b0 6d 6f 76 65 20 74 68 65 20 72 65 73 75 6c 74 73  move the results
129c0 20 74 6f 20 74 68 65 20 64 65 73 69 72 65 64 0a   to the desired.
129d0 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a  ** register..*/.
129e0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
129f0 6f 64 65 54 61 72 67 65 74 28 50 61 72 73 65 20  odeTarget(Parse 
12a00 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
12a10 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
12a20 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
12a30 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f  Parse->pVdbe;  /
12a40 2a 20 54 68 65 20 56 4d 20 75 6e 64 65 72 20 63  * The VM under c
12a50 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
12a60 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
12a70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
12a80 65 20 6f 70 63 6f 64 65 20 62 65 69 6e 67 20 63  e opcode being c
12a90 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e  oded */.  int in
12aa0 52 65 67 20 3d 20 74 61 72 67 65 74 3b 20 20 20  Reg = target;   
12ab0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 73      /* Results s
12ac0 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65  tored in registe
12ad0 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74  r inReg */.  int
12ae0 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20 20   regFree1 = 0;  
12af0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e         /* If non
12b00 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20  -zero free this 
12b10 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
12b20 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46  er */.  int regF
12b30 72 65 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20  ree2 = 0;       
12b40 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f    /* If non-zero
12b50 20 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f   free this tempo
12b60 72 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f  rary register */
12b70 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72  .  int r1, r2, r
12b80 33 2c 20 72 34 3b 20 20 20 20 20 20 20 2f 2a 20  3, r4;       /* 
12b90 56 61 72 69 6f 75 73 20 72 65 67 69 73 74 65 72  Various register
12ba0 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20 73 71   numbers */.  sq
12bb0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
12bc0 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64  se->db; /* The d
12bd0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
12be0 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  on */..  assert(
12bf0 20 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72   target>0 && tar
12c00 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65  get<=pParse->nMe
12c10 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  m );.  if( v==0 
12c20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
12c30 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
12c40 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72  cFailed );.    r
12c50 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
12c60 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a  if( pExpr==0 ){.
12c70 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c      op = TK_NULL
12c80 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
12c90 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
12ca0 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20   }.  switch( op 
12cb0 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
12cc0 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  GG_COLUMN: {.   
12cd0 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67     AggInfo *pAgg
12ce0 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41  Info = pExpr->pA
12cf0 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74  ggInfo;.      st
12d00 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
12d10 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e   *pCol = &pAggIn
12d20 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e  fo->aCol[pExpr->
12d30 69 41 67 67 5d 3b 0a 20 20 20 20 20 20 69 66 28  iAgg];.      if(
12d40 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65   !pAggInfo->dire
12d50 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  ctMode ){.      
12d60 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e    assert( pCol->
12d70 69 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20  iMem>0 );.      
12d80 20 20 69 6e 52 65 67 20 3d 20 70 43 6f 6c 2d 3e    inReg = pCol->
12d90 69 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 62 72  iMem;.        br
12da0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eak;.      }else
12db0 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75   if( pAggInfo->u
12dc0 73 65 53 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a  seSortingIdx ){.
12dd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
12de0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
12df0 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f  Column, pAggInfo
12e00 2d 3e 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20  ->sortingIdx,.  
12e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
12e30 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c  ->iSorterColumn,
12e40 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
12e50 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
12e60 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 77  .      /* Otherw
12e70 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 75 20 69  ise, fall thru i
12e80 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d  nto the TK_COLUM
12e90 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a  N case */.    }.
12ea0 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
12eb0 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  MN: {.      if( 
12ec0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3c 30 20  pExpr->iTable<0 
12ed0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
12ee0 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  is only happens 
12ef0 77 68 65 6e 20 63 6f 64 69 6e 67 20 63 68 65 63  when coding chec
12f00 6b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  k constraints */
12f10 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
12f20 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3e   pParse->ckBase>
12f30 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52  0 );.        inR
12f40 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  eg = pExpr->iCol
12f50 75 6d 6e 20 2b 20 70 50 61 72 73 65 2d 3e 63 6b  umn + pParse->ck
12f60 42 61 73 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Base;.      }els
12f70 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  e{.        inReg
12f80 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
12f90 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72  deGetColumn(pPar
12fa0 73 65 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c  se, pExpr->pTab,
12fb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fd0 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
12fe0 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
12ff0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
13000 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
13010 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
13020 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
13030 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 76 2c    codeInteger(v,
13040 20 70 45 78 70 72 2c 20 30 2c 20 74 61 72 67 65   pExpr, 0, targe
13050 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
13060 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
13070 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20  TK_FLOAT: {.    
13080 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
13090 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
130a0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
130b0 3b 0a 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c  ;.      codeReal
130c0 28 76 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  (v, pExpr->u.zTo
130d0 6b 65 6e 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ken, 0, target);
130e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
130f0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
13100 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20  STRING: {.      
13110 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
13120 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
13130 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
13140 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13150 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74  eAddOp4(v, OP_St
13160 72 69 6e 67 38 2c 20 30 2c 20 74 61 72 67 65 74  ring8, 0, target
13170 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  , 0, pExpr->u.zT
13180 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  oken, 0);.      
13190 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
131a0 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b   case TK_NULL: {
131b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
131c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
131d0 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ull, 0, target);
131e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
131f0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
13200 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54  TE_OMIT_BLOB_LIT
13210 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b  ERAL.    case TK
13220 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69  _BLOB: {.      i
13230 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73  nt n;.      cons
13240 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20  t char *z;.     
13250 20 63 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20   char *zBlob;.  
13260 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
13270 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
13280 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
13290 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
132a0 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ( pExpr->u.zToke
132b0 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20 70 45 78  n[0]=='x' || pEx
132c0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d  pr->u.zToken[0]=
132d0 3d 27 58 27 20 29 3b 0a 20 20 20 20 20 20 61 73  ='X' );.      as
132e0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
132f0 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29  Token[1]=='\'' )
13300 3b 0a 20 20 20 20 20 20 7a 20 3d 20 26 70 45 78  ;.      z = &pEx
13310 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b  pr->u.zToken[2];
13320 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74  .      n = sqlit
13330 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 2d 20  e3Strlen30(z) - 
13340 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
13350 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20   z[n]=='\'' );. 
13360 20 20 20 20 20 7a 42 6c 6f 62 20 3d 20 73 71 6c       zBlob = sql
13370 69 74 65 33 48 65 78 54 6f 42 6c 6f 62 28 73 71  ite3HexToBlob(sq
13380 6c 69 74 65 33 56 64 62 65 44 62 28 76 29 2c 20  lite3VdbeDb(v), 
13390 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  z, n);.      sql
133a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
133b0 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20  , OP_Blob, n/2, 
133c0 74 61 72 67 65 74 2c 20 30 2c 20 7a 42 6c 6f 62  target, 0, zBlob
133d0 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
133e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
133f0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
13400 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b  e TK_VARIABLE: {
13410 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70  .      VdbeOp *p
13420 4f 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  Op;.      assert
13430 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
13440 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
13450 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
13460 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
13470 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20 20  .zToken!=0 );.  
13480 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
13490 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d  r->u.zToken[0]!=
134a0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
134b0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31  Expr->u.zToken[1
134c0 5d 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  ]==0.         &&
134d0 20 28 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56   (pOp = sqlite3V
134e0 64 62 65 47 65 74 4f 70 28 76 2c 20 2d 31 29 29  dbeGetOp(v, -1))
134f0 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 61 72  ->opcode==OP_Var
13500 69 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 26  iable.         &
13510 26 20 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70  & pOp->p1+pOp->p
13520 33 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  3==pExpr->iColum
13530 6e 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4f  n.         && pO
13540 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 3d 3d 74  p->p2+pOp->p3==t
13550 61 72 67 65 74 0a 20 20 20 20 20 20 20 20 20 26  arget.         &
13560 26 20 70 4f 70 2d 3e 70 34 2e 7a 3d 3d 30 0a 20  & pOp->p4.z==0. 
13570 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
13580 2f 2a 20 49 66 20 74 68 65 20 70 72 65 76 69 6f  /* If the previo
13590 75 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77  us instruction w
135a0 61 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  as a copy of the
135b0 20 70 72 65 76 69 6f 75 73 20 75 6e 6e 61 6d 65   previous unname
135c0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 72  d.        ** par
135d0 61 6d 65 74 65 72 20 69 6e 74 6f 20 74 68 65 20  ameter into the 
135e0 70 72 65 76 69 6f 75 73 20 72 65 67 69 73 74 65  previous registe
135f0 72 2c 20 74 68 65 6e 20 73 69 6d 70 6c 79 20 69  r, then simply i
13600 6e 63 72 65 6d 65 6e 74 20 74 68 65 0a 20 20 20  ncrement the.   
13610 20 20 20 20 20 2a 2a 20 72 65 70 65 61 74 20 63       ** repeat c
13620 6f 75 6e 74 20 6f 6e 20 74 68 65 20 70 72 69 6f  ount on the prio
13630 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 72 61  r instruction ra
13640 74 68 65 72 20 74 68 61 6e 20 6d 61 6b 69 6e 67  ther than making
13650 20 61 20 6e 65 77 0a 20 20 20 20 20 20 20 20 2a   a new.        *
13660 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20  * instruction.. 
13670 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
13680 20 20 70 4f 70 2d 3e 70 33 2b 2b 3b 0a 20 20 20    pOp->p3++;.   
13690 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
136a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
136b0 4f 70 33 28 76 2c 20 4f 50 5f 56 61 72 69 61 62  Op3(v, OP_Variab
136c0 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  le, pExpr->iColu
136d0 6d 6e 2c 20 74 61 72 67 65 74 2c 20 31 29 3b 0a  mn, target, 1);.
136e0 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
136f0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d  r->u.zToken[1]!=
13700 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
13710 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
13720 50 34 28 76 2c 20 2d 31 2c 20 70 45 78 70 72 2d  P4(v, -1, pExpr-
13730 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20  >u.zToken, 0);. 
13740 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
13750 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
13760 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
13770 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20  REGISTER: {.    
13780 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72 2d    inReg = pExpr-
13790 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 62  >iTable;.      b
137a0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
137b0 63 61 73 65 20 54 4b 5f 41 53 3a 20 7b 0a 20 20  case TK_AS: {.  
137c0 20 20 20 20 69 6e 52 65 67 20 3d 20 63 6f 64 65      inReg = code
137d0 41 6c 69 61 73 28 70 50 61 72 73 65 2c 20 70 45  Alias(pParse, pE
137e0 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78  xpr->iTable, pEx
137f0 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65  pr->pLeft, targe
13800 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
13810 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
13820 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a  QLITE_OMIT_CAST.
13830 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54      case TK_CAST
13840 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70  : {.      /* Exp
13850 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  ressions of the 
13860 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65  form:   CAST(pLe
13870 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a  ft AS token) */.
13880 20 20 20 20 20 20 69 6e 74 20 61 66 66 2c 20 74        int aff, t
13890 6f 5f 6f 70 3b 0a 20 20 20 20 20 20 69 6e 52 65  o_op;.      inRe
138a0 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
138b0 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
138c0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
138d0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 61  target);.      a
138e0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
138f0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
13900 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
13910 20 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74       aff = sqlit
13920 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 70  e3AffinityType(p
13930 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  Expr->u.zToken);
13940 0a 20 20 20 20 20 20 74 6f 5f 6f 70 20 3d 20 61  .      to_op = a
13950 66 66 20 2d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff - SQLITE_AFF_
13960 54 45 58 54 20 2b 20 4f 50 5f 54 6f 54 65 78 74  TEXT + OP_ToText
13970 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13980 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 54 65 78 74  to_op==OP_ToText
13990 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49      || aff!=SQLI
139a0 54 45 5f 41 46 46 5f 54 45 58 54 20 20 20 20 29  TE_AFF_TEXT    )
139b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
139c0 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62  to_op==OP_ToBlob
139d0 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49      || aff!=SQLI
139e0 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 20 20 20 29  TE_AFF_NONE    )
139f0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13a00 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65  to_op==OP_ToNume
13a10 72 69 63 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49  ric || aff!=SQLI
13a20 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
13a30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13a40 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 49 6e 74 20  to_op==OP_ToInt 
13a50 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49      || aff!=SQLI
13a60 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29  TE_AFF_INTEGER )
13a70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13a80 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c  to_op==OP_ToReal
13a90 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49      || aff!=SQLI
13aa0 54 45 5f 41 46 46 5f 52 45 41 4c 20 20 20 20 29  TE_AFF_REAL    )
13ab0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
13ac0 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 54 65  ( to_op==OP_ToTe
13ad0 78 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  xt );.      test
13ae0 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  case( to_op==OP_
13af0 54 6f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20  ToBlob );.      
13b00 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d  testcase( to_op=
13b10 3d 4f 50 5f 54 6f 4e 75 6d 65 72 69 63 20 29 3b  =OP_ToNumeric );
13b20 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
13b30 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 49 6e 74   to_op==OP_ToInt
13b40 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
13b50 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  se( to_op==OP_To
13b60 52 65 61 6c 20 29 3b 0a 20 20 20 20 20 20 69 66  Real );.      if
13b70 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20  ( inReg!=target 
13b80 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
13b90 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13ba0 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c  OP_SCopy, inReg,
13bb0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
13bc0 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74    inReg = target
13bd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13be0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13bf0 31 28 76 2c 20 74 6f 5f 6f 70 2c 20 69 6e 52 65  1(v, to_op, inRe
13c00 67 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  g);.      testca
13c10 73 65 28 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e  se( usedAsColumn
13c20 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 69 6e  Cache(pParse, in
13c30 52 65 67 2c 20 69 6e 52 65 67 29 20 29 3b 0a 20  Reg, inReg) );. 
13c40 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
13c50 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
13c60 6e 67 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65  nge(pParse, inRe
13c70 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65  g, 1);.      bre
13c80 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
13c90 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
13ca0 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73 65  CAST */.    case
13cb0 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
13cc0 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
13cd0 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
13ce0 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
13cf0 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
13d00 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
13d10 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f  assert( TK_LT==O
13d20 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Lt );.      as
13d30 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f  sert( TK_LE==OP_
13d40 4c 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Le );.      asse
13d50 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74  rt( TK_GT==OP_Gt
13d60 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
13d70 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29  ( TK_GE==OP_Ge )
13d80 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13d90 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a  TK_EQ==OP_Eq );.
13da0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
13db0 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20  _NE==OP_Ne );.  
13dc0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
13dd0 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20  ==TK_LT );.     
13de0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
13df0 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65  K_LE );.      te
13e00 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47  stcase( op==TK_G
13e10 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
13e20 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 45 20 29  ase( op==TK_GE )
13e30 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
13e40 28 20 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20  ( op==TK_EQ );. 
13e50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
13e60 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20  p==TK_NE );.    
13e70 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
13e80 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
13e90 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
13ea0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
13eb0 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
13ec0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
13ed0 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
13ee0 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
13ef0 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
13f00 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
13f10 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52  pLeft, pExpr->pR
13f20 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20  ight, op,.      
13f30 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
13f40 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49 54  r2, inReg, SQLIT
13f50 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20  E_STOREP2);.    
13f60 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
13f70 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
13f80 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
13f90 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
13fa0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
13fb0 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20   case TK_IS:.   
13fc0 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20   case TK_ISNOT: 
13fd0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
13fe0 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ( op==TK_IS );. 
13ff0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
14000 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20  p==TK_ISNOT );. 
14010 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
14020 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
14030 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
14040 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
14050 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
14060 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
14070 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
14080 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
14090 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70  ;.      op = (op
140a0 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51  ==TK_IS) ? TK_EQ
140b0 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20   : TK_NE;.      
140c0 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
140d0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
140e0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
140f0 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20   op,.           
14100 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 69         r1, r2, i
14110 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f  nReg, SQLITE_STO
14120 52 45 50 32 20 7c 20 53 51 4c 49 54 45 5f 4e 55  REP2 | SQLITE_NU
14130 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73  LLEQ);.      tes
14140 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
14150 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
14160 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
14170 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
14180 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
14190 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73   TK_AND:.    cas
141a0 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73  e TK_OR:.    cas
141b0 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63  e TK_PLUS:.    c
141c0 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20  ase TK_STAR:.   
141d0 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a   case TK_MINUS:.
141e0 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a      case TK_REM:
141f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
14200 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  AND:.    case TK
14210 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73 65  _BITOR:.    case
14220 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63   TK_SLASH:.    c
14230 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20  ase TK_LSHIFT:. 
14240 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46     case TK_RSHIF
14250 54 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  T: .    case TK_
14260 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20  CONCAT: {.      
14270 61 73 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d  assert( TK_AND==
14280 4f 50 5f 41 6e 64 20 29 3b 0a 20 20 20 20 20 20  OP_And );.      
14290 61 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f  assert( TK_OR==O
142a0 50 5f 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Or );.      as
142b0 73 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f  sert( TK_PLUS==O
142c0 50 5f 41 64 64 20 29 3b 0a 20 20 20 20 20 20 61  P_Add );.      a
142d0 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d  ssert( TK_MINUS=
142e0 3d 4f 50 5f 53 75 62 74 72 61 63 74 20 29 3b 0a  =OP_Subtract );.
142f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
14300 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64  _REM==OP_Remaind
14310 65 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  er );.      asse
14320 72 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f  rt( TK_BITAND==O
14330 50 5f 42 69 74 41 6e 64 20 29 3b 0a 20 20 20 20  P_BitAnd );.    
14340 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54    assert( TK_BIT
14350 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 0a  OR==OP_BitOr );.
14360 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
14370 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64  _SLASH==OP_Divid
14380 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
14390 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50  t( TK_LSHIFT==OP
143a0 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 0a 20 20  _ShiftLeft );.  
143b0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52      assert( TK_R
143c0 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52  SHIFT==OP_ShiftR
143d0 69 67 68 74 20 29 3b 0a 20 20 20 20 20 20 61 73  ight );.      as
143e0 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d  sert( TK_CONCAT=
143f0 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 0a 20 20  =OP_Concat );.  
14400 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
14410 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20  ==TK_AND );.    
14420 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
14430 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 74  TK_OR );.      t
14440 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
14450 50 4c 55 53 20 29 3b 0a 20 20 20 20 20 20 74 65  PLUS );.      te
14460 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d  stcase( op==TK_M
14470 49 4e 55 53 20 29 3b 0a 20 20 20 20 20 20 74 65  INUS );.      te
14480 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52  stcase( op==TK_R
14490 45 4d 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  EM );.      test
144a0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54  case( op==TK_BIT
144b0 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73  AND );.      tes
144c0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49  tcase( op==TK_BI
144d0 54 4f 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73  TOR );.      tes
144e0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c  tcase( op==TK_SL
144f0 41 53 48 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ASH );.      tes
14500 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53  tcase( op==TK_LS
14510 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20 74 65  HIFT );.      te
14520 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52  stcase( op==TK_R
14530 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20 74  SHIFT );.      t
14540 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
14550 43 4f 4e 43 41 54 20 29 3b 0a 20 20 20 20 20 20  CONCAT );.      
14560 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
14570 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
14580 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
14590 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
145a0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
145b0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
145c0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
145d0 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
145e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
145f0 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72 32 2c 20  dOp3(v, op, r2, 
14600 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  r1, target);.   
14610 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
14620 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
14630 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
14640 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
14650 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
14660 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53    case TK_UMINUS
14670 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  : {.      Expr *
14680 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
14690 4c 65 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Left;.      asse
146a0 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20  rt( pLeft );.   
146b0 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70     if( pLeft->op
146c0 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20  ==TK_FLOAT ){.  
146d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
146e0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
146f0 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
14700 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  e) );.        co
14710 64 65 52 65 61 6c 28 76 2c 20 70 4c 65 66 74 2d  deReal(v, pLeft-
14720 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74 61  >u.zToken, 1, ta
14730 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  rget);.      }el
14740 73 65 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70  se if( pLeft->op
14750 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a  ==TK_INTEGER ){.
14760 20 20 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65          codeInte
14770 67 65 72 28 76 2c 20 70 4c 65 66 74 2c 20 31 2c  ger(v, pLeft, 1,
14780 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
14790 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
147a0 65 67 46 72 65 65 31 20 3d 20 72 31 20 3d 20 73  egFree1 = r1 = s
147b0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
147c0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
147d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
147e0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
147f0 72 2c 20 30 2c 20 72 31 29 3b 0a 20 20 20 20 20  r, 0, r1);.     
14800 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
14810 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
14820 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
14830 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
14840 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14850 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75  eAddOp3(v, OP_Su
14860 62 74 72 61 63 74 2c 20 72 32 2c 20 72 31 2c 20  btract, r2, r1, 
14870 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
14880 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
14890 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
148a0 7d 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20  }.      inReg = 
148b0 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 62 72  target;.      br
148c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
148d0 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20  ase TK_BITNOT:. 
148e0 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
148f0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
14900 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69  TK_BITNOT==OP_Bi
14910 74 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 61 73  tNot );.      as
14920 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50  sert( TK_NOT==OP
14930 5f 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 74 65  _Not );.      te
14940 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42  stcase( op==TK_B
14950 49 54 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 74  ITNOT );.      t
14960 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
14970 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20  NOT );.      r1 
14980 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
14990 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
149a0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
149b0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65  Free1);.      te
149c0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
149d0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 6e 52  ==0 );.      inR
149e0 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20  eg = target;.   
149f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14a00 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20  dOp2(v, op, r1, 
14a10 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72  inReg);.      br
14a20 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
14a30 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
14a40 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
14a50 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  LL: {.      int 
14a60 61 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65  addr;.      asse
14a70 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f  rt( TK_ISNULL==O
14a80 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20  P_IsNull );.    
14a90 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54    assert( TK_NOT
14aa0 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c  NULL==OP_NotNull
14ab0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
14ac0 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  se( op==TK_ISNUL
14ad0 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  L );.      testc
14ae0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  ase( op==TK_NOTN
14af0 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ULL );.      sql
14b00 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14b10 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
14b20 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
14b30 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
14b40 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
14b50 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
14b60 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
14b70 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
14b80 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
14b90 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
14ba0 62 65 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20  beAddOp1(v, op, 
14bb0 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
14bc0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14bd0 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65  OP_AddImm, targe
14be0 74 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 73 71  t, -1);.      sq
14bf0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
14c00 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
14c10 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
14c20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
14c30 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
14c40 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20   AggInfo *pInfo 
14c50 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66  = pExpr->pAggInf
14c60 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e  o;.      if( pIn
14c70 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  fo==0 ){.       
14c80 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
14c90 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
14ca0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
14cb0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14cc0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
14cd0 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72   "misuse of aggr
14ce0 65 67 61 74 65 3a 20 25 73 28 29 22 2c 20 70 45  egate: %s()", pE
14cf0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
14d00 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14d10 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 49 6e       inReg = pIn
14d20 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d  fo->aFunc[pExpr-
14d30 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20  >iAgg].iMem;.   
14d40 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
14d50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
14d60 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a   TK_CONST_FUNC:.
14d70 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
14d80 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78  TION: {.      Ex
14d90 70 72 4c 69 73 74 20 2a 70 46 61 72 67 3b 20 20  prList *pFarg;  
14da0 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
14db0 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
14dc0 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
14dd0 6e 46 61 72 67 3b 20 20 20 20 20 20 20 20 20 20  nFarg;          
14de0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
14df0 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
14e00 74 73 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63  ts */.      Func
14e10 44 65 66 20 2a 70 44 65 66 3b 20 20 20 20 20 20  Def *pDef;      
14e20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69     /* The functi
14e30 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 62  on definition ob
14e40 6a 65 63 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ject */.      in
14e50 74 20 6e 49 64 3b 20 20 20 20 20 20 20 20 20 20  t nId;          
14e60 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
14e70 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e  f the function n
14e80 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ame in bytes */.
14e90 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
14ea0 20 2a 7a 49 64 3b 20 20 20 20 20 20 20 2f 2a 20   *zId;       /* 
14eb0 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  The function nam
14ec0 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63  e */.      int c
14ed0 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20  onstMask = 0;   
14ee0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e    /* Mask of fun
14ef0 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
14f00 74 68 61 74 20 61 72 65 20 63 6f 6e 73 74 61 6e  that are constan
14f10 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  t */.      int i
14f20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14f30 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
14f40 72 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 6e  r */.      u8 en
14f50 63 20 3d 20 45 4e 43 28 64 62 29 3b 20 20 20 20  c = ENC(db);    
14f60 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65 6e    /* The text en
14f70 63 6f 64 69 6e 67 20 75 73 65 64 20 62 79 20 74  coding used by t
14f80 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  his database */.
14f90 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
14fa0 43 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20  Coll = 0;    /* 
14fb0 41 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  A collating sequ
14fc0 65 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61  ence */..      a
14fd0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
14fe0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
14ff0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
15000 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15010 6f 70 3d 3d 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e  op==TK_CONST_FUN
15020 43 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  C );.      testc
15030 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 46 55 4e 43  ase( op==TK_FUNC
15040 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 69 66  TION );.      if
15050 28 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70  ( ExprHasAnyProp
15060 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54  erty(pExpr, EP_T
15070 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  okenOnly) ){.   
15080 20 20 20 20 20 70 46 61 72 67 20 3d 20 30 3b 0a       pFarg = 0;.
15090 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
150a0 20 20 20 20 20 70 46 61 72 67 20 3d 20 70 45 78       pFarg = pEx
150b0 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
150c0 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 61 72 67     }.      nFarg
150d0 20 3d 20 70 46 61 72 67 20 3f 20 70 46 61 72 67   = pFarg ? pFarg
150e0 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20  ->nExpr : 0;.   
150f0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
15100 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
15110 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
15120 29 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d 20 70  );.      zId = p
15130 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Expr->u.zToken;.
15140 20 20 20 20 20 20 6e 49 64 20 3d 20 73 71 6c 69        nId = sqli
15150 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 49 64 29  te3Strlen30(zId)
15160 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73  ;.      pDef = s
15170 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
15180 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c  on(db, zId, nId,
15190 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b   nFarg, enc, 0);
151a0 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d  .      if( pDef=
151b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
151c0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
151d0 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 66  arse, "unknown f
151e0 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73 28 29 22  unction: %.*s()"
151f0 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20  , nId, zId);.   
15200 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15210 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74    }..      /* At
15220 74 65 6d 70 74 20 61 20 64 69 72 65 63 74 20 69  tempt a direct i
15230 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
15240 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 43 4f   the built-in CO
15250 41 4c 45 53 43 45 28 29 20 61 6e 64 0a 20 20 20  ALESCE() and.   
15260 20 20 20 2a 2a 20 49 46 4e 55 4c 4c 28 29 20 66     ** IFNULL() f
15270 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 69 73 20  unctions.  This 
15280 61 76 6f 69 64 73 20 75 6e 6e 65 63 65 73 73 61  avoids unnecessa
15290 72 79 20 65 76 61 6c 61 74 69 6f 6e 20 6f 66 0a  ry evalation of.
152a0 20 20 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e        ** argumen
152b0 74 73 20 70 61 73 74 20 74 68 65 20 66 69 72 73  ts past the firs
152c0 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d  t non-NULL argum
152d0 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ent..      */.  
152e0 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 6c      if( pDef->fl
152f0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
15300 43 5f 43 4f 41 4c 45 53 43 45 20 29 7b 0a 20 20  C_COALESCE ){.  
15310 20 20 20 20 20 20 69 6e 74 20 65 6e 64 43 6f 61        int endCoa
15320 6c 65 73 63 65 20 3d 20 73 71 6c 69 74 65 33 56  lesce = sqlite3V
15330 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
15340 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
15350 20 6e 46 61 72 67 3e 3d 32 20 29 3b 0a 20 20 20   nFarg>=2 );.   
15360 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
15370 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46 61  Code(pParse, pFa
15380 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  rg->a[0].pExpr, 
15390 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
153a0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 46 61 72   for(i=1; i<nFar
153b0 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
153c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
153d0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  dOp2(v, OP_NotNu
153e0 6c 6c 2c 20 74 61 72 67 65 74 2c 20 65 6e 64 43  ll, target, endC
153f0 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20  oalesce);.      
15400 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
15410 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73  acheRemove(pPars
15420 65 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  e, target);.    
15430 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
15440 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
15450 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
15460 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
15470 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69  arse, pFarg->a[i
15480 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  ].pExpr, target)
15490 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
154a0 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
154b0 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 20 20  pParse, 1);.    
154c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
154d0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
154e0 4c 61 62 65 6c 28 76 2c 20 65 6e 64 43 6f 61 6c  Label(v, endCoal
154f0 65 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20 62  esce);.        b
15500 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a  reak;.      }...
15510 20 20 20 20 20 20 69 66 28 20 70 46 61 72 67 20        if( pFarg 
15520 29 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  ){.        r1 = 
15530 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
15540 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 46 61 72  nge(pParse, nFar
15550 67 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  g);.        sqli
15560 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
15570 28 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a  (pParse);     /*
15580 20 54 69 63 6b 65 74 20 32 65 61 32 34 32 35 64   Ticket 2ea2425d
15590 33 34 62 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  34be */.        
155a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
155b0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
155c0 70 46 61 72 67 2c 20 72 31 2c 20 31 29 3b 0a 20  pFarg, r1, 1);. 
155d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
155e0 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
155f0 65 2c 20 31 29 3b 20 20 20 2f 2a 20 54 69 63 6b  e, 1);   /* Tick
15600 65 74 20 32 65 61 32 34 32 35 64 33 34 62 65 20  et 2ea2425d34be 
15610 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  */.      }else{.
15620 20 20 20 20 20 20 20 20 72 31 20 3d 20 30 3b 0a          r1 = 0;.
15630 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
15640 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
15650 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f  UALTABLE.      /
15660 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c  * Possibly overl
15670 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  oad the function
15680 20 69 66 20 74 68 65 20 66 69 72 73 74 20 61 72   if the first ar
15690 67 75 6d 65 6e 74 20 69 73 0a 20 20 20 20 20 20  gument is.      
156a0 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ** a virtual tab
156b0 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20  le column..     
156c0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72   **.      ** For
156d0 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73   infix functions
156e0 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45   (LIKE, GLOB, RE
156f0 47 45 58 50 2c 20 61 6e 64 20 4d 41 54 43 48 29  GEXP, and MATCH)
15700 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 2a   use the.      *
15710 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  * second argumen
15720 74 2c 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74  t, not the first
15730 2c 20 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e  , as the argumen
15740 74 20 74 6f 20 74 65 73 74 20 74 6f 0a 20 20 20  t to test to.   
15750 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20     ** see if it 
15760 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61  is a column in a
15770 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
15780 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65   This is done be
15790 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74  cause.      ** t
157a0 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20  he left operand 
157b0 6f 66 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f  of infix functio
157c0 6e 73 20 28 74 68 65 20 6f 70 65 72 61 6e 64 20  ns (the operand 
157d0 77 65 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 20  we want to.     
157e0 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72   ** control over
157f0 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73 20 75 70  loading) ends up
15800 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
15810 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20  rgument to the. 
15820 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
15830 2e 20 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  .  The expressio
15840 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 69 73 20  n "A glob B" is 
15850 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20  equivalent to . 
15860 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c       ** "glob(B,
15870 41 29 2e 20 20 57 65 20 77 61 6e 74 20 74 6f 20  A).  We want to 
15880 75 73 65 20 74 68 65 20 41 20 69 6e 20 22 41 20  use the A in "A 
15890 67 6c 6f 62 20 42 22 20 74 6f 20 74 65 73 74 0a  glob B" to test.
158a0 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e        ** for fun
158b0 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e  ction overloadin
158c0 67 2e 20 20 42 75 74 20 77 65 20 75 73 65 20 74  g.  But we use t
158d0 68 65 20 42 20 74 65 72 6d 20 69 6e 20 22 67 6c  he B term in "gl
158e0 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20 20 20 20  ob(B,A)"..      
158f0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61  */.      if( nFa
15900 72 67 3e 3d 32 20 26 26 20 28 70 45 78 70 72 2d  rg>=2 && (pExpr-
15910 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 66 69  >flags & EP_Infi
15920 78 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20  xFunc) ){.      
15930 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
15940 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63  VtabOverloadFunc
15950 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e  tion(db, pDef, n
15960 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 31  Farg, pFarg->a[1
15970 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
15980 7d 65 6c 73 65 20 69 66 28 20 6e 46 61 72 67 3e  }else if( nFarg>
15990 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  0 ){.        pDe
159a0 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f  f = sqlite3VtabO
159b0 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28  verloadFunction(
159c0 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c  db, pDef, nFarg,
159d0 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
159e0 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  pr);.      }.#en
159f0 64 69 66 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  dif.      for(i=
15a00 30 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29  0; i<nFarg; i++)
15a10 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c  {.        if( i<
15a20 33 32 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  32 && sqlite3Exp
15a30 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 46 61 72  rIsConstant(pFar
15a40 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  g->a[i].pExpr) )
15a50 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  {.          cons
15a60 74 4d 61 73 6b 20 7c 3d 20 28 31 3c 3c 69 29 3b  tMask |= (1<<i);
15a70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15a80 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66 6c     if( (pDef->fl
15a90 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
15aa0 43 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20 26  C_NEEDCOLL)!=0 &
15ab0 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  & !pColl ){.    
15ac0 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
15ad0 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
15ae0 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e  (pParse, pFarg->
15af0 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
15b00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
15b10 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66       if( pDef->f
15b20 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
15b30 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20  NC_NEEDCOLL ){. 
15b40 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c         if( !pCol
15b50 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  l ) pColl = db->
15b60 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20  pDfltColl; .    
15b70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15b80 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c  ddOp4(v, OP_Coll
15b90 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63  Seq, 0, 0, 0, (c
15ba0 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  har *)pColl, P4_
15bb0 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
15bc0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
15bd0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
15be0 46 75 6e 63 74 69 6f 6e 2c 20 63 6f 6e 73 74 4d  Function, constM
15bf0 61 73 6b 2c 20 72 31 2c 20 74 61 72 67 65 74 2c  ask, r1, target,
15c00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15c10 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
15c20 70 44 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46  pDef, P4_FUNCDEF
15c30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15c40 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
15c50 28 75 38 29 6e 46 61 72 67 29 3b 0a 20 20 20 20  (u8)nFarg);.    
15c60 20 20 69 66 28 20 6e 46 61 72 67 20 29 7b 0a 20    if( nFarg ){. 
15c70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
15c80 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
15c90 50 61 72 73 65 2c 20 72 31 2c 20 6e 46 61 72 67  Parse, r1, nFarg
15ca0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
15cb0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
15cc0 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
15cd0 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 46 61 72  pParse, r1, nFar
15ce0 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  g);.      break;
15cf0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
15d00 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
15d10 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
15d20 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65  EXISTS:.    case
15d30 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20   TK_SELECT: {.  
15d40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
15d50 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20  ==TK_EXISTS );. 
15d60 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
15d70 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
15d80 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71        inReg = sq
15d90 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
15da0 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ct(pParse, pExpr
15db0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  , 0, 0);.      b
15dc0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
15dd0 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
15de0 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 46 61      int destIfFa
15df0 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  lse = sqlite3Vdb
15e00 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
15e10 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e       int destIfN
15e20 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ull = sqlite3Vdb
15e30 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
15e40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15e50 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
15e60 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  l, 0, target);. 
15e70 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
15e80 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70  CodeIN(pParse, p
15e90 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73  Expr, destIfFals
15ea0 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  e, destIfNull);.
15eb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15ec0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
15ed0 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74  teger, 1, target
15ee0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15ef0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
15f00 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29  (v, destIfFalse)
15f10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
15f20 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15f30 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20  AddImm, target, 
15f40 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
15f50 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
15f60 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  l(v, destIfNull)
15f70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
15f80 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
15f90 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
15fa0 45 52 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 0a  ERY */...    /*.
15fb0 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54 57      **    x BETW
15fc0 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20  EEN y AND z.    
15fd0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  **.    ** This i
15fe0 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a  s equivalent to.
15ff0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
16000 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20   x>=y AND x<=z. 
16010 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69     **.    ** X i
16020 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70  s stored in pExp
16030 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a  r->pLeft..    **
16040 20 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   Y is stored in 
16050 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
16060 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a  0].pExpr..    **
16070 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   Z is stored in 
16080 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
16090 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f  1].pExpr..    */
160a0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
160b0 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78  WEEN: {.      Ex
160c0 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
160d0 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
160e0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
160f0 69 74 65 6d 20 2a 70 4c 49 74 65 6d 20 3d 20 70  item *pLItem = p
16100 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
16110 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  ;.      Expr *pR
16120 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70  ight = pLItem->p
16130 45 78 70 72 3b 0a 0a 20 20 20 20 20 20 72 31 20  Expr;..      r1 
16140 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
16150 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c  eTemp(pParse, pL
16160 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
16170 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
16180 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
16190 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20  pParse, pRight, 
161a0 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
161b0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
161c0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
161d0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
161e0 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
161f0 72 33 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r3 = sqlite3GetT
16200 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
16210 20 20 20 20 20 20 72 34 20 3d 20 73 71 6c 69 74        r4 = sqlit
16220 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
16230 72 73 65 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  rse);.      code
16240 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
16250 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f  pLeft, pRight, O
16260 50 5f 47 65 2c 0a 20 20 20 20 20 20 20 20 20 20  P_Ge,.          
16270 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
16280 72 33 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45  r3, SQLITE_STORE
16290 50 32 29 3b 0a 20 20 20 20 20 20 70 4c 49 74 65  P2);.      pLIte
162a0 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 52 69 67 68  m++;.      pRigh
162b0 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70  t = pLItem->pExp
162c0 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
162d0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
162e0 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
162f0 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
16300 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
16310 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c  (pParse, pRight,
16320 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
16330 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
16340 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
16350 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
16360 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69  arse, pLeft, pRi
16370 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 72 31 2c 20  ght, OP_Le, r1, 
16380 72 32 2c 20 72 34 2c 20 53 51 4c 49 54 45 5f 53  r2, r4, SQLITE_S
16390 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20 73  TOREP2);.      s
163a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
163b0 28 76 2c 20 4f 50 5f 41 6e 64 2c 20 72 33 2c 20  (v, OP_And, r3, 
163c0 72 34 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  r4, target);.   
163d0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
163e0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
163f0 20 72 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r3);.      sqli
16400 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
16410 67 28 70 50 61 72 73 65 2c 20 72 34 29 3b 0a 20  g(pParse, r4);. 
16420 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16430 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50  }.    case TK_UP
16440 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52  LUS: {.      inR
16450 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
16460 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
16470 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
16480 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
16490 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
164a0 20 20 63 61 73 65 20 54 4b 5f 54 52 49 47 47 45    case TK_TRIGGE
164b0 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  R: {.      /* If
164c0 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20 54   the opcode is T
164d0 4b 5f 54 52 49 47 47 45 52 2c 20 74 68 65 6e 20  K_TRIGGER, then 
164e0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
164f0 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20  s a reference.  
16500 20 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75      ** to a colu
16510 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20  mn in the new.* 
16520 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d  or old.* pseudo-
16530 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c 65  tables available
16540 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72 69   to.      ** tri
16550 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 20 49  gger programs. I
16560 6e 20 74 68 69 73 20 63 61 73 65 20 45 78 70 72  n this case Expr
16570 2e 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74  .iTable is set t
16580 6f 20 31 20 66 6f 72 20 74 68 65 0a 20 20 20 20  o 1 for the.    
16590 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64    ** new.* pseud
165a0 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f  o-table, or 0 fo
165b0 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75  r the old.* pseu
165c0 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e 69  do-table. Expr.i
165d0 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20  Column.      ** 
165e0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f  is set to the co
165f0 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 73 65 75  lumn of the pseu
16600 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65 61 64  do-table to read
16610 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20  , or to -1 to.  
16620 20 20 20 20 2a 2a 20 72 65 61 64 20 74 68 65 20      ** read the 
16630 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20 20 20  rowid field..   
16640 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
16650 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
16660 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69   implemented usi
16670 6e 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d 20 6f  ng an OP_Param o
16680 70 63 6f 64 65 2e 20 54 68 65 20 70 31 0a 20 20  pcode. The p1.  
16690 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72      ** parameter
166a0 20 69 73 20 73 65 74 20 74 6f 20 30 20 66 6f 72   is set to 0 for
166b0 20 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20 72 65   an old.rowid re
166c0 66 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f 20 28  ference, or to (
166d0 69 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f  i+1).      ** to
166e0 20 72 65 66 65 72 65 6e 63 65 20 61 6e 6f 74 68   reference anoth
166f0 65 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  er column of the
16700 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61   old.* pseudo-ta
16710 62 6c 65 2c 20 77 68 65 72 65 20 0a 20 20 20 20  ble, where .    
16720 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69 6e    ** i is the in
16730 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  dex of the colum
16740 6e 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72 6f 77  n. For a new.row
16750 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20 70 31  id reference, p1
16760 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 73 65 74   is.      ** set
16770 20 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65 72 65   to (n+1), where
16780 20 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   n is the number
16790 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 65   of columns in e
167a0 61 63 68 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  ach pseudo-table
167b0 2e 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61  ..      ** For a
167c0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e   reference to an
167d0 79 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 69  y other column i
167e0 6e 20 74 68 65 20 6e 65 77 2e 2a 20 70 73 65 75  n the new.* pseu
167f0 64 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20 20 20  do-table, p1.   
16800 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20     ** is set to 
16810 28 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65 20 6e  (n+2+i), where n
16820 20 61 6e 64 20 69 20 61 72 65 20 61 73 20 64 65   and i are as de
16830 66 69 6e 65 64 20 70 72 65 76 69 6f 75 73 6c 79  fined previously
16840 2e 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a 20 65  . For.      ** e
16850 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 74  xample, if the t
16860 61 62 6c 65 20 6f 6e 20 77 68 69 63 68 20 74 72  able on which tr
16870 69 67 67 65 72 73 20 61 72 65 20 62 65 69 6e 67  iggers are being
16880 20 66 69 72 65 64 20 69 73 0a 20 20 20 20 20 20   fired is.      
16890 2a 2a 20 64 65 63 6c 61 72 65 64 20 61 73 3a 0a  ** declared as:.
168a0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
168b0 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
168c0 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20   t1(a, b);.     
168d0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
168e0 6e 20 70 31 20 69 73 20 69 6e 74 65 72 70 72 65  n p1 is interpre
168f0 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
16900 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
16910 2a 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e 20 20  *   p1==0   ->  
16920 20 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20 20 20    old.rowid     
16930 70 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20 6e 65  p1==3   ->    ne
16940 77 2e 72 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a  w.rowid.      **
16950 20 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20 20 20     p1==1   ->   
16960 20 6f 6c 64 2e 61 20 20 20 20 20 20 20 20 20 70   old.a         p
16970 31 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e 65 77  1==4   ->    new
16980 2e 61 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31  .a.      **   p1
16990 3d 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e  ==2   ->    old.
169a0 62 20 20 20 20 20 20 20 20 20 70 31 3d 3d 35 20  b         p1==5 
169b0 20 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20 20 20    ->    new.b   
169c0 20 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20      .      */.  
169d0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
169e0 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20  = pExpr->pTab;. 
169f0 20 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 45       int p1 = pE
16a00 78 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20 28 70  xpr->iTable * (p
16a10 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31  Tab->nCol+1) + 1
16a20 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   + pExpr->iColum
16a30 6e 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  n;..      assert
16a40 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ( pExpr->iTable=
16a50 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61  =0 || pExpr->iTa
16a60 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ble==1 );.      
16a70 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69  assert( pExpr->i
16a80 43 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20 70 45  Column>=-1 && pE
16a90 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61  xpr->iColumn<pTa
16aa0 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20  b->nCol );.     
16ab0 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 69   assert( pTab->i
16ac0 50 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70 72 2d  PKey<0 || pExpr-
16ad0 3e 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e  >iColumn!=pTab->
16ae0 69 50 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 61  iPKey );.      a
16af0 73 73 65 72 74 28 20 70 31 3e 3d 30 20 26 26 20  ssert( p1>=0 && 
16b00 70 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32  p1<(pTab->nCol*2
16b10 2b 32 29 20 29 3b 0a 0a 20 20 20 20 20 20 73 71  +2) );..      sq
16b20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16b30 76 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70 31 2c  v, OP_Param, p1,
16b40 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
16b50 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
16b60 22 25 73 2e 25 73 20 2d 3e 20 24 25 64 22 2c 0a  "%s.%s -> $%d",.
16b70 20 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e          (pExpr->
16b80 69 54 61 62 6c 65 20 3f 20 22 6e 65 77 22 20 3a  iTable ? "new" :
16b90 20 22 6f 6c 64 22 29 2c 0a 20 20 20 20 20 20 20   "old"),.       
16ba0 20 28 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e   (pExpr->iColumn
16bb0 3c 30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 70  <0 ? "rowid" : p
16bc0 45 78 70 72 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c  Expr->pTab->aCol
16bd0 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
16be0 2e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20  .zName),.       
16bf0 20 74 61 72 67 65 74 0a 20 20 20 20 20 20 29 29   target.      ))
16c00 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ;..      /* If t
16c10 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 52 45  he column has RE
16c20 41 4c 20 61 66 66 69 6e 69 74 79 2c 20 69 74 20  AL affinity, it 
16c30 6d 61 79 20 63 75 72 72 65 6e 74 6c 79 20 62 65  may currently be
16c40 20 73 74 6f 72 65 64 20 61 73 20 61 6e 0a 20 20   stored as an.  
16c50 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20      ** integer. 
16c60 55 73 65 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e  Use OP_RealAffin
16c70 69 74 79 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ity to make sure
16c80 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65   it is really re
16c90 61 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66  al.  */.      if
16ca0 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
16cb0 3e 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70  >=0 .       && p
16cc0 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d  Tab->aCol[pExpr-
16cd0 3e 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69  >iColumn].affini
16ce0 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ty==SQLITE_AFF_R
16cf0 45 41 4c 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  EAL.      ){.   
16d00 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16d10 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 61  AddOp1(v, OP_Rea
16d20 6c 41 66 66 69 6e 69 74 79 2c 20 74 61 72 67 65  lAffinity, targe
16d30 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
16d40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
16d50 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 46  .    /*.    ** F
16d60 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20 20 20  orm A:.    **   
16d70 43 41 53 45 20 78 20 57 48 45 4e 20 65 31 20 54  CASE x WHEN e1 T
16d80 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54  HEN r1 WHEN e2 T
16d90 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20  HEN r2 ... WHEN 
16da0 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20  eN THEN rN ELSE 
16db0 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20  y END.    **.   
16dc0 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20 20 20   ** Form B:.    
16dd0 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 65  **   CASE WHEN e
16de0 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65  1 THEN r1 WHEN e
16df0 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48  2 THEN r2 ... WH
16e00 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c  EN eN THEN rN EL
16e10 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a  SE y END.    **.
16e20 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20 69 73      ** Form A is
16e30 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66 6f 72   can be transfor
16e40 6d 65 64 20 69 6e 74 6f 20 74 68 65 20 65 71 75  med into the equ
16e50 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42 20 61  ivalent form B a
16e60 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a  s follows:.    *
16e70 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 78 3d  *   CASE WHEN x=
16e80 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20  e1 THEN r1 WHEN 
16e90 78 3d 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e  x=e2 THEN r2 ...
16ea0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 57  .    **        W
16eb0 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20 72 4e  HEN x=eN THEN rN
16ec0 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20   ELSE y END.    
16ed0 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69 66 20  **.    ** X (if 
16ee0 69 74 20 65 78 69 73 74 73 29 20 69 73 20 69 6e  it exists) is in
16ef0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20   pExpr->pLeft.. 
16f00 20 20 20 2a 2a 20 59 20 69 73 20 69 6e 20 70 45     ** Y is in pE
16f10 78 70 72 2d 3e 70 52 69 67 68 74 2e 20 20 54 68  xpr->pRight.  Th
16f20 65 20 59 20 69 73 20 61 6c 73 6f 20 6f 70 74 69  e Y is also opti
16f30 6f 6e 61 6c 2e 20 20 49 66 20 74 68 65 72 65 20  onal.  If there 
16f40 69 73 20 6e 6f 0a 20 20 20 20 2a 2a 20 45 4c 53  is no.    ** ELS
16f50 45 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 20  E clause and no 
16f60 6f 74 68 65 72 20 74 65 72 6d 20 6d 61 74 63 68  other term match
16f70 65 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  es, then the res
16f80 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ult of the.    *
16f90 2a 20 65 78 70 72 73 73 69 6f 6e 20 69 73 20 4e  * exprssion is N
16fa0 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69 20 69  ULL..    ** Ei i
16fb0 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73  s in pExpr->pLis
16fc0 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20 52 69  t->a[i*2] and Ri
16fd0 20 69 73 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   is pExpr->pList
16fe0 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20 20  ->a[i*2+1]..    
16ff0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65  **.    ** The re
17000 73 75 6c 74 20 6f 66 20 74 68 65 20 65 78 70 72  sult of the expr
17010 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20 52 69  ession is the Ri
17020 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 6d   for the first m
17030 61 74 63 68 69 6e 67 20 45 69 2c 0a 20 20 20 20  atching Ei,.    
17040 2a 2a 20 6f 72 20 69 66 20 74 68 65 72 65 20 69  ** or if there i
17050 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 45 69  s no matching Ei
17060 2c 20 74 68 65 20 45 4c 53 45 20 74 65 72 6d 20  , the ELSE term 
17070 59 2c 20 6f 72 20 69 66 20 74 68 65 72 65 20 69  Y, or if there i
17080 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c 53 45  s.    ** no ELSE
17090 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20   term, NULL..   
170a0 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   */.    default:
170b0 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f   assert( op==TK_
170c0 43 41 53 45 20 29 3b 20 7b 0a 20 20 20 20 20 20  CASE ); {.      
170d0 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20 20 20  int endLabel;   
170e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
170f0 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20    /* GOTO label 
17100 66 6f 72 20 65 6e 64 20 6f 66 20 43 41 53 45 20  for end of CASE 
17110 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  stmt */.      in
17120 74 20 6e 65 78 74 43 61 73 65 3b 20 20 20 20 20  t nextCase;     
17130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17140 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f  /* GOTO label fo
17150 72 20 6e 65 78 74 20 57 48 45 4e 20 63 6c 61 75  r next WHEN clau
17160 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  se */.      int 
17170 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20  nExpr;          
17180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17190 20 32 78 20 6e 75 6d 62 65 72 20 6f 66 20 57 48   2x number of WH
171a0 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  EN terms */.    
171b0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
171c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171d0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
171e0 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ter */.      Exp
171f0 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20  rList *pEList;  
17200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17210 2a 20 4c 69 73 74 20 6f 66 20 57 48 45 4e 20 74  * List of WHEN t
17220 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 73 74  erms */.      st
17230 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
17240 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 20 20  em *aListelem;  
17250 2f 2a 20 41 72 72 61 79 20 6f 66 20 57 48 45 4e  /* Array of WHEN
17260 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20   terms */.      
17270 45 78 70 72 20 6f 70 43 6f 6d 70 61 72 65 3b 20  Expr opCompare; 
17280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17290 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69 20 65    /* The X==Ei e
172a0 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
172b0 20 20 20 45 78 70 72 20 63 61 63 68 65 58 3b 20     Expr cacheX; 
172c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172d0 20 20 20 20 20 2f 2a 20 43 61 63 68 65 64 20 65       /* Cached e
172e0 78 70 72 65 73 73 69 6f 6e 20 58 20 2a 2f 0a 20  xpression X */. 
172f0 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20       Expr *pX;  
17300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17310 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 20         /* The X 
17320 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
17330 20 20 20 20 45 78 70 72 20 2a 70 54 65 73 74 20      Expr *pTest 
17340 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
17350 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28        /* X==Ei (
17360 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73 74 20  form A) or just 
17370 45 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 20  Ei (form B) */. 
17380 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69       VVA_ONLY( i
17390 6e 74 20 69 43 61 63 68 65 4c 65 76 65 6c 20 3d  nt iCacheLevel =
173a0 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
173b0 65 76 65 6c 3b 20 29 0a 0a 20 20 20 20 20 20 61  evel; )..      a
173c0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
173d0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
173e0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 26 26 20  P_xIsSelect) && 
173f0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29  pExpr->x.pList )
17400 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 28  ;.      assert((
17410 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
17420 6e 45 78 70 72 20 25 20 32 29 20 3d 3d 20 30 29  nExpr % 2) == 0)
17430 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  ;.      assert(p
17440 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
17450 45 78 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20  Expr > 0);.     
17460 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   pEList = pExpr-
17470 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  >x.pList;.      
17480 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69  aListelem = pELi
17490 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78  st->a;.      nEx
174a0 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  pr = pEList->nEx
174b0 70 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c 61 62  pr;.      endLab
174c0 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  el = sqlite3Vdbe
174d0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
174e0 20 20 20 20 69 66 28 20 28 70 58 20 3d 20 70 45      if( (pX = pE
174f0 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29  xpr->pLeft)!=0 )
17500 7b 0a 20 20 20 20 20 20 20 20 63 61 63 68 65 58  {.        cacheX
17510 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20   = *pX;.        
17520 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70  testcase( pX->op
17530 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
17540 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
17550 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49   pX->op==TK_REGI
17560 53 54 45 52 20 29 3b 0a 20 20 20 20 20 20 20 20  STER );.        
17570 63 61 63 68 65 58 2e 69 54 61 62 6c 65 20 3d 20  cacheX.iTable = 
17580 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
17590 65 6d 70 28 70 50 61 72 73 65 2c 20 70 58 2c 20  emp(pParse, pX, 
175a0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
175b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
175c0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
175d0 20 20 20 20 20 63 61 63 68 65 58 2e 6f 70 20 3d       cacheX.op =
175e0 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20   TK_REGISTER;.  
175f0 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e        opCompare.
17600 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20  op = TK_EQ;.    
17610 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c      opCompare.pL
17620 65 66 74 20 3d 20 26 63 61 63 68 65 58 3b 0a 20  eft = &cacheX;. 
17630 20 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 26         pTest = &
17640 6f 70 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20  opCompare;.     
17650 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   }.      for(i=0
17660 3b 20 69 3c 6e 45 78 70 72 3b 20 69 3d 69 2b 32  ; i<nExpr; i=i+2
17670 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
17680 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
17690 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
176a0 20 69 66 28 20 70 58 20 29 7b 0a 20 20 20 20 20   if( pX ){.     
176b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65       assert( pTe
176c0 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  st!=0 );.       
176d0 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 52 69     opCompare.pRi
176e0 67 68 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b  ght = aListelem[
176f0 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
17700 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17710 20 20 20 70 54 65 73 74 20 3d 20 61 4c 69 73 74     pTest = aList
17720 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  elem[i].pExpr;. 
17730 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17740 20 6e 65 78 74 43 61 73 65 20 3d 20 73 71 6c 69   nextCase = sqli
17750 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
17760 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  (v);.        tes
17770 74 63 61 73 65 28 20 70 54 65 73 74 2d 3e 6f 70  tcase( pTest->op
17780 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
17790 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
177a0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
177b0 2c 20 70 54 65 73 74 2c 20 6e 65 78 74 43 61 73  , pTest, nextCas
177c0 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  e, SQLITE_JUMPIF
177d0 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 74  NULL);.        t
177e0 65 73 74 63 61 73 65 28 20 61 4c 69 73 74 65 6c  estcase( aListel
177f0 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f  em[i+1].pExpr->o
17800 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
17810 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
17820 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d  ( aListelem[i+1]
17830 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52  .pExpr->op==TK_R
17840 45 47 49 53 54 45 52 20 29 3b 0a 20 20 20 20 20  EGISTER );.     
17850 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
17860 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74  de(pParse, aList
17870 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c  elem[i+1].pExpr,
17880 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
17890 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
178a0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
178b0 30 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20  0, endLabel);.  
178c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
178d0 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
178e0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 1);.        sq
178f0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
17900 4c 61 62 65 6c 28 76 2c 20 6e 65 78 74 43 61 73  Label(v, nextCas
17910 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
17920 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69    if( pExpr->pRi
17930 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ght ){.        s
17940 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
17950 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
17960 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
17970 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
17980 70 72 2d 3e 70 52 69 67 68 74 2c 20 74 61 72 67  pr->pRight, targ
17990 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  et);.        sql
179a0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
179b0 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 20  (pParse, 1);.   
179c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
179d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
179e0 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
179f0 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
17a00 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
17a10 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
17a20 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  ed || pParse->nE
17a30 72 72 3e 30 20 0a 20 20 20 20 20 20 20 20 20 20  rr>0 .          
17a40 20 7c 7c 20 70 50 61 72 73 65 2d 3e 69 43 61 63   || pParse->iCac
17a50 68 65 4c 65 76 65 6c 3d 3d 69 43 61 63 68 65 4c  heLevel==iCacheL
17a60 65 76 65 6c 20 29 3b 0a 20 20 20 20 20 20 73 71  evel );.      sq
17a70 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
17a80 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65  Label(v, endLabe
17a90 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
17aa0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
17ab0 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
17ac0 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  ER.    case TK_R
17ad0 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 61 73  AISE: {.      as
17ae0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 61 66 66  sert( pExpr->aff
17af0 69 6e 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61  inity==OE_Rollba
17b00 63 6b 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ck .           |
17b10 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  | pExpr->affinit
17b20 79 3d 3d 4f 45 5f 41 62 6f 72 74 0a 20 20 20 20  y==OE_Abort.    
17b30 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
17b40 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 46 61  >affinity==OE_Fa
17b50 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  il.           ||
17b60 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
17b70 3d 3d 4f 45 5f 49 67 6e 6f 72 65 0a 20 20 20 20  ==OE_Ignore.    
17b80 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21    );.      if( !
17b90 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72  pParse->pTrigger
17ba0 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Tab ){.        s
17bb0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
17bc0 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
17bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52                "R
17be0 41 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20  AISE() may only 
17bf0 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 61  be used within a
17c00 20 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d   trigger-program
17c10 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
17c20 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
17c30 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61      if( pExpr->a
17c40 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72  ffinity==OE_Abor
17c50 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
17c60 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61  ite3MayAbort(pPa
17c70 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rse);.      }.  
17c80 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
17c90 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
17ca0 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
17cb0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45   );.      if( pE
17cc0 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
17cd0 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20  E_Ignore ){.    
17ce0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17cf0 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20 20  ddOp4(.         
17d00 20 20 20 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53     v, OP_Halt, S
17d10 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e  QLITE_OK, OE_Ign
17d20 6f 72 65 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75  ore, 0, pExpr->u
17d30 2e 7a 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20 20  .zToken,0);.    
17d40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17d50 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73   sqlite3HaltCons
17d60 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 70  traint(pParse, p
17d70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 2c 20  Expr->affinity, 
17d80 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
17d90 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   0);.      }..  
17da0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
17db0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71  .#endif.  }.  sq
17dc0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
17dd0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
17de0 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ree1);.  sqlite3
17df0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
17e00 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
17e10 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67  ;.  return inReg
17e20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
17e30 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c  ate code to eval
17e40 75 61 74 65 20 61 6e 20 65 78 70 72 65 73 73 69  uate an expressi
17e50 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  on and store the
17e60 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f   results.** into
17e70 20 61 20 72 65 67 69 73 74 65 72 2e 20 20 52 65   a register.  Re
17e80 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65  turn the registe
17e90 72 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 74  r number where t
17ea0 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 61 72  he results.** ar
17eb0 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  e stored..**.** 
17ec0 49 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20  If the register 
17ed0 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72  is a temporary r
17ee0 65 67 69 73 74 65 72 20 74 68 61 74 20 63 61 6e  egister that can
17ef0 20 62 65 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c   be deallocated,
17f00 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 69  .** then write i
17f10 74 73 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a  ts number into *
17f20 70 52 65 67 2e 20 20 49 66 20 74 68 65 20 72 65  pReg.  If the re
17f30 73 75 6c 74 20 72 65 67 69 73 74 65 72 20 69 73  sult register is
17f40 20 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d 70 6f 72   not.** a tempor
17f50 61 72 79 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  ary, then set *p
17f60 52 65 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a  Reg to zero..*/.
17f70 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
17f80 6f 64 65 54 65 6d 70 28 50 61 72 73 65 20 2a 70  odeTemp(Parse *p
17f90 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
17fa0 70 72 2c 20 69 6e 74 20 2a 70 52 65 67 29 7b 0a  pr, int *pReg){.
17fb0 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
17fc0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
17fd0 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 32 20 3d  rse);.  int r2 =
17fe0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
17ff0 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
18000 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 69 66 28  Expr, r1);.  if(
18010 20 72 32 3d 3d 72 31 20 29 7b 0a 20 20 20 20 2a   r2==r1 ){.    *
18020 70 52 65 67 20 3d 20 72 31 3b 0a 20 20 7d 65 6c  pReg = r1;.  }el
18030 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  se{.    sqlite3R
18040 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
18050 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 2a  arse, r1);.    *
18060 70 52 65 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  pReg = 0;.  }.  
18070 72 65 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a  return r2;.}../*
18080 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
18090 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c  e that will eval
180a0 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20  uate expression 
180b0 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20  pExpr and store 
180c0 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69  the.** results i
180d0 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
180e0 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73 20  t.  The results 
180f0 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74  are guaranteed t
18100 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72  o appear.** in r
18110 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a  egister target..
18120 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
18130 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70 50  prCode(Parse *pP
18140 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
18150 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
18160 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a 20 20    int inReg;..  
18170 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30  assert( target>0
18180 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72   && target<=pPar
18190 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 6e  se->nMem );.  in
181a0 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
181b0 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
181c0 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
181d0 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  t);.  assert( pP
181e0 61 72 73 65 2d 3e 70 56 64 62 65 20 7c 7c 20 70  arse->pVdbe || p
181f0 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
18200 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
18210 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20 26   inReg!=target &
18220 26 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20  & pParse->pVdbe 
18230 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
18240 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d  beAddOp2(pParse-
18250 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79  >pVdbe, OP_SCopy
18260 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29  , inReg, target)
18270 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 74  ;.  }.  return t
18280 61 72 67 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  arget;.}../*.** 
18290 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
182a0 61 74 20 65 76 61 6c 75 74 65 73 20 74 68 65 20  at evalutes the 
182b0 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
182c0 20 61 6e 64 20 70 75 74 73 20 74 68 65 20 72 65   and puts the re
182d0 73 75 6c 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73  sult.** in regis
182e0 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a  ter target..**.*
182f0 2a 20 41 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f  * Also make a co
18300 70 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  py of the expres
18310 73 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 74  sion results int
18320 6f 20 61 6e 6f 74 68 65 72 20 22 63 61 63 68 65  o another "cache
18330 22 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e  " register.** an
18340 64 20 6d 6f 64 69 66 79 20 74 68 65 20 65 78 70  d modify the exp
18350 72 65 73 73 69 6f 6e 20 73 6f 20 74 68 61 74 20  ression so that 
18360 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 69 74  the next time it
18370 20 69 73 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a   is evaluated,.*
18380 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  * the result is 
18390 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61  a copy of the ca
183a0 63 68 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a  che register..**
183b0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
183c0 20 69 73 20 75 73 65 64 20 66 6f 72 20 65 78 70   is used for exp
183d0 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72  ressions that ar
183e0 65 20 75 73 65 64 20 6d 75 6c 74 69 70 6c 65 20  e used multiple 
183f0 0a 2a 2a 20 74 69 6d 65 73 2e 20 20 54 68 65 79  .** times.  They
18400 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 6f   are evaluated o
18410 6e 63 65 20 61 6e 64 20 74 68 65 20 72 65 73 75  nce and the resu
18420 6c 74 73 20 6f 66 20 74 68 65 20 65 78 70 72 65  lts of the expre
18430 73 73 69 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75  ssion.** are reu
18440 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  sed..*/.int sqli
18450 74 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43 61  te3ExprCodeAndCa
18460 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  che(Parse *pPars
18470 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
18480 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56  int target){.  V
18490 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
184a0 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 6e  >pVdbe;.  int in
184b0 52 65 67 3b 0a 20 20 69 6e 52 65 67 20 3d 20 73  Reg;.  inReg = s
184c0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
184d0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
184e0 72 67 65 74 29 3b 0a 20 20 61 73 73 65 72 74 28  rget);.  assert(
184f0 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 2f   target>0 );.  /
18500 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
18510 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 65 72  s called for ter
18520 6d 73 20 74 6f 20 49 4e 53 45 52 54 20 6f 72 20  ms to INSERT or 
18530 55 50 44 41 54 45 2e 20 20 41 6e 64 20 74 68 65  UPDATE.  And the
18540 20 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68 65 72   only.  ** other
18550 20 70 6c 61 63 65 20 77 68 65 72 65 20 65 78 70   place where exp
18560 72 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20  ressions can be 
18570 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 54  converted into T
18580 4b 5f 52 45 47 49 53 54 45 52 20 69 73 0a 20 20  K_REGISTER is.  
18590 2a 2a 20 69 6e 20 57 48 45 52 45 20 63 6c 61 75  ** in WHERE clau
185a0 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20  se processing.  
185b0 53 6f 20 61 73 20 63 75 72 72 65 6e 74 6c 79 20  So as currently 
185c0 69 6d 70 6c 65 6d 65 6e 74 65 64 2c 20 74 68 65  implemented, the
185d0 72 65 20 69 73 0a 20 20 2a 2a 20 6e 6f 20 77 61  re is.  ** no wa
185e0 79 20 66 6f 72 20 61 20 54 4b 5f 52 45 47 49 53  y for a TK_REGIS
185f0 54 45 52 20 74 6f 20 65 78 69 73 74 20 68 65 72  TER to exist her
18600 65 2e 20 20 42 75 74 20 69 74 20 73 65 65 6d 73  e.  But it seems
18610 20 70 72 75 64 65 6e 74 20 74 6f 0a 20 20 2a 2a   prudent to.  **
18620 20 6b 65 65 70 20 74 68 65 20 41 4c 57 41 59 53   keep the ALWAYS
18630 28 29 20 69 6e 20 63 61 73 65 20 74 68 65 20 63  () in case the c
18640 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20  onditions above 
18650 63 68 61 6e 67 65 20 77 69 74 68 20 66 75 74 75  change with futu
18660 72 65 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61  re.  ** modifica
18670 74 69 6f 6e 73 20 6f 72 20 65 6e 68 61 6e 63 65  tions or enhance
18680 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 28 20  ments. */.  if( 
18690 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 6f 70  ALWAYS(pExpr->op
186a0 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 29 20 29  !=TK_REGISTER) )
186b0 7b 20 20 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d  {  .    int iMem
186c0 3b 0a 20 20 20 20 69 4d 65 6d 20 3d 20 2b 2b 70  ;.    iMem = ++p
186d0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
186e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
186f0 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 69  p2(v, OP_Copy, i
18700 6e 52 65 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20  nReg, iMem);.   
18710 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
18720 20 69 4d 65 6d 3b 0a 20 20 20 20 70 45 78 70 72   iMem;.    pExpr
18730 2d 3e 6f 70 32 20 3d 20 70 45 78 70 72 2d 3e 6f  ->op2 = pExpr->o
18740 70 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  p;.    pExpr->op
18750 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a   = TK_REGISTER;.
18760 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 6e 52    }.  return inR
18770 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  eg;.}../*.** Ret
18780 75 72 6e 20 54 52 55 45 20 69 66 20 70 45 78 70  urn TRUE if pExp
18790 72 20 69 73 20 61 6e 20 63 6f 6e 73 74 61 6e 74  r is an constant
187a0 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
187b0 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 0a   is appropriate.
187c0 2a 2a 20 66 6f 72 20 66 61 63 74 6f 72 69 6e 67  ** for factoring
187d0 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 20   out of a loop. 
187e0 20 41 70 70 72 6f 70 72 69 61 74 65 20 65 78 70   Appropriate exp
187f0 72 65 73 73 69 6f 6e 73 20 61 72 65 3a 0a 2a 2a  ressions are:.**
18800 0a 2a 2a 20 20 20 20 2a 20 20 41 6e 79 20 65 78  .**    *  Any ex
18810 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 65 76  pression that ev
18820 61 6c 75 61 74 65 73 20 74 6f 20 74 77 6f 20 6f  aluates to two o
18830 72 20 6d 6f 72 65 20 6f 70 63 6f 64 65 73 2e 0a  r more opcodes..
18840 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 41 6e 79 20  **.**    *  Any 
18850 4f 50 5f 49 6e 74 65 67 65 72 2c 20 4f 50 5f 52  OP_Integer, OP_R
18860 65 61 6c 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  eal, OP_String, 
18870 4f 50 5f 42 6c 6f 62 2c 20 4f 50 5f 4e 75 6c 6c  OP_Blob, OP_Null
18880 2c 20 0a 2a 2a 20 20 20 20 20 20 20 6f 72 20 4f  , .**       or O
18890 50 5f 56 61 72 69 61 62 6c 65 20 74 68 61 74 20  P_Variable that 
188a0 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
188b0 20 62 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20   be placed in a 
188c0 0a 2a 2a 20 20 20 20 20 20 20 73 70 65 63 69 66  .**       specif
188d0 69 63 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a  ic register..**.
188e0 2a 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 70  ** There is no p
188f0 6f 69 6e 74 20 69 6e 20 66 61 63 74 6f 72 69 6e  oint in factorin
18900 67 20 6f 75 74 20 73 69 6e 67 6c 65 2d 69 6e 73  g out single-ins
18910 74 72 75 63 74 69 6f 6e 20 63 6f 6e 73 74 61 6e  truction constan
18920 74 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73  t.** expressions
18930 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
18940 20 70 6c 61 63 65 64 20 69 6e 20 61 20 70 61 72   placed in a par
18950 74 69 63 75 6c 61 72 20 72 65 67 69 73 74 65 72  ticular register
18960 2e 20 20 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20  .  .** We could 
18970 66 61 63 74 6f 72 20 74 68 65 6d 20 6f 75 74 2c  factor them out,
18980 20 62 75 74 20 74 68 65 6e 20 77 65 20 77 6f 75   but then we wou
18990 6c 64 20 65 6e 64 20 75 70 20 61 64 64 69 6e 67  ld end up adding
189a0 20 61 6e 0a 2a 2a 20 4f 50 5f 53 43 6f 70 79 20   an.** OP_SCopy 
189b0 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 6d  instruction to m
189c0 6f 76 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e  ove the value in
189d0 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 72  to the correct r
189e0 65 67 69 73 74 65 72 0a 2a 2a 20 6c 61 74 65 72  egister.** later
189f0 2e 20 20 57 65 20 6d 69 67 68 74 20 61 73 20 77  .  We might as w
18a00 65 6c 6c 20 6a 75 73 74 20 75 73 65 20 74 68 65  ell just use the
18a10 20 6f 72 69 67 69 6e 61 6c 20 69 6e 73 74 72 75   original instru
18a20 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 61 76 6f  ction and.** avo
18a30 69 64 20 74 68 65 20 4f 50 5f 53 43 6f 70 79 2e  id the OP_SCopy.
18a40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
18a50 73 41 70 70 72 6f 70 72 69 61 74 65 46 6f 72 46  sAppropriateForF
18a60 61 63 74 6f 72 69 6e 67 28 45 78 70 72 20 2a 70  actoring(Expr *p
18a70 29 7b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  ){.  if( !sqlite
18a80 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e  3ExprIsConstantN
18a90 6f 74 4a 6f 69 6e 28 70 29 20 29 7b 0a 20 20 20  otJoin(p) ){.   
18aa0 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4f   return 0;  /* O
18ab0 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20 65 78 70  nly constant exp
18ac0 72 65 73 73 69 6f 6e 73 20 61 72 65 20 61 70 70  ressions are app
18ad0 72 6f 70 72 69 61 74 65 20 66 6f 72 20 66 61 63  ropriate for fac
18ae0 74 6f 72 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20  toring */.  }.  
18af0 69 66 28 20 28 70 2d 3e 66 6c 61 67 73 20 26 20  if( (p->flags & 
18b00 45 50 5f 46 69 78 65 64 44 65 73 74 29 3d 3d 30  EP_FixedDest)==0
18b10 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
18b20 3b 20 20 2f 2a 20 41 6e 79 20 63 6f 6e 73 74 61  ;  /* Any consta
18b30 6e 74 20 77 69 74 68 6f 75 74 20 61 20 66 69 78  nt without a fix
18b40 65 64 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69  ed destination i
18b50 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 2a 2f  s appropriate */
18b60 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d  .  }.  while( p-
18b70 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 29 20  >op==TK_UPLUS ) 
18b80 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20  p = p->pLeft;.  
18b90 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
18ba0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
18bb0 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41  OMIT_BLOB_LITERA
18bc0 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c  L.    case TK_BL
18bd0 4f 42 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 63  OB:.#endif.    c
18be0 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a  ase TK_VARIABLE:
18bf0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
18c00 45 47 45 52 3a 0a 20 20 20 20 63 61 73 65 20 54  EGER:.    case T
18c10 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73  K_FLOAT:.    cas
18c20 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20 63  e TK_NULL:.    c
18c30 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b  ase TK_STRING: {
18c40 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
18c50 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 42 4c 4f 42 20   p->op==TK_BLOB 
18c60 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
18c70 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52  e( p->op==TK_VAR
18c80 49 41 42 4c 45 20 29 3b 0a 20 20 20 20 20 20 74  IABLE );.      t
18c90 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d  estcase( p->op==
18ca0 54 4b 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20  TK_INTEGER );.  
18cb0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
18cc0 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 3b  >op==TK_FLOAT );
18cd0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
18ce0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 4e 55 4c 4c 20   p->op==TK_NULL 
18cf0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
18d00 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52  e( p->op==TK_STR
18d10 49 4e 47 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20  ING );.      /* 
18d20 53 69 6e 67 6c 65 2d 69 6e 73 74 72 75 63 74 69  Single-instructi
18d30 6f 6e 20 63 6f 6e 73 74 61 6e 74 73 20 77 69 74  on constants wit
18d40 68 20 61 20 66 69 78 65 64 20 64 65 73 74 69 6e  h a fixed destin
18d50 61 74 69 6f 6e 20 61 72 65 0a 20 20 20 20 20 20  ation are.      
18d60 2a 2a 20 62 65 74 74 65 72 20 64 6f 6e 65 20 69  ** better done i
18d70 6e 2d 6c 69 6e 65 2e 20 20 49 66 20 77 65 20 66  n-line.  If we f
18d80 61 63 74 6f 72 20 74 68 65 6d 2c 20 74 68 65 79  actor them, they
18d90 20 77 69 6c 6c 20 6a 75 73 74 20 65 6e 64 0a 20   will just end. 
18da0 20 20 20 20 20 2a 2a 20 75 70 20 67 65 6e 65 72       ** up gener
18db0 61 74 69 6e 67 20 61 6e 20 4f 50 5f 53 43 6f 70  ating an OP_SCop
18dc0 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 76 61  y to move the va
18dd0 6c 75 65 20 74 6f 20 74 68 65 20 64 65 73 74 69  lue to the desti
18de0 6e 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  nation.      ** 
18df0 72 65 67 69 73 74 65 72 2e 20 2a 2f 0a 20 20 20  register. */.   
18e00 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
18e10 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
18e20 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 69  MINUS: {.      i
18e30 66 28 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  f( p->pLeft->op=
18e40 3d 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20 70 2d 3e  =TK_FLOAT || p->
18e50 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  pLeft->op==TK_IN
18e60 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20  TEGER ){.       
18e70 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
18e80 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
18e90 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
18ea0 74 3a 20 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  t: {.      break
18eb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
18ec0 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
18ed0 20 49 66 20 70 45 78 70 72 20 69 73 20 61 20 63   If pExpr is a c
18ee0 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69  onstant expressi
18ef0 6f 6e 20 74 68 61 74 20 69 73 20 61 70 70 72 6f  on that is appro
18f00 70 72 69 61 74 65 20 66 6f 72 0a 2a 2a 20 66 61  priate for.** fa
18f10 63 74 6f 72 69 6e 67 20 6f 75 74 20 6f 66 20 61  ctoring out of a
18f20 20 6c 6f 6f 70 2c 20 74 68 65 6e 20 65 76 61 6c   loop, then eval
18f30 75 61 74 65 20 74 68 65 20 65 78 70 72 65 73 73  uate the express
18f40 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65  ion.** into a re
18f50 67 69 73 74 65 72 20 61 6e 64 20 63 6f 6e 76 65  gister and conve
18f60 72 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  rt the expressio
18f70 6e 20 69 6e 74 6f 20 61 20 54 4b 5f 52 45 47 49  n into a TK_REGI
18f80 53 54 45 52 0a 2a 2a 20 65 78 70 72 65 73 73 69  STER.** expressi
18f90 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
18fa0 74 20 65 76 61 6c 43 6f 6e 73 74 45 78 70 72 28  t evalConstExpr(
18fb0 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
18fc0 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
18fd0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
18fe0 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
18ff0 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ;.  switch( pExp
19000 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
19010 65 20 54 4b 5f 49 4e 3a 0a 20 20 20 20 63 61 73  e TK_IN:.    cas
19020 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b  e TK_REGISTER: {
19030 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
19040 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20  C_Prune;.    }. 
19050 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
19060 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ION:.    case TK
19070 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20  _AGG_FUNCTION:. 
19080 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54     case TK_CONST
19090 5f 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20 20 2f  _FUNC: {.      /
190a0 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20  * The arguments 
190b0 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 68 61  to a function ha
190c0 76 65 20 61 20 66 69 78 65 64 20 64 65 73 74 69  ve a fixed desti
190d0 6e 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a  nation..      **
190e0 20 4d 61 72 6b 20 74 68 65 6d 20 74 68 69 73 20   Mark them this 
190f0 77 61 79 20 74 6f 20 61 76 6f 69 64 20 67 65 6e  way to avoid gen
19100 65 72 61 74 65 64 20 75 6e 6e 65 65 64 65 64 20  erated unneeded 
19110 4f 50 5f 53 43 6f 70 79 0a 20 20 20 20 20 20 2a  OP_SCopy.      *
19120 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20  * instructions. 
19130 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
19140 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
19150 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
19160 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
19170 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
19180 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
19190 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69  lect) );.      i
191a0 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
191b0 20 20 20 20 69 6e 74 20 69 20 3d 20 70 4c 69 73      int i = pLis
191c0 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
191d0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
191e0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
191f0 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  pList->a;.      
19200 20 20 66 6f 72 28 3b 20 69 3e 30 3b 20 69 2d 2d    for(; i>0; i--
19210 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
19220 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
19230 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 20 29  (pItem->pExpr) )
19240 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 66   pItem->pExpr->f
19250 6c 61 67 73 20 7c 3d 20 45 50 5f 46 69 78 65 64  lags |= EP_Fixed
19260 44 65 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Dest;.        }.
19270 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
19280 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
19290 20 69 66 28 20 69 73 41 70 70 72 6f 70 72 69 61   if( isAppropria
192a0 74 65 46 6f 72 46 61 63 74 6f 72 69 6e 67 28 70  teForFactoring(p
192b0 45 78 70 72 29 20 29 7b 0a 20 20 20 20 69 6e 74  Expr) ){.    int
192c0 20 72 31 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e   r1 = ++pParse->
192d0 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e 74 20 72 32  nMem;.    int r2
192e0 3b 0a 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74  ;.    r2 = sqlit
192f0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
19300 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
19310 72 31 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56  r1);.    if( NEV
19320 45 52 28 72 31 21 3d 72 32 29 20 29 20 73 71 6c  ER(r1!=r2) ) sql
19330 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
19340 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
19350 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 20 3d      pExpr->op2 =
19360 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20   pExpr->op;.    
19370 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52  pExpr->op = TK_R
19380 45 47 49 53 54 45 52 3b 0a 20 20 20 20 70 45 78  EGISTER;.    pEx
19390 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 72 32 3b  pr->iTable = r2;
193a0 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
193b0 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 72 65 74  Prune;.  }.  ret
193c0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
193d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 65 76  ;.}../*.** Preev
193e0 61 6c 75 61 74 65 20 63 6f 6e 73 74 61 6e 74 20  aluate constant 
193f0 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77  subexpressions w
19400 69 74 68 69 6e 20 70 45 78 70 72 20 61 6e 64 20  ithin pExpr and 
19410 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73  store the.** res
19420 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72  ults in register
19430 73 2e 20 20 4d 6f 64 69 66 79 20 70 45 78 70 72  s.  Modify pExpr
19440 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 6e   so that the con
19450 73 74 61 6e 74 20 73 75 62 65 78 70 72 65 73 69  stant subexpresi
19460 6f 6e 73 0a 2a 2a 20 61 72 65 20 54 4b 5f 52 45  ons.** are TK_RE
19470 47 49 53 54 45 52 20 6f 70 63 6f 64 65 73 20 74  GISTER opcodes t
19480 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65  hat refer to the
19490 20 70 72 65 63 6f 6d 70 75 74 65 64 20 76 61 6c   precomputed val
194a0 75 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ues..*/.void sql
194b0 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 6e 73  ite3ExprCodeCons
194c0 74 61 6e 74 73 28 50 61 72 73 65 20 2a 70 50 61  tants(Parse *pPa
194d0 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
194e0 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
194f0 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
19500 20 3d 20 65 76 61 6c 43 6f 6e 73 74 45 78 70 72   = evalConstExpr
19510 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
19520 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77 2e 70  lback = 0;.  w.p
19530 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
19540 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
19550 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a  r(&w, pExpr);.}.
19560 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
19570 20 63 6f 64 65 20 74 68 61 74 20 70 75 73 68 65   code that pushe
19580 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65  s the value of e
19590 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20  very element of 
195a0 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70  the given.** exp
195b0 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 69 6e 74  ression list int
195c0 6f 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  o a sequence of 
195d0 72 65 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e  registers beginn
195e0 69 6e 67 20 61 74 20 74 61 72 67 65 74 2e 0a 2a  ing at target..*
195f0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
19600 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
19610 74 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2f  ts evaluated..*/
19620 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
19630 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20  CodeExprList(.  
19640 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
19650 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
19660 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
19670 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a  ist *pList,   /*
19680 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
19690 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64  list to be coded
196a0 20 2a 2f 0a 20 20 69 6e 74 20 74 61 72 67 65 74   */.  int target
196b0 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72  ,        /* Wher
196c0 65 20 74 6f 20 77 72 69 74 65 20 72 65 73 75 6c  e to write resul
196d0 74 73 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 48 61  ts */.  int doHa
196e0 72 64 43 6f 70 79 20 20 20 20 20 2f 2a 20 4d 61  rdCopy     /* Ma
196f0 6b 65 20 61 20 68 61 72 64 20 63 6f 70 79 20 6f  ke a hard copy o
19700 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20  f every element 
19710 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45  */.){.  struct E
19720 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
19730 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b  tem;.  int i, n;
19740 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
19750 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
19760 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 6e   target>0 );.  n
19770 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
19780 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69  .  for(pItem=pLi
19790 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b  st->a, i=0; i<n;
197a0 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
197b0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69      if( pItem->i
197c0 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 69  Alias ){.      i
197d0 6e 74 20 69 52 65 67 20 3d 20 63 6f 64 65 41 6c  nt iReg = codeAl
197e0 69 61 73 28 70 50 61 72 73 65 2c 20 70 49 74 65  ias(pParse, pIte
197f0 6d 2d 3e 69 41 6c 69 61 73 2c 20 70 49 74 65 6d  m->iAlias, pItem
19800 2d 3e 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b  ->pExpr, target+
19810 69 29 3b 0a 20 20 20 20 20 20 56 64 62 65 20 2a  i);.      Vdbe *
19820 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
19830 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
19840 20 20 69 66 28 20 69 52 65 67 21 3d 74 61 72 67    if( iReg!=targ
19850 65 74 2b 69 20 29 7b 0a 20 20 20 20 20 20 20 20  et+i ){.        
19860 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19870 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69  2(v, OP_SCopy, i
19880 52 65 67 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a  Reg, target+i);.
19890 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
198a0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
198b0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
198c0 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 74   pItem->pExpr, t
198d0 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 7d 0a  arget+i);.    }.
198e0 20 20 20 20 69 66 28 20 64 6f 48 61 72 64 43 6f      if( doHardCo
198f0 70 79 20 26 26 20 21 70 50 61 72 73 65 2d 3e 64  py && !pParse->d
19900 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
19910 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
19920 45 78 70 72 48 61 72 64 43 6f 70 79 28 70 50 61  ExprHardCopy(pPa
19930 72 73 65 2c 20 74 61 72 67 65 74 2c 20 6e 29 3b  rse, target, n);
19940 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
19950 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
19960 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
19970 72 20 61 20 42 45 54 57 45 45 4e 20 6f 70 65 72  r a BETWEEN oper
19980 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78  ator..**.**    x
19990 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a   BETWEEN y AND z
199a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65  .**.** The above
199b0 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
199c0 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79  o .**.**    x>=y
199d0 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20   AND x<=z.**.** 
199e0 43 6f 64 65 20 69 74 20 61 73 20 73 75 63 68 2c  Code it as such,
199f0 20 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f 20   taking care to 
19a00 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75  do the common su
19a10 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65  bexpression.** e
19a20 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 78  lementation of x
19a30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
19a40 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e   exprCodeBetween
19a50 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
19a60 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
19a70 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
19a80 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
19a90 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
19aa0 20 20 20 20 2f 2a 20 54 68 65 20 42 45 54 57 45      /* The BETWE
19ab0 45 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  EN expression */
19ac0 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20  .  int dest,    
19ad0 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
19ae0 65 20 69 66 20 74 68 65 20 6a 75 6d 70 20 69 73  e if the jump is
19af0 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20   taken */.  int 
19b00 6a 75 6d 70 49 66 54 72 75 65 2c 20 20 20 2f 2a  jumpIfTrue,   /*
19b10 20 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69   Take the jump i
19b20 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 73  f the BETWEEN is
19b30 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 6a   true */.  int j
19b40 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20  umpIfNull    /* 
19b50 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66  Take the jump if
19b60 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 73 20   the BETWEEN is 
19b70 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  NULL */.){.  Exp
19b80 72 20 65 78 70 72 41 6e 64 3b 20 20 20 20 20 2f  r exprAnd;     /
19b90 2a 20 54 68 65 20 41 4e 44 20 6f 70 65 72 61 74  * The AND operat
19ba0 6f 72 20 69 6e 20 20 78 3e 3d 79 20 41 4e 44 20  or in  x>=y AND 
19bb0 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78 70 72 20  x<=z  */.  Expr 
19bc0 63 6f 6d 70 4c 65 66 74 3b 20 20 20 20 2f 2a 20  compLeft;    /* 
19bd0 54 68 65 20 20 78 3e 3d 79 20 20 74 65 72 6d 20  The  x>=y  term 
19be0 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 52 69  */.  Expr compRi
19bf0 67 68 74 3b 20 20 20 2f 2a 20 54 68 65 20 20 78  ght;   /* The  x
19c00 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45  <=z  term */.  E
19c10 78 70 72 20 65 78 70 72 58 3b 20 20 20 20 20 20  xpr exprX;      
19c20 20 2f 2a 20 54 68 65 20 20 78 20 20 73 75 62 65   /* The  x  sube
19c30 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69  xpression */.  i
19c40 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
19c50 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75 73   /* Temporary us
19c60 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a 20  e register */.. 
19c70 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
19c80 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
19c90 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
19ca0 3b 0a 20 20 65 78 70 72 58 20 3d 20 2a 70 45 78  ;.  exprX = *pEx
19cb0 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 65 78 70  pr->pLeft;.  exp
19cc0 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44  rAnd.op = TK_AND
19cd0 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 4c 65 66  ;.  exprAnd.pLef
19ce0 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20  t = &compLeft;. 
19cf0 20 65 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20   exprAnd.pRight 
19d00 3d 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20  = &compRight;.  
19d10 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b  compLeft.op = TK
19d20 5f 47 45 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e  _GE;.  compLeft.
19d30 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a  pLeft = &exprX;.
19d40 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68    compLeft.pRigh
19d50 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
19d60 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
19d70 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d    compRight.op =
19d80 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52 69   TK_LE;.  compRi
19d90 67 68 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70  ght.pLeft = &exp
19da0 72 58 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e  rX;.  compRight.
19db0 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
19dc0 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  x.pList->a[1].pE
19dd0 78 70 72 3b 0a 20 20 65 78 70 72 58 2e 69 54 61  xpr;.  exprX.iTa
19de0 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ble = sqlite3Exp
19df0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
19e00 2c 20 26 65 78 70 72 58 2c 20 26 72 65 67 46 72  , &exprX, &regFr
19e10 65 65 31 29 3b 0a 20 20 65 78 70 72 58 2e 6f 70  ee1);.  exprX.op
19e20 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a   = TK_REGISTER;.
19e30 20 20 69 66 28 20 6a 75 6d 70 49 66 54 72 75 65    if( jumpIfTrue
19e40 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
19e50 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
19e60 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74  , &exprAnd, dest
19e70 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
19e80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
19e90 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
19ea0 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c  Parse, &exprAnd,
19eb0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
19ec0 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  l);.  }.  sqlite
19ed0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
19ee0 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
19ef0 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20  );..  /* Ensure 
19f00 61 64 65 71 75 61 74 65 20 74 65 73 74 20 63 6f  adequate test co
19f10 76 65 72 61 67 65 20 2a 2f 0a 20 20 74 65 73 74  verage */.  test
19f20 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65  case( jumpIfTrue
19f30 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  ==0 && jumpIfNul
19f40 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l==0 && regFree1
19f50 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==0 );.  testcas
19f60 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30  e( jumpIfTrue==0
19f70 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
19f80 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30  0 && regFree1!=0
19f90 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
19fa0 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26  jumpIfTrue==0 &&
19fb0 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26   jumpIfNull!=0 &
19fc0 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  & regFree1==0 );
19fd0 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d  .  testcase( jum
19fe0 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75  pIfTrue==0 && ju
19ff0 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72  mpIfNull!=0 && r
1a000 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20  egFree1!=0 );.  
1a010 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1a020 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49  True!=0 && jumpI
1a030 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46  fNull==0 && regF
1a040 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73  ree1==0 );.  tes
1a050 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75  tcase( jumpIfTru
1a060 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75  e!=0 && jumpIfNu
1a070 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll==0 && regFree
1a080 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1!=0 );.  testca
1a090 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d  se( jumpIfTrue!=
1a0a0 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  0 && jumpIfNull!
1a0b0 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d  =0 && regFree1==
1a0c0 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
1a0d0 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26   jumpIfTrue!=0 &
1a0e0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20  & jumpIfNull!=0 
1a0f0 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29  && regFree1!=0 )
1a100 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
1a110 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62  ate code for a b
1a120 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f  oolean expressio
1a130 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75  n such that a ju
1a140 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f  mp is made.** to
1a150 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74   the label "dest
1a160 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  " if the express
1a170 69 6f 6e 20 69 73 20 74 72 75 65 20 62 75 74 20  ion is true but 
1a180 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e  execution.** con
1a190 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20  tinues straight 
1a1a0 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72  thru if the expr
1a1b0 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e  ession is false.
1a1c0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
1a1d0 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74  pression evaluat
1a1e0 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74  es to NULL (neit
1a1f0 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c  her true nor fal
1a200 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b  se), then.** tak
1a210 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68  e the jump if th
1a220 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61  e jumpIfNull fla
1a230 67 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50  g is SQLITE_JUMP
1a240 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  IFNULL..**.** Th
1a250 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20  is code depends 
1a260 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68 61 74  on the fact that
1a270 20 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76   certain token v
1a280 61 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f 45 51  alues (ex: TK_EQ
1a290 29 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d  ).** are the sam
1a2a0 65 20 61 73 20 6f 70 63 6f 64 65 20 76 61 6c 75  e as opcode valu
1a2b0 65 73 20 28 65 78 3a 20 4f 50 5f 45 71 29 20 74  es (ex: OP_Eq) t
1a2c0 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68  hat implement th
1a2d0 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
1a2e0 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53  ** operation.  S
1a2f0 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20  pecial comments 
1a300 69 6e 20 76 64 62 65 2e 63 20 61 6e 64 20 74 68  in vdbe.c and th
1a310 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20  e mkopcodeh.awk 
1a320 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65  script in.** the
1a330 20 6d 61 6b 65 20 70 72 6f 63 65 73 73 20 63 61   make process ca
1a340 75 73 65 20 74 68 65 73 65 20 76 61 6c 75 65 73  use these values
1a350 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73 65   to align.  Asse
1a360 72 74 28 29 73 20 69 6e 20 74 68 65 20 63 6f 64  rt()s in the cod
1a370 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69 66  e.** below verif
1a380 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65  y that the numbe
1a390 72 73 20 61 72 65 20 61 6c 69 67 6e 65 64 20 63  rs are aligned c
1a3a0 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69  orrectly..*/.voi
1a3b0 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54  d sqlite3ExprIfT
1a3c0 72 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  rue(Parse *pPars
1a3d0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
1a3e0 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75  int dest, int ju
1a3f0 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62  mpIfNull){.  Vdb
1a400 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1a410 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d  Vdbe;.  int op =
1a420 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65   0;.  int regFre
1a430 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  e1 = 0;.  int re
1a440 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e  gFree2 = 0;.  in
1a450 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73  t r1, r2;..  ass
1a460 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ert( jumpIfNull=
1a470 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55  =SQLITE_JUMPIFNU
1a480 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c  LL || jumpIfNull
1a490 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56  ==0 );.  if( NEV
1a4a0 45 52 28 76 3d 3d 30 29 20 29 20 20 20 20 20 72  ER(v==0) )     r
1a4b0 65 74 75 72 6e 3b 20 20 2f 2a 20 45 78 69 73 74  eturn;  /* Exist
1a4c0 61 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68 65  ance of VDBE che
1a4d0 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a  cked by caller *
1a4e0 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 45  /.  if( NEVER(pE
1a4f0 78 70 72 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  xpr==0) ) return
1a500 3b 20 20 2f 2a 20 4e 6f 20 77 61 79 20 74 68 69  ;  /* No way thi
1a510 73 20 63 61 6e 20 68 61 70 70 65 6e 20 2a 2f 0a  s can happen */.
1a520 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70    op = pExpr->op
1a530 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
1a540 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  {.    case TK_AN
1a550 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  D: {.      int d
1a560 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  2 = sqlite3VdbeM
1a570 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
1a580 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1a590 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1a5a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1a5b0 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
1a5c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1a5d0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
1a5e0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1a5f0 20 64 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53   d2,jumpIfNull^S
1a600 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
1a610 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1a620 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
1a630 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
1a640 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1a650 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
1a660 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1a670 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20  el(v, d2);.     
1a680 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1a690 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b  ePop(pParse, 1);
1a6a0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1a6b0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1a6c0 4f 52 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  OR: {.      test
1a6d0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1a6e0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
1a6f0 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
1a700 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1a710 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
1a720 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
1a730 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
1a740 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1a750 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
1a760 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
1a770 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1a780 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a   case TK_NOT: {.
1a790 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1a7a0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1a7b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1a7c0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
1a7d0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1a7e0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1a7f0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1a800 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1a810 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LT:.    case T
1a820 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LE:.    case T
1a830 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GT:.    case T
1a840 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GE:.    case T
1a850 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_NE:.    case T
1a860 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 61 73  K_EQ: {.      as
1a870 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f  sert( TK_LT==OP_
1a880 4c 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Lt );.      asse
1a890 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65  rt( TK_LE==OP_Le
1a8a0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1a8b0 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29  ( TK_GT==OP_Gt )
1a8c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1a8d0 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a  TK_GE==OP_Ge );.
1a8e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1a8f0 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20  _EQ==OP_Eq );.  
1a900 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
1a910 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20  E==OP_Ne );.    
1a920 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1a930 54 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74  TK_LT );.      t
1a940 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1a950 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LE );.      test
1a960 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 54 20  case( op==TK_GT 
1a970 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1a980 65 28 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a  e( op==TK_GE );.
1a990 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1a9a0 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20  op==TK_EQ );.   
1a9b0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1a9c0 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20  =TK_NE );.      
1a9d0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1a9e0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1a9f0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1aa00 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1aa10 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1aa20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1aa30 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
1aa40 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1aa50 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
1aa60 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
1aa70 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
1aa80 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1aa90 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  Left, pExpr->pRi
1aaa0 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20  ght, op,.       
1aab0 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72             r1, r
1aac0 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  2, dest, jumpIfN
1aad0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ull);.      test
1aae0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1aaf0 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
1ab00 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
1ab10 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
1ab20 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1ab30 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20  TK_IS:.    case 
1ab40 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20  TK_ISNOT: {.    
1ab50 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1ab60 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74  TK_IS );.      t
1ab70 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1ab80 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72  ISNOT );.      r
1ab90 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1aba0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1abb0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
1abc0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1abd0 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
1abe0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1abf0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1ac00 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
1ac10 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49    op = (op==TK_I
1ac20 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f  S) ? TK_EQ : TK_
1ac30 4e 45 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  NE;.      codeCo
1ac40 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
1ac50 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
1ac60 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20  r->pRight, op,. 
1ac70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac80 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 53   r1, r2, dest, S
1ac90 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
1aca0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1acb0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1acc0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1acd0 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
1ace0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1acf0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
1ad00 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
1ad10 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  NOTNULL: {.     
1ad20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55   assert( TK_ISNU
1ad30 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b  LL==OP_IsNull );
1ad40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1ad50 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f  K_NOTNULL==OP_No
1ad60 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 74  tNull );.      t
1ad70 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1ad80 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
1ad90 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1ada0 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  _NOTNULL );.    
1adb0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1adc0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1add0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1ade0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1adf0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1ae00 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20  dOp2(v, op, r1, 
1ae10 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73  dest);.      tes
1ae20 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1ae30 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
1ae40 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1ae50 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
1ae60 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ae70 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1ae80 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42  .      exprCodeB
1ae90 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70  etween(pParse, p
1aea0 45 78 70 72 2c 20 64 65 73 74 2c 20 31 2c 20 6a  Expr, dest, 1, j
1aeb0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1aec0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1aed0 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
1aee0 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49  .      int destI
1aef0 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33  fFalse = sqlite3
1af00 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1af10 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74  ;.      int dest
1af20 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e  IfNull = jumpIfN
1af30 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20 64 65 73  ull ? dest : des
1af40 74 49 66 46 61 6c 73 65 3b 0a 20 20 20 20 20 20  tIfFalse;.      
1af50 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
1af60 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  N(pParse, pExpr,
1af70 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65   destIfFalse, de
1af80 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
1af90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1afa0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
1afb0 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73  , dest);.      s
1afc0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1afd0 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66  eLabel(v, destIf
1afe0 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 62 72  False);.      br
1aff0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
1b000 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
1b010 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1b020 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1b030 20 70 45 78 70 72 2c 20 26 72 65 67 46 72 65 65   pExpr, &regFree
1b040 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
1b050 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1b060 50 5f 49 66 2c 20 72 31 2c 20 64 65 73 74 2c 20  P_If, r1, dest, 
1b070 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a  jumpIfNull!=0);.
1b080 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1b090 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1b0a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
1b0b0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
1b0c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1b0d0 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
1b0e0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
1b0f0 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29  Parse, regFree1)
1b100 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
1b110 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
1b120 2c 20 72 65 67 46 72 65 65 32 29 3b 20 20 0a 7d  , regFree2);  .}
1b130 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1b140 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c   code for a bool
1b150 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73  ean expression s
1b160 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20  uch that a jump 
1b170 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68  is made.** to th
1b180 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69  e label "dest" i
1b190 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1b1a0 20 69 73 20 66 61 6c 73 65 20 62 75 74 20 65 78   is false but ex
1b1b0 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69  ecution.** conti
1b1c0 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68  nues straight th
1b1d0 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ru if the expres
1b1e0 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a  sion is true..**
1b1f0 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
1b200 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20  ssion evaluates 
1b210 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72  to NULL (neither
1b220 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29   true nor false)
1b230 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66   then.** jump if
1b240 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 53   jumpIfNull is S
1b250 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
1b260 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67 68   or fall through
1b270 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a   if jumpIfNull.*
1b280 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20  * is 0..*/.void 
1b290 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
1b2a0 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  se(Parse *pParse
1b2b0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
1b2c0 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d  nt dest, int jum
1b2d0 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65  pIfNull){.  Vdbe
1b2e0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1b2f0 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20  dbe;.  int op = 
1b300 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
1b310 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67  1 = 0;.  int reg
1b320 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74  Free2 = 0;.  int
1b330 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65   r1, r2;..  asse
1b340 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  rt( jumpIfNull==
1b350 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
1b360 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  L || jumpIfNull=
1b370 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  =0 );.  if( NEVE
1b380 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(v==0) ) return
1b390 3b 20 2f 2a 20 45 78 69 73 74 61 6e 63 65 20 6f  ; /* Existance o
1b3a0 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20 62  f VDBE checked b
1b3b0 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66  y caller */.  if
1b3c0 28 20 70 45 78 70 72 3d 3d 30 20 29 20 20 20 20  ( pExpr==0 )    
1b3d0 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68  return;..  /* Th
1b3e0 65 20 76 61 6c 75 65 20 6f 66 20 70 45 78 70 72  e value of pExpr
1b3f0 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72 65 20  ->op and op are 
1b400 72 65 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f  related as follo
1b410 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ws:.  **.  **   
1b420 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20      pExpr->op   
1b430 20 20 20 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a           op.  **
1b440 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d         ---------
1b450 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d            ------
1b460 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20  ----.  **       
1b470 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20 20  TK_ISNULL       
1b480 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20     OP_NotNull.  
1b490 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e  **       TK_NOTN
1b4a0 55 4c 4c 20 20 20 20 20 20 20 20 20 4f 50 5f 49  ULL         OP_I
1b4b0 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20  sNull.  **      
1b4c0 20 54 4b 5f 4e 45 20 20 20 20 20 20 20 20 20 20   TK_NE          
1b4d0 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20      OP_Eq.  **  
1b4e0 20 20 20 20 20 54 4b 5f 45 51 20 20 20 20 20 20       TK_EQ      
1b4f0 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20          OP_Ne.  
1b500 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 54 20 20  **       TK_GT  
1b510 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c              OP_L
1b520 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  e.  **       TK_
1b530 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  LE              
1b540 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Gt.  **      
1b550 20 54 4b 5f 47 45 20 20 20 20 20 20 20 20 20 20   TK_GE          
1b560 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20      OP_Lt.  **  
1b570 20 20 20 20 20 54 4b 5f 4c 54 20 20 20 20 20 20       TK_LT      
1b580 20 20 20 20 20 20 20 20 4f 50 5f 47 65 0a 20 20          OP_Ge.  
1b590 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65  **.  ** For othe
1b5a0 72 20 76 61 6c 75 65 73 20 6f 66 20 70 45 78 70  r values of pExp
1b5b0 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64  r->op, op is und
1b5c0 65 66 69 6e 65 64 20 61 6e 64 20 75 6e 75 73 65  efined and unuse
1b5d0 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c 75  d..  ** The valu
1b5e0 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f  e of TK_ and OP_
1b5f0 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65 20 61   constants are a
1b600 72 72 61 6e 67 65 64 20 73 75 63 68 20 74 68 61  rranged such tha
1b610 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f  t we.  ** can co
1b620 6d 70 75 74 65 20 74 68 65 20 6d 61 70 70 69 6e  mpute the mappin
1b630 67 20 61 62 6f 76 65 20 75 73 69 6e 67 20 74 68  g above using th
1b640 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72  e following expr
1b650 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73  ession..  ** Ass
1b660 65 72 74 28 29 73 20 76 65 72 69 66 79 20 74 68  ert()s verify th
1b670 61 74 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69  at the computati
1b680 6f 6e 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20  on is correct.. 
1b690 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45 78   */.  op = ((pEx
1b6a0 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c  pr->op+(TK_ISNUL
1b6b0 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e  L&1))^1)-(TK_ISN
1b6c0 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65  ULL&1);..  /* Ve
1b6d0 72 69 66 79 20 63 6f 72 72 65 63 74 20 61 6c 69  rify correct ali
1b6e0 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e  gnment of TK_ an
1b6f0 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a  d OP_ constants.
1b700 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
1b710 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e  Expr->op!=TK_ISN
1b720 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f  ULL || op==OP_No
1b730 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  tNull );.  asser
1b740 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
1b750 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d  _NOTNULL || op==
1b760 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61  OP_IsNull );.  a
1b770 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
1b780 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_NE || op==O
1b790 50 5f 45 71 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Eq );.  assert
1b7a0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
1b7b0 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20  EQ || op==OP_Ne 
1b7c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
1b7d0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c  pr->op!=TK_LT ||
1b7e0 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20   op==OP_Ge );.  
1b7f0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
1b800 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_LE || op==
1b810 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73 73 65 72  OP_Gt );.  asser
1b820 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
1b830 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65  _GT || op==OP_Le
1b840 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
1b850 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c  xpr->op!=TK_GE |
1b860 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a  | op==OP_Lt );..
1b870 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
1b880 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
1b890 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20  TK_AND: {.      
1b8a0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1b8b0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1b8c0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
1b8d0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
1b8e0 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
1b8f0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
1b900 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1b910 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
1b920 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
1b930 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1b940 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1b950 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f   }.    case TK_O
1b960 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  R: {.      int d
1b970 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  2 = sqlite3VdbeM
1b980 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
1b990 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1b9a0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1b9b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1b9c0 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
1b9d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1b9e0 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
1b9f0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1ba00 64 32 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53  d2, jumpIfNull^S
1ba10 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
1ba20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1ba30 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
1ba40 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
1ba50 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
1ba60 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
1ba70 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1ba80 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20  bel(v, d2);.    
1ba90 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1baa0 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29  hePop(pParse, 1)
1bab0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1bac0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1bad0 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65  _NOT: {.      te
1bae0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
1baf0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
1bb00 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
1bb10 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1bb20 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
1bb30 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
1bb40 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1bb50 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
1bb60 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
1bb70 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
1bb80 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
1bb90 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
1bba0 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
1bbb0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1bbc0 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20 20  p==TK_LT );.    
1bbd0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1bbe0 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 74  TK_LE );.      t
1bbf0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1bc00 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GT );.      test
1bc10 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 45 20  case( op==TK_GE 
1bc20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1bc30 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a  e( op==TK_EQ );.
1bc40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1bc50 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 20  op==TK_NE );.   
1bc60 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1bc70 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1bc80 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1bc90 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1bca0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1bcb0 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
1bcc0 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
1bcd0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1bce0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
1bcf0 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
1bd00 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
1bd10 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
1bd20 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
1bd30 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
1bd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31                r1
1bd50 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r2, dest, jump
1bd60 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 74  IfNull);.      t
1bd70 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1bd80 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
1bd90 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
1bda0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
1bdb0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1bdc0 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61  se TK_IS:.    ca
1bdd0 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20  se TK_ISNOT: {. 
1bde0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1bdf0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
1be00 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1be10 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
1be20 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  _ISNOT );.      
1be30 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1be40 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1be50 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1be60 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1be70 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
1be80 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1be90 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1bea0 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
1beb0 20 20 20 6f 70 20 3d 20 28 70 45 78 70 72 2d 3e     op = (pExpr->
1bec0 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f  op==TK_IS) ? TK_
1bed0 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a 20 20 20 20  NE : TK_EQ;.    
1bee0 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
1bef0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1bf00 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
1bf10 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  t, op,.         
1bf20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
1bf30 20 64 65 73 74 2c 20 53 51 4c 49 54 45 5f 4e 55   dest, SQLITE_NU
1bf40 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73  LLEQ);.      tes
1bf50 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1bf60 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1bf70 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
1bf80 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1bf90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1bfa0 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
1bfb0 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
1bfc0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1bfd0 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  e( op==TK_ISNULL
1bfe0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1bff0 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  se( op==TK_NOTNU
1c000 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  LL );.      r1 =
1c010 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1c020 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1c030 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
1c040 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  ree1);.      sql
1c050 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1c060 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b  , op, r1, dest);
1c070 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1c080 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1c090 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c0a0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
1c0b0 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
1c0c0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1c0d0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1c0e0 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e   exprCodeBetween
1c0f0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1c100 64 65 73 74 2c 20 30 2c 20 6a 75 6d 70 49 66 4e  dest, 0, jumpIfN
1c110 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
1c120 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1c130 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
1c140 20 69 66 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   if( jumpIfNull 
1c150 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1c160 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61  e3ExprCodeIN(pPa
1c170 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
1c180 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d  , dest);.      }
1c190 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
1c1a0 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73  t destIfNull = s
1c1b0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1c1c0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
1c1d0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
1c1e0 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  N(pParse, pExpr,
1c1f0 20 64 65 73 74 2c 20 64 65 73 74 49 66 4e 75 6c   dest, destIfNul
1c200 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
1c210 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1c220 62 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c  bel(v, destIfNul
1c230 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
1c240 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1c250 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
1c260 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1c270 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1c280 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67  rse, pExpr, &reg
1c290 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71  Free1);.      sq
1c2a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1c2b0 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 31 2c  v, OP_IfNot, r1,
1c2c0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1c2d0 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 74 65 73  l!=0);.      tes
1c2e0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1c2f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1c300 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1c310 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
1c320 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
1c330 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1c340 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
1c350 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74  gFree1);.  sqlit
1c360 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1c370 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
1c380 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  2);.}../*.** Do 
1c390 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f  a deep compariso
1c3a0 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73  n of two express
1c3b0 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75  ion trees.  Retu
1c3c0 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72  rn TRUE (non-zer
1c3d0 6f 29 0a 2a 2a 20 69 66 20 74 68 65 79 20 61 72  o).** if they ar
1c3e0 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20  e identical and 
1c3f0 72 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  return FALSE if 
1c400 74 68 65 79 20 64 69 66 66 65 72 20 69 6e 20 61  they differ in a
1c410 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f  ny way..**.** So
1c420 6d 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75  metimes this rou
1c430 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
1c440 20 46 41 4c 53 45 20 65 76 65 6e 20 69 66 20 74   FALSE even if t
1c450 68 65 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  he two expressio
1c460 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65  ns.** really are
1c470 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 49 66   equivalent.  If
1c480 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65   we cannot prove
1c490 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73   that the expres
1c4a0 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65  sions are.** ide
1c4b0 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74 75 72  ntical, we retur
1c4c0 6e 20 46 41 4c 53 45 20 6a 75 73 74 20 74 6f 20  n FALSE just to 
1c4d0 62 65 20 73 61 66 65 2e 20 20 53 6f 20 69 66 20  be safe.  So if 
1c4e0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
1c4f0 72 65 74 75 72 6e 73 20 66 61 6c 73 65 2c 20 74  returns false, t
1c500 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f 74 20 72  hen you do not r
1c510 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72 20 63  eally know for c
1c520 65 72 74 61 69 6e 20 69 66 20 74 68 65 20 74 77  ertain if the tw
1c530 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73  o.** expressions
1c540 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20   are the same.  
1c550 42 75 74 20 69 66 20 79 6f 75 20 67 65 74 20 61  But if you get a
1c560 20 54 52 55 45 20 72 65 74 75 72 6e 2c 20 74 68   TRUE return, th
1c570 65 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20 62 65  en you.** can be
1c580 20 73 75 72 65 20 74 68 65 20 65 78 70 72 65 73   sure the expres
1c590 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61  sions are the sa
1c5a0 6d 65 2e 20 20 49 6e 20 74 68 65 20 70 6c 61 63  me.  In the plac
1c5b0 65 73 20 77 68 65 72 65 0a 2a 2a 20 74 68 69 73  es where.** this
1c5c0 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
1c5d0 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 68 75  , it does not hu
1c5e0 72 74 20 74 6f 20 67 65 74 20 61 6e 20 65 78 74  rt to get an ext
1c5f0 72 61 20 46 41 4c 53 45 20 2d 20 74 68 61 74 0a  ra FALSE - that.
1c600 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20 72 65  ** just might re
1c610 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73 6c 69  sult in some sli
1c620 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63 6f 64  ghtly slower cod
1c630 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e 69 6e  e.  But returnin
1c640 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72 65 63  g.** an incorrec
1c650 74 20 54 52 55 45 20 63 6f 75 6c 64 20 6c 65 61  t TRUE could lea
1c660 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e 63 74 69  d to a malfuncti
1c670 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
1c680 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 45 78  e3ExprCompare(Ex
1c690 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42  pr *pA, Expr *pB
1c6a0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
1c6b0 28 20 70 41 3d 3d 30 7c 7c 70 42 3d 3d 30 20 29  ( pA==0||pB==0 )
1c6c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d  {.    return pB=
1c6d0 3d 70 41 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  =pA;.  }.  asser
1c6e0 74 28 20 21 45 78 70 72 48 61 73 41 6e 79 50 72  t( !ExprHasAnyPr
1c6f0 6f 70 65 72 74 79 28 70 41 2c 20 45 50 5f 54 6f  operty(pA, EP_To
1c700 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
1c710 65 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ed) );.  assert(
1c720 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70   !ExprHasAnyProp
1c730 65 72 74 79 28 70 42 2c 20 45 50 5f 54 6f 6b 65  erty(pB, EP_Toke
1c740 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
1c750 29 20 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48  ) );.  if( ExprH
1c760 61 73 50 72 6f 70 65 72 74 79 28 70 41 2c 20 45  asProperty(pA, E
1c770 50 5f 78 49 73 53 65 6c 65 63 74 29 20 7c 7c 20  P_xIsSelect) || 
1c780 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1c790 70 42 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pB, EP_xIsSelect
1c7a0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1c7b0 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 41  0;.  }.  if( (pA
1c7c0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73  ->flags & EP_Dis
1c7d0 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61  tinct)!=(pB->fla
1c7e0 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74  gs & EP_Distinct
1c7f0 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
1c800 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e  if( pA->op!=pB->
1c810 6f 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  op ) return 0;. 
1c820 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
1c830 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65  rCompare(pA->pLe
1c840 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 29 20 29  ft, pB->pLeft) )
1c850 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
1c860 20 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d   !sqlite3ExprCom
1c870 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68 74 2c  pare(pA->pRight,
1c880 20 70 42 2d 3e 70 52 69 67 68 74 29 20 29 20 72   pB->pRight) ) r
1c890 65 74 75 72 6e 20 30 3b 0a 0a 20 20 69 66 28 20  eturn 0;..  if( 
1c8a0 70 41 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 70  pA->x.pList && p
1c8b0 42 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20  B->x.pList ){.  
1c8c0 20 20 69 66 28 20 70 41 2d 3e 78 2e 70 4c 69 73    if( pA->x.pLis
1c8d0 74 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 78 2e  t->nExpr!=pB->x.
1c8e0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 20 72  pList->nExpr ) r
1c8f0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f 72  eturn 0;.    for
1c900 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 78 2e 70 4c  (i=0; i<pA->x.pL
1c910 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
1c920 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
1c930 78 70 72 41 20 3d 20 70 41 2d 3e 78 2e 70 4c 69  xprA = pA->x.pLi
1c940 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
1c950 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
1c960 72 42 20 3d 20 70 42 2d 3e 78 2e 70 4c 69 73 74  rB = pB->x.pList
1c970 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
1c980 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
1c990 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 78 70  ExprCompare(pExp
1c9a0 72 41 2c 20 70 45 78 70 72 42 29 20 29 20 72 65  rA, pExprB) ) re
1c9b0 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
1c9c0 7d 65 6c 73 65 20 69 66 28 20 70 41 2d 3e 78 2e  }else if( pA->x.
1c9d0 70 4c 69 73 74 20 7c 7c 20 70 42 2d 3e 78 2e 70  pList || pB->x.p
1c9e0 4c 69 73 74 20 29 7b 0a 20 20 20 20 72 65 74 75  List ){.    retu
1c9f0 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  rn 0;.  }..  if(
1ca00 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d   pA->iTable!=pB-
1ca10 3e 69 54 61 62 6c 65 20 7c 7c 20 70 41 2d 3e 69  >iTable || pA->i
1ca20 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c  Column!=pB->iCol
1ca30 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  umn ) return 0;.
1ca40 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
1ca50 70 65 72 74 79 28 70 41 2c 20 45 50 5f 49 6e 74  perty(pA, EP_Int
1ca60 56 61 6c 75 65 29 20 29 7b 0a 20 20 20 20 69 66  Value) ){.    if
1ca70 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1ca80 74 79 28 70 42 2c 20 45 50 5f 49 6e 74 56 61 6c  ty(pB, EP_IntVal
1ca90 75 65 29 20 7c 7c 20 70 41 2d 3e 75 2e 69 56 61  ue) || pA->u.iVa
1caa0 6c 75 65 21 3d 70 42 2d 3e 75 2e 69 56 61 6c 75  lue!=pB->u.iValu
1cab0 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
1cac0 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  n 0;.    }.  }el
1cad0 73 65 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54  se if( pA->op!=T
1cae0 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e  K_COLUMN && pA->
1caf0 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  u.zToken ){.    
1cb00 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
1cb10 72 74 79 28 70 42 2c 20 45 50 5f 49 6e 74 56 61  rty(pB, EP_IntVa
1cb20 6c 75 65 29 20 7c 7c 20 4e 45 56 45 52 28 70 42  lue) || NEVER(pB
1cb30 2d 3e 75 2e 7a 54 6f 6b 65 6e 3d 3d 30 29 20 29  ->u.zToken==0) )
1cb40 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69   return 0;.    i
1cb50 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
1cb60 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70  p(pA->u.zToken,p
1cb70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20  B->u.zToken)!=0 
1cb80 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1cb90 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
1cba0 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn 1;.}.../*.
1cbb0 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65  ** Add a new ele
1cbc0 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67  ment to the pAgg
1cbd0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72  Info->aCol[] arr
1cbe0 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ay.  Return the 
1cbf0 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20  index of.** the 
1cc00 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65  new element.  Re
1cc10 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20  turn a negative 
1cc20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63  number if malloc
1cc30 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
1cc40 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f  c int addAggInfo
1cc50 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20 2a  Column(sqlite3 *
1cc60 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e  db, AggInfo *pIn
1cc70 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  fo){.  int i;.  
1cc80 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71  pInfo->aCol = sq
1cc90 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
1cca0 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 0a 20  te(.       db,. 
1ccb0 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f        pInfo->aCo
1ccc0 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66  l,.       sizeof
1ccd0 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29  (pInfo->aCol[0])
1cce0 2c 0a 20 20 20 20 20 20 20 33 2c 0a 20 20 20 20  ,.       3,.    
1ccf0 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75     &pInfo->nColu
1cd00 6d 6e 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66  mn,.       &pInf
1cd10 6f 2d 3e 6e 43 6f 6c 75 6d 6e 41 6c 6c 6f 63 2c  o->nColumnAlloc,
1cd20 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a  .       &i.  );.
1cd30 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20    return i;.}   
1cd40 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e   ../*.** Add a n
1cd50 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
1cd60 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  e pAggInfo->aFun
1cd70 63 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75  c[] array.  Retu
1cd80 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a  rn the index of.
1cd90 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65  ** the new eleme
1cda0 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65  nt.  Return a ne
1cdb0 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66  gative number if
1cdc0 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a   malloc fails..*
1cdd0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64  /.static int add
1cde0 41 67 67 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69  AggInfoFunc(sqli
1cdf0 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f  te3 *db, AggInfo
1ce00 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20   *pInfo){.  int 
1ce10 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e  i;.  pInfo->aFun
1ce20 63 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79  c = sqlite3Array
1ce30 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20  Allocate(.      
1ce40 20 64 62 2c 20 0a 20 20 20 20 20 20 20 70 49 6e   db, .       pIn
1ce50 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20  fo->aFunc,.     
1ce60 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e    sizeof(pInfo->
1ce70 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20  aFunc[0]),.     
1ce80 20 20 33 2c 0a 20 20 20 20 20 20 20 26 70 49 6e    3,.       &pIn
1ce90 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20 20  fo->nFunc,.     
1cea0 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 41    &pInfo->nFuncA
1ceb0 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 20 26 69 0a  lloc,.       &i.
1cec0 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b    );.  return i;
1ced0 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68  .}    ../*.** Th
1cee0 69 73 20 69 73 20 74 68 65 20 78 45 78 70 72 43  is is the xExprC
1cef0 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 20 74 72  allback for a tr
1cf00 65 65 20 77 61 6c 6b 65 72 2e 20 20 49 74 20 69  ee walker.  It i
1cf10 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20 69 6d 70  s used to.** imp
1cf20 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 45 78  lement sqlite3Ex
1cf30 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
1cf40 74 65 73 28 29 2e 20 20 53 65 65 20 73 71 6c 69  tes().  See sqli
1cf50 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
1cf60 67 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20  gregates.** for 
1cf70 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
1cf80 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  mation..*/.stati
1cf90 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67  c int analyzeAgg
1cfa0 72 65 67 61 74 65 28 57 61 6c 6b 65 72 20 2a 70  regate(Walker *p
1cfb0 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
1cfc0 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  xpr){.  int i;. 
1cfd0 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
1cfe0 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  C = pWalker->u.p
1cff0 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  NC;.  Parse *pPa
1d000 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
1d010 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  e;.  SrcList *pS
1d020 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53  rcList = pNC->pS
1d030 72 63 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e 66  rcList;.  AggInf
1d040 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e  o *pAggInfo = pN
1d050 43 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 0a 20 20  C->pAggInfo;..  
1d060 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
1d070 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
1d080 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  _AGG_COLUMN:.   
1d090 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
1d0a0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1d0b0 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
1d0c0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  _AGG_COLUMN );. 
1d0d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1d0e0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
1d0f0 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20  UMN );.      /* 
1d100 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
1d110 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e  the column is in
1d120 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c   one of the tabl
1d130 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20  es in the FROM. 
1d140 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f       ** clause o
1d150 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
1d160 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69  query */.      i
1d170 66 28 20 41 4c 57 41 59 53 28 70 53 72 63 4c 69  f( ALWAYS(pSrcLi
1d180 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  st!=0) ){.      
1d190 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1d1a0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70  _item *pItem = p
1d1b0 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20  SrcList->a;.    
1d1c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
1d1d0 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  SrcList->nSrc; i
1d1e0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
1d1f0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
1d200 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
1d210 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
1d220 72 74 28 20 21 45 78 70 72 48 61 73 41 6e 79 50  rt( !ExprHasAnyP
1d230 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1d240 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
1d250 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20  educed) );.     
1d260 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
1d270 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69  iTable==pItem->i
1d280 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
1d290 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72        /* If we r
1d2a0 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
1d2b0 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 70   it means that p
1d2c0 45 78 70 72 20 72 65 66 65 72 73 20 74 6f 20 61  Expr refers to a
1d2d0 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20   table.         
1d2e0 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 69 6e     ** that is in
1d2f0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1d300 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74   of the aggregat
1d310 65 20 71 75 65 72 79 2e 20 20 0a 20 20 20 20 20  e query.  .     
1d320 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
1d330 20 20 20 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e        ** Make an
1d340 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 63   entry for the c
1d350 6f 6c 75 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66  olumn in pAggInf
1d360 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65  o->aCol[] if the
1d370 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  re.            *
1d380 2a 20 69 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72  * is not an entr
1d390 79 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e  y there already.
1d3a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
1d3b0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
1d3c0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  k;.            p
1d3d0 43 6f 6c 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  Col = pAggInfo->
1d3e0 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  aCol;.          
1d3f0 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41 67    for(k=0; k<pAg
1d400 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  gInfo->nColumn; 
1d410 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  k++, pCol++){.  
1d420 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1d430 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70 45  pCol->iTable==pE
1d440 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20  xpr->iTable &&. 
1d450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d460 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d   pCol->iColumn==
1d470 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29  pExpr->iColumn )
1d480 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1d490 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1d4a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1d4b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1d4c0 20 20 20 69 66 28 20 28 6b 3e 3d 70 41 67 67 49     if( (k>=pAggI
1d4d0 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20  nfo->nColumn).  
1d4e0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6b             && (k
1d4f0 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c   = addAggInfoCol
1d500 75 6d 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  umn(pParse->db, 
1d510 70 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20 0a 20  pAggInfo))>=0 . 
1d520 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20             ){.  
1d530 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
1d540 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43   = &pAggInfo->aC
1d550 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20  ol[k];.         
1d560 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 20       pCol->pTab 
1d570 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20  = pExpr->pTab;. 
1d580 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
1d590 6c 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 78 70  l->iTable = pExp
1d5a0 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  r->iTable;.     
1d5b0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
1d5c0 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e  Column = pExpr->
1d5d0 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  iColumn;.       
1d5e0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65         pCol->iMe
1d5f0 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  m = ++pParse->nM
1d600 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  em;.            
1d610 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
1d620 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  olumn = -1;.    
1d630 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
1d640 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
1d650 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
1d660 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75   pAggInfo->pGrou
1d670 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBy ){.         
1d680 20 20 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b         int j, n;
1d690 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d6a0 20 45 78 70 72 4c 69 73 74 20 2a 70 47 42 20 3d   ExprList *pGB =
1d6b0 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75   pAggInfo->pGrou
1d6c0 70 42 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pBy;.           
1d6d0 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
1d6e0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d  List_item *pTerm
1d6f0 20 3d 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20   = pGB->a;.     
1d700 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70             n = p
1d710 47 42 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  GB->nExpr;.     
1d720 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a             for(j
1d730 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54  =0; j<n; j++, pT
1d740 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
1d750 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
1d760 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pE = pTerm->pExp
1d770 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
1d780 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d       if( pE->op=
1d790 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45  =TK_COLUMN && pE
1d7a0 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d  ->iTable==pExpr-
1d7b0 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20  >iTable &&.     
1d7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7d0 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45   pE->iColumn==pE
1d7e0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a  xpr->iColumn ){.
1d7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d800 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65      pCol->iSorte
1d810 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20  rColumn = j;.   
1d820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d830 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1d840 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1d850 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1d860 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1d870 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1d880 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
1d890 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  umn<0 ){.       
1d8a0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
1d8b0 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70  SorterColumn = p
1d8c0 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e  AggInfo->nSortin
1d8d0 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20  gColumn++;.     
1d8e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1d8f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1d900 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73       /* There is
1d910 20 6e 6f 77 20 61 6e 20 65 6e 74 72 79 20 66 6f   now an entry fo
1d920 72 20 70 45 78 70 72 20 69 6e 20 70 41 67 67 49  r pExpr in pAggI
1d930 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74  nfo->aCol[] (eit
1d940 68 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20  her.            
1d950 2a 2a 20 62 65 63 61 75 73 65 20 69 74 20 77 61  ** because it wa
1d960 73 20 74 68 65 72 65 20 62 65 66 6f 72 65 20 6f  s there before o
1d970 72 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73  r because we jus
1d980 74 20 63 72 65 61 74 65 64 20 69 74 29 2e 0a 20  t created it).. 
1d990 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 43 6f             ** Co
1d9a0 6e 76 65 72 74 20 74 68 65 20 70 45 78 70 72 20  nvert the pExpr 
1d9b0 74 6f 20 62 65 20 61 20 54 4b 5f 41 47 47 5f 43  to be a TK_AGG_C
1d9c0 4f 4c 55 4d 4e 20 72 65 66 65 72 72 69 6e 67 20  OLUMN referring 
1d9d0 74 6f 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  to that.        
1d9e0 20 20 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d      ** pAggInfo-
1d9f0 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20  >aCol[] entry.. 
1da00 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
1da10 20 20 20 20 20 20 20 20 20 20 45 78 70 72 53 65            ExprSe
1da20 74 49 72 72 65 64 75 63 69 62 6c 65 28 70 45 78  tIrreducible(pEx
1da30 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pr);.           
1da40 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
1da50 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20   = pAggInfo;.   
1da60 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
1da70 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  op = TK_AGG_COLU
1da80 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  MN;.            
1da90 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69  pExpr->iAgg = (i
1daa0 31 36 29 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  16)k;.          
1dab0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1dac0 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45     } /* endif pE
1dad0 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74  xpr->iTable==pIt
1dae0 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20  em->iCursor */. 
1daf0 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20         } /* end 
1db00 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63 4c 69  loop over pSrcLi
1db10 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  st */.      }.  
1db20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
1db30 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rune;.    }.    
1db40 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
1db50 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  TION: {.      /*
1db60 20 54 68 65 20 70 4e 43 2d 3e 6e 44 65 70 74 68   The pNC->nDepth
1db70 3d 3d 30 20 74 65 73 74 20 63 61 75 73 65 73 20  ==0 test causes 
1db80 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
1db90 6f 6e 73 20 69 6e 20 73 75 62 71 75 65 72 69 65  ons in subquerie
1dba0 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65  s.      ** to be
1dbb0 20 69 67 6e 6f 72 65 64 20 2a 2f 0a 20 20 20 20   ignored */.    
1dbc0 20 20 69 66 28 20 70 4e 43 2d 3e 6e 44 65 70 74    if( pNC->nDept
1dbd0 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  h==0 ){.        
1dbe0 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
1dbf0 69 66 20 70 45 78 70 72 20 69 73 20 61 20 64 75  if pExpr is a du
1dc00 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68  plicate of anoth
1dc10 65 72 20 61 67 67 72 65 67 61 74 65 20 0a 20 20  er aggregate .  
1dc20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
1dc30 6e 20 74 68 61 74 20 69 73 20 61 6c 72 65 61 64  n that is alread
1dc40 79 20 69 6e 20 74 68 65 20 70 41 67 67 49 6e 66  y in the pAggInf
1dc50 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 20 20  o structure.    
1dc60 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73      */.        s
1dc70 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
1dc80 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70 41 67 67  nc *pItem = pAgg
1dc90 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20  Info->aFunc;.   
1dca0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
1dcb0 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
1dcc0 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
1dcd0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
1dce0 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
1dcf0 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70  (pItem->pExpr, p
1dd00 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
1dd10 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1dd20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1dd30 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e  }.        if( i>
1dd40 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  =pAggInfo->nFunc
1dd50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
1dd60 20 70 45 78 70 72 20 69 73 20 6f 72 69 67 69 6e   pExpr is origin
1dd70 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77 20  al.  Make a new 
1dd80 65 6e 74 72 79 20 69 6e 20 70 41 67 67 49 6e 66  entry in pAggInf
1dd90 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20  o->aFunc[].     
1dda0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1ddb0 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 70    u8 enc = ENC(p
1ddc0 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20  Parse->db);.    
1ddd0 20 20 20 20 20 20 69 20 3d 20 61 64 64 41 67 67        i = addAgg
1dde0 49 6e 66 6f 46 75 6e 63 28 70 50 61 72 73 65 2d  InfoFunc(pParse-
1ddf0 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 3b 0a  >db, pAggInfo);.
1de00 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
1de10 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1de20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1de30 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1de40 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1de50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
1de60 49 74 65 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f  Item = &pAggInfo
1de70 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20  ->aFunc[i];.    
1de80 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70          pItem->p
1de90 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
1dea0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
1deb0 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65  >iMem = ++pParse
1dec0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->nMem;.        
1ded0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1dee0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1def0 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
1df00 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
1df10 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73  pItem->pFunc = s
1df20 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
1df30 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20  on(pParse->db,. 
1df40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df50 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65    pExpr->u.zToke
1df60 6e 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  n, sqlite3Strlen
1df70 33 30 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  30(pExpr->u.zTok
1df80 65 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  en),.           
1df90 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 78          pExpr->x
1dfa0 2e 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e  .pList ? pExpr->
1dfb0 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  x.pList->nExpr :
1dfc0 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20   0, enc, 0);.   
1dfd0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
1dfe0 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44  pr->flags & EP_D
1dff0 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20  istinct ){.     
1e000 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
1e010 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72  iDistinct = pPar
1e020 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
1e030 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1e040 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
1e050 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20  em->iDistinct = 
1e060 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -1;.            
1e070 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
1e080 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e090 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72 20 70 6f  /* Make pExpr po
1e0a0 69 6e 74 20 74 6f 20 74 68 65 20 61 70 70 72 6f  int to the appro
1e0b0 70 72 69 61 74 65 20 70 41 67 67 49 6e 66 6f 2d  priate pAggInfo-
1e0c0 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20  >aFunc[] entry. 
1e0d0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1e0e0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1e0f0 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45  asAnyProperty(pE
1e100 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  xpr, EP_TokenOnl
1e110 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  y|EP_Reduced) );
1e120 0a 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74  .        ExprSet
1e130 49 72 72 65 64 75 63 69 62 6c 65 28 70 45 78 70  Irreducible(pExp
1e140 72 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70  r);.        pExp
1e150 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29 69  r->iAgg = (i16)i
1e160 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
1e170 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67  >pAggInfo = pAgg
1e180 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 72 65  Info;.        re
1e190 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
1e1a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1e1b0 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
1e1c0 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69  ontinue;.}.stati
1e1d0 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67  c int analyzeAgg
1e1e0 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 28  regatesInSelect(
1e1f0 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
1e200 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
1e210 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  ){.  NameContext
1e220 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d   *pNC = pWalker-
1e230 3e 75 2e 70 4e 43 3b 0a 20 20 69 66 28 20 70 4e  >u.pNC;.  if( pN
1e240 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 29 7b 0a  C->nDepth==0 ){.
1e250 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2b      pNC->nDepth+
1e260 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61  +;.    sqlite3Wa
1e270 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
1e280 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  , pSelect);.    
1e290 70 4e 43 2d 3e 6e 44 65 70 74 68 2d 2d 3b 0a 20  pNC->nDepth--;. 
1e2a0 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
1e2b0 75 6e 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  une;.  }else{.  
1e2c0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
1e2d0 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  tinue;.  }.}../*
1e2e0 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20  .** Analyze the 
1e2f0 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
1e300 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67   looking for agg
1e310 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
1e320 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69   and.** for vari
1e330 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20  ables that need 
1e340 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  to be added to t
1e350 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b  he pParse->aAgg[
1e360 5d 20 61 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b 65  ] array..** Make
1e370 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72   additional entr
1e380 69 65 73 20 74 6f 20 74 68 65 20 70 50 61 72 73  ies to the pPars
1e390 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 20  e->aAgg[] array 
1e3a0 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  as necessary..**
1e3b0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1e3c0 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
1e3d0 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65  called after the
1e3e0 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
1e3f0 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64  been.** analyzed
1e400 20 62 79 20 73 71 6c 69 74 65 33 52 65 73 6f 6c   by sqlite3Resol
1e410 76 65 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a  veExprNames()..*
1e420 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1e430 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
1e440 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20  tes(NameContext 
1e450 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70  *pNC, Expr *pExp
1e460 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  r){.  Walker w;.
1e470 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
1e480 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  k = analyzeAggre
1e490 67 61 74 65 3b 0a 20 20 77 2e 78 53 65 6c 65 63  gate;.  w.xSelec
1e4a0 74 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c  tCallback = anal
1e4b0 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53  yzeAggregatesInS
1e4c0 65 6c 65 63 74 3b 0a 20 20 77 2e 75 2e 70 4e 43  elect;.  w.u.pNC
1e4d0 20 3d 20 70 4e 43 3b 0a 20 20 61 73 73 65 72 74   = pNC;.  assert
1e4e0 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21  ( pNC->pSrcList!
1e4f0 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 57  =0 );.  sqlite3W
1e500 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70  alkExpr(&w, pExp
1e510 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c  r);.}../*.** Cal
1e520 6c 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  l sqlite3ExprAna
1e530 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29  lyzeAggregates()
1e540 20 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65   for every expre
1e550 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65  ssion in an.** e
1e560 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20  xpression list. 
1e570 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
1e580 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a  er of errors..**
1e590 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
1e5a0 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e  is found, the an
1e5b0 61 6c 79 73 69 73 20 69 73 20 63 75 74 20 73 68  alysis is cut sh
1e5c0 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ort..*/.void sql
1e5d0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
1e5e0 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65  ggList(NameConte
1e5f0 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73  xt *pNC, ExprLis
1e600 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74 72  t *pList){.  str
1e610 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
1e620 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
1e630 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  i;.  if( pList )
1e640 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d  {.    for(pItem=
1e650 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
1e660 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
1e670 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
1e680 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
1e690 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
1e6a0 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78  (pNC, pItem->pEx
1e6b0 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  pr);.    }.  }.}
1e6c0 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
1e6d0 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 72 65   a single new re
1e6e0 67 69 73 74 65 72 20 66 6f 72 20 75 73 65 20 74  gister for use t
1e6f0 6f 20 68 6f 6c 64 20 73 6f 6d 65 20 69 6e 74 65  o hold some inte
1e700 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 2e  rmediate result.
1e710 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47  .*/.int sqlite3G
1e720 65 74 54 65 6d 70 52 65 67 28 50 61 72 73 65 20  etTempReg(Parse 
1e730 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20  *pParse){.  if( 
1e740 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
1e750 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
1e760 6e 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  n ++pParse->nMem
1e770 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
1e780 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
1e790 2d 2d 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  --pParse->nTempR
1e7a0 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  eg];.}../*.** De
1e7b0 61 6c 6c 6f 63 61 74 65 20 61 20 72 65 67 69 73  allocate a regis
1e7c0 74 65 72 2c 20 6d 61 6b 69 6e 67 20 61 76 61 69  ter, making avai
1e7d0 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 20  lable for reuse 
1e7e0 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a  for some other.*
1e7f0 2a 20 70 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a  * purpose..**.**
1e800 20 49 66 20 61 20 72 65 67 69 73 74 65 72 20 69   If a register i
1e810 73 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  s currently bein
1e820 67 20 75 73 65 64 20 62 79 20 74 68 65 20 63 6f  g used by the co
1e830 6c 75 6d 6e 20 63 61 63 68 65 2c 20 74 68 65 6e  lumn cache, then
1e840 0a 2a 2a 20 74 68 65 20 64 61 6c 6c 6f 63 61 74  .** the dallocat
1e850 69 6f 6e 20 69 73 20 64 65 66 65 72 72 65 64 20  ion is deferred 
1e860 75 6e 74 69 6c 20 74 68 65 20 63 6f 6c 75 6d 6e  until the column
1e870 20 63 61 63 68 65 20 6c 69 6e 65 20 74 68 61 74   cache line that
1e880 20 75 73 65 73 0a 2a 2a 20 74 68 65 20 72 65 67   uses.** the reg
1e890 69 73 74 65 72 20 62 65 63 6f 6d 65 73 20 73 74  ister becomes st
1e8a0 61 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ale..*/.void sql
1e8b0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1e8c0 65 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eg(Parse *pParse
1e8d0 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69  , int iReg){.  i
1e8e0 66 28 20 69 52 65 67 20 26 26 20 70 50 61 72 73  f( iReg && pPars
1e8f0 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61  e->nTempReg<Arra
1e900 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54  ySize(pParse->aT
1e910 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20 69  empReg) ){.    i
1e920 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74  nt i;.    struct
1e930 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20   yColCache *p;. 
1e940 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50     for(i=0, p=pP
1e950 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
1e960 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
1e970 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
1e980 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 52  .      if( p->iR
1e990 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20  eg==iReg ){.    
1e9a0 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d      p->tempReg =
1e9b0 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   1;.        retu
1e9c0 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
1e9d0 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54  }.    pParse->aT
1e9e0 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e  empReg[pParse->n
1e9f0 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65  TempReg++] = iRe
1ea00 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  g;.  }.}../*.** 
1ea10 41 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c  Allocate or deal
1ea20 6c 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f  locate a block o
1ea30 66 20 6e 52 65 67 20 63 6f 6e 73 65 63 75 74 69  f nReg consecuti
1ea40 76 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2f 0a  ve registers.*/.
1ea50 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65  int sqlite3GetTe
1ea60 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70  mpRange(Parse *p
1ea70 50 61 72 73 65 2c 20 69 6e 74 20 6e 52 65 67 29  Parse, int nReg)
1ea80 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20  {.  int i, n;.  
1ea90 69 20 3d 20 70 50 61 72 73 65 2d 3e 69 52 61 6e  i = pParse->iRan
1eaa0 67 65 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50 61  geReg;.  n = pPa
1eab0 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b 0a  rse->nRangeReg;.
1eac0 20 20 69 66 28 20 6e 52 65 67 3c 3d 6e 20 26 26    if( nReg<=n &&
1ead0 20 21 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61   !usedAsColumnCa
1eae0 63 68 65 28 70 50 61 72 73 65 2c 20 69 2c 20 69  che(pParse, i, i
1eaf0 2b 6e 2d 31 29 20 29 7b 0a 20 20 20 20 70 50 61  +n-1) ){.    pPa
1eb00 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 2b  rse->iRangeReg +
1eb10 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72  = nReg;.    pPar
1eb20 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 2d 3d  se->nRangeReg -=
1eb30 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nReg;.  }else{.
1eb40 20 20 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e      i = pParse->
1eb50 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72  nMem+1;.    pPar
1eb60 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67  se->nMem += nReg
1eb70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
1eb80 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
1eb90 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
1eba0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1ebb0 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52  int iReg, int nR
1ebc0 65 67 29 7b 0a 20 20 69 66 28 20 6e 52 65 67 3e  eg){.  if( nReg>
1ebd0 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
1ebe0 67 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  g ){.    pParse-
1ebf0 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e 52 65  >nRangeReg = nRe
1ec00 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69  g;.    pParse->i
1ec10 52 61 6e 67 65 52 65 67 20 3d 20 69 52 65 67 3b  RangeReg = iReg;
1ec20 0a 20 20 7d 0a 7d 0a                             .  }.}.