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

Artifact 0fdd547d2820aa700acc39697b9a9894153a627e:


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 20 2a 2f  xisting entry */
106f0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
10700 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
10710 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
10720 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
10730 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67  .    if( p->iReg
10740 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69   && p->iTable==i
10750 54 61 62 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d  Tab && p->iColum
10760 6e 3d 3d 69 43 6f 6c 20 29 7b 0a 20 20 20 20 20  n==iCol ){.     
10770 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72   cacheEntryClear
10780 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
10790 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70     p->iLevel = p
107a0 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
107b0 65 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65  el;.      p->iRe
107c0 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 20 20  g = iReg;.      
107d0 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d  p->lru = pParse-
107e0 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20  >iCacheCnt++;.  
107f0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
10800 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64  }.  }..  /* Find
10810 20 61 6e 20 65 6d 70 74 79 20 73 6c 6f 74 20 61   an empty slot a
10820 6e 64 20 72 65 70 6c 61 63 65 20 69 74 20 2a 2f  nd replace it */
10830 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
10840 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
10850 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
10860 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
10870 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67  .    if( p->iReg
10880 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      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 54 61 62 6c 65 20 3d 20      p->iTable = 
108c0 69 54 61 62 3b 0a 20 20 20 20 20 20 70 2d 3e 69  iTab;.      p->i
108d0 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20  Column = iCol;. 
108e0 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 69       p->iReg = i
108f0 52 65 67 3b 0a 20 20 20 20 20 20 70 2d 3e 74 65  Reg;.      p->te
10900 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 20  mpReg = 0;.     
10910 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65   p->lru = pParse
10920 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20  ->iCacheCnt++;. 
10930 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
10940 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70   }.  }..  /* Rep
10950 6c 61 63 65 20 74 68 65 20 6c 61 73 74 20 72 65  lace the last re
10960 63 65 6e 74 6c 79 20 75 73 65 64 20 2a 2f 0a 20  cently used */. 
10970 20 6d 69 6e 4c 72 75 20 3d 20 30 78 37 66 66 66   minLru = 0x7fff
10980 66 66 66 66 3b 0a 20 20 69 64 78 4c 72 75 20 3d  ffff;.  idxLru =
10990 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20   -1;.  for(i=0, 
109a0 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
109b0 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
109c0 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
109d0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
109e0 6c 72 75 3c 6d 69 6e 4c 72 75 20 29 7b 0a 20 20  lru<minLru ){.  
109f0 20 20 20 20 69 64 78 4c 72 75 20 3d 20 69 3b 0a      idxLru = i;.
10a00 20 20 20 20 20 20 6d 69 6e 4c 72 75 20 3d 20 70        minLru = p
10a10 2d 3e 6c 72 75 3b 0a 20 20 20 20 7d 0a 20 20 7d  ->lru;.    }.  }
10a20 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 69 64  .  if( ALWAYS(id
10a30 78 4c 72 75 3e 3d 30 29 20 29 7b 0a 20 20 20 20  xLru>=0) ){.    
10a40 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43 6f  p = &pParse->aCo
10a50 6c 43 61 63 68 65 5b 69 64 78 4c 72 75 5d 3b 0a  lCache[idxLru];.
10a60 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20      p->iLevel = 
10a70 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
10a80 76 65 6c 3b 0a 20 20 20 20 70 2d 3e 69 54 61 62  vel;.    p->iTab
10a90 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70  le = iTab;.    p
10aa0 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c  ->iColumn = iCol
10ab0 3b 0a 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20  ;.    p->iReg = 
10ac0 69 52 65 67 3b 0a 20 20 20 20 70 2d 3e 74 65 6d  iReg;.    p->tem
10ad0 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 70 2d  pReg = 0;.    p-
10ae0 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69  >lru = pParse->i
10af0 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20  CacheCnt++;.    
10b00 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 2f  return;.  }.}../
10b10 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68  *.** Indicate th
10b20 61 74 20 61 20 72 65 67 69 73 74 65 72 20 69 73  at a register is
10b30 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74   being overwritt
10b40 65 6e 2e 20 20 50 75 72 67 65 20 74 68 65 20 72  en.  Purge the r
10b50 65 67 69 73 74 65 72 0a 2a 2a 20 66 72 6f 6d 20  egister.** from 
10b60 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
10b70 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
10b80 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65  3ExprCacheRemove
10b90 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
10ba0 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74  int iReg){.  int
10bb0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
10bc0 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72  lCache *p;.  for
10bd0 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
10be0 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
10bf0 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
10c00 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
10c10 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67  f( p->iReg==iReg
10c20 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45   ){.      cacheE
10c30 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72 73 65  ntryClear(pParse
10c40 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69  , p);.      p->i
10c50 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Reg = 0;.    }. 
10c60 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65   }.}../*.** Reme
10c70 6d 62 65 72 20 74 68 65 20 63 75 72 72 65 6e 74  mber the current
10c80 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 63 6f   column cache co
10c90 6e 74 65 78 74 2e 20 20 41 6e 79 20 6e 65 77 20  ntext.  Any new 
10ca0 65 6e 74 72 69 65 73 20 61 64 64 65 64 0a 2a 2a  entries added.**
10cb0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 63 6f   added to the co
10cc0 6c 75 6d 6e 20 63 61 63 68 65 20 61 66 74 65 72  lumn cache after
10cd0 20 74 68 69 73 20 63 61 6c 6c 20 61 72 65 20 72   this call are r
10ce0 65 6d 6f 76 65 64 20 77 68 65 6e 20 74 68 65 0a  emoved when the.
10cf0 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
10d00 20 70 6f 70 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a   pop occurs..*/.
10d10 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
10d20 43 61 63 68 65 50 75 73 68 28 50 61 72 73 65 20  CachePush(Parse 
10d30 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50 61 72  *pParse){.  pPar
10d40 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 2b  se->iCacheLevel+
10d50 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  +;.}../*.** Remo
10d60 76 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75  ve from the colu
10d70 6d 6e 20 63 61 63 68 65 20 61 6e 79 20 65 6e 74  mn cache any ent
10d80 72 69 65 73 20 74 68 61 74 20 77 65 72 65 20 61  ries that were a
10d90 64 64 65 64 20 73 69 6e 63 65 20 74 68 65 0a 2a  dded since the.*
10da0 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 4e  * the previous N
10db0 20 50 75 73 68 20 6f 70 65 72 61 74 69 6f 6e 73   Push operations
10dc0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
10dd0 73 2c 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  s, restore the c
10de0 61 63 68 65 0a 2a 2a 20 74 6f 20 74 68 65 20 73  ache.** to the s
10df0 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 4e  tate it was in N
10e00 20 50 75 73 68 65 73 20 61 67 6f 2e 0a 2a 2f 0a   Pushes ago..*/.
10e10 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
10e20 43 61 63 68 65 50 6f 70 28 50 61 72 73 65 20 2a  CachePop(Parse *
10e30 70 50 61 72 73 65 2c 20 69 6e 74 20 4e 29 7b 0a  pParse, int N){.
10e40 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
10e50 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a  t yColCache *p;.
10e60 20 20 61 73 73 65 72 74 28 20 4e 3e 30 20 29 3b    assert( N>0 );
10e70 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
10e80 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3e 3d  e->iCacheLevel>=
10e90 4e 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69  N );.  pParse->i
10ea0 43 61 63 68 65 4c 65 76 65 6c 20 2d 3d 20 4e 3b  CacheLevel -= N;
10eb0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
10ec0 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
10ed0 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
10ee0 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
10ef0 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67  .    if( p->iReg
10f00 20 26 26 20 70 2d 3e 69 4c 65 76 65 6c 3e 70 50   && p->iLevel>pP
10f10 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
10f20 6c 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65  l ){.      cache
10f30 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72 73  EntryClear(pPars
10f40 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e  e, p);.      p->
10f50 69 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  iReg = 0;.    }.
10f60 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65    }.}../*.** Whe
10f70 6e 20 61 20 63 61 63 68 65 64 20 63 6f 6c 75 6d  n a cached colum
10f80 6e 20 69 73 20 72 65 75 73 65 64 2c 20 6d 61 6b  n is reused, mak
10f90 65 20 73 75 72 65 20 74 68 61 74 20 69 74 73 20  e sure that its 
10fa0 72 65 67 69 73 74 65 72 20 69 73 0a 2a 2a 20 6e  register is.** n
10fb0 6f 20 6c 6f 6e 67 65 72 20 61 76 61 69 6c 61 62  o longer availab
10fc0 6c 65 20 61 73 20 61 20 74 65 6d 70 20 72 65 67  le as a temp reg
10fd0 69 73 74 65 72 2e 20 20 74 69 63 6b 65 74 20 23  ister.  ticket #
10fe0 33 38 37 39 3a 20 20 74 68 61 74 20 73 61 6d 65  3879:  that same
10ff0 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 6d 69 67  .** register mig
11000 68 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63  ht be in the cac
11010 68 65 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70  he in multiple p
11020 6c 61 63 65 73 2c 20 73 6f 20 62 65 20 73 75 72  laces, so be sur
11030 65 20 74 6f 0a 2a 2a 20 67 65 74 20 74 68 65 6d  e to.** get them
11040 20 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   all..*/.static 
11050 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
11060 43 61 63 68 65 50 69 6e 52 65 67 69 73 74 65 72  CachePinRegister
11070 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
11080 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74  int iReg){.  int
11090 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
110a0 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72  lCache *p;.  for
110b0 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
110c0 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
110d0 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
110e0 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
110f0 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67  f( p->iReg==iReg
11100 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d   ){.      p->tem
11110 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pReg = 0;.    }.
11120 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
11130 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
11140 77 69 6c 6c 20 65 78 74 72 61 63 74 20 74 68 65  will extract the
11150 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75   iColumn-th colu
11160 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65  mn from.** table
11170 20 70 54 61 62 20 61 6e 64 20 73 74 6f 72 65 20   pTab and store 
11180 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  the column value
11190 20 69 6e 20 61 20 72 65 67 69 73 74 65 72 2e 20   in a register. 
111a0 20 41 6e 20 65 66 66 6f 72 74 0a 2a 2a 20 69 73   An effort.** is
111b0 20 6d 61 64 65 20 74 6f 20 73 74 6f 72 65 20 74   made to store t
111c0 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  he column value 
111d0 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65 67  in register iReg
111e0 2c 20 62 75 74 20 74 68 69 73 20 69 73 0a 2a 2a  , but this is.**
111f0 20 6e 6f 74 20 67 75 61 72 61 6e 74 65 65 64 2e   not guaranteed.
11200 20 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f    The location o
11210 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c  f the column val
11220 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ue is returned..
11230 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74  **.** There must
11240 20 62 65 20 61 6e 20 6f 70 65 6e 20 63 75 72 73   be an open curs
11250 6f 72 20 74 6f 20 70 54 61 62 20 69 6e 20 69 54  or to pTab in iT
11260 61 62 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72  able when this r
11270 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
11280 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c 75 6d 6e  led.  If iColumn
11290 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73 20  <0 then code is 
112a0 67 65 6e 65 72 61 74 65 64 20 74 68 61 74 20 65  generated that e
112b0 78 74 72 61 63 74 73 20 74 68 65 20 72 6f 77 69  xtracts the rowi
112c0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
112d0 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
112e0 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  mn(.  Parse *pPa
112f0 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e  rse,   /* Parsin
11300 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
11310 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
11320 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
11330 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69      /* Descripti
11340 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  on of the table 
11350 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 66  we are reading f
11360 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  rom */.  int iCo
11370 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64  lumn,     /* Ind
11380 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ex of the table 
11390 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20  column */.  int 
113a0 69 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20  iTable,      /* 
113b0 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74  The cursor point
113c0 69 6e 67 20 74 6f 20 74 68 65 20 74 61 62 6c 65  ing to the table
113d0 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 20 20   */.  int iReg  
113e0 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20         /* Store 
113f0 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
11400 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
11410 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
11420 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
11430 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20  yColCache *p;.. 
11440 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
11450 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
11460 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
11470 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
11480 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3e 30     if( p->iReg>0
11490 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69   && p->iTable==i
114a0 54 61 62 6c 65 20 26 26 20 70 2d 3e 69 43 6f 6c  Table && p->iCol
114b0 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a  umn==iColumn ){.
114c0 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70        p->lru = p
114d0 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74  Parse->iCacheCnt
114e0 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
114f0 33 45 78 70 72 43 61 63 68 65 50 69 6e 52 65 67  3ExprCachePinReg
11500 69 73 74 65 72 28 70 50 61 72 73 65 2c 20 70 2d  ister(pParse, p-
11510 3e 69 52 65 67 29 3b 0a 20 20 20 20 20 20 72 65  >iReg);.      re
11520 74 75 72 6e 20 70 2d 3e 69 52 65 67 3b 0a 20 20  turn p->iReg;.  
11530 20 20 7d 0a 20 20 7d 20 20 0a 20 20 61 73 73 65    }.  }  .  asse
11540 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 69 66  rt( v!=0 );.  if
11550 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ( iColumn<0 ){. 
11560 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11570 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64  dOp2(v, OP_Rowid
11580 2c 20 69 54 61 62 6c 65 2c 20 69 52 65 67 29 3b  , iTable, iReg);
11590 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57  .  }else if( ALW
115a0 41 59 53 28 70 54 61 62 21 3d 30 29 20 29 7b 0a  AYS(pTab!=0) ){.
115b0 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 49 73 56      int op = IsV
115c0 69 72 74 75 61 6c 28 70 54 61 62 29 20 3f 20 4f  irtual(pTab) ? O
115d0 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43  P_VColumn : OP_C
115e0 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74  olumn;.    sqlit
115f0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
11600 6f 70 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c  op, iTable, iCol
11610 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  umn, iReg);.    
11620 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66  sqlite3ColumnDef
11630 61 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69 43  ault(v, pTab, iC
11640 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20  olumn, iReg);.  
11650 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  }.  sqlite3ExprC
11660 61 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65  acheStore(pParse
11670 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d  , iTable, iColum
11680 6e 2c 20 69 52 65 67 29 3b 0a 20 20 72 65 74 75  n, iReg);.  retu
11690 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn iReg;.}../*.*
116a0 2a 20 43 6c 65 61 72 20 61 6c 6c 20 63 6f 6c 75  * Clear all colu
116b0 6d 6e 20 63 61 63 68 65 20 65 6e 74 72 69 65 73  mn cache entries
116c0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
116d0 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
116e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
116f0 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
11700 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a  t yColCache *p;.
11710 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
11720 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
11730 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
11740 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
11750 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67  .    if( p->iReg
11760 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45   ){.      cacheE
11770 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72 73 65  ntryClear(pParse
11780 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69  , p);.      p->i
11790 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Reg = 0;.    }. 
117a0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f   }.}../*.** Reco
117b0 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74  rd the fact that
117c0 20 61 6e 20 61 66 66 69 6e 69 74 79 20 63 68 61   an affinity cha
117d0 6e 67 65 20 68 61 73 20 6f 63 63 75 72 72 65 64  nge has occurred
117e0 20 6f 6e 20 69 43 6f 75 6e 74 0a 2a 2a 20 72 65   on iCount.** re
117f0 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
11800 20 77 69 74 68 20 69 53 74 61 72 74 2e 0a 2a 2f   with iStart..*/
11810 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
11820 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
11830 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72  ange(Parse *pPar
11840 73 65 2c 20 69 6e 74 20 69 53 74 61 72 74 2c 20  se, int iStart, 
11850 69 6e 74 20 69 43 6f 75 6e 74 29 7b 0a 20 20 69  int iCount){.  i
11860 6e 74 20 69 45 6e 64 20 3d 20 69 53 74 61 72 74  nt iEnd = iStart
11870 20 2b 20 69 43 6f 75 6e 74 20 2d 20 31 3b 0a 20   + iCount - 1;. 
11880 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
11890 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20   yColCache *p;. 
118a0 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
118b0 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
118c0 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
118d0 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
118e0 20 20 20 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52     int r = p->iR
118f0 65 67 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 69  eg;.    if( r>=i
11900 53 74 61 72 74 20 26 26 20 72 3c 3d 69 45 6e 64  Start && r<=iEnd
11910 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45   ){.      cacheE
11920 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72 73 65  ntryClear(pParse
11930 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69  , p);.      p->i
11940 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Reg = 0;.    }. 
11950 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
11960 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 76  rate code to mov
11970 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72  e content from r
11980 65 67 69 73 74 65 72 73 20 69 46 72 6f 6d 2e 2e  egisters iFrom..
11990 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a  .iFrom+nReg-1.**
119a0 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69 54   over to iTo..iT
119b0 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65 65 70 20 74  o+nReg-1. Keep t
119c0 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  he column cache 
119d0 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 76  up-to-date..*/.v
119e0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
119f0 6f 64 65 4d 6f 76 65 28 50 61 72 73 65 20 2a 70  odeMove(Parse *p
11a00 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d  Parse, int iFrom
11a10 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e  , int iTo, int n
11a20 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Reg){.  int i;. 
11a30 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
11a40 65 20 2a 70 3b 0a 20 20 69 66 28 20 4e 45 56 45  e *p;.  if( NEVE
11a50 52 28 69 46 72 6f 6d 3d 3d 69 54 6f 29 20 29 20  R(iFrom==iTo) ) 
11a60 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
11a70 33 56 64 62 65 41 64 64 4f 70 33 28 70 50 61 72  3VdbeAddOp3(pPar
11a80 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f  se->pVdbe, OP_Mo
11a90 76 65 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 2c 20  ve, iFrom, iTo, 
11aa0 6e 52 65 67 29 3b 0a 20 20 66 6f 72 28 69 3d 30  nReg);.  for(i=0
11ab0 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
11ac0 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
11ad0 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
11ae0 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 78   p++){.    int x
11af0 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20   = p->iReg;.    
11b00 69 66 28 20 78 3e 3d 69 46 72 6f 6d 20 26 26 20  if( x>=iFrom && 
11b10 78 3c 69 46 72 6f 6d 2b 6e 52 65 67 20 29 7b 0a  x<iFrom+nReg ){.
11b20 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20 2b 3d        p->iReg +=
11b30 20 69 54 6f 2d 69 46 72 6f 6d 3b 0a 20 20 20 20   iTo-iFrom;.    
11b40 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  }.  }.}../*.** G
11b50 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
11b60 63 6f 70 79 20 63 6f 6e 74 65 6e 74 20 66 72 6f  copy content fro
11b70 6d 20 72 65 67 69 73 74 65 72 73 20 69 46 72 6f  m registers iFro
11b80 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31  m...iFrom+nReg-1
11b90 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e  .** over to iTo.
11ba0 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 0a 2a 2f 0a  .iTo+nReg-1..*/.
11bb0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
11bc0 43 6f 64 65 43 6f 70 79 28 50 61 72 73 65 20 2a  CodeCopy(Parse *
11bd0 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f  pParse, int iFro
11be0 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20  m, int iTo, int 
11bf0 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  nReg){.  int i;.
11c00 20 20 69 66 28 20 4e 45 56 45 52 28 69 46 72 6f    if( NEVER(iFro
11c10 6d 3d 3d 69 54 6f 29 20 29 20 72 65 74 75 72 6e  m==iTo) ) return
11c20 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
11c30 52 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  Reg; i++){.    s
11c40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
11c50 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
11c60 4f 50 5f 43 6f 70 79 2c 20 69 46 72 6f 6d 2b 69  OP_Copy, iFrom+i
11c70 2c 20 69 54 6f 2b 69 29 3b 0a 20 20 7d 0a 7d 0a  , iTo+i);.  }.}.
11c80 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
11c90 75 65 20 69 66 20 61 6e 79 20 72 65 67 69 73 74  ue if any regist
11ca0 65 72 20 69 6e 20 74 68 65 20 72 61 6e 67 65 20  er in the range 
11cb0 69 46 72 6f 6d 2e 2e 69 54 6f 20 28 69 6e 63 6c  iFrom..iTo (incl
11cc0 75 73 69 76 65 29 0a 2a 2a 20 69 73 20 75 73 65  usive).** is use
11cd0 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
11ce0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a   column cache..*
11cf0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 73 65  /.static int use
11d00 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 50  dAsColumnCache(P
11d10 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
11d20 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f  t iFrom, int iTo
11d30 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
11d40 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
11d50 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  p;.  for(i=0, p=
11d60 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
11d70 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
11d80 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
11d90 29 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d 20 70  ){.    int r = p
11da0 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20  ->iReg;.    if( 
11db0 72 3e 3d 69 46 72 6f 6d 20 26 26 20 72 3c 3d 69  r>=iFrom && r<=i
11dc0 54 6f 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  To ) return 1;. 
11dd0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
11de0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ../*.** If the l
11df0 61 73 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ast instruction 
11e00 63 6f 64 65 64 20 69 73 20 61 6e 20 65 70 68 65  coded is an ephe
11e10 6d 65 72 61 6c 20 63 6f 70 79 20 6f 66 20 61 6e  meral copy of an
11e20 79 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 67 69  y of.** the regi
11e30 73 74 65 72 73 20 69 6e 20 74 68 65 20 6e 52 65  sters in the nRe
11e40 67 20 72 65 67 69 73 74 65 72 73 20 62 65 67 69  g registers begi
11e50 6e 6e 69 6e 67 20 77 69 74 68 20 69 52 65 67 2c  nning with iReg,
11e60 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 76 65 72 74   then.** convert
11e70 20 74 68 65 20 6c 61 73 74 20 69 6e 73 74 72 75   the last instru
11e80 63 74 69 6f 6e 20 66 72 6f 6d 20 4f 50 5f 53 43  ction from OP_SC
11e90 6f 70 79 20 74 6f 20 4f 50 5f 43 6f 70 79 2e 0a  opy to OP_Copy..
11ea0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
11eb0 78 70 72 48 61 72 64 43 6f 70 79 28 50 61 72 73  xprHardCopy(Pars
11ec0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
11ed0 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a  Reg, int nReg){.
11ee0 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20    VdbeOp *pOp;. 
11ef0 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73 73   Vdbe *v;..  ass
11f00 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
11f10 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
11f20 20 29 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65   );.  v = pParse
11f30 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
11f40 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 70 4f 70  t( v!=0 );.  pOp
11f50 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
11f60 74 4f 70 28 76 2c 20 2d 31 29 3b 0a 20 20 61 73  tOp(v, -1);.  as
11f70 73 65 72 74 28 20 70 4f 70 21 3d 30 20 29 3b 0a  sert( pOp!=0 );.
11f80 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
11f90 65 3d 3d 4f 50 5f 53 43 6f 70 79 20 26 26 20 70  e==OP_SCopy && p
11fa0 4f 70 2d 3e 70 31 3e 3d 69 52 65 67 20 26 26 20  Op->p1>=iReg && 
11fb0 70 4f 70 2d 3e 70 31 3c 69 52 65 67 2b 6e 52 65  pOp->p1<iReg+nRe
11fc0 67 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 6f 70  g ){.    pOp->op
11fd0 63 6f 64 65 20 3d 20 4f 50 5f 43 6f 70 79 3b 0a  code = OP_Copy;.
11fe0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
11ff0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 74  erate code to st
12000 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ore the value of
12010 20 74 68 65 20 69 41 6c 69 61 73 2d 74 68 20 61   the iAlias-th a
12020 6c 69 61 73 20 69 6e 20 72 65 67 69 73 74 65 72  lias in register
12030 0a 2a 2a 20 74 61 72 67 65 74 2e 20 20 54 68 65  .** target.  The
12040 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73   first time this
12050 20 69 73 20 63 61 6c 6c 65 64 2c 20 70 45 78 70   is called, pExp
12060 72 20 69 73 20 65 76 61 6c 75 61 74 65 64 20 74  r is evaluated t
12070 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65  o compute.** the
12080 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 61 6c   value of the al
12090 69 61 73 2e 20 20 54 68 65 20 76 61 6c 75 65 20  ias.  The value 
120a0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 6e 20  is stored in an 
120b0 61 75 78 69 6c 69 61 72 79 20 72 65 67 69 73 74  auxiliary regist
120c0 65 72 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 75  er.** and the nu
120d0 6d 62 65 72 20 6f 66 20 74 68 61 74 20 72 65 67  mber of that reg
120e0 69 73 74 65 72 20 69 73 20 72 65 74 75 72 6e 65  ister is returne
120f0 64 2e 20 20 4f 6e 20 73 75 62 73 65 71 75 65 6e  d.  On subsequen
12100 74 20 63 61 6c 6c 73 2c 0a 2a 2a 20 74 68 65 20  t calls,.** the 
12110 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20  register number 
12120 69 73 20 72 65 74 75 72 6e 65 64 20 77 69 74 68  is returned with
12130 6f 75 74 20 67 65 6e 65 72 61 74 69 6e 67 20 61  out generating a
12140 6e 79 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4e  ny code..**.** N
12150 6f 74 65 20 74 68 61 74 20 69 6e 20 6f 72 64 65  ote that in orde
12160 72 20 66 6f 72 20 74 68 69 73 20 74 6f 20 77 6f  r for this to wo
12170 72 6b 2c 20 63 6f 64 65 20 6d 75 73 74 20 62 65  rk, code must be
12180 20 67 65 6e 65 72 61 74 65 64 20 69 6e 20 74 68   generated in th
12190 65 0a 2a 2a 20 73 61 6d 65 20 6f 72 64 65 72 20  e.** same order 
121a0 74 68 61 74 20 69 74 20 69 73 20 65 78 65 63 75  that it is execu
121b0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6c 69 61 73  ted..**.** Alias
121c0 65 73 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20  es are numbered 
121d0 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 31 2e  starting with 1.
121e0 20 20 53 6f 20 69 41 6c 69 61 73 20 69 73 20 69    So iAlias is i
121f0 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 6f  n the range.** o
12200 66 20 31 20 74 6f 20 70 50 61 72 73 65 2d 3e 6e  f 1 to pParse->n
12210 41 6c 69 61 73 20 69 6e 63 6c 75 73 69 76 65 2e  Alias inclusive.
12220 20 20 0a 2a 2a 0a 2a 2a 20 70 50 61 72 73 65 2d    .**.** pParse-
12230 3e 61 41 6c 69 61 73 5b 69 41 6c 69 61 73 2d 31  >aAlias[iAlias-1
12240 5d 20 72 65 63 6f 72 64 73 20 74 68 65 20 72 65  ] records the re
12250 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 68  gister number wh
12260 65 72 65 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a  ere the value.**
12270 20 6f 66 20 74 68 65 20 69 41 6c 69 61 73 2d 74   of the iAlias-t
12280 68 20 61 6c 69 61 73 20 69 73 20 73 74 6f 72 65  h alias is store
12290 64 2e 20 20 49 66 20 7a 65 72 6f 2c 20 74 68 61  d.  If zero, tha
122a0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
122b0 0a 2a 2a 20 61 6c 69 61 73 20 68 61 73 20 6e 6f  .** alias has no
122c0 74 20 79 65 74 20 62 65 65 6e 20 63 6f 6d 70 75  t yet been compu
122d0 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
122e0 6e 74 20 63 6f 64 65 41 6c 69 61 73 28 50 61 72  nt codeAlias(Par
122f0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
12300 69 41 6c 69 61 73 2c 20 45 78 70 72 20 2a 70 45  iAlias, Expr *pE
12310 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
12320 7b 0a 23 69 66 20 30 0a 20 20 73 71 6c 69 74 65  {.#if 0.  sqlite
12330 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
12340 64 62 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b 0a  db;.  int iReg;.
12350 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 41    if( pParse->nA
12360 6c 69 61 73 41 6c 6c 6f 63 3c 70 50 61 72 73 65  liasAlloc<pParse
12370 2d 3e 6e 41 6c 69 61 73 20 29 7b 0a 20 20 20 20  ->nAlias ){.    
12380 70 50 61 72 73 65 2d 3e 61 41 6c 69 61 73 20 3d  pParse->aAlias =
12390 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
123a0 63 4f 72 46 72 65 65 28 64 62 2c 20 70 50 61 72  cOrFree(db, pPar
123b0 73 65 2d 3e 61 41 6c 69 61 73 2c 0a 20 20 20 20  se->aAlias,.    
123c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123d0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
123e0 65 6f 66 28 70 50 61 72 73 65 2d 3e 61 41 6c 69  eof(pParse->aAli
123f0 61 73 5b 30 5d 29 2a 70 50 61 72 73 65 2d 3e 6e  as[0])*pParse->n
12400 41 6c 69 61 73 20 29 3b 0a 20 20 20 20 74 65 73  Alias );.    tes
12410 74 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f  tcase( db->mallo
12420 63 46 61 69 6c 65 64 20 26 26 20 70 50 61 72 73  cFailed && pPars
12430 65 2d 3e 6e 41 6c 69 61 73 41 6c 6c 6f 63 3e 30  e->nAliasAlloc>0
12440 20 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   );.    if( db->
12450 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
12460 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 6d 65 6d  eturn 0;.    mem
12470 73 65 74 28 26 70 50 61 72 73 65 2d 3e 61 41 6c  set(&pParse->aAl
12480 69 61 73 5b 70 50 61 72 73 65 2d 3e 6e 41 6c 69  ias[pParse->nAli
12490 61 73 41 6c 6c 6f 63 5d 2c 20 30 2c 0a 20 20 20  asAlloc], 0,.   
124a0 20 20 20 20 20 20 20 20 28 70 50 61 72 73 65 2d          (pParse-
124b0 3e 6e 41 6c 69 61 73 2d 70 50 61 72 73 65 2d 3e  >nAlias-pParse->
124c0 6e 41 6c 69 61 73 41 6c 6c 6f 63 29 2a 73 69 7a  nAliasAlloc)*siz
124d0 65 6f 66 28 70 50 61 72 73 65 2d 3e 61 41 6c 69  eof(pParse->aAli
124e0 61 73 5b 30 5d 29 29 3b 0a 20 20 20 20 70 50 61  as[0]));.    pPa
124f0 72 73 65 2d 3e 6e 41 6c 69 61 73 41 6c 6c 6f 63  rse->nAliasAlloc
12500 20 3d 20 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61   = pParse->nAlia
12510 73 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  s;.  }.  assert(
12520 20 69 41 6c 69 61 73 3e 30 20 26 26 20 69 41 6c   iAlias>0 && iAl
12530 69 61 73 3c 3d 70 50 61 72 73 65 2d 3e 6e 41 6c  ias<=pParse->nAl
12540 69 61 73 20 29 3b 0a 20 20 69 52 65 67 20 3d 20  ias );.  iReg = 
12550 70 50 61 72 73 65 2d 3e 61 41 6c 69 61 73 5b 69  pParse->aAlias[i
12560 41 6c 69 61 73 2d 31 5d 3b 0a 20 20 69 66 28 20  Alias-1];.  if( 
12570 69 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69  iReg==0 ){.    i
12580 66 28 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  f( pParse->iCach
12590 65 4c 65 76 65 6c 3e 30 20 29 7b 0a 20 20 20 20  eLevel>0 ){.    
125a0 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33    iReg = sqlite3
125b0 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
125c0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
125d0 72 67 65 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  rget);.    }else
125e0 7b 0a 20 20 20 20 20 20 69 52 65 67 20 3d 20 2b  {.      iReg = +
125f0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
12600 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
12610 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
12620 70 72 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20  pr, iReg);.     
12630 20 70 50 61 72 73 65 2d 3e 61 41 6c 69 61 73 5b   pParse->aAlias[
12640 69 41 6c 69 61 73 2d 31 5d 20 3d 20 69 52 65 67  iAlias-1] = iReg
12650 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
12660 74 75 72 6e 20 69 52 65 67 3b 0a 23 65 6c 73 65  turn iReg;.#else
12670 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
12680 54 45 52 28 69 41 6c 69 61 73 29 3b 0a 20 20 72  TER(iAlias);.  r
12690 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
126a0 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
126b0 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
126c0 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  t);.#endif.}../*
126d0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
126e0 65 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65  e into the curre
126f0 6e 74 20 56 64 62 65 20 74 6f 20 65 76 61 6c 75  nt Vdbe to evalu
12700 61 74 65 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  ate the given.**
12710 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 41 74   expression.  At
12720 74 65 6d 70 74 20 74 6f 20 73 74 6f 72 65 20 74  tempt to store t
12730 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65  he results in re
12740 67 69 73 74 65 72 20 22 74 61 72 67 65 74 22 2e  gister "target".
12750 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72  .** Return the r
12760 65 67 69 73 74 65 72 20 77 68 65 72 65 20 72 65  egister where re
12770 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64  sults are stored
12780 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68 69  ..**.** With thi
12790 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 72 65  s routine, there
127a0 20 69 73 20 6e 6f 20 67 75 61 72 61 6e 74 65 65   is no guarantee
127b0 20 74 68 61 74 20 72 65 73 75 6c 74 73 20 77 69   that results wi
127c0 6c 6c 0a 2a 2a 20 62 65 20 73 74 6f 72 65 64 20  ll.** be stored 
127d0 69 6e 20 74 61 72 67 65 74 2e 20 20 54 68 65 20  in target.  The 
127e0 72 65 73 75 6c 74 20 6d 69 67 68 74 20 62 65 20  result might be 
127f0 73 74 6f 72 65 64 20 69 6e 20 73 6f 6d 65 20 6f  stored in some o
12800 74 68 65 72 0a 2a 2a 20 72 65 67 69 73 74 65 72  ther.** register
12810 20 69 66 20 69 74 20 69 73 20 63 6f 6e 76 65 6e   if it is conven
12820 69 65 6e 74 20 74 6f 20 64 6f 20 73 6f 2e 20 20  ient to do so.  
12830 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
12840 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63 68 65  tion.** must che
12850 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f  ck the return co
12860 64 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20  de and move the 
12870 72 65 73 75 6c 74 73 20 74 6f 20 74 68 65 20 64  results to the d
12880 65 73 69 72 65 64 0a 2a 2a 20 72 65 67 69 73 74  esired.** regist
12890 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
128a0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
128b0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
128c0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
128d0 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65   target){.  Vdbe
128e0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
128f0 64 62 65 3b 20 20 2f 2a 20 54 68 65 20 56 4d 20  dbe;  /* The VM 
12900 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
12910 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20  on */.  int op; 
12920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12930 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20    /* The opcode 
12940 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
12950 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 74 61 72   int inReg = tar
12960 67 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  get;       /* Re
12970 73 75 6c 74 73 20 73 74 6f 72 65 64 20 69 6e 20  sults stored in 
12980 72 65 67 69 73 74 65 72 20 69 6e 52 65 67 20 2a  register inReg *
12990 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31  /.  int regFree1
129a0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
129b0 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65   If non-zero fre
129c0 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79  e this temporary
129d0 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69   register */.  i
129e0 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  nt regFree2 = 0;
129f0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e           /* If n
12a00 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69  on-zero free thi
12a10 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  s temporary regi
12a20 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 31  ster */.  int r1
12a30 2c 20 72 32 2c 20 72 33 2c 20 72 34 3b 20 20 20  , r2, r3, r4;   
12a40 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 72      /* Various r
12a50 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20  egister numbers 
12a60 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
12a70 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 2f   = pParse->db; /
12a80 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
12a90 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20  onnection */..  
12aa0 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30  assert( target>0
12ab0 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72   && target<=pPar
12ac0 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66  se->nMem );.  if
12ad0 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  ( v==0 ){.    as
12ae0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62  sert( pParse->db
12af0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
12b00 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
12b10 20 20 7d 0a 0a 20 20 69 66 28 20 70 45 78 70 72    }..  if( pExpr
12b20 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20  ==0 ){.    op = 
12b30 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65  TK_NULL;.  }else
12b40 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72  {.    op = pExpr
12b50 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74  ->op;.  }.  swit
12b60 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
12b70 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
12b80 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66  : {.      AggInf
12b90 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 45  o *pAggInfo = pE
12ba0 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20  xpr->pAggInfo;. 
12bb0 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
12bc0 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20  nfo_col *pCol = 
12bd0 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b  &pAggInfo->aCol[
12be0 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20  pExpr->iAgg];.  
12bf0 20 20 20 20 69 66 28 20 21 70 41 67 67 49 6e 66      if( !pAggInf
12c00 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 29 7b  o->directMode ){
12c10 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
12c20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b   pCol->iMem>0 );
12c30 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d  .        inReg =
12c40 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20   pCol->iMem;.   
12c50 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
12c60 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41 67 67    }else if( pAgg
12c70 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67  Info->useSorting
12c80 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Idx ){.        s
12c90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
12ca0 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70  (v, OP_Column, p
12cb0 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67  AggInfo->sorting
12cc0 49 64 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Idx,.           
12cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ce0 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
12cf0 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b  Column, target);
12d00 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
12d10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
12d20 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c   Otherwise, fall
12d30 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54   thru into the T
12d40 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f  K_COLUMN case */
12d50 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
12d60 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
12d70 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
12d80 61 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20 20 20  able<0 ){.      
12d90 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68    /* This only h
12da0 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 64 69  appens when codi
12db0 6e 67 20 63 68 65 63 6b 20 63 6f 6e 73 74 72 61  ng check constra
12dc0 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ints */.        
12dd0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
12de0 63 6b 42 61 73 65 3e 30 20 29 3b 0a 20 20 20 20  ckBase>0 );.    
12df0 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70      inReg = pExp
12e00 72 2d 3e 69 43 6f 6c 75 6d 6e 20 2b 20 70 50 61  r->iColumn + pPa
12e10 72 73 65 2d 3e 63 6b 42 61 73 65 3b 0a 20 20 20  rse->ckBase;.   
12e20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12e30 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
12e40 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
12e50 6d 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mn(pParse, pExpr
12e60 2d 3e 70 54 61 62 2c 0a 20 20 20 20 20 20 20 20  ->pTab,.        
12e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e80 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
12e90 69 43 6f 6c 75 6d 6e 2c 20 70 45 78 70 72 2d 3e  iColumn, pExpr->
12ea0 69 54 61 62 6c 65 2c 20 74 61 72 67 65 74 29 3b  iTable, target);
12eb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
12ec0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
12ed0 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
12ee0 20 7b 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74   {.      codeInt
12ef0 65 67 65 72 28 76 2c 20 70 45 78 70 72 2c 20 30  eger(v, pExpr, 0
12f00 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
12f10 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
12f20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
12f30 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
12f40 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
12f50 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
12f60 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 63  alue) );.      c
12f70 6f 64 65 52 65 61 6c 28 76 2c 20 70 45 78 70 72  odeReal(v, pExpr
12f80 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74  ->u.zToken, 0, t
12f90 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72  arget);.      br
12fa0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
12fb0 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b  ase TK_STRING: {
12fc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
12fd0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
12fe0 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
12ff0 75 65 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ue) );.      sql
13000 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
13010 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
13020 20 74 61 72 67 65 74 2c 20 30 2c 20 70 45 78 70   target, 0, pExp
13030 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b  r->u.zToken, 0);
13040 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
13050 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
13060 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71  NULL: {.      sq
13070 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13080 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74  v, OP_Null, 0, t
13090 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72  arget);.      br
130a0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
130b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  ef SQLITE_OMIT_B
130c0 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20  LOB_LITERAL.    
130d0 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a  case TK_BLOB: {.
130e0 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
130f0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
13100 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42  ;.      char *zB
13110 6c 6f 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72  lob;.      asser
13120 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
13130 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
13140 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
13150 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
13160 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27  u.zToken[0]=='x'
13170 20 7c 7c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f   || pExpr->u.zTo
13180 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20  ken[0]=='X' );. 
13190 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
131a0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d  pr->u.zToken[1]=
131b0 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a  ='\'' );.      z
131c0 20 3d 20 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f   = &pExpr->u.zTo
131d0 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20  ken[2];.      n 
131e0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
131f0 30 28 7a 29 20 2d 20 31 3b 0a 20 20 20 20 20 20  0(z) - 1;.      
13200 61 73 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c  assert( z[n]=='\
13210 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f  '' );.      zBlo
13220 62 20 3d 20 73 71 6c 69 74 65 33 48 65 78 54 6f  b = sqlite3HexTo
13230 42 6c 6f 62 28 73 71 6c 69 74 65 33 56 64 62 65  Blob(sqlite3Vdbe
13240 44 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20  Db(v), z, n);.  
13250 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13260 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62  ddOp4(v, OP_Blob
13270 2c 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c 20 30  , n/2, target, 0
13280 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41  , zBlob, P4_DYNA
13290 4d 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61  MIC);.      brea
132a0 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
132b0 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49      case TK_VARI
132c0 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 56 64  ABLE: {.      Vd
132d0 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20  beOp *pOp;.     
132e0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
132f0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
13300 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
13310 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
13320 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d  Expr->u.zToken!=
13330 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
13340 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
13350 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20  en[0]!=0 );.    
13360 20 20 69 66 28 20 70 45 78 70 72 2d 3e 75 2e 7a    if( pExpr->u.z
13370 54 6f 6b 65 6e 5b 31 5d 3d 3d 30 0a 20 20 20 20  Token[1]==0.    
13380 20 20 20 20 20 26 26 20 28 70 4f 70 20 3d 20 73       && (pOp = s
13390 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
133a0 76 2c 20 2d 31 29 29 2d 3e 6f 70 63 6f 64 65 3d  v, -1))->opcode=
133b0 3d 4f 50 5f 56 61 72 69 61 62 6c 65 0a 20 20 20  =OP_Variable.   
133c0 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 31        && pOp->p1
133d0 2b 70 4f 70 2d 3e 70 33 3d 3d 70 45 78 70 72 2d  +pOp->p3==pExpr-
133e0 3e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20  >iColumn.       
133f0 20 20 26 26 20 70 4f 70 2d 3e 70 32 2b 70 4f 70    && pOp->p2+pOp
13400 2d 3e 70 33 3d 3d 74 61 72 67 65 74 0a 20 20 20  ->p3==target.   
13410 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 34        && pOp->p4
13420 2e 7a 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20  .z==0.      ){. 
13430 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
13440 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74 72 75   previous instru
13450 63 74 69 6f 6e 20 77 61 73 20 61 20 63 6f 70 79  ction was a copy
13460 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75 73   of the previous
13470 20 75 6e 6e 61 6d 65 64 0a 20 20 20 20 20 20 20   unnamed.       
13480 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 6e   ** parameter in
13490 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  to the previous 
134a0 72 65 67 69 73 74 65 72 2c 20 74 68 65 6e 20 73  register, then s
134b0 69 6d 70 6c 79 20 69 6e 63 72 65 6d 65 6e 74 20  imply increment 
134c0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  the.        ** r
134d0 65 70 65 61 74 20 63 6f 75 6e 74 20 6f 6e 20 74  epeat count on t
134e0 68 65 20 70 72 69 6f 72 20 69 6e 73 74 72 75 63  he prior instruc
134f0 74 69 6f 6e 20 72 61 74 68 65 72 20 74 68 61 6e  tion rather than
13500 20 6d 61 6b 69 6e 67 20 61 20 6e 65 77 0a 20 20   making a new.  
13510 20 20 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63        ** instruc
13520 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f  tion..        */
13530 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 33  .        pOp->p3
13540 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ++;.      }else{
13550 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
13560 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
13570 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70 72  _Variable, pExpr
13580 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65  ->iColumn, targe
13590 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  t, 1);.        i
135a0 66 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  f( pExpr->u.zTok
135b0 65 6e 5b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20  en[1]!=0 ){.    
135c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
135d0 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
135e0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
135f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
13600 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
13610 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
13620 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a  ase TK_REGISTER:
13630 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d   {.      inReg =
13640 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a   pExpr->iTable;.
13650 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13660 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
13670 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67  S: {.      inReg
13680 20 3d 20 63 6f 64 65 41 6c 69 61 73 28 70 50 61   = codeAlias(pPa
13690 72 73 65 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  rse, pExpr->iTab
136a0 6c 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  le, pExpr->pLeft
136b0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
136c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
136d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
136e0 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65 20  T_CAST.    case 
136f0 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20  TK_CAST: {.     
13700 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20   /* Expressions 
13710 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43  of the form:   C
13720 41 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b  AST(pLeft AS tok
13730 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  en) */.      int
13740 20 61 66 66 2c 20 74 6f 5f 6f 70 3b 0a 20 20 20   aff, to_op;.   
13750 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
13760 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
13770 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
13780 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a  pLeft, target);.
13790 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
137a0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
137b0 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
137c0 65 29 20 29 3b 0a 20 20 20 20 20 20 61 66 66 20  e) );.      aff 
137d0 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  = sqlite3Affinit
137e0 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a  yType(pExpr->u.z
137f0 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 74 6f  Token);.      to
13800 5f 6f 70 20 3d 20 61 66 66 20 2d 20 53 51 4c 49  _op = aff - SQLI
13810 54 45 5f 41 46 46 5f 54 45 58 54 20 2b 20 4f 50  TE_AFF_TEXT + OP
13820 5f 54 6f 54 65 78 74 3b 0a 20 20 20 20 20 20 61  _ToText;.      a
13830 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50  ssert( to_op==OP
13840 5f 54 6f 54 65 78 74 20 20 20 20 7c 7c 20 61 66  _ToText    || af
13850 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  f!=SQLITE_AFF_TE
13860 58 54 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61  XT    );.      a
13870 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50  ssert( to_op==OP
13880 5f 54 6f 42 6c 6f 62 20 20 20 20 7c 7c 20 61 66  _ToBlob    || af
13890 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  f!=SQLITE_AFF_NO
138a0 4e 45 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61  NE    );.      a
138b0 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50  ssert( to_op==OP
138c0 5f 54 6f 4e 75 6d 65 72 69 63 20 7c 7c 20 61 66  _ToNumeric || af
138d0 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f!=SQLITE_AFF_NU
138e0 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 20 20 61  MERIC );.      a
138f0 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50  ssert( to_op==OP
13900 5f 54 6f 49 6e 74 20 20 20 20 20 7c 7c 20 61 66  _ToInt     || af
13910 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  f!=SQLITE_AFF_IN
13920 54 45 47 45 52 20 29 3b 0a 20 20 20 20 20 20 61  TEGER );.      a
13930 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50  ssert( to_op==OP
13940 5f 54 6f 52 65 61 6c 20 20 20 20 7c 7c 20 61 66  _ToReal    || af
13950 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  f!=SQLITE_AFF_RE
13960 41 4c 20 20 20 20 29 3b 0a 20 20 20 20 20 20 74  AL    );.      t
13970 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d  estcase( to_op==
13980 4f 50 5f 54 6f 54 65 78 74 20 29 3b 0a 20 20 20  OP_ToText );.   
13990 20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f     testcase( to_
139a0 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20 29 3b  op==OP_ToBlob );
139b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
139c0 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d   to_op==OP_ToNum
139d0 65 72 69 63 20 29 3b 0a 20 20 20 20 20 20 74 65  eric );.      te
139e0 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f  stcase( to_op==O
139f0 50 5f 54 6f 49 6e 74 20 29 3b 0a 20 20 20 20 20  P_ToInt );.     
13a00 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70   testcase( to_op
13a10 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20 29 3b 0a 20  ==OP_ToReal );. 
13a20 20 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d       if( inReg!=
13a30 74 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20 20  target ){.      
13a40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13a50 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c  Op2(v, OP_SCopy,
13a60 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b   inReg, target);
13a70 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d  .        inReg =
13a80 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d   target;.      }
13a90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
13aa0 62 65 41 64 64 4f 70 31 28 76 2c 20 74 6f 5f 6f  beAddOp1(v, to_o
13ab0 70 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20  p, inReg);.     
13ac0 20 74 65 73 74 63 61 73 65 28 20 75 73 65 64 41   testcase( usedA
13ad0 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61  sColumnCache(pPa
13ae0 72 73 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65  rse, inReg, inRe
13af0 67 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g) );.      sqli
13b00 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
13b10 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
13b20 65 2c 20 69 6e 52 65 67 2c 20 31 29 3b 0a 20 20  e, inReg, 1);.  
13b30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
13b40 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
13b50 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20  E_OMIT_CAST */. 
13b60 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
13b70 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
13b80 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
13b90 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
13ba0 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
13bb0 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
13bc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
13bd0 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20  K_LT==OP_Lt );. 
13be0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
13bf0 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20  LE==OP_Le );.   
13c00 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54     assert( TK_GT
13c10 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20 20  ==OP_Gt );.     
13c20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d   assert( TK_GE==
13c30 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20 20 20 61  OP_Ge );.      a
13c40 73 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50  ssert( TK_EQ==OP
13c50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Eq );.      ass
13c60 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e  ert( TK_NE==OP_N
13c70 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
13c80 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29  ase( op==TK_LT )
13c90 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
13ca0 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20  ( op==TK_LE );. 
13cb0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
13cc0 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20  p==TK_GT );.    
13cd0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
13ce0 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74  TK_GE );.      t
13cf0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
13d00 45 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  EQ );.      test
13d10 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20  case( op==TK_NE 
13d20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
13d30 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
13d40 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
13d50 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
13d60 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
13d70 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
13d80 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
13d90 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
13da0 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ee2);.      code
13db0 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
13dc0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
13dd0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
13de0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13df0 20 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65 67     r1, r2, inReg
13e00 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32  , SQLITE_STOREP2
13e10 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
13e20 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
13e30 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
13e40 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
13e50 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
13e60 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
13e70 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  IS:.    case TK_
13e80 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74  ISNOT: {.      t
13e90 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
13ea0 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  IS );.      test
13eb0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  case( op==TK_ISN
13ec0 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  OT );.      r1 =
13ed0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
13ee0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
13ef0 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
13f00 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20  ree1);.      r2 
13f10 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
13f20 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
13f30 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65  xpr->pRight, &re
13f40 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 6f  gFree2);.      o
13f50 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20  p = (op==TK_IS) 
13f60 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b  ? TK_EQ : TK_NE;
13f70 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
13f80 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
13f90 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
13fa0 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
13fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31                r1
13fc0 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c  , r2, inReg, SQL
13fd0 49 54 45 5f 53 54 4f 52 45 50 32 20 7c 20 53 51  ITE_STOREP2 | SQ
13fe0 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
13ff0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
14000 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
14010 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
14020 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
14030 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
14040 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a     case TK_AND:.
14050 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a      case TK_OR:.
14060 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53      case TK_PLUS
14070 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  :.    case TK_ST
14080 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AR:.    case TK_
14090 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20  MINUS:.    case 
140a0 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65  TK_REM:.    case
140b0 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20   TK_BITAND:.    
140c0 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20  case TK_BITOR:. 
140d0 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48     case TK_SLASH
140e0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53  :.    case TK_LS
140f0 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54  HIFT:.    case T
14100 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63  K_RSHIFT: .    c
14110 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b  ase TK_CONCAT: {
14120 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
14130 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b  K_AND==OP_And );
14140 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
14150 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 0a 20  K_OR==OP_Or );. 
14160 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
14170 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 0a  PLUS==OP_Add );.
14180 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
14190 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72  _MINUS==OP_Subtr
141a0 61 63 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  act );.      ass
141b0 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f  ert( TK_REM==OP_
141c0 52 65 6d 61 69 6e 64 65 72 20 29 3b 0a 20 20 20  Remainder );.   
141d0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49     assert( TK_BI
141e0 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20  TAND==OP_BitAnd 
141f0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14200 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69   TK_BITOR==OP_Bi
14210 74 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  tOr );.      ass
14220 65 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f  ert( TK_SLASH==O
14230 50 5f 44 69 76 69 64 65 20 29 3b 0a 20 20 20 20  P_Divide );.    
14240 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48    assert( TK_LSH
14250 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66  IFT==OP_ShiftLef
14260 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
14270 74 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50  t( TK_RSHIFT==OP
14280 5f 53 68 69 66 74 52 69 67 68 74 20 29 3b 0a 20  _ShiftRight );. 
14290 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
142a0 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61  CONCAT==OP_Conca
142b0 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
142c0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20  ase( op==TK_AND 
142d0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
142e0 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a  e( op==TK_OR );.
142f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14300 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20  op==TK_PLUS );. 
14310 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
14320 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20  p==TK_MINUS );. 
14330 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
14340 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20 20  p==TK_REM );.   
14350 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
14360 3d 54 4b 5f 42 49 54 41 4e 44 20 29 3b 0a 20 20  =TK_BITAND );.  
14370 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
14380 3d 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20 20  ==TK_BITOR );.  
14390 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
143a0 3d 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20  ==TK_SLASH );.  
143b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
143c0 3d 3d 54 4b 5f 4c 53 48 49 46 54 20 29 3b 0a 20  ==TK_LSHIFT );. 
143d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
143e0 70 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a  p==TK_RSHIFT );.
143f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14400 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b  op==TK_CONCAT );
14410 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
14420 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
14430 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
14440 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
14450 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
14460 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
14470 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
14480 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
14490 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
144a0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f  3VdbeAddOp3(v, o
144b0 70 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65  p, r2, r1, targe
144c0 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
144d0 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
144e0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
144f0 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
14500 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
14510 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
14520 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20  _UMINUS: {.     
14530 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
14540 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
14550 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74     assert( pLeft
14560 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
14570 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41  eft->op==TK_FLOA
14580 54 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  T ){.        ass
14590 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
145a0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
145b0 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
145c0 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c       codeReal(v,
145d0 20 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e   pLeft->u.zToken
145e0 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 1, target);.  
145f0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c      }else if( pL
14600 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45  eft->op==TK_INTE
14610 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 63  GER ){.        c
14620 6f 64 65 49 6e 74 65 67 65 72 28 76 2c 20 70 4c  odeInteger(v, pL
14630 65 66 74 2c 20 31 2c 20 74 61 72 67 65 74 29 3b  eft, 1, target);
14640 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
14650 20 20 20 20 20 20 72 65 67 46 72 65 65 31 20 3d        regFree1 =
14660 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
14670 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
14680 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14690 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
146a0 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 31 29  _Integer, 0, r1)
146b0 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73  ;.        r2 = s
146c0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
146d0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
146e0 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
146f0 65 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  e2);.        sql
14700 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
14710 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72  , OP_Subtract, r
14720 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a  2, r1, target);.
14730 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
14740 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
14750 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
14760 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20  nReg = target;. 
14770 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14780 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  }.    case TK_BI
14790 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54  TNOT:.    case T
147a0 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61  K_NOT: {.      a
147b0 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54  ssert( TK_BITNOT
147c0 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 0a 20  ==OP_BitNot );. 
147d0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
147e0 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 0a 20  NOT==OP_Not );. 
147f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
14800 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a  p==TK_BITNOT );.
14810 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14820 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20  op==TK_NOT );.  
14830 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
14840 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
14850 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
14860 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
14870 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
14880 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
14890 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67      inReg = targ
148a0 65 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  et;.      sqlite
148b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
148c0 70 2c 20 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20  p, r1, inReg);. 
148d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
148e0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
148f0 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
14900 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
14910 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
14920 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53     assert( TK_IS
14930 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  NULL==OP_IsNull 
14940 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14950 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f   TK_NOTNULL==OP_
14960 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20  NotNull );.     
14970 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
14980 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  K_ISNULL );.    
14990 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
149a0 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20  TK_NOTNULL );.  
149b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
149c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
149d0 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b  ger, 1, target);
149e0 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
149f0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
14a00 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
14a10 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
14a20 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14a30 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
14a40 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
14a50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
14a60 76 2c 20 6f 70 2c 20 72 31 29 3b 0a 20 20 20 20  v, op, r1);.    
14a70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14a80 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
14a90 2c 20 74 61 72 67 65 74 2c 20 2d 31 29 3b 0a 20  , target, -1);. 
14aa0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14ab0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
14ac0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
14ad0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
14ae0 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20  K_AGG_FUNCTION: 
14af0 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20  {.      AggInfo 
14b00 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e  *pInfo = pExpr->
14b10 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
14b20 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a  if( pInfo==0 ){.
14b30 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
14b40 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
14b50 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
14b60 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  lue) );.        
14b70 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
14b80 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20  pParse, "misuse 
14b90 6f 66 20 61 67 67 72 65 67 61 74 65 3a 20 25 73  of aggregate: %s
14ba0 28 29 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ()", pExpr->u.zT
14bb0 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  oken);.      }el
14bc0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 52 65  se{.        inRe
14bd0 67 20 3d 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63  g = pInfo->aFunc
14be0 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d  [pExpr->iAgg].iM
14bf0 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  em;.      }.    
14c00 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
14c10 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54     case TK_CONST
14c20 5f 46 55 4e 43 3a 0a 20 20 20 20 63 61 73 65 20  _FUNC:.    case 
14c30 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  TK_FUNCTION: {. 
14c40 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
14c50 46 61 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c  Farg;       /* L
14c60 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20  ist of function 
14c70 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
14c80 20 20 20 69 6e 74 20 6e 46 61 72 67 3b 20 20 20     int nFarg;   
14c90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
14ca0 62 65 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20  ber of function 
14cb0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
14cc0 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66     FuncDef *pDef
14cd0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
14ce0 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69   function defini
14cf0 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  tion object */. 
14d00 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 20 20 20       int nId;   
14d10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
14d20 65 6e 67 74 68 20 6f 66 20 74 68 65 20 66 75 6e  ength of the fun
14d30 63 74 69 6f 6e 20 6e 61 6d 65 20 69 6e 20 62 79  ction name in by
14d40 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e  tes */.      con
14d50 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20  st char *zId;   
14d60 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74      /* The funct
14d70 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ion name */.    
14d80 20 20 69 6e 74 20 63 6f 6e 73 74 4d 61 73 6b 20    int constMask 
14d90 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4d 61 73 6b  = 0;     /* Mask
14da0 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67   of function arg
14db0 75 6d 65 6e 74 73 20 74 68 61 74 20 61 72 65 20  uments that are 
14dc0 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20 20 20 20  constant */.    
14dd0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
14de0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
14df0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
14e00 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64    u8 enc = ENC(d
14e10 62 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  b);      /* The 
14e20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 75 73  text encoding us
14e30 65 64 20 62 79 20 74 68 69 73 20 64 61 74 61 62  ed by this datab
14e40 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c  ase */.      Col
14e50 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b  lSeq *pColl = 0;
14e60 20 20 20 20 2f 2a 20 41 20 63 6f 6c 6c 61 74 69      /* A collati
14e70 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a  ng sequence */..
14e80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
14e90 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
14ea0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
14eb0 63 74 29 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ct) );.      tes
14ec0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f  tcase( op==TK_CO
14ed0 4e 53 54 5f 46 55 4e 43 20 29 3b 0a 20 20 20 20  NST_FUNC );.    
14ee0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
14ef0 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  TK_FUNCTION );. 
14f00 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
14f10 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70  AnyProperty(pExp
14f20 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  r, EP_TokenOnly)
14f30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72   ){.        pFar
14f40 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  g = 0;.      }el
14f50 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72  se{.        pFar
14f60 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  g = pExpr->x.pLi
14f70 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  st;.      }.    
14f80 20 20 6e 46 61 72 67 20 3d 20 70 46 61 72 67 20    nFarg = pFarg 
14f90 3f 20 70 46 61 72 67 2d 3e 6e 45 78 70 72 20 3a  ? pFarg->nExpr :
14fa0 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
14fb0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
14fc0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
14fd0 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
14fe0 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a  zId = pExpr->u.z
14ff0 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 49 64  Token;.      nId
15000 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
15010 33 30 28 7a 49 64 29 3b 0a 20 20 20 20 20 20 70  30(zId);.      p
15020 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Def = sqlite3Fin
15030 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 49  dFunction(db, zI
15040 64 2c 20 6e 49 64 2c 20 6e 46 61 72 67 2c 20 65  d, nId, nFarg, e
15050 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  nc, 0);.      if
15060 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ( pDef==0 ){.   
15070 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
15080 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
15090 6b 6e 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 3a 20  known function: 
150a0 25 2e 2a 73 28 29 22 2c 20 6e 49 64 2c 20 7a 49  %.*s()", nId, zI
150b0 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  d);.        brea
150c0 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
150d0 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 61 20 64    /* Attempt a d
150e0 69 72 65 63 74 20 69 6d 70 6c 65 6d 65 6e 74 61  irect implementa
150f0 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c  tion of the buil
15100 74 2d 69 6e 20 43 4f 41 4c 45 53 43 45 28 29 20  t-in COALESCE() 
15110 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 49 46 4e  and.      ** IFN
15120 55 4c 4c 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e  ULL() functions.
15130 20 20 54 68 69 73 20 61 76 6f 69 64 73 20 75 6e    This avoids un
15140 6e 65 63 65 73 73 61 72 79 20 65 76 61 6c 61 74  necessary evalat
15150 69 6f 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ion of.      ** 
15160 61 72 67 75 6d 65 6e 74 73 20 70 61 73 74 20 74  arguments past t
15170 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c  he first non-NUL
15180 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20  L argument..    
15190 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
151a0 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  Def->flags & SQL
151b0 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43  ITE_FUNC_COALESC
151c0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  E ){.        int
151d0 20 65 6e 64 43 6f 61 6c 65 73 63 65 20 3d 20 73   endCoalesce = s
151e0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
151f0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
15200 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 32  assert( nFarg>=2
15210 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
15220 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
15230 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  se, pFarg->a[0].
15240 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
15250 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b          for(i=1;
15260 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a   i<nFarg; i++){.
15270 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15280 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15290 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72 67 65  P_NotNull, targe
152a0 74 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b  t, endCoalesce);
152b0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
152c0 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76  e3ExprCacheRemov
152d0 65 28 70 50 61 72 73 65 2c 20 74 61 72 67 65 74  e(pParse, target
152e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
152f0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
15300 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
15310 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
15320 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46 61  Code(pParse, pFa
15330 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  rg->a[i].pExpr, 
15340 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
15350 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
15360 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31  chePop(pParse, 1
15370 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
15380 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15390 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
153a0 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20  endCoalesce);.  
153b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
153c0 20 20 20 7d 0a 0a 0a 20 20 20 20 20 20 69 66 28     }...      if(
153d0 20 70 46 61 72 67 20 29 7b 0a 20 20 20 20 20 20   pFarg ){.      
153e0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
153f0 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
15400 65 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20  e, nFarg);.     
15410 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
15420 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
15430 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32       /* Ticket 2
15440 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20  ea2425d34be */. 
15450 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
15460 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
15470 50 61 72 73 65 2c 20 70 46 61 72 67 2c 20 72 31  Parse, pFarg, r1
15480 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 1);.        sq
15490 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
154a0 70 28 70 50 61 72 73 65 2c 20 31 29 3b 20 20 20  p(pParse, 1);   
154b0 2f 2a 20 54 69 63 6b 65 74 20 32 65 61 32 34 32  /* Ticket 2ea242
154c0 35 64 33 34 62 65 20 2a 2f 0a 20 20 20 20 20 20  5d34be */.      
154d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
154e0 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  1 = 0;.      }.#
154f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15500 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
15510 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c        /* Possibl
15520 79 20 6f 76 65 72 6c 6f 61 64 20 74 68 65 20 66  y overload the f
15530 75 6e 63 74 69 6f 6e 20 69 66 20 74 68 65 20 66  unction if the f
15540 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
15550 0a 20 20 20 20 20 20 2a 2a 20 61 20 76 69 72 74  .      ** a virt
15560 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  ual table column
15570 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
15580 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78 20 66 75   ** For infix fu
15590 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47  nctions (LIKE, G
155a0 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20 61 6e 64  LOB, REGEXP, and
155b0 20 4d 41 54 43 48 29 20 75 73 65 20 74 68 65 0a   MATCH) use the.
155c0 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20        ** second 
155d0 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68  argument, not th
155e0 65 20 66 69 72 73 74 2c 20 61 73 20 74 68 65 20  e first, as the 
155f0 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 65 73 74  argument to test
15600 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65   to.      ** see
15610 20 69 66 20 69 74 20 69 73 20 61 20 63 6f 6c 75   if it is a colu
15620 6d 6e 20 69 6e 20 61 20 76 69 72 74 75 61 6c 20  mn in a virtual 
15630 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20  table.  This is 
15640 64 6f 6e 65 20 62 65 63 61 75 73 65 0a 20 20 20  done because.   
15650 20 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f     ** the left o
15660 70 65 72 61 6e 64 20 6f 66 20 69 6e 66 69 78 20  perand of infix 
15670 66 75 6e 63 74 69 6f 6e 73 20 28 74 68 65 20 6f  functions (the o
15680 70 65 72 61 6e 64 20 77 65 20 77 61 6e 74 20 74  perand we want t
15690 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72  o.      ** contr
156a0 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20  ol overloading) 
156b0 65 6e 64 73 20 75 70 20 61 73 20 74 68 65 20 73  ends up as the s
156c0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
156d0 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66  o the.      ** f
156e0 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 65 78  unction.  The ex
156f0 70 72 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62  pression "A glob
15700 20 42 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e   B" is equivalen
15710 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22  t to .      ** "
15720 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57 65 20 77  glob(B,A).  We w
15730 61 6e 74 20 74 6f 20 75 73 65 20 74 68 65 20 41  ant to use the A
15740 20 69 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 74   in "A glob B" t
15750 6f 20 74 65 73 74 0a 20 20 20 20 20 20 2a 2a 20  o test.      ** 
15760 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65  for function ove
15770 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75 74 20 77  rloading.  But w
15780 65 20 75 73 65 20 74 68 65 20 42 20 74 65 72 6d  e use the B term
15790 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e   in "glob(B,A)".
157a0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
157b0 69 66 28 20 6e 46 61 72 67 3e 3d 32 20 26 26 20  if( nFarg>=2 && 
157c0 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20  (pExpr->flags & 
157d0 45 50 5f 49 6e 66 69 78 46 75 6e 63 29 20 29 7b  EP_InfixFunc) ){
157e0 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20  .        pDef = 
157f0 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c  sqlite3VtabOverl
15800 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  oadFunction(db, 
15810 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61  pDef, nFarg, pFa
15820 72 67 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b  rg->a[1].pExpr);
15830 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
15840 20 6e 46 61 72 67 3e 30 20 29 7b 0a 20 20 20 20   nFarg>0 ){.    
15850 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
15860 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75  e3VtabOverloadFu
15870 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c  nction(db, pDef,
15880 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61   nFarg, pFarg->a
15890 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [0].pExpr);.    
158a0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
158b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 61 72   for(i=0; i<nFar
158c0 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
158d0 20 69 66 28 20 69 3c 33 32 20 26 26 20 73 71 6c   if( i<32 && sql
158e0 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
158f0 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70  nt(pFarg->a[i].p
15900 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
15910 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20     constMask |= 
15920 28 31 3c 3c 69 29 3b 0a 20 20 20 20 20 20 20 20  (1<<i);.        
15930 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  }.        if( (p
15940 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  Def->flags & SQL
15950 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c  ITE_FUNC_NEEDCOL
15960 4c 29 21 3d 30 20 26 26 20 21 70 43 6f 6c 6c 20  L)!=0 && !pColl 
15970 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  ){.          pCo
15980 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
15990 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
159a0 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70  pFarg->a[i].pExp
159b0 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
159c0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
159d0 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51  pDef->flags & SQ
159e0 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
159f0 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  LL ){.        if
15a00 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
15a10 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
15a20 3b 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ; .        sqlit
15a30 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
15a40 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30  OP_CollSeq, 0, 0
15a50 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f  , 0, (char *)pCo
15a60 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
15a70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
15a80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
15a90 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c  (v, OP_Function,
15aa0 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20   constMask, r1, 
15ab0 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20  target,.        
15ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ad0 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50 34 5f  (char*)pDef, P4_
15ae0 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20  FUNCDEF);.      
15af0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
15b00 65 50 35 28 76 2c 20 28 75 38 29 6e 46 61 72 67  eP5(v, (u8)nFarg
15b10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61  );.      if( nFa
15b20 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rg ){.        sq
15b30 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
15b40 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31  Range(pParse, r1
15b50 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20  , nFarg);.      
15b60 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
15b70 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
15b80 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
15b90 31 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20  1, nFarg);.     
15ba0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
15bb0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
15bc0 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
15bd0 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20  ase TK_EXISTS:. 
15be0 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43     case TK_SELEC
15bf0 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  T: {.      testc
15c00 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 58 49 53  ase( op==TK_EXIS
15c10 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  TS );.      test
15c20 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c  case( op==TK_SEL
15c30 45 43 54 20 29 3b 0a 20 20 20 20 20 20 69 6e 52  ECT );.      inR
15c40 65 67 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  eg = sqlite3Code
15c50 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
15c60 2c 20 70 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a  , pExpr, 0, 0);.
15c70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15c80 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
15c90 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  N: {.      int d
15ca0 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c  estIfFalse = sql
15cb0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
15cc0 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  l(v);.      int 
15cd0 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c  destIfNull = sql
15ce0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
15cf0 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  l(v);.      sqli
15d00 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15d10 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72   OP_Null, 0, tar
15d20 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  get);.      sqli
15d30 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50  te3ExprCodeIN(pP
15d40 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
15d50 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66  tIfFalse, destIf
15d60 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
15d70 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15d80 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
15d90 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
15da0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
15db0 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49  veLabel(v, destI
15dc0 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 73  fFalse);.      s
15dd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15de0 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74  (v, OP_AddImm, t
15df0 61 72 67 65 74 2c 20 30 29 3b 0a 20 20 20 20 20  arget, 0);.     
15e00 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
15e10 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74  lveLabel(v, dest
15e20 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
15e30 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
15e40 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
15e50 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 0a  T_SUBQUERY */...
15e60 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20      /*.    **   
15e70 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44   x BETWEEN y AND
15e80 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a   z.    **.    **
15e90 20 54 68 69 73 20 69 73 20 65 71 75 69 76 61 6c   This is equival
15ea0 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20  ent to.    **.  
15eb0 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44    **    x>=y AND
15ec0 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20   x<=z.    **.   
15ed0 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65 64 20   ** X is stored 
15ee0 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e  in pExpr->pLeft.
15ef0 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73 74 6f  .    ** Y is sto
15f00 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
15f10 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e  ist->a[0].pExpr.
15f20 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f  .    ** Z is sto
15f30 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
15f40 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e  ist->a[1].pExpr.
15f50 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
15f60 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
15f70 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
15f80 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
15f90 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
15fa0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 49  prList_item *pLI
15fb0 74 65 6d 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  tem = pExpr->x.p
15fc0 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 45  List->a;.      E
15fd0 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 4c  xpr *pRight = pL
15fe0 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20  Item->pExpr;..  
15ff0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
16000 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
16010 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 72 65 67  rse, pLeft, &reg
16020 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
16030 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
16040 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
16050 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
16060 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
16070 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
16080 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
16090 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
160a0 0a 20 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69  .      r3 = sqli
160b0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
160c0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72 34 20  arse);.      r4 
160d0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
160e0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
160f0 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
16100 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52  Parse, pLeft, pR
16110 69 67 68 74 2c 20 4f 50 5f 47 65 2c 0a 20 20 20  ight, OP_Ge,.   
16120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
16130 31 2c 20 72 32 2c 20 72 33 2c 20 53 51 4c 49 54  1, r2, r3, SQLIT
16140 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20  E_STOREP2);.    
16150 20 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20 20 20 20    pLItem++;.    
16160 20 20 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65    pRight = pLIte
16170 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
16180 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
16190 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
161a0 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 72  gFree2);.      r
161b0 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
161c0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
161d0 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
161e0 32 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  2);.      testca
161f0 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
16200 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
16210 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65  pare(pParse, pLe
16220 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c  ft, pRight, OP_L
16230 65 2c 20 72 31 2c 20 72 32 2c 20 72 34 2c 20 53  e, r1, r2, r4, S
16240 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a  QLITE_STOREP2);.
16250 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16260 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 6e  eAddOp3(v, OP_An
16270 64 2c 20 72 33 2c 20 72 34 2c 20 74 61 72 67 65  d, r3, r4, targe
16280 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
16290 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
162a0 70 50 61 72 73 65 2c 20 72 33 29 3b 0a 20 20 20  pParse, r3);.   
162b0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
162c0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
162d0 20 72 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r4);.      brea
162e0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
162f0 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20  e TK_UPLUS: {.  
16300 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
16310 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
16320 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
16330 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b  >pLeft, target);
16340 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
16350 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b    }..    case TK
16360 5f 54 52 49 47 47 45 52 3a 20 7b 0a 20 20 20 20  _TRIGGER: {.    
16370 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 63 6f    /* If the opco
16380 64 65 20 69 73 20 54 4b 5f 54 52 49 47 47 45 52  de is TK_TRIGGER
16390 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65  , then the expre
163a0 73 73 69 6f 6e 20 69 73 20 61 20 72 65 66 65 72  ssion is a refer
163b0 65 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  ence.      ** to
163c0 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65   a column in the
163d0 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20   new.* or old.* 
163e0 70 73 65 75 64 6f 2d 74 61 62 6c 65 73 20 61 76  pseudo-tables av
163f0 61 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20 20 20  ailable to.     
16400 20 2a 2a 20 74 72 69 67 67 65 72 20 70 72 6f 67   ** trigger prog
16410 72 61 6d 73 2e 20 49 6e 20 74 68 69 73 20 63 61  rams. In this ca
16420 73 65 20 45 78 70 72 2e 69 54 61 62 6c 65 20 69  se Expr.iTable i
16430 73 20 73 65 74 20 74 6f 20 31 20 66 6f 72 20 74  s set to 1 for t
16440 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e  he.      ** new.
16450 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20  * pseudo-table, 
16460 6f 72 20 30 20 66 6f 72 20 74 68 65 20 6f 6c 64  or 0 for the old
16470 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e  .* pseudo-table.
16480 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20   Expr.iColumn.  
16490 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f      ** is set to
164a0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74   the column of t
164b0 68 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20  he pseudo-table 
164c0 74 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d  to read, or to -
164d0 31 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65  1 to.      ** re
164e0 61 64 20 74 68 65 20 72 6f 77 69 64 20 66 69 65  ad the rowid fie
164f0 6c 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ld..      **.   
16500 20 20 20 2a 2a 20 54 68 65 20 65 78 70 72 65 73     ** The expres
16510 73 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e  sion is implemen
16520 74 65 64 20 75 73 69 6e 67 20 61 6e 20 4f 50 5f  ted using an OP_
16530 50 61 72 61 6d 20 6f 70 63 6f 64 65 2e 20 54 68  Param opcode. Th
16540 65 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 70 61  e p1.      ** pa
16550 72 61 6d 65 74 65 72 20 69 73 20 73 65 74 20 74  rameter is set t
16560 6f 20 30 20 66 6f 72 20 61 6e 20 6f 6c 64 2e 72  o 0 for an old.r
16570 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20  owid reference, 
16580 6f 72 20 74 6f 20 28 69 2b 31 29 0a 20 20 20 20  or to (i+1).    
16590 20 20 2a 2a 20 74 6f 20 72 65 66 65 72 65 6e 63    ** to referenc
165a0 65 20 61 6e 6f 74 68 65 72 20 63 6f 6c 75 6d 6e  e another column
165b0 20 6f 66 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73   of the old.* ps
165c0 65 75 64 6f 2d 74 61 62 6c 65 2c 20 77 68 65 72  eudo-table, wher
165d0 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 20 69 73  e .      ** i is
165e0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
165f0 65 20 63 6f 6c 75 6d 6e 2e 20 46 6f 72 20 61 20  e column. For a 
16600 6e 65 77 2e 72 6f 77 69 64 20 72 65 66 65 72 65  new.rowid refere
16610 6e 63 65 2c 20 70 31 20 69 73 0a 20 20 20 20 20  nce, p1 is.     
16620 20 2a 2a 20 73 65 74 20 74 6f 20 28 6e 2b 31 29   ** set to (n+1)
16630 2c 20 77 68 65 72 65 20 6e 20 69 73 20 74 68 65  , where n is the
16640 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
16650 6e 73 20 69 6e 20 65 61 63 68 20 70 73 65 75 64  ns in each pseud
16660 6f 2d 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a  o-table..      *
16670 2a 20 46 6f 72 20 61 20 72 65 66 65 72 65 6e 63  * For a referenc
16680 65 20 74 6f 20 61 6e 79 20 6f 74 68 65 72 20 63  e to any other c
16690 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77  olumn in the new
166a0 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c  .* pseudo-table,
166b0 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 69 73 20   p1.      ** is 
166c0 73 65 74 20 74 6f 20 28 6e 2b 32 2b 69 29 2c 20  set to (n+2+i), 
166d0 77 68 65 72 65 20 6e 20 61 6e 64 20 69 20 61 72  where n and i ar
166e0 65 20 61 73 20 64 65 66 69 6e 65 64 20 70 72 65  e as defined pre
166f0 76 69 6f 75 73 6c 79 2e 20 46 6f 72 0a 20 20 20  viously. For.   
16700 20 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69     ** example, i
16710 66 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 77  f the table on w
16720 68 69 63 68 20 74 72 69 67 67 65 72 73 20 61 72  hich triggers ar
16730 65 20 62 65 69 6e 67 20 66 69 72 65 64 20 69 73  e being fired is
16740 0a 20 20 20 20 20 20 2a 2a 20 64 65 63 6c 61 72  .      ** declar
16750 65 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a  ed as:.      **.
16760 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54        **   CREAT
16770 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
16780 3b 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ;.      **.     
16790 20 2a 2a 20 54 68 65 6e 20 70 31 20 69 73 20 69   ** Then p1 is i
167a0 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f  nterpreted as fo
167b0 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a  llows:.      **.
167c0 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 30        **   p1==0
167d0 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 72 6f 77     ->    old.row
167e0 69 64 20 20 20 20 20 70 31 3d 3d 33 20 20 20 2d  id     p1==3   -
167f0 3e 20 20 20 20 6e 65 77 2e 72 6f 77 69 64 0a 20  >    new.rowid. 
16800 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 31 20       **   p1==1 
16810 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 61 20 20 20    ->    old.a   
16820 20 20 20 20 20 20 70 31 3d 3d 34 20 20 20 2d 3e        p1==4   ->
16830 20 20 20 20 6e 65 77 2e 61 0a 20 20 20 20 20 20      new.a.      
16840 2a 2a 20 20 20 70 31 3d 3d 32 20 20 20 2d 3e 20  **   p1==2   -> 
16850 20 20 20 6f 6c 64 2e 62 20 20 20 20 20 20 20 20     old.b        
16860 20 70 31 3d 3d 35 20 20 20 2d 3e 20 20 20 20 6e   p1==5   ->    n
16870 65 77 2e 62 20 20 20 20 20 20 20 0a 20 20 20 20  ew.b       .    
16880 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65    */.      Table
16890 20 2a 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e   *pTab = pExpr->
168a0 70 54 61 62 3b 0a 20 20 20 20 20 20 69 6e 74 20  pTab;.      int 
168b0 70 31 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  p1 = pExpr->iTab
168c0 6c 65 20 2a 20 28 70 54 61 62 2d 3e 6e 43 6f 6c  le * (pTab->nCol
168d0 2b 31 29 20 2b 20 31 20 2b 20 70 45 78 70 72 2d  +1) + 1 + pExpr-
168e0 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20  >iColumn;..     
168f0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
16900 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78  iTable==0 || pEx
16910 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 31 20 29 3b  pr->iTable==1 );
16920 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
16930 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d  Expr->iColumn>=-
16940 31 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c  1 && pExpr->iCol
16950 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  umn<pTab->nCol )
16960 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
16970 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c  pTab->iPKey<0 ||
16980 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21   pExpr->iColumn!
16990 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 3b 0a  =pTab->iPKey );.
169a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 31        assert( p1
169b0 3e 3d 30 20 26 26 20 70 31 3c 28 70 54 61 62 2d  >=0 && p1<(pTab-
169c0 3e 6e 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20  >nCol*2+2) );.. 
169d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
169e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50 61 72  AddOp2(v, OP_Par
169f0 61 6d 2c 20 70 31 2c 20 74 61 72 67 65 74 29 3b  am, p1, target);
16a00 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
16a10 6e 74 28 28 76 2c 20 22 25 73 2e 25 73 20 2d 3e  nt((v, "%s.%s ->
16a20 20 24 25 64 22 2c 0a 20 20 20 20 20 20 20 20 28   $%d",.        (
16a30 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20  pExpr->iTable ? 
16a40 22 6e 65 77 22 20 3a 20 22 6f 6c 64 22 29 2c 0a  "new" : "old"),.
16a50 20 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e          (pExpr->
16a60 69 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f 77  iColumn<0 ? "row
16a70 69 64 22 20 3a 20 70 45 78 70 72 2d 3e 70 54 61  id" : pExpr->pTa
16a80 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69  b->aCol[pExpr->i
16a90 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 2c 0a  Column].zName),.
16aa0 20 20 20 20 20 20 20 20 74 61 72 67 65 74 0a 20          target. 
16ab0 20 20 20 20 20 29 29 3b 0a 0a 20 20 20 20 20 20       ));..      
16ac0 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e  /* If the column
16ad0 20 68 61 73 20 52 45 41 4c 20 61 66 66 69 6e 69   has REAL affini
16ae0 74 79 2c 20 69 74 20 6d 61 79 20 63 75 72 72 65  ty, it may curre
16af0 6e 74 6c 79 20 62 65 20 73 74 6f 72 65 64 20 61  ntly be stored a
16b00 73 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e  s an.      ** in
16b10 74 65 67 65 72 2e 20 55 73 65 20 4f 50 5f 52 65  teger. Use OP_Re
16b20 61 6c 41 66 66 69 6e 69 74 79 20 74 6f 20 6d 61  alAffinity to ma
16b30 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 72 65  ke sure it is re
16b40 61 6c 6c 79 20 72 65 61 6c 2e 20 20 2a 2f 0a 20  ally real.  */. 
16b50 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
16b60 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20 20  iColumn>=0 .    
16b70 20 20 20 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c     && pTab->aCol
16b80 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
16b90 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  .affinity==SQLIT
16ba0 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20 20 20 20  E_AFF_REAL.     
16bb0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
16bc0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
16bd0 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79   OP_RealAffinity
16be0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
16bf0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
16c00 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20      }...    /*. 
16c10 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a 20 20     ** Form A:.  
16c20 20 20 2a 2a 20 20 20 43 41 53 45 20 78 20 57 48    **   CASE x WH
16c30 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57 48  EN e1 THEN r1 WH
16c40 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e  EN e2 THEN r2 ..
16c50 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72  . WHEN eN THEN r
16c60 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20  N ELSE y END.   
16c70 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20   **.    ** Form 
16c80 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45  B:.    **   CASE
16c90 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31   WHEN e1 THEN r1
16ca0 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32   WHEN e2 THEN r2
16cb0 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45   ... WHEN eN THE
16cc0 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a  N rN ELSE y END.
16cd0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f      **.    ** Fo
16ce0 72 6d 20 41 20 69 73 20 63 61 6e 20 62 65 20 74  rm A is can be t
16cf0 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20  ransformed into 
16d00 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66  the equivalent f
16d10 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c 6f 77 73  orm B as follows
16d20 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20  :.    **   CASE 
16d30 57 48 45 4e 20 78 3d 65 31 20 54 48 45 4e 20 72  WHEN x=e1 THEN r
16d40 31 20 57 48 45 4e 20 78 3d 65 32 20 54 48 45 4e  1 WHEN x=e2 THEN
16d50 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20   r2 ....    **  
16d60 20 20 20 20 20 20 57 48 45 4e 20 78 3d 65 4e 20        WHEN x=eN 
16d70 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45  THEN rN ELSE y E
16d80 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ND.    **.    **
16d90 20 58 20 28 69 66 20 69 74 20 65 78 69 73 74 73   X (if it exists
16da0 29 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70  ) is in pExpr->p
16db0 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69  Left..    ** Y i
16dc0 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 52 69 67  s in pExpr->pRig
16dd0 68 74 2e 20 20 54 68 65 20 59 20 69 73 20 61 6c  ht.  The Y is al
16de0 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66  so optional.  If
16df0 20 74 68 65 72 65 20 69 73 20 6e 6f 0a 20 20 20   there is no.   
16e00 20 2a 2a 20 45 4c 53 45 20 63 6c 61 75 73 65 20   ** ELSE clause 
16e10 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 74 65 72  and no other ter
16e20 6d 20 6d 61 74 63 68 65 73 2c 20 74 68 65 6e 20  m matches, then 
16e30 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
16e40 65 0a 20 20 20 20 2a 2a 20 65 78 70 72 73 73 69  e.    ** exprssi
16e50 6f 6e 20 69 73 20 4e 55 4c 4c 2e 0a 20 20 20 20  on is NULL..    
16e60 2a 2a 20 45 69 20 69 73 20 69 6e 20 70 45 78 70  ** Ei is in pExp
16e70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d  r->pList->a[i*2]
16e80 20 61 6e 64 20 52 69 20 69 73 20 70 45 78 70 72   and Ri is pExpr
16e90 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 2b 31  ->pList->a[i*2+1
16ea0 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ]..    **.    **
16eb0 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   The result of t
16ec0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
16ed0 20 74 68 65 20 52 69 20 66 6f 72 20 74 68 65 20   the Ri for the 
16ee0 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20 45  first matching E
16ef0 69 2c 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66 20  i,.    ** or if 
16f00 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 74 63  there is no matc
16f10 68 69 6e 67 20 45 69 2c 20 74 68 65 20 45 4c 53  hing Ei, the ELS
16f20 45 20 74 65 72 6d 20 59 2c 20 6f 72 20 69 66 20  E term Y, or if 
16f30 74 68 65 72 65 20 69 73 0a 20 20 20 20 2a 2a 20  there is.    ** 
16f40 6e 6f 20 45 4c 53 45 20 74 65 72 6d 2c 20 4e 55  no ELSE term, NU
16f50 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  LL..    */.    d
16f60 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20  efault: assert( 
16f70 6f 70 3d 3d 54 4b 5f 43 41 53 45 20 29 3b 20 7b  op==TK_CASE ); {
16f80 0a 20 20 20 20 20 20 69 6e 74 20 65 6e 64 4c 61  .      int endLa
16f90 62 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  bel;            
16fa0 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f           /* GOTO
16fb0 20 6c 61 62 65 6c 20 66 6f 72 20 65 6e 64 20 6f   label for end o
16fc0 66 20 43 41 53 45 20 73 74 6d 74 20 2a 2f 0a 20  f CASE stmt */. 
16fd0 20 20 20 20 20 69 6e 74 20 6e 65 78 74 43 61 73       int nextCas
16fe0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
16ff0 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c         /* GOTO l
17000 61 62 65 6c 20 66 6f 72 20 6e 65 78 74 20 57 48  abel for next WH
17010 45 4e 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  EN clause */.   
17020 20 20 20 69 6e 74 20 6e 45 78 70 72 3b 20 20 20     int nExpr;   
17030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17040 20 20 20 20 20 2f 2a 20 32 78 20 6e 75 6d 62 65       /* 2x numbe
17050 72 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20  r of WHEN terms 
17060 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20  */.      int i; 
17070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17080 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
17090 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
170a0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
170b0 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
170c0 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
170d0 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20   WHEN terms */. 
170e0 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
170f0 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74  List_item *aList
17100 65 6c 65 6d 3b 20 20 2f 2a 20 41 72 72 61 79 20  elem;  /* Array 
17110 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f  of WHEN terms */
17120 0a 20 20 20 20 20 20 45 78 70 72 20 6f 70 43 6f  .      Expr opCo
17130 6d 70 61 72 65 3b 20 20 20 20 20 20 20 20 20 20  mpare;          
17140 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
17150 58 3d 3d 45 69 20 65 78 70 72 65 73 73 69 6f 6e  X==Ei expression
17160 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 63   */.      Expr c
17170 61 63 68 65 58 3b 20 20 20 20 20 20 20 20 20 20  acheX;          
17180 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
17190 61 63 68 65 64 20 65 78 70 72 65 73 73 69 6f 6e  ached expression
171a0 20 58 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72   X */.      Expr
171b0 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
171c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
171d0 20 54 68 65 20 58 20 65 78 70 72 65 73 73 69 6f   The X expressio
171e0 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  n */.      Expr 
171f0 2a 70 54 65 73 74 20 3d 20 30 3b 20 20 20 20 20  *pTest = 0;     
17200 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17210 58 3d 3d 45 69 20 28 66 6f 72 6d 20 41 29 20 6f  X==Ei (form A) o
17220 72 20 6a 75 73 74 20 45 69 20 28 66 6f 72 6d 20  r just Ei (form 
17230 42 29 20 2a 2f 0a 20 20 20 20 20 20 56 56 41 5f  B) */.      VVA_
17240 4f 4e 4c 59 28 20 69 6e 74 20 69 43 61 63 68 65  ONLY( int iCache
17250 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e  Level = pParse->
17260 69 43 61 63 68 65 4c 65 76 65 6c 3b 20 29 0a 0a  iCacheLevel; )..
17270 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
17280 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
17290 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
172a0 63 74 29 20 26 26 20 70 45 78 70 72 2d 3e 78 2e  ct) && pExpr->x.
172b0 70 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 61  pList );.      a
172c0 73 73 65 72 74 28 28 70 45 78 70 72 2d 3e 78 2e  ssert((pExpr->x.
172d0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 25 20 32  pList->nExpr % 2
172e0 29 20 3d 3d 20 30 29 3b 0a 20 20 20 20 20 20 61  ) == 0);.      a
172f0 73 73 65 72 74 28 70 45 78 70 72 2d 3e 78 2e 70  ssert(pExpr->x.p
17300 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29  List->nExpr > 0)
17310 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d  ;.      pEList =
17320 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
17330 0a 20 20 20 20 20 20 61 4c 69 73 74 65 6c 65 6d  .      aListelem
17340 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20   = pEList->a;.  
17350 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45 4c 69      nExpr = pELi
17360 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  st->nExpr;.     
17370 20 65 6e 64 4c 61 62 65 6c 20 3d 20 73 71 6c 69   endLabel = sqli
17380 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
17390 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  (v);.      if( (
173a0 70 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  pX = pExpr->pLef
173b0 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  t)!=0 ){.       
173c0 20 63 61 63 68 65 58 20 3d 20 2a 70 58 3b 0a 20   cacheX = *pX;. 
173d0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
173e0 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55   pX->op==TK_COLU
173f0 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  MN );.        te
17400 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d  stcase( pX->op==
17410 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20  TK_REGISTER );. 
17420 20 20 20 20 20 20 20 63 61 63 68 65 58 2e 69 54         cacheX.iT
17430 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 45 78  able = sqlite3Ex
17440 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
17450 65 2c 20 70 58 2c 20 26 72 65 67 46 72 65 65 31  e, pX, &regFree1
17460 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
17470 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
17480 20 29 3b 0a 20 20 20 20 20 20 20 20 63 61 63 68   );.        cach
17490 65 58 2e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53  eX.op = TK_REGIS
174a0 54 45 52 3b 0a 20 20 20 20 20 20 20 20 6f 70 43  TER;.        opC
174b0 6f 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b 5f 45  ompare.op = TK_E
174c0 51 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d  Q;.        opCom
174d0 70 61 72 65 2e 70 4c 65 66 74 20 3d 20 26 63 61  pare.pLeft = &ca
174e0 63 68 65 58 3b 0a 20 20 20 20 20 20 20 20 70 54  cheX;.        pT
174f0 65 73 74 20 3d 20 26 6f 70 43 6f 6d 70 61 72 65  est = &opCompare
17500 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17510 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
17520 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20  ; i=i+2){.      
17530 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
17540 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
17550 20 20 20 20 20 20 20 20 69 66 28 20 70 58 20 29          if( pX )
17560 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
17570 72 74 28 20 70 54 65 73 74 21 3d 30 20 29 3b 0a  rt( pTest!=0 );.
17580 20 20 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70            opComp
17590 61 72 65 2e 70 52 69 67 68 74 20 3d 20 61 4c 69  are.pRight = aLi
175a0 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b  stelem[i].pExpr;
175b0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
175c0 20 20 20 20 20 20 20 20 20 20 70 54 65 73 74 20            pTest 
175d0 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70  = aListelem[i].p
175e0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Expr;.        }.
175f0 20 20 20 20 20 20 20 20 6e 65 78 74 43 61 73 65          nextCase
17600 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
17610 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
17620 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
17630 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  est->op==TK_COLU
17640 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  MN );.        sq
17650 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
17660 28 70 50 61 72 73 65 2c 20 70 54 65 73 74 2c 20  (pParse, pTest, 
17670 6e 65 78 74 43 61 73 65 2c 20 53 51 4c 49 54 45  nextCase, SQLITE
17680 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
17690 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
176a0 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70  aListelem[i+1].p
176b0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
176c0 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 74  UMN );.        t
176d0 65 73 74 63 61 73 65 28 20 61 4c 69 73 74 65 6c  estcase( aListel
176e0 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f  em[i+1].pExpr->o
176f0 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
17700 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
17710 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
17720 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d  , aListelem[i+1]
17730 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b  .pExpr, target);
17740 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17750 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
17760 5f 47 6f 74 6f 2c 20 30 2c 20 65 6e 64 4c 61 62  _Goto, 0, endLab
17770 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  el);.        sql
17780 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
17790 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 20  (pParse, 1);.   
177a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
177b0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
177c0 6e 65 78 74 43 61 73 65 29 3b 0a 20 20 20 20 20  nextCase);.     
177d0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   }.      if( pEx
177e0 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20  pr->pRight ){.  
177f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
17800 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
17810 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
17820 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
17830 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
17840 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  t, target);.    
17850 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
17860 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20  achePop(pParse, 
17870 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
17880 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17890 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
178a0 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74  _Null, 0, target
178b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
178c0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
178d0 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61  locFailed || pPa
178e0 72 73 65 2d 3e 6e 45 72 72 3e 30 20 0a 20 20 20  rse->nErr>0 .   
178f0 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73          || pPars
17900 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d  e->iCacheLevel==
17910 69 43 61 63 68 65 4c 65 76 65 6c 20 29 3b 0a 20  iCacheLevel );. 
17920 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17930 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
17940 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20  endLabel);.     
17950 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
17960 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17970 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63 61  T_TRIGGER.    ca
17980 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20  se TK_RAISE: {. 
17990 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
179a0 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
179b0 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20  _Rollback .     
179c0 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e        || pExpr->
179d0 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f  affinity==OE_Abo
179e0 72 74 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  rt.           ||
179f0 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
17a00 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20 20  ==OE_Fail.      
17a10 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61       || pExpr->a
17a20 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f  ffinity==OE_Igno
17a30 72 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  re.      );.    
17a40 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 70    if( !pParse->p
17a50 54 72 69 67 67 65 72 54 61 62 20 29 7b 0a 20 20  TriggerTab ){.  
17a60 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
17a70 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
17a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a90 20 20 20 20 20 22 52 41 49 53 45 28 29 20 6d 61       "RAISE() ma
17aa0 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77  y only be used w
17ab0 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 2d  ithin a trigger-
17ac0 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20  program");.     
17ad0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
17ae0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
17af0 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
17b00 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20  OE_Abort ){.    
17b10 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62      sqlite3MayAb
17b20 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ort(pParse);.   
17b30 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
17b40 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
17b50 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
17b60 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
17b70 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69   if( pExpr->affi
17b80 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20  nity==OE_Ignore 
17b90 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
17ba0 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20  e3VdbeAddOp4(.  
17bb0 20 20 20 20 20 20 20 20 20 20 76 2c 20 4f 50 5f            v, OP_
17bc0 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c  Halt, SQLITE_OK,
17bd0 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 30 2c 20 70   OE_Ignore, 0, p
17be0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 30  Expr->u.zToken,0
17bf0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
17c00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48          sqlite3H
17c10 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  altConstraint(pP
17c20 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 61 66 66  arse, pExpr->aff
17c30 69 6e 69 74 79 2c 20 70 45 78 70 72 2d 3e 75 2e  inity, pExpr->u.
17c40 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 20 20  zToken, 0);.    
17c50 20 20 7d 0a 0a 20 20 20 20 20 20 62 72 65 61 6b    }..      break
17c60 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
17c70 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
17c80 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
17c90 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20  e, regFree1);.  
17ca0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
17cb0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
17cc0 67 46 72 65 65 32 29 3b 0a 20 20 72 65 74 75 72  gFree2);.  retur
17cd0 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  n inReg;.}../*.*
17ce0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
17cf0 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 65  to evaluate an e
17d00 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 74  xpression and st
17d10 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ore the results.
17d20 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74  ** into a regist
17d30 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  er.  Return the 
17d40 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20  register number 
17d50 77 68 65 72 65 20 74 68 65 20 72 65 73 75 6c 74  where the result
17d60 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 2e  s.** are stored.
17d70 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
17d80 67 69 73 74 65 72 20 69 73 20 61 20 74 65 6d 70  gister is a temp
17d90 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 74  orary register t
17da0 68 61 74 20 63 61 6e 20 62 65 20 64 65 61 6c 6c  hat can be deall
17db0 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20  ocated,.** then 
17dc0 77 72 69 74 65 20 69 74 73 20 6e 75 6d 62 65 72  write its number
17dd0 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20 20 49 66   into *pReg.  If
17de0 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 67 69   the result regi
17df0 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 61  ster is not.** a
17e00 20 74 65 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e   temporary, then
17e10 20 73 65 74 20 2a 70 52 65 67 20 74 6f 20 7a 65   set *pReg to ze
17e20 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ro..*/.int sqlit
17e30 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 50  e3ExprCodeTemp(P
17e40 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
17e50 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a  pr *pExpr, int *
17e60 70 52 65 67 29 7b 0a 20 20 69 6e 74 20 72 31 20  pReg){.  int r1 
17e70 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
17e80 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69  Reg(pParse);.  i
17e90 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45  nt r2 = sqlite3E
17ea0 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
17eb0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31 29  arse, pExpr, r1)
17ec0 3b 0a 20 20 69 66 28 20 72 32 3d 3d 72 31 20 29  ;.  if( r2==r1 )
17ed0 7b 0a 20 20 20 20 2a 70 52 65 67 20 3d 20 72 31  {.    *pReg = r1
17ee0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
17ef0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
17f00 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
17f10 3b 0a 20 20 20 20 2a 70 52 65 67 20 3d 20 30 3b  ;.    *pReg = 0;
17f20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 32  .  }.  return r2
17f30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
17f40 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
17f50 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70 72  ll evaluate expr
17f60 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64  ession pExpr and
17f70 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65   store the.** re
17f80 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65  sults in registe
17f90 72 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72  r target.  The r
17fa0 65 73 75 6c 74 73 20 61 72 65 20 67 75 61 72 61  esults are guara
17fb0 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a  nteed to appear.
17fc0 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ** in register t
17fd0 61 72 67 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  arget..*/.int sq
17fe0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 50 61  lite3ExprCode(Pa
17ff0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
18000 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61  r *pExpr, int ta
18010 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e 52  rget){.  int inR
18020 65 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74  eg;..  assert( t
18030 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65  arget>0 && targe
18040 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  t<=pParse->nMem 
18050 29 3b 0a 20 20 69 6e 52 65 67 20 3d 20 73 71 6c  );.  inReg = sql
18060 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
18070 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
18080 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 61 73 73  , target);.  ass
18090 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64  ert( pParse->pVd
180a0 62 65 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  be || pParse->db
180b0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
180c0 3b 0a 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74  ;.  if( inReg!=t
180d0 61 72 67 65 74 20 26 26 20 70 50 61 72 73 65 2d  arget && pParse-
180e0 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 73 71  >pVdbe ){.    sq
180f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
18100 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
18110 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20  P_SCopy, inReg, 
18120 74 61 72 67 65 74 29 3b 0a 20 20 7d 0a 20 20 72  target);.  }.  r
18130 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 7d 0a  eturn target;.}.
18140 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
18150 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 74  code that evalut
18160 65 73 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  es the given exp
18170 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 75 74 73  ression and puts
18180 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69   the result.** i
18190 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
181a0 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61  t..**.** Also ma
181b0 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
181c0 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 73 75   expression resu
181d0 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72  lts into another
181e0 20 22 63 61 63 68 65 22 20 72 65 67 69 73 74 65   "cache" registe
181f0 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20  r.** and modify 
18200 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73  the expression s
18210 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20  o that the next 
18220 74 69 6d 65 20 69 74 20 69 73 20 65 76 61 6c 75  time it is evalu
18230 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73  ated,.** the res
18240 75 6c 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ult is a copy of
18250 20 74 68 65 20 63 61 63 68 65 20 72 65 67 69 73   the cache regis
18260 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ter..**.** This 
18270 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
18280 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20  for expressions 
18290 74 68 61 74 20 61 72 65 20 75 73 65 64 20 6d 75  that are used mu
182a0 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73  ltiple .** times
182b0 2e 20 20 54 68 65 79 20 61 72 65 20 65 76 61 6c  .  They are eval
182c0 75 61 74 65 64 20 6f 6e 63 65 20 61 6e 64 20 74  uated once and t
182d0 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
182e0 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  e expression.** 
182f0 61 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 69  are reused..*/.i
18300 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
18310 64 65 41 6e 64 43 61 63 68 65 28 50 61 72 73 65  deAndCache(Parse
18320 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
18330 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65  pExpr, int targe
18340 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  t){.  Vdbe *v = 
18350 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
18360 20 69 6e 74 20 69 6e 52 65 67 3b 0a 20 20 69 6e   int inReg;.  in
18370 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
18380 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
18390 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
183a0 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30  assert( target>0
183b0 20 29 3b 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f   );.  /* This ro
183c0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
183d0 66 6f 72 20 74 65 72 6d 73 20 74 6f 20 49 4e 53  for terms to INS
183e0 45 52 54 20 6f 72 20 55 50 44 41 54 45 2e 20 20  ERT or UPDATE.  
183f0 41 6e 64 20 74 68 65 20 6f 6e 6c 79 0a 20 20 2a  And the only.  *
18400 2a 20 6f 74 68 65 72 20 70 6c 61 63 65 20 77 68  * other place wh
18410 65 72 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ere expressions 
18420 63 61 6e 20 62 65 20 63 6f 6e 76 65 72 74 65 64  can be converted
18430 20 69 6e 74 6f 20 54 4b 5f 52 45 47 49 53 54 45   into TK_REGISTE
18440 52 20 69 73 0a 20 20 2a 2a 20 69 6e 20 57 48 45  R is.  ** in WHE
18450 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
18460 73 69 6e 67 2e 20 20 53 6f 20 61 73 20 63 75 72  sing.  So as cur
18470 72 65 6e 74 6c 79 20 69 6d 70 6c 65 6d 65 6e 74  rently implement
18480 65 64 2c 20 74 68 65 72 65 20 69 73 0a 20 20 2a  ed, there is.  *
18490 2a 20 6e 6f 20 77 61 79 20 66 6f 72 20 61 20 54  * no way for a T
184a0 4b 5f 52 45 47 49 53 54 45 52 20 74 6f 20 65 78  K_REGISTER to ex
184b0 69 73 74 20 68 65 72 65 2e 20 20 42 75 74 20 69  ist here.  But i
184c0 74 20 73 65 65 6d 73 20 70 72 75 64 65 6e 74 20  t seems prudent 
184d0 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 74 68 65  to.  ** keep the
184e0 20 41 4c 57 41 59 53 28 29 20 69 6e 20 63 61 73   ALWAYS() in cas
184f0 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73  e the conditions
18500 20 61 62 6f 76 65 20 63 68 61 6e 67 65 20 77 69   above change wi
18510 74 68 20 66 75 74 75 72 65 0a 20 20 2a 2a 20 6d  th future.  ** m
18520 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 6f 72 20  odifications or 
18530 65 6e 68 61 6e 63 65 6d 65 6e 74 73 2e 20 2a 2f  enhancements. */
18540 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 45  .  if( ALWAYS(pE
18550 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49  xpr->op!=TK_REGI
18560 53 54 45 52 29 20 29 7b 20 20 0a 20 20 20 20 69  STER) ){  .    i
18570 6e 74 20 69 4d 65 6d 3b 0a 20 20 20 20 69 4d 65  nt iMem;.    iMe
18580 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  m = ++pParse->nM
18590 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  em;.    sqlite3V
185a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
185b0 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 69 4d 65  Copy, inReg, iMe
185c0 6d 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69  m);.    pExpr->i
185d0 54 61 62 6c 65 20 3d 20 69 4d 65 6d 3b 0a 20 20  Table = iMem;.  
185e0 20 20 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20 70    pExpr->op2 = p
185f0 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 70 45  Expr->op;.    pE
18600 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47  xpr->op = TK_REG
18610 49 53 54 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ISTER;.  }.  ret
18620 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a  urn inReg;.}../*
18630 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
18640 69 66 20 70 45 78 70 72 20 69 73 20 61 6e 20 63  if pExpr is an c
18650 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69  onstant expressi
18660 6f 6e 20 74 68 61 74 20 69 73 20 61 70 70 72 6f  on that is appro
18670 70 72 69 61 74 65 0a 2a 2a 20 66 6f 72 20 66 61  priate.** for fa
18680 63 74 6f 72 69 6e 67 20 6f 75 74 20 6f 66 20 61  ctoring out of a
18690 20 6c 6f 6f 70 2e 20 20 41 70 70 72 6f 70 72 69   loop.  Appropri
186a0 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ate expressions 
186b0 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  are:.**.**    * 
186c0 20 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   Any expression 
186d0 74 68 61 74 20 65 76 61 6c 75 61 74 65 73 20 74  that evaluates t
186e0 6f 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 70  o two or more op
186f0 63 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  codes..**.**    
18700 2a 20 20 41 6e 79 20 4f 50 5f 49 6e 74 65 67 65  *  Any OP_Intege
18710 72 2c 20 4f 50 5f 52 65 61 6c 2c 20 4f 50 5f 53  r, OP_Real, OP_S
18720 74 72 69 6e 67 2c 20 4f 50 5f 42 6c 6f 62 2c 20  tring, OP_Blob, 
18730 4f 50 5f 4e 75 6c 6c 2c 20 0a 2a 2a 20 20 20 20  OP_Null, .**    
18740 20 20 20 6f 72 20 4f 50 5f 56 61 72 69 61 62 6c     or OP_Variabl
18750 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
18760 6e 65 65 64 20 74 6f 20 62 65 20 70 6c 61 63 65  need to be place
18770 64 20 69 6e 20 61 20 0a 2a 2a 20 20 20 20 20 20  d in a .**      
18780 20 73 70 65 63 69 66 69 63 20 72 65 67 69 73 74   specific regist
18790 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  er..**.** There 
187a0 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 66  is no point in f
187b0 61 63 74 6f 72 69 6e 67 20 6f 75 74 20 73 69 6e  actoring out sin
187c0 67 6c 65 2d 69 6e 73 74 72 75 63 74 69 6f 6e 20  gle-instruction 
187d0 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 65 78 70 72  constant.** expr
187e0 65 73 73 69 6f 6e 73 20 74 68 61 74 20 6e 65 65  essions that nee
187f0 64 20 74 6f 20 62 65 20 70 6c 61 63 65 64 20 69  d to be placed i
18800 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 72  n a particular r
18810 65 67 69 73 74 65 72 2e 20 20 0a 2a 2a 20 57 65  egister.  .** We
18820 20 63 6f 75 6c 64 20 66 61 63 74 6f 72 20 74 68   could factor th
18830 65 6d 20 6f 75 74 2c 20 62 75 74 20 74 68 65 6e  em out, but then
18840 20 77 65 20 77 6f 75 6c 64 20 65 6e 64 20 75 70   we would end up
18850 20 61 64 64 69 6e 67 20 61 6e 0a 2a 2a 20 4f 50   adding an.** OP
18860 5f 53 43 6f 70 79 20 69 6e 73 74 72 75 63 74 69  _SCopy instructi
18870 6f 6e 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 76  on to move the v
18880 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 63 6f  alue into the co
18890 72 72 65 63 74 20 72 65 67 69 73 74 65 72 0a 2a  rrect register.*
188a0 2a 20 6c 61 74 65 72 2e 20 20 57 65 20 6d 69 67  * later.  We mig
188b0 68 74 20 61 73 20 77 65 6c 6c 20 6a 75 73 74 20  ht as well just 
188c0 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  use the original
188d0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64   instruction and
188e0 0a 2a 2a 20 61 76 6f 69 64 20 74 68 65 20 4f 50  .** avoid the OP
188f0 5f 53 43 6f 70 79 2e 0a 2a 2f 0a 73 74 61 74 69  _SCopy..*/.stati
18900 63 20 69 6e 74 20 69 73 41 70 70 72 6f 70 72 69  c int isAppropri
18910 61 74 65 46 6f 72 46 61 63 74 6f 72 69 6e 67 28  ateForFactoring(
18920 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
18930 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f  !sqlite3ExprIsCo
18940 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 29  nstantNotJoin(p)
18950 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
18960 3b 20 20 2f 2a 20 4f 6e 6c 79 20 63 6f 6e 73 74  ;  /* Only const
18970 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ant expressions 
18980 61 72 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  are appropriate 
18990 66 6f 72 20 66 61 63 74 6f 72 69 6e 67 20 2a 2f  for factoring */
189a0 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 66  .  }.  if( (p->f
189b0 6c 61 67 73 20 26 20 45 50 5f 46 69 78 65 64 44  lags & EP_FixedD
189c0 65 73 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  est)==0 ){.    r
189d0 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 41 6e 79  eturn 1;  /* Any
189e0 20 63 6f 6e 73 74 61 6e 74 20 77 69 74 68 6f 75   constant withou
189f0 74 20 61 20 66 69 78 65 64 20 64 65 73 74 69 6e  t a fixed destin
18a00 61 74 69 6f 6e 20 69 73 20 61 70 70 72 6f 70 72  ation is appropr
18a10 69 61 74 65 20 2a 2f 0a 20 20 7d 0a 20 20 77 68  iate */.  }.  wh
18a20 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  ile( p->op==TK_U
18a30 50 4c 55 53 20 29 20 70 20 3d 20 70 2d 3e 70 4c  PLUS ) p = p->pL
18a40 65 66 74 3b 0a 20 20 73 77 69 74 63 68 28 20 70  eft;.  switch( p
18a50 2d 3e 6f 70 20 29 7b 0a 23 69 66 6e 64 65 66 20  ->op ){.#ifndef 
18a60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42  SQLITE_OMIT_BLOB
18a70 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73  _LITERAL.    cas
18a80 65 20 54 4b 5f 42 4c 4f 42 3a 0a 23 65 6e 64 69  e TK_BLOB:.#endi
18a90 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41  f.    case TK_VA
18aa0 52 49 41 42 4c 45 3a 0a 20 20 20 20 63 61 73 65  RIABLE:.    case
18ab0 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20   TK_INTEGER:.   
18ac0 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a   case TK_FLOAT:.
18ad0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c      case TK_NULL
18ae0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  :.    case TK_ST
18af0 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 74 65  RING: {.      te
18b00 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
18b10 4b 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 20 20  K_BLOB );.      
18b20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
18b30 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 3b 0a  =TK_VARIABLE );.
18b40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
18b50 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45  p->op==TK_INTEGE
18b60 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  R );.      testc
18b70 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46  ase( p->op==TK_F
18b80 4c 4f 41 54 20 29 3b 0a 20 20 20 20 20 20 74 65  LOAT );.      te
18b90 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
18ba0 4b 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  K_NULL );.      
18bb0 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
18bc0 3d 54 4b 5f 53 54 52 49 4e 47 20 29 3b 0a 20 20  =TK_STRING );.  
18bd0 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 2d 69 6e      /* Single-in
18be0 73 74 72 75 63 74 69 6f 6e 20 63 6f 6e 73 74 61  struction consta
18bf0 6e 74 73 20 77 69 74 68 20 61 20 66 69 78 65 64  nts with a fixed
18c00 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 61 72 65   destination are
18c10 0a 20 20 20 20 20 20 2a 2a 20 62 65 74 74 65 72  .      ** better
18c20 20 64 6f 6e 65 20 69 6e 2d 6c 69 6e 65 2e 20 20   done in-line.  
18c30 49 66 20 77 65 20 66 61 63 74 6f 72 20 74 68 65  If we factor the
18c40 6d 2c 20 74 68 65 79 20 77 69 6c 6c 20 6a 75 73  m, they will jus
18c50 74 20 65 6e 64 0a 20 20 20 20 20 20 2a 2a 20 75  t end.      ** u
18c60 70 20 67 65 6e 65 72 61 74 69 6e 67 20 61 6e 20  p generating an 
18c70 4f 50 5f 53 43 6f 70 79 20 74 6f 20 6d 6f 76 65  OP_SCopy to move
18c80 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 74 68   the value to th
18c90 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 20 20  e destination.  
18ca0 20 20 20 20 2a 2a 20 72 65 67 69 73 74 65 72 2e      ** register.
18cb0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
18cc0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   0;.    }.    ca
18cd0 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a  se TK_UMINUS: {.
18ce0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65        if( p->pLe
18cf0 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54  ft->op==TK_FLOAT
18d00 20 7c 7c 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70   || p->pLeft->op
18d10 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a  ==TK_INTEGER ){.
18d20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
18d30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18d40 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
18d50 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
18d60 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
18d70 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
18d80 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ../*.** If pExpr
18d90 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 65   is a constant e
18da0 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69  xpression that i
18db0 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
18dc0 72 0a 2a 2a 20 66 61 63 74 6f 72 69 6e 67 20 6f  r.** factoring o
18dd0 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2c 20 74 68  ut of a loop, th
18de0 65 6e 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  en evaluate the 
18df0 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 6e  expression.** in
18e00 74 6f 20 61 20 72 65 67 69 73 74 65 72 20 61 6e  to a register an
18e10 64 20 63 6f 6e 76 65 72 74 20 74 68 65 20 65 78  d convert the ex
18e20 70 72 65 73 73 69 6f 6e 20 69 6e 74 6f 20 61 20  pression into a 
18e30 54 4b 5f 52 45 47 49 53 54 45 52 0a 2a 2a 20 65  TK_REGISTER.** e
18e40 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 73 74  xpression..*/.st
18e50 61 74 69 63 20 69 6e 74 20 65 76 61 6c 43 6f 6e  atic int evalCon
18e60 73 74 45 78 70 72 28 57 61 6c 6b 65 72 20 2a 70  stExpr(Walker *p
18e70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
18e80 78 70 72 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  xpr){.  Parse *p
18e90 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
18ea0 3e 70 50 61 72 73 65 3b 0a 20 20 73 77 69 74 63  >pParse;.  switc
18eb0 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
18ec0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 0a      case TK_IN:.
18ed0 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49      case TK_REGI
18ee0 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 65  STER: {.      re
18ef0 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
18f00 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
18f10 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  K_FUNCTION:.    
18f20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
18f30 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  TION:.    case T
18f40 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 20 7b 0a  K_CONST_FUNC: {.
18f50 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 72 67        /* The arg
18f60 75 6d 65 6e 74 73 20 74 6f 20 61 20 66 75 6e 63  uments to a func
18f70 74 69 6f 6e 20 68 61 76 65 20 61 20 66 69 78 65  tion have a fixe
18f80 64 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 20  d destination.. 
18f90 20 20 20 20 20 2a 2a 20 4d 61 72 6b 20 74 68 65       ** Mark the
18fa0 6d 20 74 68 69 73 20 77 61 79 20 74 6f 20 61 76  m this way to av
18fb0 6f 69 64 20 67 65 6e 65 72 61 74 65 64 20 75 6e  oid generated un
18fc0 6e 65 65 64 65 64 20 4f 50 5f 53 43 6f 70 79 0a  needed OP_SCopy.
18fd0 20 20 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63        ** instruc
18fe0 74 69 6f 6e 73 2e 20 0a 20 20 20 20 20 20 2a 2f  tions. .      */
18ff0 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
19000 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
19010 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61  x.pList;.      a
19020 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
19030 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
19040 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
19050 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 20        if( pList 
19060 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
19070 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
19080 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
19090 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
190a0 49 74 65 6d 20 3d 20 70 4c 69 73 74 2d 3e 61 3b  Item = pList->a;
190b0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20 69  .        for(; i
190c0 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; i--, pItem++
190d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
190e0 20 41 4c 57 41 59 53 28 70 49 74 65 6d 2d 3e 70   ALWAYS(pItem->p
190f0 45 78 70 72 29 20 29 20 70 49 74 65 6d 2d 3e 70  Expr) ) pItem->p
19100 45 78 70 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  Expr->flags |= E
19110 50 5f 46 69 78 65 64 44 65 73 74 3b 0a 20 20 20  P_FixedDest;.   
19120 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
19130 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19140 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 70  }.  }.  if( isAp
19150 70 72 6f 70 72 69 61 74 65 46 6f 72 46 61 63 74  propriateForFact
19160 6f 72 69 6e 67 28 70 45 78 70 72 29 20 29 7b 0a  oring(pExpr) ){.
19170 20 20 20 20 69 6e 74 20 72 31 20 3d 20 2b 2b 70      int r1 = ++p
19180 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
19190 20 69 6e 74 20 72 32 3b 0a 20 20 20 20 72 32 20   int r2;.    r2 
191a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
191b0 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
191c0 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 20 20  pExpr, r1);.    
191d0 69 66 28 20 4e 45 56 45 52 28 72 31 21 3d 72 32  if( NEVER(r1!=r2
191e0 29 20 29 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ) ) sqlite3Relea
191f0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
19200 2c 20 72 31 29 3b 0a 20 20 20 20 70 45 78 70 72  , r1);.    pExpr
19210 2d 3e 6f 70 32 20 3d 20 70 45 78 70 72 2d 3e 6f  ->op2 = pExpr->o
19220 70 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  p;.    pExpr->op
19230 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a   = TK_REGISTER;.
19240 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
19250 65 20 3d 20 72 32 3b 0a 20 20 20 20 72 65 74 75  e = r2;.    retu
19260 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
19270 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
19280 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
19290 2a 20 50 72 65 65 76 61 6c 75 61 74 65 20 63 6f  * Preevaluate co
192a0 6e 73 74 61 6e 74 20 73 75 62 65 78 70 72 65 73  nstant subexpres
192b0 73 69 6f 6e 73 20 77 69 74 68 69 6e 20 70 45 78  sions within pEx
192c0 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  pr and store the
192d0 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72  .** results in r
192e0 65 67 69 73 74 65 72 73 2e 20 20 4d 6f 64 69 66  egisters.  Modif
192f0 79 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20  y pExpr so that 
19300 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 73 75 62  the constant sub
19310 65 78 70 72 65 73 69 6f 6e 73 0a 2a 2a 20 61 72  expresions.** ar
19320 65 20 54 4b 5f 52 45 47 49 53 54 45 52 20 6f 70  e TK_REGISTER op
19330 63 6f 64 65 73 20 74 68 61 74 20 72 65 66 65 72  codes that refer
19340 20 74 6f 20 74 68 65 20 70 72 65 63 6f 6d 70 75   to the precompu
19350 74 65 64 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 76  ted values..*/.v
19360 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
19370 6f 64 65 43 6f 6e 73 74 61 6e 74 73 28 50 61 72  odeConstants(Par
19380 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
19390 20 2a 70 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b   *pExpr){.  Walk
193a0 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43  er w;.  w.xExprC
193b0 61 6c 6c 62 61 63 6b 20 3d 20 65 76 61 6c 43 6f  allback = evalCo
193c0 6e 73 74 45 78 70 72 3b 0a 20 20 77 2e 78 53 65  nstExpr;.  w.xSe
193d0 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30  lectCallback = 0
193e0 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70  ;.  w.pParse = p
193f0 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33  Parse;.  sqlite3
19400 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78  WalkExpr(&w, pEx
19410 70 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  pr);.}.../*.** G
19420 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
19430 74 20 70 75 73 68 65 73 20 74 68 65 20 76 61 6c  t pushes the val
19440 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d  ue of every elem
19450 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e  ent of the given
19460 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
19470 69 73 74 20 69 6e 74 6f 20 61 20 73 65 71 75 65  ist into a seque
19480 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nce of registers
19490 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 74 61   beginning at ta
194a0 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  rget..**.** Retu
194b0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
194c0 20 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75 61   elements evalua
194d0 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
194e0 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
194f0 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ist(.  Parse *pP
19500 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72  arse,     /* Par
19510 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
19520 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
19530 74 2c 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72  t,   /* The expr
19540 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62  ession list to b
19550 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74  e coded */.  int
19560 20 74 61 72 67 65 74 2c 20 20 20 20 20 20 20 20   target,        
19570 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74  /* Where to writ
19580 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  e results */.  i
19590 6e 74 20 64 6f 48 61 72 64 43 6f 70 79 20 20 20  nt doHardCopy   
195a0 20 20 2f 2a 20 4d 61 6b 65 20 61 20 68 61 72 64    /* Make a hard
195b0 20 63 6f 70 79 20 6f 66 20 65 76 65 72 79 20 65   copy of every e
195c0 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73  lement */.){.  s
195d0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
195e0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e  tem *pItem;.  in
195f0 74 20 69 2c 20 6e 3b 0a 20 20 61 73 73 65 72 74  t i, n;.  assert
19600 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20  ( pList!=0 );.  
19610 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30  assert( target>0
19620 20 29 3b 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d   );.  n = pList-
19630 3e 6e 45 78 70 72 3b 0a 20 20 66 6f 72 28 70 49  >nExpr;.  for(pI
19640 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d  tem=pList->a, i=
19650 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74  0; i<n; i++, pIt
19660 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  em++){.    if( p
19670 49 74 65 6d 2d 3e 69 41 6c 69 61 73 20 29 7b 0a  Item->iAlias ){.
19680 20 20 20 20 20 20 69 6e 74 20 69 52 65 67 20 3d        int iReg =
19690 20 63 6f 64 65 41 6c 69 61 73 28 70 50 61 72 73   codeAlias(pPars
196a0 65 2c 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73  e, pItem->iAlias
196b0 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20  , pItem->pExpr, 
196c0 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20  target+i);.     
196d0 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
196e0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
196f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 52 65  );.      if( iRe
19700 67 21 3d 74 61 72 67 65 74 2b 69 20 29 7b 0a 20  g!=target+i ){. 
19710 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
19720 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
19730 43 6f 70 79 2c 20 69 52 65 67 2c 20 74 61 72 67  Copy, iReg, targ
19740 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20  et+i);.      }. 
19750 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19760 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
19770 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70  pParse, pItem->p
19780 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b  Expr, target+i);
19790 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
197a0 6f 48 61 72 64 43 6f 70 79 20 26 26 20 21 70 50  oHardCopy && !pP
197b0 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
197c0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
197d0 73 71 6c 69 74 65 33 45 78 70 72 48 61 72 64 43  sqlite3ExprHardC
197e0 6f 70 79 28 70 50 61 72 73 65 2c 20 74 61 72 67  opy(pParse, targ
197f0 65 74 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  et, n);.    }.  
19800 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  }.  return n;.}.
19810 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
19820 63 6f 64 65 20 66 6f 72 20 61 20 42 45 54 57 45  code for a BETWE
19830 45 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a  EN operator..**.
19840 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e 20  **    x BETWEEN 
19850 79 20 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68  y AND z.**.** Th
19860 65 20 61 62 6f 76 65 20 69 73 20 65 71 75 69 76  e above is equiv
19870 61 6c 65 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20  alent to .**.** 
19880 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a     x>=y AND x<=z
19890 0a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 69 74 20 61  .**.** Code it a
198a0 73 20 73 75 63 68 2c 20 74 61 6b 69 6e 67 20 63  s such, taking c
198b0 61 72 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f  are to do the co
198c0 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65 73 73 69  mmon subexpressi
198d0 6f 6e 0a 2a 2a 20 65 6c 65 6d 65 6e 74 61 74 69  on.** elementati
198e0 6f 6e 20 6f 66 20 78 2e 0a 2a 2f 0a 73 74 61 74  on of x..*/.stat
198f0 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f 64 65  ic void exprCode
19900 42 65 74 77 65 65 6e 28 0a 20 20 50 61 72 73 65  Between(.  Parse
19910 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
19920 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
19930 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
19940 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
19950 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  Expr,      /* Th
19960 65 20 42 45 54 57 45 45 4e 20 65 78 70 72 65 73  e BETWEEN expres
19970 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65  sion */.  int de
19980 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  st,         /* J
19990 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65 20  ump here if the 
199a0 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 2a 2f  jump is taken */
199b0 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 54 72 75  .  int jumpIfTru
199c0 65 2c 20 20 20 2f 2a 20 54 61 6b 65 20 74 68 65  e,   /* Take the
199d0 20 6a 75 6d 70 20 69 66 20 74 68 65 20 42 45 54   jump if the BET
199e0 57 45 45 4e 20 69 73 20 74 72 75 65 20 2a 2f 0a  WEEN is true */.
199f0 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c    int jumpIfNull
19a00 20 20 20 20 2f 2a 20 54 61 6b 65 20 74 68 65 20      /* Take the 
19a10 6a 75 6d 70 20 69 66 20 74 68 65 20 42 45 54 57  jump if the BETW
19a20 45 45 4e 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29  EEN is NULL */.)
19a30 7b 0a 20 20 45 78 70 72 20 65 78 70 72 41 6e 64  {.  Expr exprAnd
19a40 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 41 4e 44  ;     /* The AND
19a50 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 20 78 3e   operator in  x>
19a60 3d 79 20 41 4e 44 20 78 3c 3d 7a 20 20 2a 2f 0a  =y AND x<=z  */.
19a70 20 20 45 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b    Expr compLeft;
19a80 20 20 20 20 2f 2a 20 54 68 65 20 20 78 3e 3d 79      /* The  x>=y
19a90 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72    term */.  Expr
19aa0 20 63 6f 6d 70 52 69 67 68 74 3b 20 20 20 2f 2a   compRight;   /*
19ab0 20 54 68 65 20 20 78 3c 3d 7a 20 20 74 65 72 6d   The  x<=z  term
19ac0 20 2a 2f 0a 20 20 45 78 70 72 20 65 78 70 72 58   */.  Expr exprX
19ad0 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 20  ;       /* The  
19ae0 78 20 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  x  subexpression
19af0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65   */.  int regFre
19b00 65 31 20 3d 20 30 3b 20 2f 2a 20 54 65 6d 70 6f  e1 = 0; /* Tempo
19b10 72 61 72 79 20 75 73 65 20 72 65 67 69 73 74 65  rary use registe
19b20 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
19b30 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
19b40 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
19b50 6c 65 63 74 29 20 29 3b 0a 20 20 65 78 70 72 58  lect) );.  exprX
19b60 20 3d 20 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74   = *pExpr->pLeft
19b70 3b 0a 20 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d  ;.  exprAnd.op =
19b80 20 54 4b 5f 41 4e 44 3b 0a 20 20 65 78 70 72 41   TK_AND;.  exprA
19b90 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70  nd.pLeft = &comp
19ba0 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e  Left;.  exprAnd.
19bb0 70 52 69 67 68 74 20 3d 20 26 63 6f 6d 70 52 69  pRight = &compRi
19bc0 67 68 74 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e  ght;.  compLeft.
19bd0 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 63 6f  op = TK_GE;.  co
19be0 6d 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20 26  mpLeft.pLeft = &
19bf0 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 4c 65 66  exprX;.  compLef
19c00 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72  t.pRight = pExpr
19c10 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  ->x.pList->a[0].
19c20 70 45 78 70 72 3b 0a 20 20 63 6f 6d 70 52 69 67  pExpr;.  compRig
19c30 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20  ht.op = TK_LE;. 
19c40 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66 74   compRight.pLeft
19c50 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d   = &exprX;.  com
19c60 70 52 69 67 68 74 2e 70 52 69 67 68 74 20 3d 20  pRight.pRight = 
19c70 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
19c80 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 65 78  a[1].pExpr;.  ex
19c90 70 72 58 2e 69 54 61 62 6c 65 20 3d 20 73 71 6c  prX.iTable = sql
19ca0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
19cb0 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 58 2c  (pParse, &exprX,
19cc0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 65   &regFree1);.  e
19cd0 78 70 72 58 2e 6f 70 20 3d 20 54 4b 5f 52 45 47  xprX.op = TK_REG
19ce0 49 53 54 45 52 3b 0a 20 20 69 66 28 20 6a 75 6d  ISTER;.  if( jum
19cf0 70 49 66 54 72 75 65 20 29 7b 0a 20 20 20 20 73  pIfTrue ){.    s
19d00 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
19d10 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e  (pParse, &exprAn
19d20 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  d, dest, jumpIfN
19d30 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ull);.  }else{. 
19d40 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
19d50 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 26 65  False(pParse, &e
19d60 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75  xprAnd, dest, ju
19d70 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20  mpIfNull);.  }. 
19d80 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
19d90 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
19da0 65 67 46 72 65 65 31 29 3b 0a 0a 20 20 2f 2a 20  egFree1);..  /* 
19db0 45 6e 73 75 72 65 20 61 64 65 71 75 61 74 65 20  Ensure adequate 
19dc0 74 65 73 74 20 63 6f 76 65 72 61 67 65 20 2a 2f  test coverage */
19dd0 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d  .  testcase( jum
19de0 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75  pIfTrue==0 && ju
19df0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72  mpIfNull==0 && r
19e00 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
19e10 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
19e20 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49  True==0 && jumpI
19e30 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46  fNull==0 && regF
19e40 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73  ree1!=0 );.  tes
19e50 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75  tcase( jumpIfTru
19e60 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75  e==0 && jumpIfNu
19e70 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll!=0 && regFree
19e80 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1==0 );.  testca
19e90 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d  se( jumpIfTrue==
19ea0 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  0 && jumpIfNull!
19eb0 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d  =0 && regFree1!=
19ec0 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
19ed0 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26   jumpIfTrue!=0 &
19ee0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  & jumpIfNull==0 
19ef0 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  && regFree1==0 )
19f00 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75  ;.  testcase( ju
19f10 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a  mpIfTrue!=0 && j
19f20 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20  umpIfNull==0 && 
19f30 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20  regFree1!=0 );. 
19f40 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
19f50 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70  fTrue!=0 && jump
19f60 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67  IfNull!=0 && reg
19f70 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65  Free1==0 );.  te
19f80 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72  stcase( jumpIfTr
19f90 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e  ue!=0 && jumpIfN
19fa0 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65  ull!=0 && regFre
19fb0 65 31 21 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  e1!=0 );.}../*.*
19fc0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
19fd0 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78  for a boolean ex
19fe0 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68  pression such th
19ff0 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  at a jump is mad
1a000 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65  e.** to the labe
1a010 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20  l "dest" if the 
1a020 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72  expression is tr
1a030 75 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e  ue but execution
1a040 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74  .** continues st
1a050 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74  raight thru if t
1a060 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
1a070 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   false..**.** If
1a080 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1a090 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c  evaluates to NUL
1a0a0 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20  L (neither true 
1a0b0 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68 65 6e  nor false), then
1a0c0 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d  .** take the jum
1a0d0 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49 66 4e  p if the jumpIfN
1a0e0 75 6c 6c 20 66 6c 61 67 20 69 73 20 53 51 4c 49  ull flag is SQLI
1a0f0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a  TE_JUMPIFNULL..*
1a100 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64  *.** This code d
1a110 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61  epends on the fa
1a120 63 74 20 74 68 61 74 20 63 65 72 74 61 69 6e 20  ct that certain 
1a130 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78  token values (ex
1a140 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20  : TK_EQ).** are 
1a150 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f  the same as opco
1a160 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f  de values (ex: O
1a170 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65  P_Eq) that imple
1a180 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70  ment the corresp
1a190 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74  onding.** operat
1a1a0 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f  ion.  Special co
1a1b0 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63  mments in vdbe.c
1a1c0 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64   and the mkopcod
1a1d0 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e  eh.awk script in
1a1e0 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f  .** the make pro
1a1f0 63 65 73 73 20 63 61 75 73 65 20 74 68 65 73 65  cess cause these
1a200 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e   values to align
1a210 2e 20 20 41 73 73 65 72 74 28 29 73 20 69 6e 20  .  Assert()s in 
1a220 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f  the code.** belo
1a230 77 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  w verify that th
1a240 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c  e numbers are al
1a250 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e  igned correctly.
1a260 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1a270 45 78 70 72 49 66 54 72 75 65 28 50 61 72 73 65  ExprIfTrue(Parse
1a280 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
1a290 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c  pExpr, int dest,
1a2a0 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
1a2b0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
1a2c0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
1a2d0 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74  nt op = 0;.  int
1a2e0 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20   regFree1 = 0;. 
1a2f0 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20   int regFree2 = 
1a300 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b  0;.  int r1, r2;
1a310 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70  ..  assert( jump
1a320 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a  IfNull==SQLITE_J
1a330 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d  UMPIFNULL || jum
1a340 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1a350 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20  if( NEVER(v==0) 
1a360 29 20 20 20 20 20 72 65 74 75 72 6e 3b 20 20 2f  )     return;  /
1a370 2a 20 45 78 69 73 74 61 6e 63 65 20 6f 66 20 56  * Existance of V
1a380 44 42 45 20 63 68 65 63 6b 65 64 20 62 79 20 63  DBE checked by c
1a390 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 4e  aller */.  if( N
1a3a0 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20 29  EVER(pExpr==0) )
1a3b0 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20   return;  /* No 
1a3c0 77 61 79 20 74 68 69 73 20 63 61 6e 20 68 61 70  way this can hap
1a3d0 70 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 45  pen */.  op = pE
1a3e0 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63  xpr->op;.  switc
1a3f0 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
1a400 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20  e TK_AND: {.    
1a410 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74    int d2 = sqlit
1a420 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1a430 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  v);.      testca
1a440 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
1a450 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
1a460 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
1a470 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
1a480 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
1a490 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1a4a0 3e 70 4c 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49  >pLeft, d2,jumpI
1a4b0 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d  fNull^SQLITE_JUM
1a4c0 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
1a4d0 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
1a4e0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1a4f0 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
1a500 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1a510 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1a520 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29  olveLabel(v, d2)
1a530 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1a540 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
1a550 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72  se, 1);.      br
1a560 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1a570 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20  ase TK_OR: {.   
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 49      sqlite3ExprI
1a5b0 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
1a5c0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
1a5d0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
1a5e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1a5f0 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
1a600 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
1a610 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
1a620 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1a630 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1a640 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  NOT: {.      tes
1a650 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
1a660 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
1a670 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
1a680 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1a690 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
1a6a0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
1a6b0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1a6c0 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
1a6d0 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
1a6e0 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
1a6f0 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
1a700 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
1a710 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
1a720 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1a730 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20  LT==OP_Lt );.   
1a740 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45     assert( TK_LE
1a750 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20  ==OP_Le );.     
1a760 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d   assert( TK_GT==
1a770 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20 20 20 61  OP_Gt );.      a
1a780 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50  ssert( TK_GE==OP
1a790 5f 47 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Ge );.      ass
1a7a0 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45  ert( TK_EQ==OP_E
1a7b0 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  q );.      asser
1a7c0 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20  t( TK_NE==OP_Ne 
1a7d0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1a7e0 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a  e( op==TK_LT );.
1a7f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1a800 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20  op==TK_LE );.   
1a810 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1a820 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20  =TK_GT );.      
1a830 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1a840 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _GE );.      tes
1a850 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51  tcase( op==TK_EQ
1a860 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1a870 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b  se( op==TK_NE );
1a880 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1a890 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
1a8a0 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
1a8b0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1a8c0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1a8d0 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
1a8e0 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
1a8f0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1a900 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1a910 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
1a920 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  e2);.      codeC
1a930 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
1a940 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
1a950 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
1a960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a970 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20    r1, r2, dest, 
1a980 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
1a990 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1a9a0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1a9b0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1a9c0 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
1a9d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1a9e0 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20    case TK_IS:.  
1a9f0 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a    case TK_ISNOT:
1aa00 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1aa10 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a  e( op==TK_IS );.
1aa20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1aa30 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a  op==TK_ISNOT );.
1aa40 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1aa50 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1aa60 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1aa70 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1aa80 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
1aa90 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1aaa0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1aab0 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
1aac0 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f  );.      op = (o
1aad0 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45  p==TK_IS) ? TK_E
1aae0 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20  Q : TK_NE;.     
1aaf0 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
1ab00 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1ab10 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
1ab20 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  , op,.          
1ab30 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
1ab40 64 65 73 74 2c 20 53 51 4c 49 54 45 5f 4e 55 4c  dest, SQLITE_NUL
1ab50 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LEQ);.      test
1ab60 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1ab70 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
1ab80 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
1ab90 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
1aba0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1abb0 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63  TK_ISNULL:.    c
1abc0 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
1abd0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1abe0 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73  TK_ISNULL==OP_Is
1abf0 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61 73  Null );.      as
1ac00 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c  sert( TK_NOTNULL
1ac10 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a  ==OP_NotNull );.
1ac20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ac30 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b  op==TK_ISNULL );
1ac40 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1ac50 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20   op==TK_NOTNULL 
1ac60 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
1ac70 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1ac80 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1ac90 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
1aca0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
1acb0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
1acc0 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20  p, r1, dest);.  
1acd0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1ace0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1acf0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1ad00 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
1ad10 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  EEN: {.      tes
1ad20 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
1ad30 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78  l==0 );.      ex
1ad40 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50  prCodeBetween(pP
1ad50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
1ad60 74 2c 20 31 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  t, 1, jumpIfNull
1ad70 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1ad80 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1ad90 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_IN: {.      in
1ada0 74 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20  t destIfFalse = 
1adb0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1adc0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
1add0 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20  nt destIfNull = 
1ade0 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f 20 64 65 73  jumpIfNull ? des
1adf0 74 20 3a 20 64 65 73 74 49 66 46 61 6c 73 65 3b  t : destIfFalse;
1ae00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1ae10 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c  prCodeIN(pParse,
1ae20 20 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61   pExpr, destIfFa
1ae30 6c 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  lse, destIfNull)
1ae40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1ae50 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1ae60 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 29 3b 0a  Goto, 0, dest);.
1ae70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1ae80 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1ae90 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
1aea0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1aeb0 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
1aec0 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
1aed0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1aee0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26  pParse, pExpr, &
1aef0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1af00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1af10 70 33 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c  p3(v, OP_If, r1,
1af20 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1af30 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 74 65 73  l!=0);.      tes
1af40 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1af50 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1af60 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1af70 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
1af80 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
1af90 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1afa0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
1afb0 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74  gFree1);.  sqlit
1afc0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1afd0 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
1afe0 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  2);  .}../*.** G
1aff0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
1b000 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65   a boolean expre
1b010 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20  ssion such that 
1b020 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a  a jump is made.*
1b030 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22  * to the label "
1b040 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70  dest" if the exp
1b050 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65  ression is false
1b060 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a   but execution.*
1b070 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61  * continues stra
1b080 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65  ight thru if the
1b090 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
1b0a0 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  rue..**.** If th
1b0b0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61  e expression eva
1b0c0 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28  luates to NULL (
1b0d0 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72  neither true nor
1b0e0 20 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20   false) then.** 
1b0f0 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75  jump if jumpIfNu
1b100 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d  ll is SQLITE_JUM
1b110 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20  PIFNULL or fall 
1b120 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49  through if jumpI
1b130 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a  fNull.** is 0..*
1b140 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1b150 70 72 49 66 46 61 6c 73 65 28 50 61 72 73 65 20  prIfFalse(Parse 
1b160 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
1b170 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20  Expr, int dest, 
1b180 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b  int jumpIfNull){
1b190 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
1b1a0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
1b1b0 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  t op = 0;.  int 
1b1c0 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20  regFree1 = 0;.  
1b1d0 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30  int regFree2 = 0
1b1e0 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a  ;.  int r1, r2;.
1b1f0 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49  .  assert( jumpI
1b200 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55  fNull==SQLITE_JU
1b210 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70  MPIFNULL || jump
1b220 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69  IfNull==0 );.  i
1b230 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29  f( NEVER(v==0) )
1b240 20 72 65 74 75 72 6e 3b 20 2f 2a 20 45 78 69 73   return; /* Exis
1b250 74 61 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68  tance of VDBE ch
1b260 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20  ecked by caller 
1b270 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  */.  if( pExpr==
1b280 30 20 29 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a  0 )    return;..
1b290 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f    /* The value o
1b2a0 66 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20  f pExpr->op and 
1b2b0 6f 70 20 61 72 65 20 72 65 6c 61 74 65 64 20 61  op are related a
1b2c0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a  s follows:.  **.
1b2d0 20 20 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72    **       pExpr
1b2e0 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20 20  ->op            
1b2f0 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d  op.  **       --
1b300 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20  -------         
1b310 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a   ----------.  **
1b320 20 20 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c         TK_ISNULL
1b330 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74            OP_Not
1b340 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20  Null.  **       
1b350 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20  TK_NOTNULL      
1b360 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a     OP_IsNull.  *
1b370 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20  *       TK_NE   
1b380 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71             OP_Eq
1b390 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45  .  **       TK_E
1b3a0 51 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  Q              O
1b3b0 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Ne.  **       
1b3c0 54 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20 20  TK_GT           
1b3d0 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20     OP_Le.  **   
1b3e0 20 20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20      TK_LE       
1b3f0 20 20 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a         OP_Gt.  *
1b400 2a 20 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20  *       TK_GE   
1b410 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74             OP_Lt
1b420 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c  .  **       TK_L
1b430 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  T              O
1b440 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46  P_Ge.  **.  ** F
1b450 6f 72 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20  or other values 
1b460 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70  of pExpr->op, op
1b470 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e   is undefined an
1b480 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54  d unused..  ** T
1b490 68 65 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20  he value of TK_ 
1b4a0 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74  and OP_ constant
1b4b0 73 20 61 72 65 20 61 72 72 61 6e 67 65 64 20 73  s are arranged s
1b4c0 75 63 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a  uch that we.  **
1b4d0 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65   can compute the
1b4e0 20 6d 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75   mapping above u
1b4f0 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  sing the followi
1b500 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20  ng expression.. 
1b510 20 2a 2a 20 41 73 73 65 72 74 28 29 73 20 76 65   ** Assert()s ve
1b520 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63 6f  rify that the co
1b530 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72  mputation is cor
1b540 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20  rect..  */.  op 
1b550 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54  = ((pExpr->op+(T
1b560 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d  K_ISNULL&1))^1)-
1b570 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a  (TK_ISNULL&1);..
1b580 20 20 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72    /* Verify corr
1b590 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66  ect alignment of
1b5a0 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e   TK_ and OP_ con
1b5b0 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73  stants.  */.  as
1b5c0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
1b5d0 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70  =TK_ISNULL || op
1b5e0 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a  ==OP_NotNull );.
1b5f0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1b600 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20  >op!=TK_NOTNULL 
1b610 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c  || op==OP_IsNull
1b620 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
1b630 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c  xpr->op!=TK_NE |
1b640 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20  | op==OP_Eq );. 
1b650 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1b660 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d  op!=TK_EQ || op=
1b670 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65  =OP_Ne );.  asse
1b680 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
1b690 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47  K_LT || op==OP_G
1b6a0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
1b6b0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20  Expr->op!=TK_LE 
1b6c0 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a  || op==OP_Gt );.
1b6d0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1b6e0 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70  >op!=TK_GT || op
1b6f0 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73  ==OP_Le );.  ass
1b700 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
1b710 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_GE || op==OP_
1b720 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28  Lt );..  switch(
1b730 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
1b740 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b    case TK_AND: {
1b750 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1b760 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
1b770 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1b780 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
1b790 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1b7a0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1b7b0 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
1b7c0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
1b7d0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
1b7e0 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
1b7f0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
1b800 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1b810 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20  se TK_OR: {.    
1b820 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74    int d2 = sqlit
1b830 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1b840 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  v);.      testca
1b850 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
1b860 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
1b870 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
1b880 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
1b890 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
1b8a0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1b8b0 70 4c 65 66 74 2c 20 64 32 2c 20 6a 75 6d 70 49  pLeft, d2, jumpI
1b8c0 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d  fNull^SQLITE_JUM
1b8d0 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
1b8e0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
1b8f0 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
1b900 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
1b910 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
1b920 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1b930 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32  solveLabel(v, d2
1b940 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1b950 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
1b960 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 62  rse, 1);.      b
1b970 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1b980 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20  case TK_NOT: {. 
1b990 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
1b9a0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
1b9b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1b9c0 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
1b9d0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
1b9e0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
1b9f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1ba00 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1ba10 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
1ba20 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
1ba30 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
1ba40 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GE:.    case TK_
1ba50 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
1ba60 45 51 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  EQ: {.      test
1ba70 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20  case( op==TK_LT 
1ba80 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1ba90 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a  e( op==TK_LE );.
1baa0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1bab0 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20  op==TK_GT );.   
1bac0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1bad0 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20  =TK_GE );.      
1bae0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1baf0 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _EQ );.      tes
1bb00 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45  tcase( op==TK_NE
1bb10 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1bb20 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
1bb30 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  0 );.      r1 = 
1bb40 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1bb50 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1bb60 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
1bb70 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
1bb80 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1bb90 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1bba0 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
1bbb0 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f  Free2);.      co
1bbc0 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
1bbd0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1bbe0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
1bbf0 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
1bc00 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73       r1, r2, des
1bc10 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1bc20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1bc30 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1bc40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1bc50 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
1bc60 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1bc70 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a  .    case TK_IS:
1bc80 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
1bc90 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  OT: {.      test
1bca0 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
1bcb0 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20  =TK_IS );.      
1bcc0 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
1bcd0 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b  >op==TK_ISNOT );
1bce0 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
1bcf0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1bd00 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1bd10 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
1bd20 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
1bd30 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1bd40 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1bd50 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
1bd60 32 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28  2);.      op = (
1bd70 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
1bd80 29 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45  ) ? TK_NE : TK_E
1bd90 51 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  Q;.      codeCom
1bda0 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
1bdb0 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
1bdc0 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
1bdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bde0 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 53 51  r1, r2, dest, SQ
1bdf0 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
1be00 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1be10 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1be20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1be30 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
1be40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1be50 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
1be60 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
1be70 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
1be80 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1be90 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  _ISNULL );.     
1bea0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1beb0 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20  K_NOTNULL );.   
1bec0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1bed0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1bee0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1bef0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1bf00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1bf10 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c  ddOp2(v, op, r1,
1bf20 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65   dest);.      te
1bf30 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
1bf40 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
1bf50 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1bf60 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
1bf70 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1bf80 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
1bf90 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65  ;.      exprCode
1bfa0 42 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20  Between(pParse, 
1bfb0 70 45 78 70 72 2c 20 64 65 73 74 2c 20 30 2c 20  pExpr, dest, 0, 
1bfc0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
1bfd0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1bfe0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
1bff0 7b 0a 20 20 20 20 20 20 69 66 28 20 6a 75 6d 70  {.      if( jump
1c000 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  IfNull ){.      
1c010 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1c020 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70  eIN(pParse, pExp
1c030 72 2c 20 64 65 73 74 2c 20 64 65 73 74 29 3b 0a  r, dest, dest);.
1c040 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1c050 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e       int destIfN
1c060 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ull = sqlite3Vdb
1c070 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
1c080 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1c090 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c  prCodeIN(pParse,
1c0a0 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65   pExpr, dest, de
1c0b0 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
1c0c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1c0d0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
1c0e0 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
1c0f0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
1c100 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
1c110 74 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20  t: {.      r1 = 
1c120 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1c130 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1c140 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  r, &regFree1);. 
1c150 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1c160 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e  AddOp3(v, OP_IfN
1c170 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75  ot, r1, dest, ju
1c180 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20  mpIfNull!=0);.  
1c190 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1c1a0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1c1b0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1c1c0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1c1d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1c1e0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
1c1f0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1c200 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
1c210 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1c220 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1c230 72 65 67 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a  regFree2);.}../*
1c240 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f  .** Do a deep co
1c250 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20  mparison of two 
1c260 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
1c270 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 28  .  Return TRUE (
1c280 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a 2a 20 69 66 20  non-zero).** if 
1c290 74 68 65 79 20 61 72 65 20 69 64 65 6e 74 69 63  they are identic
1c2a0 61 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 46 41  al and return FA
1c2b0 4c 53 45 20 69 66 20 74 68 65 79 20 64 69 66 66  LSE if they diff
1c2c0 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a  er in any way..*
1c2d0 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74  *.** Sometimes t
1c2e0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
1c2f0 20 72 65 74 75 72 6e 20 46 41 4c 53 45 20 65 76   return FALSE ev
1c300 65 6e 20 69 66 20 74 68 65 20 74 77 6f 20 65 78  en if the two ex
1c310 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 72 65 61  pressions.** rea
1c320 6c 6c 79 20 61 72 65 20 65 71 75 69 76 61 6c 65  lly are equivale
1c330 6e 74 2e 20 20 49 66 20 77 65 20 63 61 6e 6e 6f  nt.  If we canno
1c340 74 20 70 72 6f 76 65 20 74 68 61 74 20 74 68 65  t prove that the
1c350 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
1c360 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 77  .** identical, w
1c370 65 20 72 65 74 75 72 6e 20 46 41 4c 53 45 20 6a  e return FALSE j
1c380 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e 20  ust to be safe. 
1c390 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74   So if this rout
1c3a0 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 66  ine.** returns f
1c3b0 61 6c 73 65 2c 20 74 68 65 6e 20 79 6f 75 20 64  alse, then you d
1c3c0 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f  o not really kno
1c3d0 77 20 66 6f 72 20 63 65 72 74 61 69 6e 20 69 66  w for certain if
1c3e0 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72   the two.** expr
1c3f0 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20  essions are the 
1c400 73 61 6d 65 2e 20 20 42 75 74 20 69 66 20 79 6f  same.  But if yo
1c410 75 20 67 65 74 20 61 20 54 52 55 45 20 72 65 74  u get a TRUE ret
1c420 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a  urn, then you.**
1c430 20 63 61 6e 20 62 65 20 73 75 72 65 20 74 68 65   can be sure the
1c440 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
1c450 20 74 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74   the same.  In t
1c460 68 65 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a  he places where.
1c470 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
1c480 69 73 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73  is used, it does
1c490 20 6e 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74   not hurt to get
1c4a0 20 61 6e 20 65 78 74 72 61 20 46 41 4c 53 45 20   an extra FALSE 
1c4b0 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d  - that.** just m
1c4c0 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 73  ight result in s
1c4d0 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f  ome slightly slo
1c4e0 77 65 72 20 63 6f 64 65 2e 20 20 42 75 74 20 72  wer code.  But r
1c4f0 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69  eturning.** an i
1c500 6e 63 6f 72 72 65 63 74 20 54 52 55 45 20 63 6f  ncorrect TRUE co
1c510 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 6d 61  uld lead to a ma
1c520 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  lfunction..*/.in
1c530 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  t sqlite3ExprCom
1c540 70 61 72 65 28 45 78 70 72 20 2a 70 41 2c 20 45  pare(Expr *pA, E
1c550 78 70 72 20 2a 70 42 29 7b 0a 20 20 69 6e 74 20  xpr *pB){.  int 
1c560 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 7c 7c  i;.  if( pA==0||
1c570 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  pB==0 ){.    ret
1c580 75 72 6e 20 70 42 3d 3d 70 41 3b 0a 20 20 7d 0a  urn pB==pA;.  }.
1c590 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1c5a0 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 41  asAnyProperty(pA
1c5b0 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
1c5c0 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20  P_Reduced) );.  
1c5d0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1c5e0 41 6e 79 50 72 6f 70 65 72 74 79 28 70 42 2c 20  AnyProperty(pB, 
1c5f0 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
1c600 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 69 66  Reduced) );.  if
1c610 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
1c620 79 28 70 41 2c 20 45 50 5f 78 49 73 53 65 6c 65  y(pA, EP_xIsSele
1c630 63 74 29 20 7c 7c 20 45 78 70 72 48 61 73 50 72  ct) || ExprHasPr
1c640 6f 70 65 72 74 79 28 70 42 2c 20 45 50 5f 78 49  operty(pB, EP_xI
1c650 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
1c660 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1c670 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26  if( (pA->flags &
1c680 20 45 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28   EP_Distinct)!=(
1c690 70 42 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44  pB->flags & EP_D
1c6a0 69 73 74 69 6e 63 74 29 20 29 20 72 65 74 75 72  istinct) ) retur
1c6b0 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6f  n 0;.  if( pA->o
1c6c0 70 21 3d 70 42 2d 3e 6f 70 20 29 20 72 65 74 75  p!=pB->op ) retu
1c6d0 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c  rn 0;.  if( !sql
1c6e0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
1c6f0 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70  pA->pLeft, pB->p
1c700 4c 65 66 74 29 20 29 20 72 65 74 75 72 6e 20 30  Left) ) return 0
1c710 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
1c720 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e  ExprCompare(pA->
1c730 70 52 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67  pRight, pB->pRig
1c740 68 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ht) ) return 0;.
1c750 0a 20 20 69 66 28 20 70 41 2d 3e 78 2e 70 4c 69  .  if( pA->x.pLi
1c760 73 74 20 26 26 20 70 42 2d 3e 78 2e 70 4c 69 73  st && pB->x.pLis
1c770 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d  t ){.    if( pA-
1c780 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21  >x.pList->nExpr!
1c790 3d 70 42 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  =pB->x.pList->nE
1c7a0 78 70 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  xpr ) return 0;.
1c7b0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
1c7c0 41 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  A->x.pList->nExp
1c7d0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45  r; i++){.      E
1c7e0 78 70 72 20 2a 70 45 78 70 72 41 20 3d 20 70 41  xpr *pExprA = pA
1c7f0 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ->x.pList->a[i].
1c800 70 45 78 70 72 3b 0a 20 20 20 20 20 20 45 78 70  pExpr;.      Exp
1c810 72 20 2a 70 45 78 70 72 42 20 3d 20 70 42 2d 3e  r *pExprB = pB->
1c820 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  x.pList->a[i].pE
1c830 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 21  xpr;.      if( !
1c840 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
1c850 72 65 28 70 45 78 70 72 41 2c 20 70 45 78 70 72  re(pExprA, pExpr
1c860 42 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  B) ) return 0;. 
1c870 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
1c880 20 70 41 2d 3e 78 2e 70 4c 69 73 74 20 7c 7c 20   pA->x.pList || 
1c890 70 42 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20  pB->x.pList ){. 
1c8a0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1c8b0 0a 0a 20 20 69 66 28 20 70 41 2d 3e 69 54 61 62  ..  if( pA->iTab
1c8c0 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20 7c  le!=pB->iTable |
1c8d0 7c 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70  | pA->iColumn!=p
1c8e0 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74  B->iColumn ) ret
1c8f0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 45 78 70  urn 0;.  if( Exp
1c900 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 41 2c  rHasProperty(pA,
1c910 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 7b   EP_IntValue) ){
1c920 0a 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61  .    if( !ExprHa
1c930 73 50 72 6f 70 65 72 74 79 28 70 42 2c 20 45 50  sProperty(pB, EP
1c940 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20 70 41  _IntValue) || pA
1c950 2d 3e 75 2e 69 56 61 6c 75 65 21 3d 70 42 2d 3e  ->u.iValue!=pB->
1c960 75 2e 69 56 61 6c 75 65 20 29 7b 0a 20 20 20 20  u.iValue ){.    
1c970 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
1c980 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41  }.  }else if( pA
1c990 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
1c9a0 26 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20  && pA->u.zToken 
1c9b0 29 7b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48  ){.    if( ExprH
1c9c0 61 73 50 72 6f 70 65 72 74 79 28 70 42 2c 20 45  asProperty(pB, E
1c9d0 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20 4e  P_IntValue) || N
1c9e0 45 56 45 52 28 70 42 2d 3e 75 2e 7a 54 6f 6b 65  EVER(pB->u.zToke
1c9f0 6e 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30  n==0) ) return 0
1ca00 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
1ca10 33 53 74 72 49 43 6d 70 28 70 41 2d 3e 75 2e 7a  3StrICmp(pA->u.z
1ca20 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b  Token,pB->u.zTok
1ca30 65 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  en)!=0 ){.      
1ca40 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
1ca50 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
1ca60 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  }.../*.** Add a 
1ca70 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
1ca80 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  he pAggInfo->aCo
1ca90 6c 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75  l[] array.  Retu
1caa0 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a  rn the index of.
1cab0 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65  ** the new eleme
1cac0 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65  nt.  Return a ne
1cad0 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66  gative number if
1cae0 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a   malloc fails..*
1caf0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64  /.static int add
1cb00 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71  AggInfoColumn(sq
1cb10 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e  lite3 *db, AggIn
1cb20 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e  fo *pInfo){.  in
1cb30 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43  t i;.  pInfo->aC
1cb40 6f 6c 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61  ol = sqlite3Arra
1cb50 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20  yAllocate(.     
1cb60 20 20 64 62 2c 0a 20 20 20 20 20 20 20 70 49 6e    db,.       pIn
1cb70 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20  fo->aCol,.      
1cb80 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61   sizeof(pInfo->a
1cb90 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20  Col[0]),.       
1cba0 33 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f  3,.       &pInfo
1cbb0 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  ->nColumn,.     
1cbc0 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d    &pInfo->nColum
1cbd0 6e 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 20 26  nAlloc,.       &
1cbe0 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  i.  );.  return 
1cbf0 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20  i;.}    ../*.** 
1cc00 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
1cc10 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66  t to the pAggInf
1cc20 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61 79  o->aFunc[] array
1cc30 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  .  Return the in
1cc40 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  dex of.** the ne
1cc50 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75  w element.  Retu
1cc60 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75  rn a negative nu
1cc70 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66  mber if malloc f
1cc80 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
1cc90 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 46 75  int addAggInfoFu
1cca0 6e 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  nc(sqlite3 *db, 
1ccb0 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b  AggInfo *pInfo){
1ccc0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66  .  int i;.  pInf
1ccd0 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69 74  o->aFunc = sqlit
1cce0 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28  e3ArrayAllocate(
1ccf0 0a 20 20 20 20 20 20 20 64 62 2c 20 0a 20 20 20  .       db, .   
1cd00 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63      pInfo->aFunc
1cd10 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28  ,.       sizeof(
1cd20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29  pInfo->aFunc[0])
1cd30 2c 0a 20 20 20 20 20 20 20 33 2c 0a 20 20 20 20  ,.       3,.    
1cd40 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63     &pInfo->nFunc
1cd50 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d  ,.       &pInfo-
1cd60 3e 6e 46 75 6e 63 41 6c 6c 6f 63 2c 0a 20 20 20  >nFuncAlloc,.   
1cd70 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65      &i.  );.  re
1cd80 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f  turn i;.}    ../
1cd90 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
1cda0 20 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 66   xExprCallback f
1cdb0 6f 72 20 61 20 74 72 65 65 20 77 61 6c 6b 65 72  or a tree walker
1cdc0 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 74 6f  .  It is used to
1cdd0 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71  .** implement sq
1cde0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
1cdf0 41 67 67 72 65 67 61 74 65 73 28 29 2e 20 20 53  Aggregates().  S
1ce00 65 65 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  ee sqlite3ExprAn
1ce10 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 0a  alyzeAggregates.
1ce20 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ** for additiona
1ce30 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
1ce40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61  /.static int ana
1ce50 6c 79 7a 65 41 67 67 72 65 67 61 74 65 28 57 61  lyzeAggregate(Wa
1ce60 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
1ce70 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69  xpr *pExpr){.  i
1ce80 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74  nt i;.  NameCont
1ce90 65 78 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b  ext *pNC = pWalk
1cea0 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50 61 72  er->u.pNC;.  Par
1ceb0 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43  se *pParse = pNC
1cec0 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53 72 63 4c  ->pParse;.  SrcL
1ced0 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20  ist *pSrcList = 
1cee0 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20  pNC->pSrcList;. 
1cef0 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
1cf00 66 6f 20 3d 20 70 4e 43 2d 3e 70 41 67 67 49 6e  fo = pNC->pAggIn
1cf10 66 6f 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70  fo;..  switch( p
1cf20 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
1cf30 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
1cf40 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  MN:.    case TK_
1cf50 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
1cf60 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
1cf70 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
1cf80 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MN );.      test
1cf90 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
1cfa0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
1cfb0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
1cfc0 73 65 65 20 69 66 20 74 68 65 20 63 6f 6c 75 6d  see if the colum
1cfd0 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74  n is in one of t
1cfe0 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  he tables in the
1cff0 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 63   FROM.      ** c
1d000 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67  lause of the agg
1d010 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a  regate query */.
1d020 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
1d030 28 70 53 72 63 4c 69 73 74 21 3d 30 29 20 29 7b  (pSrcList!=0) ){
1d040 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
1d050 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1d060 74 65 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e  tem = pSrcList->
1d070 61 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  a;.        for(i
1d080 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e  =0; i<pSrcList->
1d090 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  nSrc; i++, pItem
1d0a0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
1d0b0 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
1d0c0 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20  l *pCol;.       
1d0d0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1d0e0 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
1d0f0 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  Expr, EP_TokenOn
1d100 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29  ly|EP_Reduced) )
1d110 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1d120 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
1d130 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b  Item->iCursor ){
1d140 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
1d150 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
1d160 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73   point, it means
1d170 20 74 68 61 74 20 70 45 78 70 72 20 72 65 66 65   that pExpr refe
1d180 72 73 20 74 6f 20 61 20 74 61 62 6c 65 0a 20 20  rs to a table.  
1d190 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61            ** tha
1d1a0 74 20 69 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  t is in the FROM
1d1b0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61   clause of the a
1d1c0 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 20  ggregate query. 
1d1d0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
1d1e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1d1f0 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f  Make an entry fo
1d200 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20  r the column in 
1d210 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
1d220 20 69 66 20 74 68 65 72 65 0a 20 20 20 20 20 20   if there.      
1d230 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20        ** is not 
1d240 61 6e 20 65 6e 74 72 79 20 74 68 65 72 65 20 61  an entry there a
1d250 6c 72 65 61 64 79 2e 0a 20 20 20 20 20 20 20 20  lready..        
1d260 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
1d270 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20     int k;.      
1d280 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 70 41 67        pCol = pAg
1d290 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20  gInfo->aCol;.   
1d2a0 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30           for(k=0
1d2b0 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  ; k<pAggInfo->nC
1d2c0 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c  olumn; k++, pCol
1d2d0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
1d2e0 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61     if( pCol->iTa
1d2f0 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  ble==pExpr->iTab
1d300 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  le &&.          
1d310 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43          pCol->iC
1d320 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43  olumn==pExpr->iC
1d330 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
1d340 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1d350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
1d360 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1d370 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6b            if( (k
1d380 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  >=pAggInfo->nCol
1d390 75 6d 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20  umn).           
1d3a0 20 20 26 26 20 28 6b 20 3d 20 61 64 64 41 67 67    && (k = addAgg
1d3b0 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73  InfoColumn(pPars
1d3c0 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29  e->db, pAggInfo)
1d3d0 29 3e 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  )>=0 .          
1d3e0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
1d3f0 20 20 20 70 43 6f 6c 20 3d 20 26 70 41 67 67 49     pCol = &pAggI
1d400 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20  nfo->aCol[k];.  
1d410 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
1d420 2d 3e 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e  ->pTab = pExpr->
1d430 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
1d440 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65      pCol->iTable
1d450 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
1d460 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1d470 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  pCol->iColumn = 
1d480 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
1d490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
1d4a0 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61  ol->iMem = ++pPa
1d4b0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
1d4c0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
1d4d0 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d  SorterColumn = -
1d4e0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
1d4f0 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70   pCol->pExpr = p
1d500 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
1d510 20 20 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f      if( pAggInfo
1d520 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ->pGroupBy ){.  
1d530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
1d540 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20  t j, n;.        
1d550 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
1d560 20 2a 70 47 42 20 3d 20 70 41 67 67 49 6e 66 6f   *pGB = pAggInfo
1d570 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  ->pGroupBy;.    
1d580 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75              stru
1d590 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
1d5a0 20 2a 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61   *pTerm = pGB->a
1d5b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1d5c0 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72    n = pGB->nExpr
1d5d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1d5e0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20    for(j=0; j<n; 
1d5f0 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  j++, pTerm++){. 
1d600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d610 20 45 78 70 72 20 2a 70 45 20 3d 20 70 54 65 72   Expr *pE = pTer
1d620 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
1d630 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1d640 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pE->op==TK_COLUM
1d650 4e 20 26 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d  N && pE->iTable=
1d660 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26  =pExpr->iTable &
1d670 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
1d680 20 20 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c          pE->iCol
1d690 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c  umn==pExpr->iCol
1d6a0 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
1d6b0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
1d6c0 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d  >iSorterColumn =
1d6d0 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   j;.            
1d6e0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1d6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d700 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
1d710 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1d720 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1d730 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f     if( pCol->iSo
1d740 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  rterColumn<0 ){.
1d750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d760 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
1d770 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  umn = pAggInfo->
1d780 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b  nSortingColumn++
1d790 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1d7a0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
1d7b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1d7c0 68 65 72 65 20 69 73 20 6e 6f 77 20 61 6e 20 65  here is now an e
1d7d0 6e 74 72 79 20 66 6f 72 20 70 45 78 70 72 20 69  ntry for pExpr i
1d7e0 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  n pAggInfo->aCol
1d7f0 5b 5d 20 28 65 69 74 68 65 72 0a 20 20 20 20 20  [] (either.     
1d800 20 20 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73         ** becaus
1d810 65 20 69 74 20 77 61 73 20 74 68 65 72 65 20 62  e it was there b
1d820 65 66 6f 72 65 20 6f 72 20 62 65 63 61 75 73 65  efore or because
1d830 20 77 65 20 6a 75 73 74 20 63 72 65 61 74 65 64   we just created
1d840 20 69 74 29 2e 0a 20 20 20 20 20 20 20 20 20 20   it)..          
1d850 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    ** Convert the
1d860 20 70 45 78 70 72 20 74 6f 20 62 65 20 61 20 54   pExpr to be a T
1d870 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66  K_AGG_COLUMN ref
1d880 65 72 72 69 6e 67 20 74 6f 20 74 68 61 74 0a 20  erring to that. 
1d890 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 41             ** pA
1d8a0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65  ggInfo->aCol[] e
1d8b0 6e 74 72 79 2e 0a 20 20 20 20 20 20 20 20 20 20  ntry..          
1d8c0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
1d8d0 20 45 78 70 72 53 65 74 49 72 72 65 64 75 63 69   ExprSetIrreduci
1d8e0 62 6c 65 28 70 45 78 70 72 29 3b 0a 20 20 20 20  ble(pExpr);.    
1d8f0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
1d900 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e  AggInfo = pAggIn
1d910 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  fo;.            
1d920 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41  pExpr->op = TK_A
1d930 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20  GG_COLUMN;.     
1d940 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41         pExpr->iA
1d950 67 67 20 3d 20 28 69 31 36 29 6b 3b 0a 20 20 20  gg = (i16)k;.   
1d960 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1d970 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65            } /* e
1d980 6e 64 69 66 20 70 45 78 70 72 2d 3e 69 54 61 62  ndif pExpr->iTab
1d990 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73  le==pItem->iCurs
1d9a0 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20  or */.        } 
1d9b0 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72  /* end loop over
1d9c0 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20   pSrcList */.   
1d9d0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
1d9e0 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20  n WRC_Prune;.   
1d9f0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
1da00 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  GG_FUNCTION: {. 
1da10 20 20 20 20 20 2f 2a 20 54 68 65 20 70 4e 43 2d       /* The pNC-
1da20 3e 6e 44 65 70 74 68 3d 3d 30 20 74 65 73 74 20  >nDepth==0 test 
1da30 63 61 75 73 65 73 20 61 67 67 72 65 67 61 74 65  causes aggregate
1da40 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 73 75   functions in su
1da50 62 71 75 65 72 69 65 73 0a 20 20 20 20 20 20 2a  bqueries.      *
1da60 2a 20 74 6f 20 62 65 20 69 67 6e 6f 72 65 64 20  * to be ignored 
1da70 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4e 43  */.      if( pNC
1da80 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 29 7b 0a 20  ->nDepth==0 ){. 
1da90 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20         /* Check 
1daa0 74 6f 20 73 65 65 20 69 66 20 70 45 78 70 72 20  to see if pExpr 
1dab0 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f  is a duplicate o
1dac0 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65 67  f another aggreg
1dad0 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ate .        ** 
1dae0 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73  function that is
1daf0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
1db00 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75  pAggInfo structu
1db10 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  re.        */.  
1db20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
1db30 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d  Info_func *pItem
1db40 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75   = pAggInfo->aFu
1db50 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  nc;.        for(
1db60 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
1db70 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74  >nFunc; i++, pIt
1db80 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  em++){.         
1db90 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
1dba0 43 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70  Compare(pItem->p
1dbb0 45 78 70 72 2c 20 70 45 78 70 72 29 20 29 7b 0a  Expr, pExpr) ){.
1dbc0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
1dbd0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
1dbe0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1dbf0 20 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f   if( i>=pAggInfo
1dc00 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20 20  ->nFunc ){.     
1dc10 20 20 20 20 20 2f 2a 20 70 45 78 70 72 20 69 73       /* pExpr is
1dc20 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65   original.  Make
1dc30 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20   a new entry in 
1dc40 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
1dc50 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ].          */. 
1dc60 20 20 20 20 20 20 20 20 20 75 38 20 65 6e 63 20           u8 enc 
1dc70 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62  = ENC(pParse->db
1dc80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d  );.          i =
1dc90 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28   addAggInfoFunc(
1dca0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67  pParse->db, pAgg
1dcb0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  Info);.         
1dcc0 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20   if( i>=0 ){.   
1dcd0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1dce0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1dcf0 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
1dd00 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
1dd10 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70        pItem = &p
1dd20 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69  AggInfo->aFunc[i
1dd30 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ];.            p
1dd40 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45  Item->pExpr = pE
1dd50 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
1dd60 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b   pItem->iMem = +
1dd70 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1dd80 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
1dd90 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1dda0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
1ddb0 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
1ddc0 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 46         pItem->pF
1ddd0 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  unc = sqlite3Fin
1dde0 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  dFunction(pParse
1ddf0 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ->db,.          
1de00 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
1de10 75 2e 7a 54 6f 6b 65 6e 2c 20 73 71 6c 69 74 65  u.zToken, sqlite
1de20 33 53 74 72 6c 65 6e 33 30 28 70 45 78 70 72 2d  3Strlen30(pExpr-
1de30 3e 75 2e 7a 54 6f 6b 65 6e 29 2c 0a 20 20 20 20  >u.zToken),.    
1de40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1de50 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3f 20  Expr->x.pList ? 
1de60 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
1de70 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20  nExpr : 0, enc, 
1de80 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
1de90 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
1dea0 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 20 29   & EP_Distinct )
1deb0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1dec0 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74  pItem->iDistinct
1ded0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
1dee0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  +;.            }
1def0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1df00 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74      pItem->iDist
1df10 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  inct = -1;.     
1df20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1df30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1df40 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70         /* Make p
1df50 45 78 70 72 20 70 6f 69 6e 74 20 74 6f 20 74 68  Expr point to th
1df60 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 70 41  e appropriate pA
1df70 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20  ggInfo->aFunc[] 
1df80 65 6e 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2f  entry.        */
1df90 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1dfa0 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70   !ExprHasAnyProp
1dfb0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54  erty(pExpr, EP_T
1dfc0 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
1dfd0 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ced) );.        
1dfe0 45 78 70 72 53 65 74 49 72 72 65 64 75 63 69 62  ExprSetIrreducib
1dff0 6c 65 28 70 45 78 70 72 29 3b 0a 20 20 20 20 20  le(pExpr);.     
1e000 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d     pExpr->iAgg =
1e010 20 28 69 31 36 29 69 3b 0a 20 20 20 20 20 20 20   (i16)i;.       
1e020 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
1e030 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20   = pAggInfo;.   
1e040 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
1e050 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 20  Prune;.      }. 
1e060 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1e070 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
1e080 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61  }.static int ana
1e090 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e  lyzeAggregatesIn
1e0a0 53 65 6c 65 63 74 28 57 61 6c 6b 65 72 20 2a 70  Select(Walker *p
1e0b0 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
1e0c0 70 53 65 6c 65 63 74 29 7b 0a 20 20 4e 61 6d 65  pSelect){.  Name
1e0d0 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 70  Context *pNC = p
1e0e0 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20  Walker->u.pNC;. 
1e0f0 20 69 66 28 20 70 4e 43 2d 3e 6e 44 65 70 74 68   if( pNC->nDepth
1e100 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 43 2d 3e  ==0 ){.    pNC->
1e110 6e 44 65 70 74 68 2b 2b 3b 0a 20 20 20 20 73 71  nDepth++;.    sq
1e120 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
1e130 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 65 63 74  pWalker, pSelect
1e140 29 3b 0a 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70  );.    pNC->nDep
1e150 74 68 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e  th--;.    return
1e160 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 65   WRC_Prune;.  }e
1e170 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
1e180 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
1e190 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79  }.}../*.** Analy
1e1a0 7a 65 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  ze the given exp
1e1b0 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20  ression looking 
1e1c0 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75  for aggregate fu
1e1d0 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66  nctions and.** f
1e1e0 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61  or variables tha
1e1f0 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64  t need to be add
1e200 65 64 20 74 6f 20 74 68 65 20 70 50 61 72 73 65  ed to the pParse
1e210 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 2e 0a  ->aAgg[] array..
1e220 2a 2a 20 4d 61 6b 65 20 61 64 64 69 74 69 6f 6e  ** Make addition
1e230 61 6c 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68  al entries to th
1e240 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d  e pParse->aAgg[]
1e250 20 61 72 72 61 79 20 61 73 20 6e 65 63 65 73 73   array as necess
1e260 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ary..**.** This 
1e270 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f  routine should o
1e280 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66  nly be called af
1e290 74 65 72 20 74 68 65 20 65 78 70 72 65 73 73 69  ter the expressi
1e2a0 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61  on has been.** a
1e2b0 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74  nalyzed by sqlit
1e2c0 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d  e3ResolveExprNam
1e2d0 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  es()..*/.void sq
1e2e0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
1e2f0 41 67 67 72 65 67 61 74 65 73 28 4e 61 6d 65 43  Aggregates(NameC
1e300 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70  ontext *pNC, Exp
1e310 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 57 61 6c  r *pExpr){.  Wal
1e320 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72  ker w;.  w.xExpr
1e330 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79  Callback = analy
1e340 7a 65 41 67 67 72 65 67 61 74 65 3b 0a 20 20 77  zeAggregate;.  w
1e350 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
1e360 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67   = analyzeAggreg
1e370 61 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20  atesInSelect;.  
1e380 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20  w.u.pNC = pNC;. 
1e390 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53   assert( pNC->pS
1e3a0 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 73  rcList!=0 );.  s
1e3b0 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26  qlite3WalkExpr(&
1e3c0 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a  w, pExpr);.}../*
1e3d0 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33  .** Call sqlite3
1e3e0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
1e3f0 67 61 74 65 73 28 29 20 66 6f 72 20 65 76 65 72  gates() for ever
1e400 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  y expression in 
1e410 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  an.** expression
1e420 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74   list.  Return t
1e430 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
1e440 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ors..**.** If an
1e450 20 65 72 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c   error is found,
1e460 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20 69 73   the analysis is
1e470 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76   cut short..*/.v
1e480 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
1e490 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e 61  nalyzeAggList(Na
1e4a0 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
1e4b0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
1e4c0 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  {.  struct ExprL
1e4d0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
1e4e0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1e4f0 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72  pList ){.    for
1e500 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
1e510 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e   i=0; i<pList->n
1e520 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
1e530 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
1e540 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
1e550 72 65 67 61 74 65 73 28 70 4e 43 2c 20 70 49 74  regates(pNC, pIt
1e560 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
1e570 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
1e580 6c 6c 6f 63 61 74 65 20 61 20 73 69 6e 67 6c 65  llocate a single
1e590 20 6e 65 77 20 72 65 67 69 73 74 65 72 20 66 6f   new register fo
1e5a0 72 20 75 73 65 20 74 6f 20 68 6f 6c 64 20 73 6f  r use to hold so
1e5b0 6d 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  me intermediate 
1e5c0 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73  result..*/.int s
1e5d0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
1e5e0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
1e5f0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
1e600 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a 20 20  TempReg==0 ){.  
1e610 20 20 72 65 74 75 72 6e 20 2b 2b 70 50 61 72 73    return ++pPars
1e620 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72  e->nMem;.  }.  r
1e630 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 61 54  eturn pParse->aT
1e640 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d  empReg[--pParse-
1e650 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f  >nTempReg];.}../
1e660 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20  *.** Deallocate 
1e670 61 20 72 65 67 69 73 74 65 72 2c 20 6d 61 6b 69  a register, maki
1e680 6e 67 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ng available for
1e690 20 72 65 75 73 65 20 66 6f 72 20 73 6f 6d 65 20   reuse for some 
1e6a0 6f 74 68 65 72 0a 2a 2a 20 70 75 72 70 6f 73 65  other.** purpose
1e6b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67  ..**.** If a reg
1e6c0 69 73 74 65 72 20 69 73 20 63 75 72 72 65 6e 74  ister is current
1e6d0 6c 79 20 62 65 69 6e 67 20 75 73 65 64 20 62 79  ly being used by
1e6e0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
1e6f0 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64  e, then.** the d
1e700 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 64 65  allocation is de
1e710 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65  ferred until the
1e720 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 6c 69   column cache li
1e730 6e 65 20 74 68 61 74 20 75 73 65 73 0a 2a 2a 20  ne that uses.** 
1e740 74 68 65 20 72 65 67 69 73 74 65 72 20 62 65 63  the register bec
1e750 6f 6d 65 73 20 73 74 61 6c 65 2e 0a 2a 2f 0a 76  omes stale..*/.v
1e760 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61  oid sqlite3Relea
1e770 73 65 54 65 6d 70 52 65 67 28 50 61 72 73 65 20  seTempReg(Parse 
1e780 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65  *pParse, int iRe
1e790 67 29 7b 0a 20 20 69 66 28 20 69 52 65 67 20 26  g){.  if( iReg &
1e7a0 26 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  & pParse->nTempR
1e7b0 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61  eg<ArraySize(pPa
1e7c0 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29  rse->aTempReg) )
1e7d0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
1e7e0 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
1e7f0 65 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d  e *p;.    for(i=
1e800 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
1e810 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
1e820 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
1e830 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  , p++){.      if
1e840 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20  ( p->iReg==iReg 
1e850 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 74 65  ){.        p->te
1e860 6d 70 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 20  mpReg = 1;.     
1e870 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
1e880 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61   }.    }.    pPa
1e890 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50  rse->aTempReg[pP
1e8a0 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b  arse->nTempReg++
1e8b0 5d 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a  ] = iReg;.  }.}.
1e8c0 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
1e8d0 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 20 61 20  or deallocate a 
1e8e0 62 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f  block of nReg co
1e8f0 6e 73 65 63 75 74 69 76 65 20 72 65 67 69 73 74  nsecutive regist
1e900 65 72 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ers.*/.int sqlit
1e910 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 50  e3GetTempRange(P
1e920 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1e930 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69  t nReg){.  int i
1e940 2c 20 6e 3b 0a 20 20 69 20 3d 20 70 50 61 72 73  , n;.  i = pPars
1e950 65 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20 20  e->iRangeReg;.  
1e960 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e  n = pParse->nRan
1e970 67 65 52 65 67 3b 0a 20 20 69 66 28 20 6e 52 65  geReg;.  if( nRe
1e980 67 3c 3d 6e 20 26 26 20 21 75 73 65 64 41 73 43  g<=n && !usedAsC
1e990 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73  olumnCache(pPars
1e9a0 65 2c 20 69 2c 20 69 2b 6e 2d 31 29 20 29 7b 0a  e, i, i+n-1) ){.
1e9b0 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e      pParse->iRan
1e9c0 67 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20  geReg += nReg;. 
1e9d0 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67     pParse->nRang
1e9e0 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20  eReg -= nReg;.  
1e9f0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20 70  }else{.    i = p
1ea00 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
1ea10 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
1ea20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72  += nReg;.  }.  r
1ea30 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20  eturn i;.}.void 
1ea40 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1ea50 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70  mpRange(Parse *p
1ea60 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c  Parse, int iReg,
1ea70 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 66   int nReg){.  if
1ea80 28 20 6e 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e  ( nReg>pParse->n
1ea90 52 61 6e 67 65 52 65 67 20 29 7b 0a 20 20 20 20  RangeReg ){.    
1eaa0 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
1eab0 67 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50  g = nReg;.    pP
1eac0 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20  arse->iRangeReg 
1ead0 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a        = iReg;.  }.}.